Fix and add things

* Fix user ID reservation in registration
* Fix some database things
* Add commands
* Add basic contact syncing and portal creation
* Add better error logging
This commit is contained in:
Tulir Asokan
2018-08-18 22:57:08 +03:00
parent edd4f817e4
commit a9124b89bd
13 changed files with 455 additions and 98 deletions

View File

@ -18,26 +18,49 @@ package main
import (
"maunium.net/go/gomatrix"
"maunium.net/go/mautrix-whatsapp/types"
"maunium.net/go/mautrix-appservice"
"maunium.net/go/maulogger"
"strings"
)
func (bridge *Bridge) HandleBotInvite(evt *gomatrix.Event) {
intent := bridge.AppService.BotIntent()
type MatrixHandler struct {
bridge *Bridge
as *appservice.AppService
log maulogger.Logger
cmd *CommandHandler
}
func NewMatrixHandler(bridge *Bridge) *MatrixHandler {
handler := &MatrixHandler{
bridge: bridge,
as: bridge.AppService,
log: bridge.Log.Sub("Matrix"),
cmd: NewCommandHandler(bridge),
}
bridge.EventProcessor.On(gomatrix.EventMessage, handler.HandleMessage)
bridge.EventProcessor.On(gomatrix.StateMember, handler.HandleMembership)
return handler
}
func (mx *MatrixHandler) HandleBotInvite(evt *gomatrix.Event) {
intent := mx.as.BotIntent()
resp, err := intent.JoinRoom(evt.RoomID, "", nil)
if err != nil {
bridge.Log.Debugln("Failed to join room", evt.RoomID, "with invite from", evt.Sender)
mx.log.Debugln("Failed to join room", evt.RoomID, "with invite from", evt.Sender)
return
}
members, err := intent.JoinedMembers(resp.RoomID)
if err != nil {
bridge.Log.Debugln("Failed to get members in room", resp.RoomID, "after accepting invite from", evt.Sender)
mx.log.Debugln("Failed to get members in room", resp.RoomID, "after accepting invite from", evt.Sender)
intent.LeaveRoom(resp.RoomID)
return
}
if len(members.Joined) < 2 {
bridge.Log.Debugln("Leaving empty room", resp.RoomID, "after accepting invite from", evt.Sender)
mx.log.Debugln("Leaving empty room", resp.RoomID, "after accepting invite from", evt.Sender)
intent.LeaveRoom(resp.RoomID)
return
}
@ -46,31 +69,49 @@ func (bridge *Bridge) HandleBotInvite(evt *gomatrix.Event) {
for mxid, _ := range members.Joined {
if mxid == intent.UserID || mxid == evt.Sender {
continue
} else if _, _, ok := bridge.ParsePuppetMXID(mxid); ok {
} else if _, _, ok := mx.bridge.ParsePuppetMXID(types.MatrixUserID(mxid)); ok {
hasPuppets = true
continue
}
bridge.Log.Debugln("Leaving multi-user room", resp.RoomID, "after accepting invite from", evt.Sender)
mx.log.Debugln("Leaving multi-user room", resp.RoomID, "after accepting invite from", evt.Sender)
intent.SendNotice(resp.RoomID, "This bridge is user-specific, please don't invite me into rooms with other users.")
intent.LeaveRoom(resp.RoomID)
return
}
if !hasPuppets {
user := bridge.GetUser(evt.Sender)
user.ManagementRoom = resp.RoomID
user.Update()
intent.SendNotice(user.ManagementRoom, "This room has been registered as your bridge management/status room.")
bridge.Log.Debugln(resp.RoomID, "registered as a management room with", evt.Sender)
user := mx.bridge.GetUser(types.MatrixUserID(evt.Sender))
user.SetManagementRoom(types.MatrixRoomID(resp.RoomID))
intent.SendNotice(string(user.ManagementRoom), "This room has been registered as your bridge management/status room.")
mx.log.Debugln(resp.RoomID, "registered as a management room with", evt.Sender)
}
}
func (bridge *Bridge) HandleMembership(evt *gomatrix.Event) {
bridge.Log.Debugln(evt.Content, evt.Content.Membership, evt.GetStateKey())
if evt.Content.Membership == "invite" && evt.GetStateKey() == bridge.AppService.BotMXID() {
bridge.HandleBotInvite(evt)
func (mx *MatrixHandler) HandleMembership(evt *gomatrix.Event) {
mx.log.Debugln(evt.Content, evt.Content.Membership, evt.GetStateKey())
if evt.Content.Membership == "invite" && evt.GetStateKey() == mx.as.BotMXID() {
mx.HandleBotInvite(evt)
}
}
func (bridge *Bridge) HandleMessage(evt *gomatrix.Event) {
func (mx *MatrixHandler) HandleMessage(evt *gomatrix.Event) {
roomID := types.MatrixRoomID(evt.RoomID)
user := mx.bridge.GetUser(types.MatrixUserID(evt.Sender))
if evt.Content.MsgType == gomatrix.MsgText {
commandPrefix := mx.bridge.Config.Bridge.CommandPrefix
hasCommandPrefix := strings.HasPrefix(evt.Content.Body, commandPrefix)
if hasCommandPrefix {
evt.Content.Body = strings.TrimLeft(evt.Content.Body[len(commandPrefix):], " ")
}
if hasCommandPrefix || roomID == user.ManagementRoom {
mx.cmd.Handle(roomID, user, evt.Content.Body)
return
}
}
portal := user.GetPortalByMXID(roomID)
if portal != nil {
portal.HandleMessage(evt)
}
}