aboutsummaryrefslogblamecommitdiff
path: root/appservice/account.go
blob: ae9716fe0a35ce18e906c8b42efb701dd75756e2 (plain) (tree)
1
2
3
4
5
6
7


                  
             

                                        
 







                                                             






































                                                                              

 

       
                                         

                                    










                                                                                 


                                       

                                     










                                                                                                         





                                                                
















                                                                                           



                                       































                                                                                         



                                                                                
                                        
                                                                             


                                       

                                                                                                                          
                                       
                                      
                         









                                                                                     

                 
 
 
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) {
	// 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 := fmt.Sprintf("@%s:%s", registration.SenderLocalpart, config.MatrixDomain)
	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)
	}
	// 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)
		}
	}
}