125 lines
3.8 KiB
Go
125 lines
3.8 KiB
Go
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)
|
|
}
|
|
}
|