xatci/cmd/xatci/main.go

83 lines
2.0 KiB
Go

package main
import (
"flag"
"log"
"runtime/debug"
"time"
"github.com/facebookarchive/flagenv"
_ "github.com/joho/godotenv/autoload"
"github.com/matrix-org/gomatrix"
)
var (
username = flag.String("matrix-username", "xatci", "Matrix bot username")
password = flag.String("matrix-password", "hunter2", "Matrix bot password")
homeserver = flag.String("matrix-homeserver", "", "Matrix homeserver")
botName = flag.String("bot-name", "xatci", "Bot name")
)
func main() {
flagenv.Parse()
flag.Parse()
cli, err := gomatrix.NewClient(*homeserver, "", "")
if err != nil {
panic(err)
}
resp, err := cli.Login(&gomatrix.ReqLogin{
Type: "m.login.password",
User: *username,
Password: *password,
})
if err != nil {
panic(err)
}
cli.SetCredentials(resp.UserID, resp.AccessToken)
log.Printf("logged in as %s to %s", resp.UserID, *homeserver)
x := Xatci{Client: cli}
cli.Syncer.(*gomatrix.DefaultSyncer).OnEventType("m.room.member", func(event *gomatrix.Event) {
// If I was invited
if event.Content["membership"] == "invite" && *event.StateKey == cli.UserID {
if _, err := cli.JoinRoom(event.RoomID, "", nil); err != nil {
log.Printf("joining %s", event.RoomID)
log.Println("Join error: ", err)
}
}
})
cli.Syncer.(*gomatrix.DefaultSyncer).OnEventType("m.room.message", func(event *gomatrix.Event) {
// Tell the room if the callback went south
defer func() {
if r := recover(); r != nil {
log.Printf("%s: %s", r, debug.Stack())
cli.SendText(event.RoomID, "Argh! I panicked.")
}
}()
// If I did not send this message
if event.Sender != cli.UserID {
if body, ok := event.Body(); ok {
x.onText(event.RoomID, event.Sender, body)
}
}
})
for range time.Tick(250 * time.Millisecond) {
if err := cli.Sync(); err != nil {
log.Println("Sync error: ", err)
}
}
}
type Xatci struct {
*gomatrix.Client
}
func (x *Xatci) onText(roomID string, userID string, text string) {
log.Printf("%s: <%s> %s", roomID, userID, text)
}