From 23c5e89c4fa109d3b2cac7cef217bd8333f034f5 Mon Sep 17 00:00:00 2001 From: Karmanyaah Malhotra Date: Fri, 30 Apr 2021 17:21:13 -0400 Subject: [PATCH] dms kind work --- database/portal.go | 24 +++++++++++++++++++++++- database/statestore.go | 5 ++++- portal.go | 6 +++++- puppet.go | 12 +++++++----- user.go | 8 +++++++- 5 files changed, 46 insertions(+), 9 deletions(-) diff --git a/database/portal.go b/database/portal.go index 3beb5dd..54a89c5 100644 --- a/database/portal.go +++ b/database/portal.go @@ -17,6 +17,9 @@ package database import ( + "strconv" + "strings" + "gorm.io/gorm" log "maunium.net/go/maulogger/v2" "maunium.net/go/mautrix/id" @@ -31,6 +34,25 @@ type PortalKey struct { Receiver types.GroupMeID `gorm:"primaryKey"` } +func ParsePortalKey(inp types.GroupMeID) *PortalKey { + parts := strings.Split(inp, "+") + + if len(parts) != 2 { + return nil + } + if i, err := strconv.Atoi(parts[0]); i == 0 || err != nil { + return nil + } + if i, err := strconv.Atoi(parts[1]); i == 0 || err != nil { + return nil + } + + return &PortalKey{ + JID: parts[0], + Receiver: parts[1], + } +} + func GroupPortalKey(jid types.GroupMeID) PortalKey { return PortalKey{ JID: jid, @@ -49,7 +71,7 @@ func (key PortalKey) String() string { if key.Receiver == key.JID { return key.JID } - return key.JID + "-" + key.Receiver + return key.JID + "+" + key.Receiver } func (key PortalKey) IsPrivate() bool { diff --git a/database/statestore.go b/database/statestore.go index 280c24d..0b50565 100644 --- a/database/statestore.go +++ b/database/statestore.go @@ -150,7 +150,10 @@ func (store *SQLStateStore) TryGetMember(roomID id.RoomID, userID id.UserID) (*e } func (store *SQLStateStore) TryGetMemberRaw(roomID id.RoomID, userID id.UserID) (user MxUserProfile, err bool) { - ans := store.db.Where("room_id = ? AND user_id = ?", roomID, userID).Limit(1).Find(&user) + user.RoomID = roomID.String() + user.UserID = userID.String() + + ans := store.db.Limit(1).Find(&user) if ans.Error == gorm.ErrRecordNotFound { err = true diff --git a/portal.go b/portal.go index e7c43a5..6e6b995 100644 --- a/portal.go +++ b/portal.go @@ -941,6 +941,8 @@ func (portal *Portal) CreateMatrixRoom(user *User) error { portal.log.Infoln("Creating Matrix room. Info source:", user.MXID) var metadata *groupme.Group + fmt.Println(portal.IsPrivateChat(), portal.Key, portal.Key.Receiver, portal.Key.JID) + return nil if portal.IsPrivateChat() { puppet := portal.bridge.GetPuppetByJID(portal.Key.JID) meta, err := portal.bridge.StateStore.TryGetMemberRaw("", puppet.MXID) @@ -967,8 +969,10 @@ func (portal *Portal) CreateMatrixRoom(user *User) error { if err == nil { portal.Name = metadata.Name portal.Topic = metadata.Description + portal.UpdateAvatar(user, metadata.ImageURL, false) + } else { + portal.log.Warnln("Cannot fetch group metadata for new portal") } - portal.UpdateAvatar(user, metadata.ImageURL, false) } bridgeInfoStateKey, bridgeInfo := portal.getBridgeInfo() diff --git a/puppet.go b/puppet.go index ed56a9f..6dd2730 100644 --- a/puppet.go +++ b/puppet.go @@ -189,6 +189,10 @@ func (puppet *Puppet) DefaultIntent() *appservice.IntentAPI { func (puppet *Puppet) UpdateAvatar(source *User, portalMXID id.RoomID, avatar string) bool { memberRaw, _ := puppet.bridge.StateStore.TryGetMemberRaw(portalMXID, puppet.MXID) //TODO Handle + if memberRaw.Avatar == avatar { + return false // up to date + } + if len(avatar) == 0 { var err error err = puppet.DefaultIntent().SetRoomAvatarURL(portalMXID, id.ContentURI{}) @@ -206,10 +210,6 @@ func (puppet *Puppet) UpdateAvatar(source *User, portalMXID id.RoomID, avatar st return true } - if memberRaw.Avatar == avatar { - return false // up to date - } - //TODO check its actually groupme? image, mime, err := groupmeExt.DownloadImage(avatar + ".large") if err != nil { @@ -241,13 +241,15 @@ func (puppet *Puppet) UpdateName(source *User, portalMXID id.RoomID, contact gro memberRaw, _ := puppet.bridge.StateStore.TryGetMemberRaw(portalMXID, puppet.MXID) //TODO Handle quality = quality //quality not used - if memberRaw.DisplayName != newName { //&& quality >= puppet.NameQuality[portalMXID] { + + if memberRaw.DisplayName != newName { //&& quality >= puppet.NameQuality[portalMXID] { var err error err = puppet.DefaultIntent().SetRoomDisplayName(portalMXID, newName) if err == nil { memberRaw.DisplayName = newName // puppet.NameQuality[portalMXID] = quality + puppet.bridge.StateStore.SetMemberRaw(&memberRaw) //TODO handle; maybe .Update() ? go puppet.updatePortalName() } else { diff --git a/user.go b/user.go index cba398c..597f083 100644 --- a/user.go +++ b/user.go @@ -914,12 +914,18 @@ func (user *User) handleMessageLoop() { func (user *User) HandleTextMessage(message groupme.Message) { var group bool var id string + if message.GroupID.String() != "" { group = true id = message.GroupID.String() } else if message.ConversationID.String() != "" { group = false - id = message.ConversationID.String() + pk := database.ParsePortalKey(message.ConversationID.String()) + if pk == nil { + user.log.Errorln("Error parsing conversationid/portalkey", message.ConversationID.String(), "ignoring message") + return + } + id = pk.JID } else { user.log.Errorln("Message received without conversation or groupid") return