85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"os"
|
||
|
"time"
|
||
|
|
||
|
"gitea.nulo.in/Nulo/zulip-checkin-cyborg/zulip"
|
||
|
"golang.org/x/exp/slices"
|
||
|
)
|
||
|
|
||
|
var bot zulip.Bot
|
||
|
var stream string
|
||
|
var message string
|
||
|
|
||
|
func main() {
|
||
|
bot.Url = os.Getenv("ZULIP_URL")
|
||
|
if len(bot.Url) == 0 {
|
||
|
log.Fatalln("Falta ZULIP_URL")
|
||
|
}
|
||
|
bot.Email = os.Getenv("ZULIP_BOT_EMAIL")
|
||
|
if len(bot.Email) == 0 {
|
||
|
log.Fatalln("Falta ZULIP_BOT_EMAIL")
|
||
|
}
|
||
|
bot.Key = os.Getenv("ZULIP_BOT_KEY")
|
||
|
if len(bot.Key) == 0 {
|
||
|
log.Fatalln("Falta ZULIP_BOT_KEY")
|
||
|
}
|
||
|
stream = os.Getenv("ZULIP_STREAM")
|
||
|
if len(stream) == 0 {
|
||
|
stream = "check-in bot test"
|
||
|
}
|
||
|
message = os.Getenv("ZULIP_MESSAGE")
|
||
|
if len(message) == 0 {
|
||
|
message = "prueba de mensaje"
|
||
|
}
|
||
|
|
||
|
cycle()
|
||
|
}
|
||
|
|
||
|
func cycle() {
|
||
|
now := time.Now()
|
||
|
lastWeek := now.Add(-time.Hour * 24 * time.Duration(now.Weekday()-time.Monday))
|
||
|
err := createIfNotExists(lastWeek.Format("semana 2006-01-02"))
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
|
||
|
time.Sleep(time.Hour * 5)
|
||
|
cycle()
|
||
|
}
|
||
|
|
||
|
func createIfNotExists(topicName string) (err error) {
|
||
|
streamId, err := bot.GetStreamId(stream)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
topics, err := bot.GetStreamTopics(streamId)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
names := mapSlice(topics, func(t zulip.GetStreamTopicsResStream) string {
|
||
|
return t.Name
|
||
|
})
|
||
|
|
||
|
if slices.Contains(names, topicName) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = bot.SendMessage(stream, topicName, message)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// https://gosamples.dev/generics-map-function/
|
||
|
func mapSlice[T any, M any](a []T, f func(T) M) []M {
|
||
|
n := make([]M, len(a))
|
||
|
for i, e := range a {
|
||
|
n[i] = f(e)
|
||
|
}
|
||
|
return n
|
||
|
}
|