package main import ( "fmt" "log" "time" "github.com/spf13/viper" "maunium.net/go/mautrix" "maunium.net/go/mautrix/event" ) var Homeserver string var Username string var Password string var DimensionServer string var HomeserverDomain string func main() { viper.SetConfigName("config") viper.AddConfigPath(".") err := viper.ReadInConfig() if err != nil { log.Fatalf("Fatal error config file: %v \n", err) } viper.SetConfigType("yaml") Homeserver = viper.GetString("homeserver") viper.SetDefault("domain", Homeserver) Username = viper.GetString("username") Password = viper.GetString("password") DimensionServer = viper.GetString("dimension") HomeserverDomain = viper.GetString("domain") log.Println("Logging into", Homeserver, "as", Username) client, err := mautrix.NewClient(Homeserver, "", "") if err != nil { panic(err) } _, err = client.Login(&mautrix.ReqLogin{ Type: "m.login.password", Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: Username}, Password: Password, StoreCredentials: true, }) if err != nil { panic(err) } fmt.Println("Login successful") syncer := client.Syncer.(*mautrix.DefaultSyncer) syncer.OnEventType(event.EventMessage, func(source mautrix.EventSource, evt *event.Event) { fmt.Printf("<%[1]s> %[4]s (%[2]s/%[3]s)\n", evt.Sender, evt.Type.String(), evt.ID, evt.Content.AsMessage().Body) }) syncer.OnEventType(event.StateMember, func(source mautrix.EventSource, evt *event.Event) { fmt.Printf("<%[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() { _, err = client.JoinRoomByID(evt.RoomID) if err != nil { fmt.Printf("error joining room %v", evt.RoomID) } else { fmt.Println("joined room") } } }) var vtubersRaw []VtuberConfig var vtubers []*Vtuber err = viper.UnmarshalKey("vtubers", &vtubersRaw) if err != nil { panic(err) } for _, vt := range vtubersRaw { log.Printf("adding vtuber %v", vt) vtubers = append(vtubers, NewVtuber(vt.Name, vt.ChannelID, vt.LiveMsg)) } go func() { for { time.Sleep(30 * time.Second) roomResp, err := client.JoinedRooms() if err != nil { log.Println("error gettting joined rooms") } rooms := roomResp.JoinedRooms // We're going to assume they're only stream one video at a time for _, v := range vtubers { v.Update() if v.IsLive() { for _, room := range rooms { //check to see if already embeded var content YoutubeWidget err = client.StateEvent(room, event.NewEventType("im.vector.modular.widgets"), "dimension-m.video-simp-"+v.Name, &content) if content.ID == "" { client.SendText(room, v.LiveMsg) resp, err := client.SendStateEvent(room, event.NewEventType("im.vector.modular.widgets"), "dimension-m.video-simp-"+v.Name, NewYT(v.Name+"'s stream", v.CurrentStream, string(room))) if err != nil { log.Println("error embeding video") log.Println(err) } log.Printf("Embed event %v", resp) } } } else { //Not live, check to see if there's any embeds and remove them for _, room := range rooms { var content YoutubeWidget err = client.StateEvent(room, event.NewEventType("im.vector.modular.widgets"), "dimension-m.video-simp-"+v.Name, &content) if err == nil && content.ID != "" { //event found, kill it resp, err := client.SendStateEvent(room, event.NewEventType("im.vector.modular.widgets"), "dimension-m.video-simp-"+v.Name, struct{}{}) if err != nil { log.Println("error removed video embed") log.Println(err) } log.Printf("Emebed remove %v", resp) } } } } } }() err = client.Sync() if err != nil { panic(err) } }