package main import ( "fmt" "log" "time" "maunium.net/go/mautrix" ) type nunWatch struct { fail int curPost post stop chan bool client *mautrix.Client } func newNunWatch(stop chan bool, c *mautrix.Client) *nunWatch { return &nunWatch{0, post{}, stop, c} } func (n *nunWatch) Main() { ticker := time.NewTicker(30 * time.Second) for { select { case <-n.stop: return case <-ticker.C: if n.fail > 5 { log.Fatal("fail count too high; ending loop") return } if n.fail > 3 { log.Println("over three failures, increasing tick time to 5 minutes") ticker.Reset(5 * time.Minute) continue } 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++ continue } if n.fail != 0 { n.fail = 0 ticker.Reset(30 * time.Second) } if n.curPost.Title != newPost.Title { n.curPost = newPost roomResp, err := n.client.JoinedRooms() if err != nil { log.Printf("error getting joined rooms: %v", err) continue } rooms := roomResp.JoinedRooms for _, room := range rooms { n.client.SendText(room, fmt.Sprintf("%v\n%v", n.curPost.Title, n.curPost.Link)) } } } } }