package botlib import ( "fmt" "log" "os" "maunium.net/go/mautrix" ) type Config struct { Userid string Server string Token string Name string Owner string Prefix string } type Bot struct { Client *mautrix.Client Rooms map[string]int Conf *Config ManagementRoomID string } 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, ManagementRoomID: "!fxioaRvcDbKKhCpHrZ:saintnet.tech"} return b } func (b *Bot) LeaveEmptyRooms() error { resp, err := b.Client.JoinedRooms() if err != nil { return err } for _, v := range resp.JoinedRooms { mem, err := b.Client.JoinedMembers(v) if err != nil { return err } if len(mem.Joined) > 1 { b.Rooms[v] = len(mem.Joined) log.Printf("%v is in Room %v\n", b.Conf.Name, v) } else { _, err := b.Client.LeaveRoom(v) if err != nil { return err } _, err = b.Client.ForgetRoom(v) if err != nil { return err } log.Printf("%v was in Room %v, left due to being last one there\n", b.Conf.Name, v) } } return nil } func (b *Bot) CreateManagementRoom() (string, error) { if b.ManagementRoomID != "" { log.Printf("%v already has management room %v\n", b.Conf.Name, b.ManagementRoomID) return "b.ManagementRoomID", nil } log.Printf("Creating Management Room for %v\n", b.Conf.Name) respCreateRoom, err := b.Client.CreateRoom(&mautrix.ReqCreateRoom{ Preset: "trusted_private_chat", Visibility: "private", Name: fmt.Sprintf("%v Control Room", b.Conf.Name), Invite: []string{b.Conf.Owner}, IsDirect: true, }) b.ManagementRoomID = respCreateRoom.RoomID if err != nil { return "", err } else { log.Printf("%v created management room %v\n", b.Conf.Name, respCreateRoom.RoomID) return respCreateRoom.RoomID, nil } } func (b *Bot) DefaultHandleMessage(e *mautrix.Event) { if e.Sender == b.Conf.Userid { return //we don't care about our own messages } body := e.Content.Body if body == "stop" { b.Client.SendText(e.RoomID, "Shutting down...") b.Client.StopSync() os.Exit(0) } _, err := b.Client.SendText(e.RoomID, body) if err != nil { log.Fatal(err) } } func (b *Bot) DefaultHandleMember(e *mautrix.Event) { mbr := e.Content.Membership if mbr == mautrix.MembershipInvite { if e.Sender == b.Conf.Owner && e.GetStateKey() == b.Conf.Userid { log.Printf("%v joining room: %v\n", b.Conf.Name, e.RoomID) _, err := b.Client.JoinRoom(e.RoomID, "", nil) if err != nil { log.Fatal(err) } } } if mbr == mautrix.MembershipJoin { log.Printf("A user joined a room %v cares about\n", b.Conf.Name) 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.Printf("%v is last in a room, leaving.\n", b.Conf.Name) _, err := b.Client.LeaveRoom(e.RoomID) if err != nil { log.Fatal(err) } _, err = b.Client.ForgetRoom(e.RoomID) if err != nil { log.Fatal(err) } } } }