aboutsummaryrefslogtreecommitdiff
path: root/appservice/account.go
diff options
context:
space:
mode:
Diffstat (limited to 'appservice/account.go')
-rw-r--r--appservice/account.go148
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
+}
+