package main import ( "fmt" "log" "time" "maunium.net/go/mautrix" ) type nunWatch struct { fail int curPost post stop chan bool client *mautrix.Client timer int } func newNunWatch(stop chan bool, c *mautrix.Client, t int) *nunWatch { return &nunWatch{0, post{}, stop, c, t} } func (n *nunWatch) SetTimer(t int) { n.timer = t n.fail = 0 } func (n *nunWatch) Main() { ticker := time.NewTicker(time.Duration(n.timer) * time.Minute) curT := n.timer for { select { case <-n.stop: return case <-ticker.C: newPost, err := getNewestPost("LittleNuns") if err != nil { log.Printf("error getting newest post: %v", err) log.Println("skipping this cycle, incrementing fail count") n.fail++ if n.fail > 5 { log.Fatal("fail count too high; ending loop") return } else if n.fail > 3 { log.Printf("over three failures, increasing tick time to %v minutes", 3*n.timer) ticker.Reset(3 * time.Duration(n.timer) * time.Minute) break } else { log.Printf("fail count %v", n.fail) break } } n.fail = 0 ticker.Reset(time.Duration(n.timer) * time.Minute) if curT != n.timer { log.Println("updating nunwatch timer") ticker.Reset(time.Duration(n.timer) * time.Minute) n.fail = 0 curT = n.timer } if n.curPost.Title != newPost.Title { n.curPost = newPost var cur post err := n.client.GetAccountData("nun.newest", &cur) if err != nil { log.Printf("tried to get saved account data but failed %v", err) cur.Number = 0 } roomResp, err := n.client.JoinedRooms() if err != nil { log.Printf("error getting joined rooms: %v", err) break } rooms := roomResp.JoinedRooms for _, room := range rooms { log.Printf("posting %v", n.curPost.Number) if n.curPost.Number != cur.Number { n.client.SendText(room, fmt.Sprintf("%v\n%v", n.curPost.Title, n.curPost.Link)) if n.curPost.Number > 0 { err := n.client.SetAccountData("nun.newest", n.curPost) if err != nil { log.Printf("error saving current post: %v", err) } } } } } } } }