Compare commits

...

3 Commits

Author SHA1 Message Date
eleksir
27ce4d3c78 Add .gitignore, rename config.json to config_example.json 2026-03-21 12:18:39 +03:00
eleksir
693996a262 Try harder to get holidays 2026-03-21 12:14:26 +03:00
eleksir
7da7f38e13 Add AcceptedAnswer.Text entity to list of holidays, fix some comments 2026-03-20 00:09:48 +03:00
7 changed files with 48 additions and 8 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/tg-holy-bot
/data/config.json

View File

@@ -61,7 +61,7 @@ func main() {
log.Infof("Stop cron")
// Jobs usually runs in a fraction of second, don't bother waiting for their completion.
// Кроновые задачки выполняются за доли сеекунды, не будем заморачиваться ожиданием их завершения.
_ = c.Stop()
log.Infof("Shutdown bot")

View File

@@ -70,6 +70,8 @@ func parser(data string) ([]string, error) {
// А теперь пробежимся по полученной структуре и вытянем из неё все строки с праздниками.
for _, ass := range s {
for _, entity := range ass.MainEntity {
holidays = append(holidays, entity.AcceptedAnswer.Text)
for _, sugestedAnswer := range entity.SuggestedAnswer {
holidays = append(holidays, sugestedAnswer.Text)
}

View File

@@ -2,18 +2,54 @@ package holy
import (
"tg-holy-bot/internal/log"
"time"
)
// CronTask sends generated hiliday list to the channel.
// CronTask sends generated holiday list to the channel.
func CronTask() {
var (
err error
errcnt int
phrase string
timeout time.Duration
)
log.Info("Cron Task triggered")
phrase, err := APIClient()
for {
phrase, err = APIClient()
if err != nil {
log.Errorf("Unable to get holidays: %s", err)
if err != nil {
errcnt++
return
log.Errorf("Unable to get holidays (try %d/15): %s", errcnt, err)
switch errcnt {
case 0, 1, 2:
timeout = 1 * time.Second
case 3, 4, 5:
timeout = 5 * time.Second
case 6, 7, 8:
timeout = 1 * time.Minute
case 9, 10, 11:
timeout = 5 * time.Minute
case 12, 13, 14:
timeout = 1 * time.Hour
default:
log.Error("Giveup trying to get holidays")
return
}
} else {
break
}
time.Sleep(timeout)
}
if _, err = Bot.SendMessage(phrase, Config.ChannelID, nil); err != nil {

View File

@@ -45,7 +45,7 @@ func ReadConfig() error {
// Исходя из документации, hjson какбы умеет парсить "кривой" json, но парсит его в map-ку.
// Интереснее на выходе получить структурку: то есть мы вначале конфиг преобразуем в map-ку, затем эту map-ку
// сериализуем в json, а потом json преврщааем в стркутурку. Не очень эффективно, но он и не часто требуется.
// сериализуем в json, а потом json преврщааем в стркутурку. Не очень эффективно, но оно и не часто требуется.
var (
sampleConfig *MyConfig
tmp map[string]any

View File

@@ -1,7 +1,7 @@
package holy
type (
// Holy структура, описывающая искомый json-чик.
// Holy структура, описывающая искомый json-чик с праздниками.
Holy struct {
AtContext string `json:"@context"`
AtType string `json:"@type"`