all repos — cameraman @ ac9177ae9453c770241849e2831d3d3611993ebc

notify.go (view raw)

  1package main
  2
  3import (
  4	"errors"
  5	"fmt"
  6	"log"
  7	"os"
  8	"time"
  9
 10	"github.com/go-resty/resty/v2"
 11)
 12
 13var (
 14	NotificationWindow int
 15	SleepDuration      time.Duration
 16
 17	notificationClient *resty.Client
 18	telegramToken      string
 19	chatID             string
 20	threadID           string
 21)
 22
 23func notifyTelegram(occurrence Occurrence) error {
 24	log.Println("Sending notification for occurrence", occurrence.ID)
 25	message := fmt.Sprintf("*Giorno %02d/%02d*.\n\n_%s_\n%s",
 26		occurrence.Day, occurrence.Month, occurrence.Name, occurrence.Description)
 27
 28	url := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", telegramToken)
 29
 30	// Create the payload
 31	payload := map[string]interface{}{
 32		"chat_id":           chatID,
 33		"text":              message,
 34		"parse_mode":        "markdown",
 35		"message_thread_id": threadID,
 36	}
 37
 38	// Send the POST request
 39	resp, err := notificationClient.R().
 40		SetHeader("Content-Type", "application/json").
 41		SetBody(payload).
 42		Post(url)
 43
 44	if err != nil {
 45		log.Printf("Failed to send notification: %v", err)
 46		return err
 47	}
 48	log.Printf("Notification sent: %s, Response: %s", message, resp)
 49	return nil
 50}
 51
 52func resetNotifications() {
 53	if err := db.Model(&Occurrence{}).Where("notified = ?", true).Update("notified", false).Error; err != nil {
 54		log.Printf("Failed to reset notifications: %v", err)
 55	} else {
 56		log.Println("Notifications have been reset for the new year.")
 57	}
 58}
 59
 60func initNotifications() error {
 61	notificationClient = resty.New()
 62
 63	telegramToken = os.Getenv("TELEGRAM_BOT_TOKEN")
 64	chatID = os.Getenv("TELEGRAM_CHAT_ID")
 65	threadID = os.Getenv("TELEGRAM_THREAD_ID")
 66
 67	if telegramToken == "" || chatID == "" {
 68		log.Println("Warning: you should set your Telegram Bot token and chat id in .env, otherwise you won't get notifications!")
 69		return errors.New("empty telegramToken or chatId")
 70	}
 71	return nil
 72}
 73
 74func CheckOccurrences() {
 75	err := initNotifications()
 76	if err != nil {
 77		log.Println(err.Error())
 78		return
 79	}
 80
 81	for {
 82		log.Println("Checking for new occurrences.")
 83		now := time.Now()
 84		today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
 85		endWindow := today.AddDate(0, 0, NotificationWindow)
 86
 87		var occurrences []Occurrence
 88		db.Where("notified = ? AND ((month = ? AND day >= ?) OR (month = ? AND day <= ?))",
 89			false, today.Month(), today.Day(), endWindow.Month(), endWindow.Day()).Find(&occurrences)
 90
 91		for _, occurrence := range occurrences {
 92			occurrenceDate := time.Date(today.Year(), time.Month(occurrence.Month), occurrence.Day, 0, 0, 0, 0, time.Local)
 93			if occurrenceDate.Before(today) || occurrenceDate.After(endWindow) || !occurrence.Notify || occurrence.Notified {
 94				continue
 95			}
 96
 97			err := notifyTelegram(occurrence)
 98			if err != nil {
 99				log.Println(err.Error())
100				return
101			}
102			occurrence.Notified = true
103			db.Save(&occurrence)
104		}
105
106		// Check if New Year's Eve is within the next sleep cycle
107		nextCheck := now.Add(SleepDuration)
108		if (now.Month() == 12 && now.Day() == 31) && (nextCheck.Month() == 1 && nextCheck.Day() == 1) {
109			resetNotifications()
110		}
111
112		time.Sleep(SleepDuration)
113	}
114}