all repos — cameraman @ 83d7e0c51439a2c4916cea870c2f687961610154

notify.go (view raw)

 1package main
 2
 3import (
 4	"fmt"
 5	"log"
 6	"os"
 7	"time"
 8
 9	"github.com/go-resty/resty/v2"
10)
11
12var notificationWindow = 3
13
14func notifyTelegram(occurrence Occurrence) {
15	client := resty.New()
16	telegramToken := os.Getenv("TELEGRAM_BOT_TOKEN")
17	chatID := os.Getenv("TELEGRAM_CHAT_ID")
18	threadID := os.Getenv("TELEGRAM_THREAD_ID")
19
20	message := fmt.Sprintf("*Giorno %02d/%02d*:\n\n_%s_\n%s",
21		occurrence.Day, occurrence.Month, occurrence.Name, occurrence.Description)
22
23	url := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", telegramToken)
24
25	// Create the payload
26	payload := map[string]interface{}{
27		"message_thread_id": threadID,
28		"chat_id":           chatID,
29		"text":              message,
30		"parse_mode":        "markdown",
31	}
32
33	// Send the POST request
34	resp, err := client.R().
35		SetHeader("Content-Type", "application/json").
36		SetBody(payload).
37		Post(url)
38
39	if err != nil {
40		log.Printf("Failed to send notification: %v", err)
41		return
42	}
43	log.Printf("Notification sent: %s, Response: %s", message, resp)
44}
45
46func resetNotifications() {
47	if err := db.Model(&Occurrence{}).Where("notified = ?", true).Update("notified", false).Error; err != nil {
48		log.Printf("Failed to reset notifications: %v", err)
49	} else {
50		log.Println("Notifications have been reset for the new year.")
51	}
52}
53
54func CheckOccurrences() {
55	const sleepDuration = 12 * time.Hour
56
57	for {
58		now := time.Now()
59		var occurrences []Occurrence
60		endWindow := now.AddDate(0, 0, notificationWindow)
61
62		db.Where("notified = ? AND ((month = ? AND day >= ?) OR (month = ? AND day <= ?))",
63			false, now.Month(), now.Day(), endWindow.Month(), endWindow.Day()).Find(&occurrences)
64
65		for _, occurrence := range occurrences {
66			occurrenceDate := time.Date(now.Year(), time.Month(occurrence.Month), occurrence.Day, 0, 0, 0, 0, time.Local)
67			if occurrenceDate.Before(now) || occurrenceDate.After(endWindow) {
68				continue
69			}
70
71			if occurrence.Notify {
72				notifyTelegram(occurrence)
73				occurrence.Notified = true
74				db.Save(&occurrence)
75			}
76		}
77
78		// Check if New Year's Eve is within the next sleep cycle
79		nextCheck := now.Add(sleepDuration)
80		if now.Month() == 12 && now.Day() == 31 || (nextCheck.Month() == 1 && nextCheck.Day() == 1) {
81			resetNotifications()
82		}
83
84		time.Sleep(sleepDuration)
85	}
86}