aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--appservice/db.go18
-rw-r--r--appservice/server.go31
2 files changed, 39 insertions, 10 deletions
diff --git a/appservice/db.go b/appservice/db.go
index cbd1d11..e5b2d02 100644
--- a/appservice/db.go
+++ b/appservice/db.go
@@ -182,3 +182,21 @@ func dbGetMxUser(protocol string, userId connector.UserID) (string, error) {
return user.MxUserID, nil
}
+
+func dbIsPmRoom(mxRoomId string) *DbPmRoomMap {
+ var pm_room DbPmRoomMap
+ if db.First(&pm_room, DbPmRoomMap{MxRoomID: mxRoomId}).RecordNotFound() {
+ return nil
+ } else {
+ return &pm_room
+ }
+}
+
+func dbIsPublicRoom(mxRoomId string) *DbRoomMap {
+ var room DbRoomMap
+ if db.First(&room, DbRoomMap{MxRoomID: mxRoomId}).RecordNotFound() {
+ return nil
+ } else {
+ return &room
+ }
+}
diff --git a/appservice/server.go b/appservice/server.go
index 79a8f1a..00f23f1 100644
--- a/appservice/server.go
+++ b/appservice/server.go
@@ -107,11 +107,7 @@ func handleTxnEvent(e *mxlib.Event) {
}
// Look up if this is a private message room
- var pm_room DbPmRoomMap
- is_pm_room := !db.First(&pm_room, DbPmRoomMap{
- MxRoomID: e.RoomId,
- }).RecordNotFound()
- if is_pm_room {
+ if pm_room := dbIsPmRoom(e.RoomId); pm_room != nil {
acct := FindAccount(pm_room.MxUserID, pm_room.AccountName)
if acct != nil && e.Sender == pm_room.MxUserID {
ev.Author = acct.Conn.User()
@@ -121,11 +117,7 @@ func handleTxnEvent(e *mxlib.Event) {
}
// Look up if this is a regular room
- var room DbRoomMap
- is_room := !db.First(&room, DbRoomMap{
- MxRoomID: e.RoomId,
- }).RecordNotFound()
- if is_room {
+ if room := dbIsPublicRoom(e.RoomId); room != nil {
acct := FindJoinedAccount(e.Sender, room.Protocol, room.RoomID)
if acct != nil {
ev.Author = acct.Conn.User()
@@ -133,5 +125,24 @@ func handleTxnEvent(e *mxlib.Event) {
acct.Conn.Send(ev)
}
}
+ } else if e.Type == "m.room.member" {
+ ms := e.Content["membership"].(string)
+ if ms == "leave" {
+ // If leaving a PM room, we must delete it
+ if pm_room := dbIsPmRoom(e.RoomId); pm_room != nil {
+ them_mx := userMxId(pm_room.Protocol, pm_room.UserID)
+ mxRoomLeaveAs(e.RoomId, them_mx)
+ db.Delete(pm_room)
+ }
+
+ // If leaving a public room, leave from server as well
+ if room := dbIsPublicRoom(e.RoomId); room != nil {
+ acct := FindJoinedAccount(e.Sender, room.Protocol, room.RoomID)
+ if acct != nil {
+ acct.Conn.Leave(room.RoomID)
+ // TODO: manage autojoin list, remove this room
+ }
+ }
+ }
}
}