diff --git a/matrix.go b/matrix.go index 42779e2..0e0bbeb 100644 --- a/matrix.go +++ b/matrix.go @@ -59,7 +59,6 @@ func (mx *MatrixHandler) HandleEncryption(evt *event.Event) { return } portal := mx.bridge.GetPortalByMXID(evt.RoomID) - mx.log.Debugln(portal) if portal != nil && !portal.Encrypted { mx.log.Debugfln("%s enabled encryption in %s", evt.Sender, evt.RoomID) portal.Encrypted = true diff --git a/portal.go b/portal.go index bb3c3ea..3f194b8 100644 --- a/portal.go +++ b/portal.go @@ -173,6 +173,7 @@ func (portal *Portal) handleMessageLoop() { portal.log.Debugln("Not creating portal room for incoming message as the message is too old.") continue } + portal.log.Debugln("Creating Matrix room from incoming message") err := portal.CreateMatrixRoom(msg.source) if err != nil { portal.log.Errorln("Failed to create portal room:", err) @@ -261,13 +262,19 @@ func (portal *Portal) markHandled(source *User, message *waProto.WebMessageInfo, } func (portal *Portal) startHandling(info whatsapp.MessageInfo) bool { - if portal.lastMessageTs > info.Timestamp+1 || - portal.isRecentlyHandled(info.Id) || - portal.isDuplicate(info.Id) { - return false + // TODO these should all be trace logs + if portal.lastMessageTs > info.Timestamp+1 { + portal.log.Debugfln("Not handling %s: message is older (%d) than last bridge message (%d)", info.Id, info.Timestamp, portal.lastMessageTs) + } else if portal.isRecentlyHandled(info.Id) { + portal.log.Debugfln("Not handling %s: message was recently handled", info.Id) + } else if portal.isDuplicate(info.Id) { + portal.log.Debugfln("Not handling %s: message is duplicate", info.Id) + } else { + portal.log.Debugfln("Starting handling of %s (ts: %d)", info.Id, info.Timestamp) + portal.lastMessageTs = info.Timestamp + return true } - portal.lastMessageTs = info.Timestamp - return true + return false } func (portal *Portal) finishHandling(source *User, message *waProto.WebMessageInfo, mxid id.EventID) { @@ -795,6 +802,9 @@ func (portal *Portal) CreateMatrixRoom(user *User) error { } portal.MXID = resp.RoomID portal.Update() + portal.bridge.portalsLock.Lock() + portal.bridge.portalsByMXID[portal.MXID] = portal + portal.bridge.portalsLock.Unlock() // We set the memberships beforehand to make sure the encryption key exchange in initial backfill knows the users are here. for _, user := range invite { @@ -1548,10 +1558,12 @@ func (portal *Portal) HandleMatrixRedaction(sender *User, evt *event.Event) { func (portal *Portal) Delete() { portal.Portal.Delete() + portal.bridge.portalsLock.Lock() delete(portal.bridge.portalsByJID, portal.Key) if len(portal.MXID) > 0 { delete(portal.bridge.portalsByMXID, portal.MXID) } + portal.bridge.portalsLock.Unlock() } func (portal *Portal) Cleanup(puppetsOnly bool) { diff --git a/user.go b/user.go index dcf52a7..e4c9b8a 100644 --- a/user.go +++ b/user.go @@ -145,8 +145,6 @@ func (user *User) GetPortals() []*Portal { portals := make([]*Portal, len(keys)) user.bridge.portalsLock.Lock() - defer user.bridge.portalsLock.Unlock() - for i, key := range keys { portal, ok := user.bridge.portalsByJID[key] if !ok { @@ -154,6 +152,7 @@ func (user *User) GetPortals() []*Portal { } portals[i] = portal } + user.bridge.portalsLock.Unlock() return portals }