diff --git a/main.go b/main.go index 8279d38..3568170 100644 --- a/main.go +++ b/main.go @@ -19,10 +19,12 @@ var GitCommit string func main() { log.Info("loading matrix client") - conf, err := mbl.LoadMatrixClientConfig("config.yaml") + cnffile := "config.yaml" + conf, err := mbl.LoadMatrixClientConfig(cnffile) if err != nil { log.Info("no local config found, checking /etc/simpbot") - conf, err = mbl.LoadMatrixClientConfig("/etc/simpbot/config.yaml") + cnffile = "/etc/simpbot/config.yaml" + conf, err = mbl.LoadMatrixClientConfig(cnffile) if err != nil { panic(err) } @@ -34,7 +36,7 @@ func main() { } log.Info("loading simpbot") - simp, err := newSimp("config.yaml", matrixClient) + simp, err := newSimp(cnffile, matrixClient) if err != nil { log.Fatal(err) } diff --git a/simp.go b/simp.go index 2ceb556..c25c18d 100644 --- a/simp.go +++ b/simp.go @@ -10,6 +10,7 @@ import ( mbl "git.saintnet.tech/stryan/matrixbotlib" "github.com/charmbracelet/log" + "golang.org/x/exp/slices" "gopkg.in/yaml.v2" "maunium.net/go/mautrix" "maunium.net/go/mautrix/event" @@ -134,6 +135,48 @@ func (s *simp) Sync() error { } } +func (s *simp) PopulateRoom(room id.RoomID) error { + log.Info("updating room", "room", room) + for _, v := range s.State.vtubers { + log.Printf("Updating vtuber %v", v.Name) + if v.IsLive() { + if v.AnnounceLive { + s.State.client.SendText(room, v.LiveMsg) + } else { + if isValidURL(v.LiveMsg) { + s.State.client.SendNotice(room, fmt.Sprintf("%v has gone live", v.Name)) + } else { + s.State.client.SendNotice(room, v.LiveMsg) + } + } + s.State.client.SendNotice(room, fmt.Sprintf("%v's Title: %v", v.Name, v.CurrentStreamTitle)) + var subs string + for k := range v.Subs { + subs += k.String() + " " + } + if len(v.Subs) > 0 { + s.State.client.SendText(room, fmt.Sprintf("Pinging %v", subs)) + } + resp, err := s.State.client.SendStateEvent( + room, + event.NewEventType("im.vector.modular.widgets"), + "dimension-m.video-simp-"+v.Name, + s.NewYT(v.Name+"'s stream", v.CurrentStream, string(room)), + ) + if err != nil { + return err + } + v.TotalStreams = v.TotalStreams + 1 + s.State.currStream++ + if s.State.currStream > s.State.maxStream { + s.State.maxStream = s.State.currStream + } + log.Info("Embed stream added", "event", resp, "vtuber", v.Name) + } + } + return nil +} + func (s *simp) Update(v *Vtuber) error { for _, room := range s.State.rooms { if v.IsLive() { @@ -197,6 +240,7 @@ func (s *simp) Run() { func (s *simp) SetupMatrix() error { mbl.SetupAccountDataStore(s.State.client, "s.batch") syncer := s.State.client.Syncer.(*mautrix.DefaultSyncer) + uid := s.State.client.UserID.String() syncer.OnEventType(event.EventMessage, func(source mautrix.EventSource, evt *event.Event) { if evt.Sender == s.State.client.UserID { return // ignore events from self @@ -269,8 +313,10 @@ func (s *simp) SetupMatrix() error { } }) syncer.OnEventType(event.StateMember, func(source mautrix.EventSource, evt *event.Event) { - log.Infof("<%[1]s> %[4]s (%[2]s/%[3]s)\n", evt.Sender, evt.Type.String(), evt.ID, evt.Content.AsMessage().Body) - if evt.Content.AsMember().Membership.IsInviteOrJoin() { + //log.Infof("<%[1]s> %[4]s (%[2]s/%[3]s)", evt.Sender, evt.Type.String(), evt.ID, evt.Content.AsMessage().Body) + mevt := evt.Content.AsMember() + log.Printf("FBL %v", mevt.Membership) + if mevt.Membership == event.MembershipInvite { _, err := s.State.client.JoinRoomByID(evt.RoomID) if err != nil { log.Errorf("error joining room %v", evt.RoomID) @@ -278,6 +324,16 @@ func (s *simp) SetupMatrix() error { log.Infof("joined room %v", evt.RoomID) s.State.rooms = append(s.State.rooms, evt.RoomID) } + } else if evt.Content.AsMember().Membership.IsLeaveOrBan() { + if evt.StateKey != nil && *evt.StateKey == uid { + log.Infof("leaving room %v", evt.RoomID) + index := slices.Index(s.State.rooms, evt.RoomID) + if index != -1 { + slices.Delete(s.State.rooms, index, index) + } else { + log.Warn("asked to leave room not in memory: %v", evt.RoomID) + } + } } }) roomResp, err := s.State.client.JoinedRooms() @@ -285,6 +341,7 @@ func (s *simp) SetupMatrix() error { return err } s.State.rooms = roomResp.JoinedRooms + log.Infof("initial room count: %v", len(s.State.rooms)) return nil }