From af7ff5727902e452e2b3c7767272a7803b042fbe Mon Sep 17 00:00:00 2001 From: eleksir Date: Tue, 4 Nov 2025 22:22:25 +0300 Subject: [PATCH] [WIP] for SendGoodMorning make sense to iterate over chats only, introduce one more slice for it * Change mechanics of SendGoodMorning * Allocate one more slice chatGroupList to store groups/supergroups/channels * Update TODO.org --- TODO.org | 3 --- internal/tg/globals.go | 3 +++ internal/tg/periodicJobs.go | 2 +- internal/tg/settings-db-util.go | 36 +++++++++++++++++++++++++++------ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/TODO.org b/TODO.org index 84549e9..5da70ff 100644 --- a/TODO.org +++ b/TODO.org @@ -63,8 +63,5 @@ - [X] регулярных компакций базы с настройками. - [ ] регулярного обслуживания таблиц с пользователями. -* TODO В функции AppendChatListDB для нового чата добавлять дефолтные значения настроек. [0/1] - - [ ] done - # -*- mode: org; -*- # vim: ft=org diff --git a/internal/tg/globals.go b/internal/tg/globals.go index d622542..a522053 100644 --- a/internal/tg/globals.go +++ b/internal/tg/globals.go @@ -44,6 +44,9 @@ var ( // chatList слайс со списоком чатов. chatList = []string{} + // chatGroupList слайс со списком групповых чатов. + chatGroupList = []string{} + // tg is var for telegram api. tg echotron.API diff --git a/internal/tg/periodicJobs.go b/internal/tg/periodicJobs.go index 4f8d418..304ca39 100644 --- a/internal/tg/periodicJobs.go +++ b/internal/tg/periodicJobs.go @@ -31,7 +31,7 @@ var ( // SendGoodMorning отсылает сообщение "с добрым утром" (сейчас - фортунку). Предполагается, что оно прогоняется по // всем желающим чатам раз в сутки, с утра. Утро отсчитывается от настроек локали в системе. SendGoodMorning = func() { - for _, chatID := range chatList { + for _, chatID := range chatGroupList { if GetSetting(chatID, "FortuneMsg") == "1" { me, err := tg.GetMe() // Засылаем фразу в misc-канал (в роутер). diff --git a/internal/tg/settings-db-util.go b/internal/tg/settings-db-util.go index fdc761f..728b005 100644 --- a/internal/tg/settings-db-util.go +++ b/internal/tg/settings-db-util.go @@ -6,6 +6,7 @@ import ( "fmt" "io/fs" "slices" + "strings" "aleesa-telegram-go/internal/log" @@ -47,6 +48,9 @@ func FetchV(db *pebble.DB, key string) (string, error) { } // InitChatListDB открывает для пользования базу со списком чатов. +// Вторым слоем этой базы являются слайсы chatList и chatGroupList, по которым можно в дальнейшем определять, известен +// ли даденный чат боту. По сути, слайс chatList активно пользуется в функции AppendChatListDB, а chatGroupList - в +// SendGoodMorning. func InitChatListDB() error { var ( err error @@ -91,7 +95,15 @@ func InitChatListDB() error { return errors.New("Got empty chat name when query " + chatListDBName) } - chatList = append(chatList, string(chatName)) + chatID := string(chatName) + + chatList = append(chatList, chatID) + slices.Sort(chatList) + + if strings.HasPrefix(chatID, "-") { + chatGroupList = append(chatGroupList, chatID) + slices.Sort(chatGroupList) + } iterator.Next() } @@ -100,7 +112,7 @@ func InitChatListDB() error { } // AppendChatListDB добавляет чат в список известных боту. Можно добавлять чаты не глядя, дубликатов не добавится. -// Bot API нам такую информацию не даёт. +// Bot API нам не даёт информацию о том, на что подписан бот. func AppendChatListDB(chatID string) error { var err error @@ -108,15 +120,21 @@ func AppendChatListDB(chatID string) error { return err } - if err = StoreKV(chatListDB, chatID, "{}"); err != nil { + if err = StoreKV(chatListDB, chatID, "1"); err != nil { return fmt.Errorf("Unable to append %s to %s: %w", chatID, chatListDBName, err) } - // TODO: fill in defaults! - // Не забываем актуализировать список чатов. chatList = append(chatList, chatID) slices.Sort(chatList) + chatList = slices.Compact(chatList) + + // Если СhatID начинается с - это значит, что мы имеем дело именно с группой/супергруппой/каналом. + if strings.HasPrefix(chatID, "-") { + chatGroupList = append(chatGroupList, chatID) + slices.Sort(chatGroupList) + chatGroupList = slices.Compact(chatGroupList) + } return err } @@ -190,8 +208,14 @@ func SaveSetting(chatID string, setting string, value string) error { } } - if err := StoreKV(settingsDB[database], setting, value); err != nil { + if err = StoreKV(settingsDB[database], setting, value); err != nil { log.Errorf("Unable to save setting %s in database %s: %s", setting, database, err) + + return err + } + + if err = settingsDB[database].Flush(); err != nil { + log.Errorf("Unable to flush settings db for %s: %s", chatID, err) } return err