83 lines
2.0 KiB
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)
|
|
}
|