diff options
Diffstat (limited to 'appservice/account.go')
-rw-r--r-- | appservice/account.go | 148 |
1 files changed, 146 insertions, 2 deletions
diff --git a/appservice/account.go b/appservice/account.go index 533e01e..4316362 100644 --- a/appservice/account.go +++ b/appservice/account.go @@ -1,6 +1,10 @@ package appservice import ( + "fmt" + "log" + + "git.deuxfleurs.fr/Deuxfleurs/easybridge/mxlib" . "git.deuxfleurs.fr/Deuxfleurs/easybridge/connector" ) @@ -12,11 +16,31 @@ type Account struct { } func (a *Account) Joined(roomId RoomID) { - // TODO + mx_room_id, err := dbGetMxRoom(a.Protocol, roomId) + if err != nil { + return + } + + log.Printf("Joined %s (%s)\n", roomId, a.MatrixUser) + + err = mxRoomInvite(mx_room_id, a.MatrixUser) + if err != nil { + log.Printf("Could not invite %s to %s", a.MatrixUser, mx_room_id) + } } func (a *Account) Left(roomId RoomID) { - // TODO + mx_room_id, err := dbGetMxRoom(a.Protocol, roomId) + if err != nil { + return + } + + log.Printf("Joined %s (%s)\n", roomId, a.MatrixUser) + + err = mxRoomKick(mx_room_id, a.MatrixUser, fmt.Sprintf("got leave room event on %s", a.Protocol)) + if err != nil { + log.Printf("Could not invite %s to %s", a.MatrixUser, mx_room_id) + } } func (a *Account) UserInfoUpdated(user UserID, info *UserInfo) { @@ -28,5 +52,125 @@ func (a *Account) RoomInfoUpdated(roomId RoomID, info *RoomInfo) { } func (a *Account) Event(event *Event) { + mx_user_id, err := dbGetMxUser(a.Protocol, event.Author) + if err != nil { + return + } + + if event.Type == EVENT_JOIN { + log.Printf("%s join %s %s", a.Protocol, event.Author, event.Room) + mx_room_id, err := dbGetMxRoom(a.Protocol, event.Room) + if err != nil { + return + } + + err = mxRoomInvite(mx_room_id, mx_user_id) + if err != nil { + log.Printf("Could not invite %s to %s", a.MatrixUser, mx_room_id) + } + + err = mxRoomJoinAs(mx_room_id, mx_user_id) + if err != nil { + log.Printf("Could not join %s as %s", a.MatrixUser, mx_room_id) + } + } else if event.Type == EVENT_LEAVE { + log.Printf("%s join %s %s", a.Protocol, event.Author, event.Room) + mx_room_id, err := dbGetMxRoom(a.Protocol, event.Room) + if err != nil { + return + } + + err = mxRoomLeaveAs(mx_room_id, mx_user_id) + if err != nil { + log.Printf("Could not leave %s as %s", a.MatrixUser, mx_room_id) + } + } else if event.Type == EVENT_MESSAGE { + if len(event.Room) > 0 { + log.Printf("%s msg %s %s", a.Protocol, event.Author, event.Room) + mx_room_id, err := dbGetMxRoom(a.Protocol, event.Room) + if err != nil { + return + } + + err = mxSendMessageAs(mx_room_id, event.Text, mx_user_id) + if err != nil { + log.Printf("Could not send %s as %s", event.Text, mx_user_id) + } + } else { + // TODO + } + } // TODO } + +// ---- + +func dbGetMxRoom(protocol string, roomId RoomID) (string, error) { + var room DbRoomMap + + // Check if room exists in our mapping, + // If not create it + must_create := db.First(&room, DbRoomMap{ + Protocol: protocol, + RoomID: roomId, + }).RecordNotFound() + if must_create { + alias := roomAlias(protocol, roomId) + // Lookup alias + mx_room_id, err := mxDirectoryRoom(fmt.Sprintf("#%s:%s", alias, config.MatrixDomain)) + + // If no alias found, create room + if err != nil { + name := fmt.Sprintf("%s (%s)", roomId, protocol) + + mx_room_id, err = mxCreateRoom(name, alias, []string{}) + if err != nil { + log.Printf("Could not create room for %s: %s", name, err) + return "", err + } + } + + room = DbRoomMap{ + Protocol: protocol, + RoomID: roomId, + MxRoomID: mx_room_id, + } + db.Create(&room) + } + log.Printf("Got room id: %s", room.MxRoomID) + + return room.MxRoomID, nil +} + +func dbGetMxUser(protocol string, userId UserID) (string, error) { + var user DbUserMap + + must_create := db.First(&user, DbUserMap{ + Protocol: protocol, + UserID: userId, + }).RecordNotFound() + if must_create { + username := userMxId(protocol, userId) + + err := mxRegisterUser(username) + if err != nil { + if mxE, ok := err.(*mxlib.MxError); !ok || mxE.ErrCode != "M_USER_IN_USE" { + log.Printf("Could not register %s: %s", username, err) + return "", err + } + } + + mxid := fmt.Sprintf("@%s:%s", username, config.MatrixDomain) + mxProfileDisplayname(mxid, fmt.Sprintf("%s (%s)", userId, protocol)) + + user = DbUserMap{ + Protocol: protocol, + UserID: userId, + MxUserID: mxid, + } + db.Create(&user) + } + + return user.MxUserID, nil +} + |