Compare commits
No commits in common. "f32d3f16683c70a689a2bedc3ef0aa2e85d835e9" and "5c231cbaba8a688a04f97d920a07b12835386d4a" have entirely different histories.
f32d3f1668
...
5c231cbaba
@ -86,12 +86,6 @@ var cmdLogin = &commands.FullHandler{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fnLogin(ce *WrappedCommandEvent) {
|
func fnLogin(ce *WrappedCommandEvent) {
|
||||||
if ce.Args != nil && len(ce.Args) > 0 {
|
|
||||||
_, err := ce.Bot.RedactEvent(ce.RoomID, ce.EventID)
|
|
||||||
if err != nil {
|
|
||||||
ce.User.log.Errorln("Failed to redact auth token")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ce.User.Client != nil {
|
if ce.User.Client != nil {
|
||||||
if ce.User.IsConnected() {
|
if ce.User.IsConnected() {
|
||||||
ce.Reply("You're already logged in")
|
ce.Reply("You're already logged in")
|
||||||
@ -106,6 +100,8 @@ func fnLogin(ce *WrappedCommandEvent) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer ce.Bot.RedactEvent(ce.RoomID, ce.EventID)
|
||||||
|
|
||||||
err := ce.User.Login(ce.Args[0])
|
err := ce.User.Login(ce.Args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ce.Reply("Failed to log in: %v", err)
|
ce.Reply("Failed to log in: %v", err)
|
||||||
|
@ -53,7 +53,7 @@ func NewFayeClient(logger log.Logger) *FayeClient {
|
|||||||
fc := &FayeClient{wray.NewFayeClient(groupme.PushServer)}
|
fc := &FayeClient{wray.NewFayeClient(groupme.PushServer)}
|
||||||
fc.SetLogger(fayeLogger{logger.Sub("FayeClient")})
|
fc.SetLogger(fayeLogger{logger.Sub("FayeClient")})
|
||||||
fc.AddExtension(&AuthExt{})
|
fc.AddExtension(&AuthExt{})
|
||||||
//fc.AddExtension(fc.FayeClient)
|
fc.AddExtension(fc.FayeClient)
|
||||||
|
|
||||||
return fc
|
return fc
|
||||||
}
|
}
|
||||||
|
152
portal.go
152
portal.go
@ -149,6 +149,8 @@ func (portal *Portal) SyncDM(user *User, dm *groupme.Chat) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(portal.MXID) == 0 {
|
if len(portal.MXID) == 0 {
|
||||||
|
|
||||||
|
// "" for overall user not related to one group
|
||||||
puppet := portal.bridge.GetPuppetByGMID(portal.Key.GMID)
|
puppet := portal.bridge.GetPuppetByGMID(portal.Key.GMID)
|
||||||
meta, err := portal.bridge.StateStore.TryGetMember("", puppet.MXID)
|
meta, err := portal.bridge.StateStore.TryGetMember("", puppet.MXID)
|
||||||
if err {
|
if err {
|
||||||
@ -188,6 +190,10 @@ func (portal *Portal) SyncDM(user *User, dm *groupme.Chat) {
|
|||||||
portal.ensureUserInvited(user)
|
portal.ensureUserInvited(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if portal.IsPrivateChat() {
|
||||||
|
// return
|
||||||
|
//}
|
||||||
|
|
||||||
update := false
|
update := false
|
||||||
|
|
||||||
update = portal.updateMetadata(user) || update
|
update = portal.updateMetadata(user) || update
|
||||||
@ -704,6 +710,9 @@ func (portal *Portal) handleAttachment(intent *appservice.IntentAPI, attachment
|
|||||||
Info: &event.FileInfo{
|
Info: &event.FileInfo{
|
||||||
Size: len(data),
|
Size: len(data),
|
||||||
MimeType: mime,
|
MimeType: mime,
|
||||||
|
//Width: width,
|
||||||
|
//Height: height,
|
||||||
|
//Duration: int(msg.length),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if content.File != nil {
|
if content.File != nil {
|
||||||
@ -740,6 +749,9 @@ func (portal *Portal) handleAttachment(intent *appservice.IntentAPI, attachment
|
|||||||
Info: &event.FileInfo{
|
Info: &event.FileInfo{
|
||||||
Size: len(data),
|
Size: len(data),
|
||||||
MimeType: fmime,
|
MimeType: fmime,
|
||||||
|
//Width: width,
|
||||||
|
//Height: height,
|
||||||
|
//Duration: int(msg.length),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if content.File != nil {
|
if content.File != nil {
|
||||||
@ -912,26 +924,6 @@ func (portal *Portal) createMatrixRoom(user *User) error {
|
|||||||
Content: event.Content{Parsed: bridgeInfo},
|
Content: event.Content{Parsed: bridgeInfo},
|
||||||
StateKey: &bridgeInfoStateKey,
|
StateKey: &bridgeInfoStateKey,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
spaceIDStr := user.SpaceId
|
|
||||||
initialState = append(initialState, &event.Event{
|
|
||||||
Type: event.StateSpaceParent,
|
|
||||||
StateKey: &spaceIDStr,
|
|
||||||
Content: event.Content{Parsed: &event.SpaceParentEventContent{
|
|
||||||
Via: []string{portal.bridge.AS.HomeserverDomain},
|
|
||||||
Canonical: true,
|
|
||||||
}},
|
|
||||||
})
|
|
||||||
initialState = append(initialState, &event.Event{
|
|
||||||
Type: event.StateJoinRules,
|
|
||||||
Content: event.Content{Parsed: &event.JoinRulesEventContent{
|
|
||||||
JoinRule: event.JoinRuleRestricted,
|
|
||||||
Allow: []event.JoinRuleAllow{{
|
|
||||||
RoomID: id.RoomID(user.SpaceId),
|
|
||||||
Type: event.JoinRuleAllowRoomMembership,
|
|
||||||
}},
|
|
||||||
}},
|
|
||||||
})
|
|
||||||
if !portal.AvatarURL.IsEmpty() {
|
if !portal.AvatarURL.IsEmpty() {
|
||||||
initialState = append(initialState, &event.Event{
|
initialState = append(initialState, &event.Event{
|
||||||
Type: event.StateRoomAvatar,
|
Type: event.StateRoomAvatar,
|
||||||
@ -985,8 +977,6 @@ func (portal *Portal) createMatrixRoom(user *User) error {
|
|||||||
portal.bridge.StateStore.SetMembership(portal.MXID, user, event.MembershipInvite)
|
portal.bridge.StateStore.SetMembership(portal.MXID, user, event.MembershipInvite)
|
||||||
}
|
}
|
||||||
|
|
||||||
user.addPortalToSpace(portal)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1079,6 +1069,12 @@ func (portal *Portal) ensureMXIDInvited(mxid id.UserID) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (portal *Portal) ensureUserInvited(user *User) bool {
|
func (portal *Portal) ensureUserInvited(user *User) bool {
|
||||||
|
portal.userMXIDAction(user, portal.ensureMXIDInvited)
|
||||||
|
|
||||||
|
customPuppet := portal.bridge.GetPuppetByCustomMXID(user.MXID)
|
||||||
|
if customPuppet != nil && customPuppet.CustomIntent() != nil {
|
||||||
|
_ = customPuppet.CustomIntent().EnsureJoined(portal.MXID)
|
||||||
|
}
|
||||||
return user.ensureInvited(portal.MainIntent(), portal.MXID, portal.IsPrivateChat())
|
return user.ensureInvited(portal.MainIntent(), portal.MXID, portal.IsPrivateChat())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1150,6 +1146,89 @@ func (portal *Portal) sendMessage(intent *appservice.IntentAPI, eventType event.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// func (portal *Portal) handleReaction(msgID groupme.ID, ppl []groupme.ID) {
|
||||||
|
// reactions := portal.bridge.DB.Reaction.GetByGMID(msgID)
|
||||||
|
// newLikes := newReactions(reactions, ppl)
|
||||||
|
// removeLikes := oldReactions(reactions, ppl)
|
||||||
|
|
||||||
|
// var eventID id.EventID
|
||||||
|
// if len(newLikes) > 0 {
|
||||||
|
// message := portal.bridge.DB.Message.GetByGMID(portal.Key, msgID)
|
||||||
|
// if message == nil {
|
||||||
|
// portal.log.Errorln("Received reaction for unknown message", msgID)
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// eventID = message.MXID
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for _, jid := range newLikes {
|
||||||
|
// intent := portal.getReactionIntent(jid)
|
||||||
|
// resp, err := portal.sendReaction(intent, eventID, "❤")
|
||||||
|
// if err != nil {
|
||||||
|
// portal.log.Errorln("Something wrong with sending reaction", msgID, jid, err)
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
|
||||||
|
// newReaction := portal.bridge.DB.Reaction.New()
|
||||||
|
// newReaction.MXID = resp.EventID
|
||||||
|
// newReaction.MessageJID = msgID
|
||||||
|
// newReaction.MessageMXID = eventID
|
||||||
|
// newReaction.PuppetJID = jid
|
||||||
|
|
||||||
|
// newReaction.Insert()
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for _, reaction := range removeLikes {
|
||||||
|
// if len(reaction.Puppet.JID) == 0 {
|
||||||
|
// portal.log.Warnln("Reaction user state wrong", reaction.MXID, msgID)
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// intent := portal.getReactionIntent(reaction.PuppetJID)
|
||||||
|
// _, err := intent.RedactEvent(portal.MXID, reaction.MXID)
|
||||||
|
// if err != nil {
|
||||||
|
// portal.log.Errorln("Something wrong with reaction redaction", reaction.MXID)
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// reaction.Delete()
|
||||||
|
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func oldReactions(a []*database.Reaction, b []string) (ans []*database.Reaction) {
|
||||||
|
// for _, i := range a {
|
||||||
|
// flag := false
|
||||||
|
// for _, j := range b {
|
||||||
|
// if i.PuppetJID == j {
|
||||||
|
// flag = true
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if !flag {
|
||||||
|
// ans = append(ans, i)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func newReactions(a []*database.Reaction, b []string) (ans []string) {
|
||||||
|
// for _, j := range b {
|
||||||
|
// flag := false
|
||||||
|
// for _, i := range a {
|
||||||
|
// if i.GMID == j {
|
||||||
|
// flag = true
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if !flag {
|
||||||
|
// ans = append(ans, j)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
func (portal *Portal) sendMediaBridgeFailure(source *User, intent *appservice.IntentAPI, message groupme.Message, bridgeErr error) {
|
func (portal *Portal) sendMediaBridgeFailure(source *User, intent *appservice.IntentAPI, message groupme.Message, bridgeErr error) {
|
||||||
portal.log.Errorfln("Failed to bridge media for %s: %v", message.UserID.String(), bridgeErr)
|
portal.log.Errorfln("Failed to bridge media for %s: %v", message.UserID.String(), bridgeErr)
|
||||||
resp, err := portal.sendMessage(intent, event.EventMessage, &event.MessageEventContent{
|
resp, err := portal.sendMessage(intent, event.EventMessage, &event.MessageEventContent{
|
||||||
@ -1211,12 +1290,36 @@ func (portal *Portal) convertMatrixMessage(sender *User, evt *event.Event) ([]*g
|
|||||||
return nil, sender
|
return nil, sender
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//ts := uint64(evt.Timestamp / 1000)
|
||||||
|
//status := waProto.WebMessageInfo_ERROR
|
||||||
|
//fromMe := true
|
||||||
|
// info := &waProto.WebMessageInfo{
|
||||||
|
// Key: &waProto.MessageKey{
|
||||||
|
// FromMe: &fromMe,
|
||||||
|
// Id: makeMessageID(),
|
||||||
|
// RemoteJid: &portal.Key.JID,
|
||||||
|
// },
|
||||||
|
// MessageTimestamp: &ts,
|
||||||
|
// Message: &waProto.Message{},
|
||||||
|
// Status: &status,
|
||||||
|
// }
|
||||||
|
//
|
||||||
info := groupme.Message{
|
info := groupme.Message{
|
||||||
GroupID: groupme.ID(portal.Key.String()),
|
GroupID: groupme.ID(portal.Key.String()),
|
||||||
ConversationID: groupme.ID(portal.Key.String()),
|
ConversationID: groupme.ID(portal.Key.String()),
|
||||||
ChatID: groupme.ID(portal.Key.String()),
|
ChatID: groupme.ID(portal.Key.String()),
|
||||||
RecipientID: groupme.ID(portal.Key.GMID),
|
RecipientID: groupme.ID(portal.Key.GMID),
|
||||||
}
|
}
|
||||||
|
replyToID := content.GetReplyTo()
|
||||||
|
if len(replyToID) > 0 {
|
||||||
|
// content.RemoveReplyFallback()
|
||||||
|
// msg := portal.bridge.DB.Message.GetByMXID(replyToID)
|
||||||
|
// if msg != nil && msg.Content != nil {
|
||||||
|
// ctxInfo.StanzaId = &msg.JID
|
||||||
|
// ctxInfo.Participant = &msg.Sender
|
||||||
|
// ctxInfo.QuotedMessage = msg.Content
|
||||||
|
// }
|
||||||
|
}
|
||||||
relaybotFormatted := false
|
relaybotFormatted := false
|
||||||
|
|
||||||
if evt.Type == event.EventSticker {
|
if evt.Type == event.EventSticker {
|
||||||
@ -1385,6 +1488,11 @@ func (portal *Portal) syncParticipants(group *groupme.Group) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
expectedLevel := 0
|
expectedLevel := 0
|
||||||
|
// if participant.IsSuperAdmin {
|
||||||
|
// expectedLevel = 95
|
||||||
|
// } else if participant.IsAdmin {
|
||||||
|
// expectedLevel = 50
|
||||||
|
// }
|
||||||
changed = levels.EnsureUserLevel(puppet.MXID, expectedLevel) || changed
|
changed = levels.EnsureUserLevel(puppet.MXID, expectedLevel) || changed
|
||||||
if user != nil {
|
if user != nil {
|
||||||
changed = levels.EnsureUserLevel(user.MXID, expectedLevel) || changed
|
changed = levels.EnsureUserLevel(user.MXID, expectedLevel) || changed
|
||||||
|
216
user.go
216
user.go
@ -56,7 +56,7 @@ type User struct {
|
|||||||
|
|
||||||
Client *groupmeext.Client
|
Client *groupmeext.Client
|
||||||
ConnectionErrors int
|
ConnectionErrors int
|
||||||
SpaceId string
|
CommunityID string
|
||||||
|
|
||||||
ChatList map[groupme.ID]*groupme.Chat
|
ChatList map[groupme.ID]*groupme.Chat
|
||||||
GroupList map[groupme.ID]*groupme.Group
|
GroupList map[groupme.ID]*groupme.Group
|
||||||
@ -90,8 +90,6 @@ type Chat struct {
|
|||||||
|
|
||||||
type ChatList []Chat
|
type ChatList []Chat
|
||||||
|
|
||||||
var connectWaitGroup = sync.WaitGroup{}
|
|
||||||
|
|
||||||
func (cl ChatList) Len() int {
|
func (cl ChatList) Len() int {
|
||||||
return len(cl)
|
return len(cl)
|
||||||
}
|
}
|
||||||
@ -154,7 +152,53 @@ func (user *User) GetIGhost() bridge.Ghost {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) GetSpaceRoom() id.RoomID {
|
func (user *User) GetSpaceRoom() id.RoomID {
|
||||||
return user.getSpaceRoom(&user.SpaceRoom, "GroupMe", "Your GroupMe bridged chats", "")
|
if !user.bridge.Config.Bridge.PersonalFilteringSpaces {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(user.SpaceRoom) == 0 {
|
||||||
|
user.spaceCreateLock.Lock()
|
||||||
|
defer user.spaceCreateLock.Unlock()
|
||||||
|
if len(user.SpaceRoom) > 0 {
|
||||||
|
return user.SpaceRoom
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
|
||||||
|
Visibility: "private",
|
||||||
|
Name: "GroupMe",
|
||||||
|
Topic: "Your GroupMe bridged chats",
|
||||||
|
InitialState: []*event.Event{{
|
||||||
|
Type: event.StateRoomAvatar,
|
||||||
|
Content: event.Content{
|
||||||
|
Parsed: &event.RoomAvatarEventContent{
|
||||||
|
URL: user.bridge.Config.AppService.Bot.ParsedAvatar,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
CreationContent: map[string]interface{}{
|
||||||
|
"type": event.RoomTypeSpace,
|
||||||
|
},
|
||||||
|
PowerLevelOverride: &event.PowerLevelsEventContent{
|
||||||
|
Users: map[id.UserID]int{
|
||||||
|
user.bridge.Bot.UserID: 9001,
|
||||||
|
user.MXID: 50,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
user.log.Errorln("Failed to auto-create space room:", err)
|
||||||
|
} else {
|
||||||
|
user.SpaceRoom = resp.RoomID
|
||||||
|
user.Update()
|
||||||
|
user.ensureInvited(user.bridge.Bot, user.SpaceRoom, false)
|
||||||
|
}
|
||||||
|
} else if !user.spaceMembershipChecked && !user.bridge.StateStore.IsInRoom(user.SpaceRoom, user.MXID) {
|
||||||
|
user.ensureInvited(user.bridge.Bot, user.SpaceRoom, false)
|
||||||
|
}
|
||||||
|
user.spaceMembershipChecked = true
|
||||||
|
|
||||||
|
return user.SpaceRoom
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) GetManagementRoom() id.RoomID {
|
func (user *User) GetManagementRoom() id.RoomID {
|
||||||
@ -244,7 +288,6 @@ func (user *User) PostLogin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) Connect() bool {
|
func (user *User) Connect() bool {
|
||||||
user.SpaceId = "GroupMe"
|
|
||||||
if user.Conn != nil {
|
if user.Conn != nil {
|
||||||
return true
|
return true
|
||||||
} else if len(user.Token) == 0 {
|
} else if len(user.Token) == 0 {
|
||||||
@ -584,20 +627,28 @@ func (user *User) sendMarkdownBridgeAlert(formatString string, args ...interface
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) postConnPing() bool {
|
func (user *User) postConnPing() bool {
|
||||||
user.log.Debugln("Making post-connection ping")
|
//user.log.Debugln("Making post-connection ping")
|
||||||
if !user.Conn.Connected() {
|
//err := user.Conn.AdminTest()
|
||||||
user.log.Errorfln("Post-connection ping failed: %v. Disconnecting and then reconnecting after a second")
|
//if err != nil {
|
||||||
user.bridge.Metrics.TrackDisconnection(user.MXID)
|
// user.log.Errorfln("Post-connection ping failed: %v. Disconnecting and then reconnecting after a second", err)
|
||||||
go func() {
|
// sess, disconnectErr := user.Conn.Disconnect()
|
||||||
time.Sleep(1 * time.Second)
|
// if disconnectErr != nil {
|
||||||
user.Connect()
|
// user.log.Warnln("Error while disconnecting after failed post-connection ping:", disconnectErr)
|
||||||
}()
|
// } else {
|
||||||
return false
|
// user.Session = &sess
|
||||||
} else {
|
// }
|
||||||
user.log.Debugln("Post-connection ping OK")
|
// user.bridge.Metrics.TrackDisconnection(user.MXID)
|
||||||
|
// go func() {
|
||||||
|
// time.Sleep(1 * time.Second)
|
||||||
|
// user.tryReconnect(fmt.Sprintf("Post-connection ping failed: %v", err))
|
||||||
|
// }()
|
||||||
|
// return false
|
||||||
|
//} else {
|
||||||
|
// user.log.Debugln("Post-connection ping OK")
|
||||||
|
// return true
|
||||||
|
//}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
func (user *User) intPostLogin() {
|
func (user *User) intPostLogin() {
|
||||||
defer user.syncWait.Done()
|
defer user.syncWait.Done()
|
||||||
@ -619,12 +670,17 @@ func (user *User) intPostLogin() {
|
|||||||
select {
|
select {
|
||||||
case <-user.chatListReceived:
|
case <-user.chatListReceived:
|
||||||
user.log.Debugln("Chat list receive confirmation received in PostLogin")
|
user.log.Debugln("Chat list receive confirmation received in PostLogin")
|
||||||
case <-time.After(time.Duration(10000 /**user.bridge.Config.Bridge.ChatListWait**/) * time.Second):
|
case <-time.After(time.Duration(1000 /**user.bridge.Config.Bridge.ChatListWait**/) * time.Second):
|
||||||
user.log.Warnln("Timed out waiting for chat list to arrive!")
|
user.log.Warnln("Timed out waiting for chat list to arrive!")
|
||||||
user.postConnPing()
|
user.postConnPing()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !user.postConnPing() {
|
||||||
|
user.log.Debugln("Post-connection ping failed, unlocking processing of incoming messages.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
user.log.Debugln("Waiting for portal sync complete confirmation")
|
user.log.Debugln("Waiting for portal sync complete confirmation")
|
||||||
select {
|
select {
|
||||||
case <-user.syncPortalsDone:
|
case <-user.syncPortalsDone:
|
||||||
@ -663,16 +719,17 @@ func (user *User) syncPortals(createAll bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//for _, chat := range chats {
|
//for _, chat := range chats {
|
||||||
// if user.IsInSpace(chat.Portal.Key) {
|
//var inSpace, ok bool
|
||||||
// user.MarkInSpace(chat.Portal.Key)
|
//if inSpace, ok = existingKeys[chat.Portal.Key]; !ok || !inCommunity {
|
||||||
|
// inCommunity = user.addPortalToCommunity(chat.Portal)
|
||||||
// if chat.Portal.IsPrivateChat() {
|
// if chat.Portal.IsPrivateChat() {
|
||||||
// user.addPortalToSpace(chat.Portal)
|
// puppet := user.bridge.GetPuppetByGMID(chat.Portal.Key.GMID)
|
||||||
|
// user.ad.addPuppetToCommunity(puppet)
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
//
|
|
||||||
//portalKeys = append(portalKeys, chat.Portal.Key)
|
//portalKeys = append(portalKeys, chat.Portal.Key)
|
||||||
//}
|
//}
|
||||||
user.log.Infoln("Read chat list, updating user-portal mapping")
|
//user.log.Infoln("Read chat list, updating user-portal mapping")
|
||||||
|
|
||||||
err := user.SetPortalKeys(portalKeys)
|
err := user.SetPortalKeys(portalKeys)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -716,47 +773,6 @@ func (user *User) syncPortals(createAll bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) addPuppetToSpace(puppet *Puppet) bool {
|
|
||||||
bot := user.bridge.Bot
|
|
||||||
url := bot.BuildURL(mautrix.ClientURLPath{"groups", user.SpaceId, "admin", "users", "invite", puppet.MXID})
|
|
||||||
blankReqBody := map[string]interface{}{}
|
|
||||||
_, err := bot.MakeRequest(http.MethodPut, url, &blankReqBody, nil)
|
|
||||||
if err != nil {
|
|
||||||
user.log.Warnfln("Failed to invite %s to %s: %v", puppet.MXID, user.SpaceId, err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
reqBody := map[string]map[string]string{
|
|
||||||
"m.visibility": {
|
|
||||||
"type": "private",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
url = bot.BuildURLWithQuery(mautrix.ClientURLPath{"groups", user.SpaceId, "self", "accept_invite"}, map[string]string{
|
|
||||||
"user_id": puppet.MXID.String(),
|
|
||||||
})
|
|
||||||
_, err = bot.MakeRequest(http.MethodPut, url, &reqBody, nil)
|
|
||||||
if err != nil {
|
|
||||||
user.log.Warnfln("Failed to join %s as %s: %v", user.SpaceId, puppet.MXID, err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
user.log.Debugln("Added", puppet.MXID, "to", user.SpaceId)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (user *User) addPortalToSpace(portal *Portal) bool {
|
|
||||||
if portal.MXID == "" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
_, err := user.bridge.Bot.SendStateEvent(user.GetSpaceRoom(), event.StateSpaceChild, portal.MXID.String(), &event.SpaceChildEventContent{
|
|
||||||
Via: []string{user.bridge.AS.HomeserverDomain},
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
user.log.Errorln("Failed to add portal space. RoomId: ", portal.MXID.String())
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (user *User) getDirectChats() map[id.UserID][]id.RoomID {
|
func (user *User) getDirectChats() map[id.UserID][]id.RoomID {
|
||||||
res := make(map[id.UserID][]id.RoomID)
|
res := make(map[id.UserID][]id.RoomID)
|
||||||
privateChats := user.bridge.DB.Portal.FindPrivateChats(user.GMID)
|
privateChats := user.bridge.DB.Portal.FindPrivateChats(user.GMID)
|
||||||
@ -768,78 +784,6 @@ func (user *User) getDirectChats() map[id.UserID][]id.RoomID {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func (user *User) getSpaceRoom(ptr *id.RoomID, name, topic string, parent id.RoomID) id.RoomID {
|
|
||||||
if len(*ptr) > 0 {
|
|
||||||
return *ptr
|
|
||||||
}
|
|
||||||
user.spaceCreateLock.Lock()
|
|
||||||
defer user.spaceCreateLock.Unlock()
|
|
||||||
if len(*ptr) > 0 {
|
|
||||||
return *ptr
|
|
||||||
}
|
|
||||||
|
|
||||||
initialState := []*event.Event{{
|
|
||||||
Type: event.StateRoomAvatar,
|
|
||||||
Content: event.Content{
|
|
||||||
Parsed: &event.RoomAvatarEventContent{
|
|
||||||
URL: user.bridge.Config.AppService.Bot.ParsedAvatar,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
|
|
||||||
if parent != "" {
|
|
||||||
parentIDStr := parent.String()
|
|
||||||
initialState = append(initialState, &event.Event{
|
|
||||||
Type: event.StateSpaceParent,
|
|
||||||
StateKey: &parentIDStr,
|
|
||||||
Content: event.Content{
|
|
||||||
Parsed: &event.SpaceParentEventContent{
|
|
||||||
Canonical: true,
|
|
||||||
Via: []string{user.bridge.AS.HomeserverDomain},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := user.bridge.Bot.CreateRoom(&mautrix.ReqCreateRoom{
|
|
||||||
Visibility: "private",
|
|
||||||
Name: name,
|
|
||||||
Topic: topic,
|
|
||||||
InitialState: initialState,
|
|
||||||
CreationContent: map[string]interface{}{
|
|
||||||
"type": event.RoomTypeSpace,
|
|
||||||
},
|
|
||||||
PowerLevelOverride: &event.PowerLevelsEventContent{
|
|
||||||
Users: map[id.UserID]int{
|
|
||||||
user.bridge.Bot.UserID: 9001,
|
|
||||||
user.MXID: 50,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
user.log.Errorln("Failed to auto-create space room", err)
|
|
||||||
} else {
|
|
||||||
*ptr = resp.RoomID
|
|
||||||
user.Update()
|
|
||||||
user.ensureInvited(user.bridge.Bot, resp.RoomID, true)
|
|
||||||
|
|
||||||
//if parent != "" {
|
|
||||||
// _, err = user.bridge.Bot.SendStateEvent(parent, event.StateSpaceChild, resp.RoomID.String(), &event.SpaceChildEventContent{
|
|
||||||
// Via: []string{user.bridge.AS.HomeserverDomain},
|
|
||||||
// Order: " 0000",
|
|
||||||
// })
|
|
||||||
// if err != nil {
|
|
||||||
// user.log.Error().Err(err).
|
|
||||||
// Str("created_space_id", resp.RoomID.String()).
|
|
||||||
// Str("parent_space_id", parent.String()).
|
|
||||||
// Msg("Failed to add created space room to parent space")
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
return *ptr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (user *User) updateAvatar(gmdi groupme.ID, avatarID *string, avatarURL *id.ContentURI, avatarSet *bool,
|
func (user *User) updateAvatar(gmdi groupme.ID, avatarID *string, avatarURL *id.ContentURI, avatarSet *bool,
|
||||||
log log.Logger, intent *appservice.IntentAPI) bool {
|
log log.Logger, intent *appservice.IntentAPI) bool {
|
||||||
return false
|
return false
|
||||||
|
Loading…
Reference in New Issue
Block a user