package main import ( "fmt" "log" "time" "maunium.net/go/mautrix" ) type Config struct { Userid string Server string Token string Owner string } type Bot struct { Client *mautrix.Client Rooms map[string]int Conf *Config } func main() { c := &Config{ Userid: "@testbot:saintnet.tech", Server: "matrix.saintnet.tech", Token: "MDAxYmxvY2F0aW9uIHNhaW50bmV0LnRlY2gKMDAxM2lkZW50aWZpZXIga2V5CjAwMTBjaWQgZ2VuID0gMQowMDI5Y2lkIHVzZXJfaWQgPSBAdGVzdGJvdDpzYWludG5ldC50ZWNoCjAwMTZjaWQgdHlwZSA9IGFjY2VzcwowMDIxY2lkIG5vbmNlID0gemlKZGs9bmJhcjp1eThIXgowMDJmc2lnbmF0dXJlIE4x0sbUS9lN-fi0KjJmEmpx6_wpYzgvk4k2Eugtkva7Cg", Owner: "@stryan:saintnet.tech", } b := NewBot(c) syncer := NewCustomSyncer("@testbot:saintnet.tech", b.Client.Store) syncer.OnEventType(mautrix.EventMessage, b.handleMessage) syncer.OnEventType(mautrix.StateMember, b.handleMember) b.Client.Syncer = syncer go func() { err := b.Client.Sync() if err != nil { log.Fatal(err) } }() fmt.Println("Syncing enabled") resp, err := b.Client.JoinedRooms() if err != nil { log.Fatal(err) } for _, v := range resp.JoinedRooms { //fmt.Printf("Bot is in Room %v\n", v) mem, err := b.Client.JoinedMembers(v) if err != nil { log.Fatal(err) } if len(mem.Joined) > 1 { b.Rooms[v] = len(mem.Joined) fmt.Printf("Bot is in Room %v\n", v) } else { _, err := b.Client.LeaveRoom(v) if err != nil { log.Fatal(err) } _, err = b.Client.ForgetRoom(v) if err != nil { log.Fatal(err) } fmt.Printf("Bot was in Room %v, left due to being last one there\n", v) } } fmt.Println("Begining main loop") for { time.Sleep(2 * time.Second) fmt.Println("Checking") } } func NewBot(c *Config) *Bot { client, err := mautrix.NewClient(c.Server, c.Userid, c.Token) if err != nil { log.Fatal(err) } b := &Bot{Client: client, Rooms: make(map[string]int), Conf: c} return b } func (b *Bot) handleMessage(e *mautrix.Event) { if e.Sender == b.Conf.Userid { return //we don't care about our own messages } body := e.Content.Body _, err := b.Client.SendText(e.RoomID, body) if err != nil { log.Fatal(err) } } func (b *Bot) handleMember(e *mautrix.Event) { mbr := e.Content.Membership if mbr == mautrix.MembershipInvite { if e.Sender == b.Conf.Owner && e.GetStateKey() == b.Conf.Userid { fmt.Println("Joining room:", e.RoomID) _, err := b.Client.JoinRoom(e.RoomID, "", nil) if err != nil { log.Fatal(err) } } } if mbr == mautrix.MembershipJoin { log.Println("A user joined a room we care about") b.Rooms[e.RoomID] = b.Rooms[e.RoomID] + 1 } if mbr == mautrix.MembershipLeave && e.Sender != b.Conf.Userid { b.Rooms[e.RoomID] = b.Rooms[e.RoomID] - 1 if b.Rooms[e.RoomID] < 2 { log.Println("Last in room, leaving") _, err := b.Client.LeaveRoom(e.RoomID) if err != nil { log.Fatal(err) } _, err = b.Client.ForgetRoom(e.RoomID) if err != nil { log.Fatal(err) } } } }