package appservice import ( "fmt" log "github.com/sirupsen/logrus" . "git.deuxfleurs.fr/Deuxfleurs/easybridge/connector" ) type Account struct { MatrixUser string AccountName string Protocol string Conn Connector JoinedRooms map[RoomID]bool } var registeredAccounts = map[string]map[string]*Account{} func AddAccount(a *Account) { if _, ok := registeredAccounts[a.MatrixUser]; !ok { registeredAccounts[a.MatrixUser] = make(map[string]*Account) } registeredAccounts[a.MatrixUser][a.AccountName] = a } func FindAccount(mxUser string, name string) *Account { if u, ok := registeredAccounts[mxUser]; ok { if a, ok := u[name]; ok { return a } } return nil } func FindJoinedAccount(mxUser string, protocol string, room RoomID) *Account { if u, ok := registeredAccounts[mxUser]; ok { for _, acct := range u { if acct.Protocol == protocol { if j, ok := acct.JoinedRooms[room]; ok && j { return acct } } } } return nil } func RemoveAccount(mxUser string, name string) { if u, ok := registeredAccounts[mxUser]; ok { delete(u, name) } } // ---- func (a *Account) Joined(roomId RoomID) { a.JoinedRooms[roomId] = true 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) { delete(a.JoinedRooms, roomId) 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) { mx_user_id, err := dbGetMxUser(a.Protocol, user) if err != nil { return } if info.DisplayName != "" { mxProfileDisplayname(mx_user_id, fmt.Sprintf("%s (%s)", info.DisplayName, a.Protocol)) } if info.Avatar != nil { // TODO } } func (a *Account) RoomInfoUpdated(roomId RoomID, author UserID, info *RoomInfo) { mx_room_id, err := dbGetMxRoom(a.Protocol, roomId) if err != nil { return } as_mxid := ezbrMxId() if len(author) > 0 { mx_user_id, err := dbGetMxUser(a.Protocol, author) if err == nil { as_mxid = mx_user_id } } if info.Topic != "" { mxRoomTopicAs(mx_room_id, info.Topic, as_mxid) } if info.Name != "" { mxRoomNameAs(mx_room_id, info.Name, as_mxid) } if info.Picture != nil { // TODO } } 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 { log.Printf("%s msg %s %s", a.Protocol, event.Author, event.Room) mx_room_id := "" if len(event.Room) > 0 { mx_room_id, err = dbGetMxRoom(a.Protocol, event.Room) if err != nil { return } } else { mx_room_id, err = dbGetMxPmRoom(a.Protocol, event.Author, mx_user_id, a.MatrixUser, a.AccountName) if err != nil { return } } typ := "m.text" if event.Type == EVENT_ACTION { typ = "m.emote" } err = mxSendMessageAs(mx_room_id, typ, event.Text, mx_user_id) if err != nil { log.Printf("Could not send %s as %s", event.Text, mx_user_id) } } }