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) }