From 94643557aeddbc37f0b84d8da62db5eb5a9f06cb Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 9 Jul 2022 00:48:15 +0700 Subject: [PATCH 01/36] first version --- README.md | 12 ++ cmd/main.go | 89 ++++++++++ conf.yml | 23 +++ go.mod | 18 ++ go.sum | 26 +++ internal/callbackmsg/callbackmsg.go | 83 +++++++++ internal/chatmembers/chatmembers.go | 63 +++++++ internal/comandmsg/comandmsg.go | 94 ++++++++++ internal/config/config.go | 55 ++++++ internal/config/constants.go | 15 ++ internal/data/data.go | 28 +++ internal/functions/functions.go | 263 ++++++++++++++++++++++++++++ internal/menu/menu.go | 21 +++ internal/socialmsg/socialmsg.go | 27 +++ internal/textmsg/textmsg.go | 227 ++++++++++++++++++++++++ pkg/client/telegram/client.go | 31 ++++ pkg/logging/logging.go | 47 +++++ 17 files changed, 1122 insertions(+) create mode 100644 cmd/main.go create mode 100755 conf.yml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/callbackmsg/callbackmsg.go create mode 100644 internal/chatmembers/chatmembers.go create mode 100644 internal/comandmsg/comandmsg.go create mode 100755 internal/config/config.go create mode 100755 internal/config/constants.go create mode 100755 internal/data/data.go create mode 100755 internal/functions/functions.go create mode 100755 internal/menu/menu.go create mode 100644 internal/socialmsg/socialmsg.go create mode 100644 internal/textmsg/textmsg.go create mode 100755 pkg/client/telegram/client.go create mode 100755 pkg/logging/logging.go diff --git a/README.md b/README.md index 1164b0e..c4c7f5f 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ # tg-bot-users 🤖 + +# Список команд: + +1. /menu (Список команд) +2. /jubileelist (выводин список юбилейных пользователей) +3. /addmoderatorgroup номер (добавление группы модераторов) +4. Меню. (список команд) +5. Привет, Здравствуйте и т.п. приветствия. +6. Доброе утро. +7. Спокойной ночи. +8. Комплимент. (А так же, Мужской и Женский) +9. Мат слово (Слово будет добавлено в базу нецензурных слов) \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..1d9280b --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,89 @@ +package main + +import ( + "flag" + "log" + "skbot/internal/callbackmsg" + "skbot/internal/chatmembers" + "skbot/internal/comandmsg" + "skbot/internal/config" + "skbot/internal/functions" + "skbot/internal/socialmsg" + "skbot/internal/textmsg" + "skbot/pkg/client/telegram" + "skbot/pkg/logging" +) + +var cfgPath string + +func init() { + flag.StringVar(&cfgPath, "config", "tg-bot-users/conf.yml", "config file path") +} + +func main() { + + log.Print("config initializing") + cfg := config.GetConfig(cfgPath) + + log.Print("logger initializing") + logger := logging.GetLogger(cfg.AppConfig.LogLevel) + + modGroupId := cfg.ModersGroupID.ModeratorsGroup + _, _, err := functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupGolang) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupJava) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupPython) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup1S) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupCSharp) + if err != nil { + logger.Info(err) + } + + updChan, bot, err := telegram.StartBotByChan(cfg, logger) + if err != nil { + logger.Fatal(err) + } + defer bot.StopReceivingUpdates() + + for { + + update := <-updChan + + // make slice from text message + //if update.Message != nil { + // command := strings.Split(update.Message.Text, " ") + //} else { + // continue + //} + if update.Message != nil { + + // text messages operations + textmsg.WithTextQueryDo(update, bot, logger, modGroupId) + + // social messages from bot in chat + socialmsg.WithSocialTextQueryDo(update, bot, logger) + } else if update.CallbackQuery != nil { + + callbackmsg.WithCallBackDo(update, bot, logger, modGroupId) + + } else if update.Message.Command() != "" { + + //com menu (only moderator's chats) + comandmsg.CommandQueryDo(update, bot, logger) + } else if update.Message.NewChatMembers != nil { + + chatmembers.WithChatMembersDo(update, bot, logger) + } + + // TODO inline help + if update.InlineQuery != nil { + log.Println("response from Inline query") + query := update.InlineQuery.Query + + log.Println(query) + + } + + } + +} diff --git a/conf.yml b/conf.yml new file mode 100755 index 0000000..d4091d4 --- /dev/null +++ b/conf.yml @@ -0,0 +1,23 @@ +--- + + +telegram: + tg_token: + tg_sert: + + + +app: + log_level: trace + +chat_count_config: + test_chat_id_count: + chat_id_count: + +moderators: + moderators_group: + moderators_group_golang: + moderators_group_java: + moderators_group_python: + moderators_group_1s: + moderators_group_csharp: diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..7d922e3 --- /dev/null +++ b/go.mod @@ -0,0 +1,18 @@ +module skbot + +go 1.18 + +require ( + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 + github.com/ilyakaznacheev/cleanenv v1.3.0 + github.com/mattn/go-sqlite3 v1.14.14 + github.com/sirupsen/logrus v1.8.1 +) + +require ( + github.com/BurntSushi/toml v1.1.0 // indirect + github.com/joho/godotenv v1.4.0 // indirect + golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..220a7ff --- /dev/null +++ b/go.sum @@ -0,0 +1,26 @@ +github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= +github.com/ilyakaznacheev/cleanenv v1.3.0 h1:RapuLclPPUbmdd5Bi5UXScwMEZA6+ZNLU5OW9itPjj0= +github.com/ilyakaznacheev/cleanenv v1.3.0/go.mod h1:i0owW+HDxeGKE0/JPREJOdSCPIyOnmh6C0xhWAkF/xA= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 h1:slmdOY3vp8a7KQbHkL+FLbvbkgMqmXojpFUO/jENuqQ= +olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3/go.mod h1:oVgVk4OWVDi43qWBEyGhXgYxt7+ED4iYNpTngSLX2Iw= diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go new file mode 100644 index 0000000..cc172b6 --- /dev/null +++ b/internal/callbackmsg/callbackmsg.go @@ -0,0 +1,83 @@ +package callbackmsg + +import ( + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "skbot/internal/config" + "skbot/internal/functions" + "skbot/internal/menu" + "skbot/pkg/logging" + "time" +) + +func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64) { + + data := update.CallbackQuery.Data + + switch data { + + case "com_list": + + msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, menu.ComMenu) + msg.ParseMode = "markdown" + delMsg, _ := bot.Send(msg) + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + + go func() { + time.Sleep(30 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.CallbackQuery.Message.Chat.ID, delMsg.MessageID)) + }() + + case "jubilee_list": + + var list string + var count = 1 + users, err := functions.GetJubileeUsers() + chatId := update.CallbackQuery.Message.Chat.ID + if err != nil { + logger.Info(err) + } + + moderGroupList, err := functions.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + + for _, group := range moderGroupList { + + if group.GroupID == chatId { + + for _, user := range users { + // TODO take id from base to number users in list + text := fmt.Sprintf("*№%d* \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ + "Время: *%s* ", count, user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.Format(config.StructDateTimeFormat)) + + list = list + text + "\n\n" + count++ + + } + } + } + msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+list) + msg.ParseMode = "markdown" + _, _ = bot.Send(msg) + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + + case "add_mod": + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + + } +} diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go new file mode 100644 index 0000000..74a86d9 --- /dev/null +++ b/internal/chatmembers/chatmembers.go @@ -0,0 +1,63 @@ +package chatmembers + +import ( + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "skbot/internal/config" + "skbot/internal/functions" + "skbot/pkg/logging" + "time" +) + +func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { + + newUser := update.Message.NewChatMembers[0] + chatId := update.Message.Chat.ID + groupName := update.Message.Chat.Title + + if !newUser.IsBot { + count, err := bot.GetChatMembersCount(tgbotapi.ChatMemberCountConfig{ + ChatConfig: tgbotapi.ChatConfig{ + ChatID: chatId, + SuperGroupUsername: groupName, + }, + }) + + if count%500 == 0 || count%500 == 1 || count%500 == 2 || count == 4 { + + err = functions.AddNewJubileeUser(&newUser, count, groupName) + if err != nil { + logger.Error(err) + } + + moderGroupList, err := functions.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + + for _, group := range moderGroupList { + + text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь\n%s "+ + "(@%s), %d. \nВремя вступления %s", + groupName, newUser.FirstName, newUser.UserName, count, + time.Now().Format(config.StructDateTimeFormat)) + + _, _ = bot.Send(tgbotapi.NewMessage(group.GroupID, text)) + } + + } + + msg := tgbotapi.NewMessage(chatId, fmt.Sprintf("_Рады вас приветствовать_ "+ + "*%s*, _расскажите нам о себе пожалуйста._", newUser.FirstName)) + + msg.ParseMode = "markdown" + ans, _ := bot.Send(msg) + + go func() { + + time.Sleep(20 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, ans.MessageID)) + }() + } + +} diff --git a/internal/comandmsg/comandmsg.go b/internal/comandmsg/comandmsg.go new file mode 100644 index 0000000..f309aca --- /dev/null +++ b/internal/comandmsg/comandmsg.go @@ -0,0 +1,94 @@ +package comandmsg + +import ( + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "skbot/internal/config" + "skbot/internal/functions" + "skbot/internal/menu" + "skbot/pkg/logging" + "time" +) + +func CommandQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { + + // com menu (only moderator's chats) ---------------------------- + if update.Message.Command() == "menu" { + + moderGroupList, err := functions.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + + for _, group := range moderGroupList { + + if group.GroupID == update.Message.Chat.ID { + + msg := tgbotapi.NewMessage(update.Message.Chat.ID, menu.ComMenu) + + del, _ := bot.Send(msg) + + go func() { + time.Sleep(60 * time.Second) + msDel := tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID) + _, _ = bot.Send(msDel) + msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true) + + }() + + } + } + + } + + // LIST of all jubilee users -------------------------------------- + if update.Message.Command() == "jubileelist" { + + users, err := functions.GetJubileeUsers() + chatId := update.Message.Chat.ID + if err != nil { + logger.Info(err) + } + + moderGroupList, err := functions.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + for _, group := range moderGroupList { + + if group.GroupID == chatId { + + for _, user := range users { + + text := fmt.Sprintf("*Группа:* _%s_\n*Имя:* %s\n*Ник:* @%s\n*Номер вступления:* %d\n"+ + "*Время вступления:* %s ", user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.Format(config.StructDateTimeFormat)) + + msg := tgbotapi.NewMessage(chatId, text) + msg.ParseMode = "markdown" + _, _ = bot.Send(msg) + + } + } + } + + } + + //if update.Message.Command() == "12" { + // + // msg := tgbotapi.NewMessage(update.Message.Chat.ID, "keyboard") + // + // msg.ReplyMarkup = menu.NumericKeyboard + // + // _, err := bot.Send(msg) + // if err != nil { + // logger.Error(err) + // } + // + // go func() { + // time.Sleep(30 * time.Second) + // msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true) + // }() + //} + +} diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100755 index 0000000..76e0788 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,55 @@ +package config + +import ( + "github.com/ilyakaznacheev/cleanenv" + "log" + "sync" +) + +type Config struct { + Telegram struct { + Token string `yaml:"tg_token" env:"TG-BOT-TOKEN" env-required:"true"` + Sert string `yaml:"tg_sert"` + } + YouTube struct { + APIURL string `yaml:"api_url"` + AccessToken string `yaml:"access_token"` + } + AppConfig AppConfig `yaml:"app"` + ChatCountConfig ChatCountConfig `yaml:"chat_count_config"` + ModersGroupID ModersGroupID `yaml:"moderators"` +} + +type AppConfig struct { + LogLevel string `yaml:"log_level" env:"TG-BOT-LogLevel" env-default:"error" env-required:"true"` +} + +type ChatCountConfig struct { + TestChatIdCount int64 `yaml:"test_chat_id_count"` + ChatIdCount int64 `yaml:"chat_id_count"` +} + +type ModersGroupID struct { + ModeratorsGroup int64 `yaml:"moderators_group" env:"moderators_group" env-required:"true"` + ModeratorsGroupGolang int64 `yaml:"moderators_group_golang" env:"moderators_group_golang"` + ModeratorsGroupJava int64 `yaml:"moderators_group_java" env:"moderators_group_java"` + ModeratorsGroupPython int64 `yaml:"moderators_group_python" env:"moderators_group_python"` + ModeratorsGroup1S int64 `yaml:"moderators_group_1s" env:"moderators_group_1s"` + ModeratorsGroupCSharp int64 `yaml:"moderators_group_csharp" env:"moderators_group_csharp"` +} + +var instance *Config +var once sync.Once + +func GetConfig(path string) *Config { + once.Do(func() { + log.Printf("read application config from path %s", path) + + instance = &Config{} + + if err := cleanenv.ReadConfig(path, instance); err != nil { + log.Fatal(err) + } + }) + return instance +} diff --git a/internal/config/constants.go b/internal/config/constants.go new file mode 100755 index 0000000..083af3f --- /dev/null +++ b/internal/config/constants.go @@ -0,0 +1,15 @@ +package config + +const StructDateTimeFormat = "2006-01-02 15:04" +const StructDateFormat = "2006-01-02" +const StructTimeFormat = "15:04" +const ( + Jubileelist = "jubileelist" +) + +var SocialMessage bool + +//var SocialChoice = SocialDown +//var SocialUP = "Включено" +//var SocialDown = "Выключено" +//var SocText = fmt.Sprintf("Социальные сообщения: %s", SocialChoice) diff --git a/internal/data/data.go b/internal/data/data.go new file mode 100755 index 0000000..33c793b --- /dev/null +++ b/internal/data/data.go @@ -0,0 +1,28 @@ +package data + +import "time" + +type User struct { + ID int + Name string + Sex string +} + +type BadWords struct { + ID int + Word string +} +type ModeratorsGroup struct { + ID int + GroupID int64 +} + +type JubileeUser struct { + ID int + Serial int + UserID int + UserName string + UserNick string + Time time.Time + GroupName string +} diff --git a/internal/functions/functions.go b/internal/functions/functions.go new file mode 100755 index 0000000..a797d1b --- /dev/null +++ b/internal/functions/functions.go @@ -0,0 +1,263 @@ +package functions + +import ( + "database/sql" + "errors" + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + _ "github.com/mattn/go-sqlite3" + "log" + "skbot/internal/data" + "strings" +) + +var ( + qb = "CREATE TABLE IF NOT EXISTS badwords (id INTEGER PRIMARY KEY, word VARCHAR (30) NOT NULL)" + + qbu = "SELECT * FROM badwords" + + mod = "CREATE TABLE IF NOT EXISTS moderators (id INTEGER PRIMARY KEY, groupid INTEGER NOT NULL)" + + modSel = "SELECT * FROM moderators" + + addNewUsersDB = "CREATE TABLE IF NOT EXISTS newJubileeUsers (id INTEGER PRIMARY KEY, serial INTEGER NOT NULL, " + + "user_id INTEGER NOT NULL, user_name VARCHAR (30) NOT NULL, user_nick VARCHAR (50) DEFAULT ('нет ника'), " + + "time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, group_name VARCHAR (50) NOT NULL)" +) + +func TrimSymbolsFromSlice(s []string) (words []string, err error) { + + var messageUpd []string + + for _, k := range s { + + k = strings.Trim(k, "([]{}*).,!") + messageUpd = append(messageUpd, k) + } + + words = messageUpd + + return words, nil +} + +func CheckBadWords(badList []string) (clearList []string, haveBadWords bool, err error) { + + var badWords []data.BadWords + var badWord data.BadWords + haveBadWords = false + + db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/badwords.db") + if err != nil { + return + } + + rows, err := db.Query(qbu) + if err != nil { + return nil, false, err + } + + defer db.Close() + + for rows.Next() { + err = rows.Scan(&badWord.ID, &badWord.Word) + badWords = append(badWords, badWord) + } + + for _, word := range badList { + + for _, bad := range badWords { + + if word == bad.Word { + + log.Println("найдено совпадение матерного слова в базе", word) + haveBadWords = true + } + + } + + } + + return clearList, haveBadWords, err + +} + +func AddBadWord(word string) (bool, error) { + + var badWord data.BadWords + var haveWord = false + + db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/badwords.db") + if err != nil { + return false, err + } + + stat, err := db.Prepare(qb) + if err != nil { + return false, err + } + + _, _ = stat.Exec() + + rows, err := db.Query(qbu) + if err != nil { + } + + defer db.Close() + + for rows.Next() { + err = rows.Scan(&badWord.ID, &badWord.Word) + if badWord.Word == word { + haveWord = true + return true, nil + } + } + + if !haveWord { + + stat, err = db.Prepare(fmt.Sprintf("INSERT INTO badwords (word) VALUES ('%s')", word)) + stat.Exec() + if err != nil { + return false, errors.New("ошибка добавления матерного слова в базу") + + } else { + return true, errors.New("новое матерное слово занесено в базу") + } + } + + return true, errors.New("added") + +} + +func AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { + + var modGroup data.ModeratorsGroup + haveGroup = false + + db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/moderators.db") + if err != nil { + return haveGroup, nil, err + } + + defer db.Close() + + stat, err := db.Prepare(mod) + if err != nil { + log.Println(err) + } + + _, err = stat.Exec() + if err != nil { + return haveGroup, nil, err + } + + rows, err := db.Query(modSel) + if err != nil { + log.Println(err) + } + + for rows.Next() { + err = rows.Scan(&modGroup.ID, &modGroup.GroupID) + modGroups = append(modGroups, modGroup) + } + + for _, grp := range modGroups { + if grp.GroupID == group { + haveGroup = true + return haveGroup, modGroups, errors.New("have group") + } + } + + if !haveGroup && group != 0 { + stat, err = db.Prepare(fmt.Sprintf("INSERT INTO moderators (groupid) VALUES ('%d')", group)) + if err != nil { + log.Println(err) + } + _, _ = stat.Exec() + haveGroup = true + } + return haveGroup, modGroups, nil +} + +func GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { + + var group data.ModeratorsGroup + + db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/moderators.db") + if err != nil { + return nil, err + } + + defer db.Close() + + rows, err := db.Query(modSel) + if err != nil { + log.Println(err) + } + + for rows.Next() { + err = rows.Scan(&group.ID, &group.GroupID) + groups = append(groups, group) + } + + return + +} + +func AddNewJubileeUser(newUser *tgbotapi.User, serial int, groupName string) error { + + db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/newJubileeUsers.db") + if err != nil { + return err + } + defer db.Close() + + log.Println("создание таблицы") + stat, err := db.Prepare(addNewUsersDB) + if err != nil { + return err + } + _, _ = stat.Exec() + + stat, err = db.Prepare(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, "+ + "group_name) VALUES ('%d', '%d', '%s', '%s', '%s')", serial, newUser.ID, newUser.FirstName, newUser.UserName, groupName)) + if err != nil { + log.Println(err) + } + _, err = stat.Exec() + if err != nil { + log.Println(err) + } + + return nil +} + +func GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { + + var user data.JubileeUser + var users []data.JubileeUser + + db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/newJubileeUsers.db") + if err != nil { + return nil, err + } + defer db.Close() + + rows, err := db.Query("SELECT * FROM newJubileeUsers") + if err != nil { + return nil, err + } + + for rows.Next() { + err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, &user.Time, &user.GroupName) + users = append(users, user) + } + + for _, v := range users { + if v.Serial%500 == 0 || v.Serial%500 == 1 || v.Serial%500 == 2 || v.Serial%4 == 0 { + jubUsers = append(jubUsers, v) + } + } + + return jubUsers, nil + +} diff --git a/internal/menu/menu.go b/internal/menu/menu.go new file mode 100755 index 0000000..d817fda --- /dev/null +++ b/internal/menu/menu.go @@ -0,0 +1,21 @@ +package menu + +import ( + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +const ComMenu = " Список доступных вам команд: 🛠 \n \n" + + "✅ `addmoderatorgroup` + номер _(добавление группы модераторов)._\n" + + "✅ `chatinfo` _(информация о имени и ID группы будет отправлено в админку," + + " сообщение будет удалено из группы пользователей, если бот админ. )_\n" + + "✅ *Мат + слово* _(Слово будет добавлено в базу)._\n" + +var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow(button1), + tgbotapi.NewInlineKeyboardRow(button2), + tgbotapi.NewInlineKeyboardRow(button3), +) + +var button1 = tgbotapi.NewInlineKeyboardButtonData("Список команд", "com_list") +var button2 = tgbotapi.NewInlineKeyboardButtonData("Список юбилейный", "jubilee_list") +var button3 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу администраторов", "add_mod") diff --git a/internal/socialmsg/socialmsg.go b/internal/socialmsg/socialmsg.go new file mode 100644 index 0000000..5d1999a --- /dev/null +++ b/internal/socialmsg/socialmsg.go @@ -0,0 +1,27 @@ +package socialmsg + +import ( + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "skbot/internal/functions" + "skbot/pkg/logging" + "strings" +) + +func WithSocialTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { + + // trim symbols and make slice from text message + if len(update.Message.Text) > 0 { + + command, err := functions.TrimSymbolsFromSlice(strings.Split(update.Message.Text, " ")) + if err != nil { + logger.Info("error trim symbols from message") + } + + switch strings.ToLower(command[0]) { + case "": + + default: + + } + } +} diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go new file mode 100644 index 0000000..8e50268 --- /dev/null +++ b/internal/textmsg/textmsg.go @@ -0,0 +1,227 @@ +package textmsg + +import ( + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "log" + "skbot/internal/config" + "skbot/internal/functions" + "skbot/internal/menu" + "skbot/pkg/logging" + "strconv" + "strings" + "time" +) + +func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64) { + + // trim symbols + if len(update.Message.Text) > 0 { + + command, err := functions.TrimSymbolsFromSlice(strings.Split(update.Message.Text, " ")) + if err != nil { + logger.Info("error trim symbols from message") + } + + // menu + //if strings.Contains(strings.ToLower(command[0]), "меню") { + // + // chatMsgDel := update.Message.MessageID + // + // moderGroupList, err := functions.GetModeratorsGroup() + // if err != nil { + // logger.Error(err) + // } + // + // for _, group := range moderGroupList { + // + // if group.GroupID == update.Message.Chat.ID { + // + // del, _ := bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, menu.ComMenu)) + // + // go func() { + // time.Sleep(20 * time.Second) + // _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + // _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, chatMsgDel)) + // }() + // } + // } + //} + + // check jubilee users ! + if strings.Contains(strings.ToLower(command[0]), "списокюбилейный") { + + users, err := functions.GetJubileeUsers() + chatId := update.Message.Chat.ID + if err != nil { + logger.Info(err) + } + + moderGroupList, err := functions.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + + for _, group := range moderGroupList { + + if group.GroupID == chatId { + + for _, user := range users { + + text := fmt.Sprintf("Группа: %s\nИмя: %s\nНик: @%s\nНомер вступления: %d\n"+ + "Время вступления: %s ", user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.Format(config.StructDateTimeFormat)) + + _, _ = bot.Send(tgbotapi.NewMessage(chatId, text)) + + } + } + } + } + + // add moderator group + if strings.Contains(strings.ToLower(command[0]), "addmoderatorgroup") { + + if update.Message.Chat.ID == modGroupId { + + newModGroup, err := strconv.ParseInt(command[1], 10, 64) + if err != nil { + logger.Error(err) + } + + b, _, err := functions.AddModeratorsGroup(newModGroup) + if err != nil { + logger.Error(err) + } + + if b && err != nil { + + _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Такая группа уже есть: %d", newModGroup))) + } + + if b && err == nil { + + _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Успешно добавлена: %d", newModGroup))) + + } + } + } + + // new users count + if strings.Contains(strings.ToLower(command[0]), "chatinfo") { + delMes := update.Message.MessageID + chatId := update.Message.Chat.ID + groupName := update.Message.Chat.Title + + go func() { + _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, delMes)) + }() + + _, err = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf( + "ID группы: %d\nИмя группы: %s", chatId, groupName))) + if err != nil { + logger.Error(err) + } + } + + // add bad words to the base + if strings.Contains(strings.ToLower(command[0]), "мат") { + + if len(command) > 1 { + + go func() { + time.Sleep(5 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + + }() + + b, err := functions.AddBadWord(command[1]) + if err != nil { + log.Println(err) + } + + if b == true && err == nil { + + del, _ := bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Уже есть.")) + + go func() { + + time.Sleep(5 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + + }() + + } else if b == true && err != nil { + + del, _ := bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Добавлено.")) + + go func() { + + time.Sleep(5 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + }() + + } + } + } + + // check bad words in chat messages + _, b, err := functions.CheckBadWords(command) + if err != nil { + logger.Error("bad words error", err) + } + + // message to chat where found bad word, copy to moderator + if b && strings.ToLower(command[0]) != "мат" { + + msgID := update.Message.MessageID + badText := update.Message.Text + + go func() { + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, msgID)) + }() + + badGuyName := update.Message.From.FirstName + badGuyNick := update.Message.From.UserName + badGuyID := update.Message.From.ID + groupName := update.Message.Chat.Title + + modMess := tgbotapi.NewMessage(modGroupId, fmt.Sprintf( + "Замечены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ + "@%s\nID пользователя: %d\nТекст сообщения: %s\nОригинал сообщения удален из чата.", + groupName, badGuyName, badGuyNick, badGuyID, badText)) + _, _ = bot.Send(modMess) + + cleanAnswer := tgbotapi.NewMessage(update.Message.Chat.ID, fmt.Sprintf( + "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. "+ + "Сообщение удалено, надеемся на ваше понимание.", groupName)) + del, _ := bot.Send(cleanAnswer) + + go func() { + time.Sleep(30 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + }() + } + + if strings.Contains(strings.ToLower(command[0]), "меню") { + + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "30 seconds") + + msg.ReplyMarkup = menu.NumericKeyboard + + delMes, err := bot.Send(msg) + if err != nil { + logger.Error(err) + } + + go func() { + time.Sleep(30 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, delMes.MessageID)) + }() + } + + } + +} diff --git a/pkg/client/telegram/client.go b/pkg/client/telegram/client.go new file mode 100755 index 0000000..14f6e08 --- /dev/null +++ b/pkg/client/telegram/client.go @@ -0,0 +1,31 @@ +package telegram + +import ( + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "log" + "skbot/internal/config" + "skbot/pkg/logging" + "time" +) + +func StartBotByChan(cfg *config.Config, logger *logging.Logger) (tgbotapi.UpdatesChannel, *tgbotapi.BotAPI, error) { + + bot, err := tgbotapi.NewBotAPI(cfg.Telegram.Token) + if err != nil { + log.Fatal(err) + } + + bot.Debug = false + + logger.Infof("Bot %s started at: %v", bot.Self.UserName, time.Now().Format("2 January 2006 15:04")) + + u := tgbotapi.NewUpdate(0) + u.Timeout = 60 + u.Limit = 0 + u.Offset = 0 + + updates := bot.GetUpdatesChan(u) + + return updates, bot, nil + +} diff --git a/pkg/logging/logging.go b/pkg/logging/logging.go new file mode 100755 index 0000000..c1a5057 --- /dev/null +++ b/pkg/logging/logging.go @@ -0,0 +1,47 @@ +package logging + +import ( + "fmt" + "github.com/sirupsen/logrus" + "log" + "os" + "path" + "runtime" +) + +type Logger struct { + *logrus.Entry +} + +func (s *Logger) ExtraFields(fields map[string]interface{}) *Logger { + return &Logger{s.WithFields(fields)} +} + +var instance Logger + +func GetLogger(level string) *Logger { + + logrusLevel, err := logrus.ParseLevel(level) + if err != nil { + log.Fatal(err) + } + + l := logrus.New() + l.SetReportCaller(true) + l.Formatter = &logrus.TextFormatter{ + CallerPrettyfier: func(f *runtime.Frame) (string, string) { + filename := path.Base(f.File) + return fmt.Sprintf("%s:%d", filename, f.Line), fmt.Sprintf("%s()", f.Function) + }, + DisableColors: false, + FullTimestamp: true, + } + + l.SetOutput(os.Stdout) + l.SetLevel(logrusLevel) + + instance = Logger{logrus.NewEntry(l)} + + return &instance + +} From 3db1733641c4074c3ea09dfed247e551f52aced6 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 9 Jul 2022 00:51:15 +0700 Subject: [PATCH 02/36] clean readme --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index c4c7f5f..5b1e80b 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,3 @@ # Список команд: -1. /menu (Список команд) -2. /jubileelist (выводин список юбилейных пользователей) -3. /addmoderatorgroup номер (добавление группы модераторов) -4. Меню. (список команд) -5. Привет, Здравствуйте и т.п. приветствия. -6. Доброе утро. -7. Спокойной ночи. -8. Комплимент. (А так же, Мужской и Женский) -9. Мат слово (Слово будет добавлено в базу нецензурных слов) \ No newline at end of file From 419a2c2aca1182579c62232972f9aa0fe303f8ed Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 9 Jul 2022 01:01:44 +0700 Subject: [PATCH 03/36] db add --- internal/sqlitedb/badwords.db | Bin 0 -> 8192 bytes internal/sqlitedb/newJubileeUsers.db | Bin 0 -> 8192 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 internal/sqlitedb/badwords.db create mode 100644 internal/sqlitedb/newJubileeUsers.db diff --git a/internal/sqlitedb/badwords.db b/internal/sqlitedb/badwords.db new file mode 100755 index 0000000000000000000000000000000000000000..67af31940cc394ac5810f144df5744e0bd8b98be GIT binary patch literal 8192 zcmeH~K~ED=5XawkQLM0USWzoN!{cB=jT#f=;LR0RB-Vm!H9=2piiSkeSexj91GQ0N ztTa7&@e_ElAjHz9)eqodUOam9=+&ba=hbe6lXo*OyV*ChGynO&-=6l?&E#@%N!`yE zRx(93C5D7$iAzceA;#&B&>b#|Hhp10PZR%Zjf->lrX8xX;EkY*7ZYFtOn?b60Vco% zm;e)C0!)AjFaaj;m%sz7KNgQ$rHNuD`*10n$vw#za*xAjWG3*vw6D_M<)p8|teRZT zskv0zpY;Q^5X{~1f<<-RUp%8sv%2F2GuOO8O-`LpsMLH~rEVva3G;70CNBv13E$x> ze1`Y%7GA?DJc2CD!xcCUqc8{;N;J+o{#%+XN5OaRF5lryH*qOL7Qx^t`1 zLE2u;KV2x~-2r2=WDcvJ(I66Y4pScmTco?DE72$wcTZP^L&iYQ5ANs}PJcLp9An)* zXb2h*WB?obCD!2pwdfL^cHPKPP2awn?m*k9^xAXQtr zyaGbvDYzgZB<^rP3NOG@@N;Ed$)WfVK#1FnY^_K0&5ZWDdG~?sM*IkOxFj&;jskSapKe*&$J!|pH+ zJG|Al_#SMty%NYtzT2PGI`Pl6H?m)mpi#P9D915mhgf!qE9RCEW z64+w5t*-4rVQu_GX=Q*u5+jXq=&Wvq#IcFWGH>;Gu3r6FU z-mm-P@yY&T{BNGkJtx|G?S!?pjz&Xa=!UVO*Ee(nj7p=j*{E)Ez53{>QLfjn{7qlQ zO!{fM@i@b>lE^Vrq4Z~>YdeTwOTy!kSj&B)>#=JL=Ux@kTWyybC ka0AahJvcj>!(Ue}=EwXOB@~CJp|)zcUG0r=;|ssI20 literal 0 HcmV?d00001 From 8c1ec77bb3c45cceb6462e8aa84dc15abf89ca9b Mon Sep 17 00:00:00 2001 From: lebedevs Date: Fri, 8 Jul 2022 22:45:49 +0300 Subject: [PATCH 04/36] Makefile and Dockerfile added First basic versions --- Dockerfile | 22 ++++++++++++++++++++++ Makefile | 12 ++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 Dockerfile create mode 100644 Makefile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9587230 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM golang:1.18.3 as builder + +#RUN apk --no-cache --no-progress add tzdata make sqlite && rm -rf /var/cache/apk/* + +WORKDIR /src + +COPY go.mod . +COPY go.sum . +RUN go mod download + +COPY . . + +RUN make build + +FROM scratch + +#COPY --from=builder /usr/share/zoneinfo /use/share/zoneinfo +COPY --from=builder /app /app +#ADD config /config + +ENTRYPOINT [ "/app" ] +#EXPOSE 80 \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6b0fb1c --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +.PHONY: default build image run + +default: build + +build: + CGO_ENABLED=1 GOOS=linux go build -o /app -a -ldflags '-linkmode external -extldflags "-static"' cmd/main.go + +image: + docker build -t skillbot:latest . + +run: + go run cmd/main.go \ No newline at end of file From 9ad3edada188965c4a99bc5fe5b2ac414ad6ff5e Mon Sep 17 00:00:00 2001 From: lebedevs Date: Fri, 8 Jul 2022 22:47:23 +0300 Subject: [PATCH 05/36] Dockerfile cleanup --- Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9587230..7478e47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,5 @@ FROM golang:1.18.3 as builder -#RUN apk --no-cache --no-progress add tzdata make sqlite && rm -rf /var/cache/apk/* - WORKDIR /src COPY go.mod . @@ -14,9 +12,7 @@ RUN make build FROM scratch -#COPY --from=builder /usr/share/zoneinfo /use/share/zoneinfo COPY --from=builder /app /app -#ADD config /config ENTRYPOINT [ "/app" ] #EXPOSE 80 \ No newline at end of file From f1976a58897cb13a0aa141ad3aa04321904bc6c6 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 9 Jul 2022 09:34:46 +0700 Subject: [PATCH 06/36] add button to add moder group --- cmd/main.go | 6 -- internal/callbackmsg/callbackmsg.go | 55 +++++++++-- internal/chatmembers/chatmembers.go | 4 +- internal/comandmsg/comandmsg.go | 123 ++++++++++-------------- internal/data/data.go | 10 +- internal/functions/functions.go | 2 +- internal/menu/menu.go | 6 +- internal/textmsg/textmsg.go | 142 ++++++++++++++++++---------- 8 files changed, 205 insertions(+), 143 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 1d9280b..0199491 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -49,12 +49,6 @@ func main() { update := <-updChan - // make slice from text message - //if update.Message != nil { - // command := strings.Split(update.Message.Text, " ") - //} else { - // continue - //} if update.Message != nil { // text messages operations diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index cc172b6..4540ac0 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -6,6 +6,7 @@ import ( "skbot/internal/config" "skbot/internal/functions" "skbot/internal/menu" + "skbot/internal/textmsg" "skbot/pkg/logging" "time" ) @@ -16,6 +17,7 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin switch data { + // menu case "com_list": msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, menu.ComMenu) @@ -32,6 +34,7 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.CallbackQuery.Message.Chat.ID, delMsg.MessageID)) }() + // jubilee users case "jubilee_list": var list string @@ -52,9 +55,9 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin if group.GroupID == chatId { for _, user := range users { - // TODO take id from base to number users in list - text := fmt.Sprintf("*№%d* \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ - "Время: *%s* ", count, user.GroupName, user.UserName, user.UserNick, + + text := fmt.Sprintf("№: `%d` \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ + "Время: *%s* ", user.UserID, user.GroupName, user.UserName, user.UserNick, user.Serial, user.Time.Format(config.StructDateTimeFormat)) list = list + text + "\n\n" @@ -72,12 +75,50 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin logger.Error(err) } - case "add_mod": + // add new moderators group + case "add_new_mod": - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) + if update.CallbackQuery.Message.Chat.ID == modGroupId { + + newGroupName := textmsg.MesInfo.Message.Chat.Title + newGroupId := textmsg.MesInfo.Message.Chat.ID + logger.Info(newGroupName, newGroupId) + + text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) + msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) + msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, + tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button5))) + + _, _ = bot.Send(msg) + _, _ = bot.Send(msgConf) + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } } + case "add_new_mod_true": + + newGroupName := textmsg.MesInfo.Message.Chat.Title + newGroupId := textmsg.MesInfo.Message.Chat.ID + + if update.CallbackQuery.Message.Chat.ID == modGroupId { + + b, _, err := functions.AddModeratorsGroup(newGroupId) + if b && err != nil { + _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s уже есть.", newGroupName))) + } else if b && err == nil { + + _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s успешно добавлена.", newGroupName))) + } else { + logger.Error(err) + } + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + } } } diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index 74a86d9..7ebc7e3 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -23,7 +23,7 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log }, }) - if count%500 == 0 || count%500 == 1 || count%500 == 2 || count == 4 { + if count%500 == 0 || count%500 == 1 || count%500 == 2 { err = functions.AddNewJubileeUser(&newUser, count, groupName) if err != nil { @@ -55,7 +55,7 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log go func() { - time.Sleep(20 * time.Second) + time.Sleep(60 * time.Second) _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, ans.MessageID)) }() } diff --git a/internal/comandmsg/comandmsg.go b/internal/comandmsg/comandmsg.go index f309aca..2a240a0 100644 --- a/internal/comandmsg/comandmsg.go +++ b/internal/comandmsg/comandmsg.go @@ -1,94 +1,71 @@ package comandmsg import ( - "fmt" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" - "skbot/internal/config" - "skbot/internal/functions" - "skbot/internal/menu" "skbot/pkg/logging" - "time" ) func CommandQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { // com menu (only moderator's chats) ---------------------------- - if update.Message.Command() == "menu" { - - moderGroupList, err := functions.GetModeratorsGroup() - if err != nil { - logger.Error(err) - } - - for _, group := range moderGroupList { - - if group.GroupID == update.Message.Chat.ID { - - msg := tgbotapi.NewMessage(update.Message.Chat.ID, menu.ComMenu) - - del, _ := bot.Send(msg) - - go func() { - time.Sleep(60 * time.Second) - msDel := tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID) - _, _ = bot.Send(msDel) - msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true) - - }() - - } - } - - } + //if update.Message.Command() == "menu" { + // + // moderGroupList, err := functions.GetModeratorsGroup() + // if err != nil { + // logger.Error(err) + // } + // + // for _, group := range moderGroupList { + // + // if group.GroupID == update.Message.Chat.ID { + // + // msg := tgbotapi.NewMessage(update.Message.Chat.ID, menu.ComMenu) + // + // del, _ := bot.Send(msg) + // + // go func() { + // time.Sleep(60 * time.Second) + // msDel := tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID) + // _, _ = bot.Send(msDel) + // + // }() + // + // } + // } + // + //} // LIST of all jubilee users -------------------------------------- - if update.Message.Command() == "jubileelist" { - - users, err := functions.GetJubileeUsers() - chatId := update.Message.Chat.ID - if err != nil { - logger.Info(err) - } - - moderGroupList, err := functions.GetModeratorsGroup() - if err != nil { - logger.Error(err) - } - for _, group := range moderGroupList { - - if group.GroupID == chatId { - - for _, user := range users { - - text := fmt.Sprintf("*Группа:* _%s_\n*Имя:* %s\n*Ник:* @%s\n*Номер вступления:* %d\n"+ - "*Время вступления:* %s ", user.GroupName, user.UserName, user.UserNick, - user.Serial, user.Time.Format(config.StructDateTimeFormat)) - - msg := tgbotapi.NewMessage(chatId, text) - msg.ParseMode = "markdown" - _, _ = bot.Send(msg) - - } - } - } - - } - - //if update.Message.Command() == "12" { - // - // msg := tgbotapi.NewMessage(update.Message.Chat.ID, "keyboard") + //if update.Message.Command() == "jubileelist" { // - // msg.ReplyMarkup = menu.NumericKeyboard + // users, err := functions.GetJubileeUsers() + // chatId := update.Message.Chat.ID + // if err != nil { + // logger.Info(err) + // } // - // _, err := bot.Send(msg) + // moderGroupList, err := functions.GetModeratorsGroup() // if err != nil { // logger.Error(err) // } + // for _, group := range moderGroupList { + // + // if group.GroupID == chatId { + // + // for _, user := range users { + // + // text := fmt.Sprintf("*Группа:* _%s_\n*Имя:* %s\n*Ник:* @%s\n*Номер вступления:* %d\n"+ + // "*Время вступления:* %s ", user.GroupName, user.UserName, user.UserNick, + // user.Serial, user.Time.Format(config.StructDateTimeFormat)) + // + // msg := tgbotapi.NewMessage(chatId, text) + // msg.ParseMode = "markdown" + // _, _ = bot.Send(msg) + // + // } + // } + // } // - // go func() { - // time.Sleep(30 * time.Second) - // msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true) - // }() //} } diff --git a/internal/data/data.go b/internal/data/data.go index 33c793b..86da48c 100755 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -2,11 +2,11 @@ package data import "time" -type User struct { - ID int - Name string - Sex string -} +//type User struct { +// ID int +// Name string +// Sex string +//} type BadWords struct { ID int diff --git a/internal/functions/functions.go b/internal/functions/functions.go index a797d1b..a0b132c 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -253,7 +253,7 @@ func GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { } for _, v := range users { - if v.Serial%500 == 0 || v.Serial%500 == 1 || v.Serial%500 == 2 || v.Serial%4 == 0 { + if v.Serial%500 == 0 || v.Serial%500 == 1 || v.Serial%500 == 2 { jubUsers = append(jubUsers, v) } } diff --git a/internal/menu/menu.go b/internal/menu/menu.go index d817fda..5c61e24 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -6,8 +6,9 @@ import ( const ComMenu = " Список доступных вам команд: 🛠 \n \n" + "✅ `addmoderatorgroup` + номер _(добавление группы модераторов)._\n" + + "✅ `moder` _(отправляет запрос из группы на добавление в список групп модераторов)._\n" + "✅ `chatinfo` _(информация о имени и ID группы будет отправлено в админку," + - " сообщение будет удалено из группы пользователей, если бот админ. )_\n" + + " сообщение будет удалено из группы пользователей, если бот админ)_\n" + "✅ *Мат + слово* _(Слово будет добавлено в базу)._\n" var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( @@ -19,3 +20,6 @@ var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( var button1 = tgbotapi.NewInlineKeyboardButtonData("Список команд", "com_list") var button2 = tgbotapi.NewInlineKeyboardButtonData("Список юбилейный", "jubilee_list") var button3 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу администраторов", "add_mod") + +var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") +var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 8e50268..7642b6c 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -13,6 +13,8 @@ import ( "time" ) +var MesInfo tgbotapi.Update + func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64) { // trim symbols @@ -49,35 +51,35 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi //} // check jubilee users ! - if strings.Contains(strings.ToLower(command[0]), "списокюбилейный") { - - users, err := functions.GetJubileeUsers() - chatId := update.Message.Chat.ID - if err != nil { - logger.Info(err) - } - - moderGroupList, err := functions.GetModeratorsGroup() - if err != nil { - logger.Error(err) - } - - for _, group := range moderGroupList { - - if group.GroupID == chatId { - - for _, user := range users { - - text := fmt.Sprintf("Группа: %s\nИмя: %s\nНик: @%s\nНомер вступления: %d\n"+ - "Время вступления: %s ", user.GroupName, user.UserName, user.UserNick, - user.Serial, user.Time.Format(config.StructDateTimeFormat)) - - _, _ = bot.Send(tgbotapi.NewMessage(chatId, text)) - - } - } - } - } + //if strings.Contains(strings.ToLower(command[0]), "списокюбилейный") { + // + // users, err := functions.GetJubileeUsers() + // chatId := update.Message.Chat.ID + // if err != nil { + // logger.Info(err) + // } + // + // moderGroupList, err := functions.GetModeratorsGroup() + // if err != nil { + // logger.Error(err) + // } + // + // for _, group := range moderGroupList { + // + // if group.GroupID == chatId { + // + // for _, user := range users { + // + // text := fmt.Sprintf("Группа: %s\nИмя: %s\nНик: @%s\nНомер вступления: %d\n"+ + // "Время вступления: %s ", user.GroupName, user.UserName, user.UserNick, + // user.Serial, user.Time.Format(config.StructDateTimeFormat)) + // + // _, _ = bot.Send(tgbotapi.NewMessage(chatId, text)) + // + // } + // } + // } + //} // add moderator group if strings.Contains(strings.ToLower(command[0]), "addmoderatorgroup") { @@ -107,7 +109,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi } } - // new users count + // new users count + if strings.Contains(strings.ToLower(command[0]), "chatinfo") { delMes := update.Message.MessageID chatId := update.Message.Chat.ID @@ -117,14 +119,16 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, delMes)) }() - _, err = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf( - "ID группы: %d\nИмя группы: %s", chatId, groupName))) + msg := tgbotapi.NewMessage(modGroupId, fmt.Sprintf( + "ID группы: `%d`\nИмя группы: *%s*", chatId, groupName)) + msg.ParseMode = "markdown" + _, err = bot.Send(msg) if err != nil { logger.Error(err) } } - // add bad words to the base + // add bad words to the base + if strings.Contains(strings.ToLower(command[0]), "мат") { if len(command) > 1 { @@ -165,13 +169,13 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi } } - // check bad words in chat messages + // check bad words in chat messages + _, b, err := functions.CheckBadWords(command) if err != nil { logger.Error("bad words error", err) } - // message to chat where found bad word, copy to moderator + // message to chat where found bad word, copy to moderators groups + if b && strings.ToLower(command[0]) != "мат" { msgID := update.Message.MessageID @@ -186,11 +190,18 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi badGuyID := update.Message.From.ID groupName := update.Message.Chat.Title - modMess := tgbotapi.NewMessage(modGroupId, fmt.Sprintf( - "Замечены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ - "@%s\nID пользователя: %d\nТекст сообщения: %s\nОригинал сообщения удален из чата.", - groupName, badGuyName, badGuyNick, badGuyID, badText)) - _, _ = bot.Send(modMess) + moderatorsGroups, err := functions.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + for _, v := range moderatorsGroups { + modMess := tgbotapi.NewMessage(v.GroupID, fmt.Sprintf( + "Замечены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ + "@%s\nID пользователя: %d\nТекст сообщения: %s\nВремя: %s\nОригинал сообщения удален из чата.", + groupName, badGuyName, badGuyNick, badGuyID, badText, time.Now().Format(config.StructDateTimeFormat))) + + _, _ = bot.Send(modMess) + } cleanAnswer := tgbotapi.NewMessage(update.Message.Chat.ID, fmt.Sprintf( "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. "+ @@ -203,23 +214,58 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi }() } + // menu moderators groups + if strings.Contains(strings.ToLower(command[0]), "меню") { - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + chatId := update.Message.Chat.ID + moderatorGroups, err := functions.GetModeratorsGroup() + if err != nil { + return + } + for _, group := range moderatorGroups { + if group.GroupID == chatId { + + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "30 seconds") + + msg.ReplyMarkup = menu.NumericKeyboard + + delMes, err := bot.Send(msg) + if err != nil { + logger.Error(err) + } + + go func() { + time.Sleep(30 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, delMes.MessageID)) + }() + } + + } - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "30 seconds") + } - msg.ReplyMarkup = menu.NumericKeyboard + if strings.Contains(strings.ToLower(command[0]), "moder") { - delMes, err := bot.Send(msg) + MesInfo = update + chatId := update.Message.Chat.ID + chatName := update.Message.Chat.Title + userName := update.Message.From.FirstName + userNick := update.Message.From.UserName + + logger.Info("mes from add moder ", modGroupId) + + text := fmt.Sprintf("Новый запрос на добавление группы администраторов:\nНазвание группы: %s\n"+ + "Уникальный номер группы: %d\nИмя пользователя: %s\nНик пользователя: @%s\nВремя запроса: %s", + chatName, chatId, userName, userNick, time.Now().Format(config.StructDateTimeFormat)) + msg := tgbotapi.NewMessage(modGroupId, text) + msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button4)) + _, err = bot.Send(msg) if err != nil { logger.Error(err) } - go func() { - time.Sleep(30 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, delMes.MessageID)) - }() } } From 1a9341b1ea0b1a3d3c9887df631a7b68ed4ab4a8 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 9 Jul 2022 09:49:02 +0700 Subject: [PATCH 07/36] button after choice remove --- internal/callbackmsg/callbackmsg.go | 9 ++++++++- internal/menu/menu.go | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index 4540ac0..8f656da 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -79,7 +79,7 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin case "add_new_mod": if update.CallbackQuery.Message.Chat.ID == modGroupId { - + newGroupName := textmsg.MesInfo.Message.Chat.Title newGroupId := textmsg.MesInfo.Message.Chat.ID logger.Info(newGroupName, newGroupId) @@ -105,6 +105,13 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin if update.CallbackQuery.Message.Chat.ID == modGroupId { + text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) + msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) + msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, + tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button6))) + _, _ = bot.Send(msg) + _, _ = bot.Send(msgConf) + b, _, err := functions.AddModeratorsGroup(newGroupId) if b && err != nil { _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s уже есть.", newGroupName))) diff --git a/internal/menu/menu.go b/internal/menu/menu.go index 5c61e24..af86f22 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -23,3 +23,4 @@ var button3 = tgbotapi.NewInlineKeyboardButtonData("Добавить групп var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") +var Button6 = tgbotapi.NewInlineKeyboardButtonData("Я справился!", "") From a4a3007be77991854e5fda9e74752312b33425cd Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 9 Jul 2022 14:42:00 +0700 Subject: [PATCH 08/36] word database begin --- cmd/main.go | 6 ++--- conf.yml | 14 +++++------ internal/callbackmsg/callbackmsg.go | 4 ++-- internal/chatmembers/chatmembers.go | 6 ++--- internal/config/config.go | 1 + internal/config/constants.go | 10 -------- internal/data/data.go | 10 +++----- internal/data/database.go | 36 +++++++++++++++++++++++++++++ internal/functions/functions.go | 18 ++++++++------- internal/textmsg/textmsg.go | 10 ++++---- 10 files changed, 70 insertions(+), 45 deletions(-) create mode 100644 internal/data/database.go diff --git a/cmd/main.go b/cmd/main.go index 0199491..9acd919 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -52,13 +52,13 @@ func main() { if update.Message != nil { // text messages operations - textmsg.WithTextQueryDo(update, bot, logger, modGroupId) + textmsg.WithTextQueryDo(update, bot, logger, modGroupId, cfg) // social messages from bot in chat socialmsg.WithSocialTextQueryDo(update, bot, logger) } else if update.CallbackQuery != nil { - callbackmsg.WithCallBackDo(update, bot, logger, modGroupId) + callbackmsg.WithCallBackDo(update, bot, logger, modGroupId, cfg) } else if update.Message.Command() != "" { @@ -66,7 +66,7 @@ func main() { comandmsg.CommandQueryDo(update, bot, logger) } else if update.Message.NewChatMembers != nil { - chatmembers.WithChatMembersDo(update, bot, logger) + chatmembers.WithChatMembersDo(update, bot, logger, cfg) } // TODO inline help diff --git a/conf.yml b/conf.yml index d4091d4..930d9c1 100755 --- a/conf.yml +++ b/conf.yml @@ -2,22 +2,22 @@ telegram: - tg_token: + tg_token: 5442143387:AAFPH2yakYUcUjPI8lHjTRjLR7ejvgmo7QU tg_sert: - +youtube: + api_url: https://www.googleapis.com/youtube/v3 + access_token: AIzaSyBhSDVnyrB3kmPlibtEKlxySjgwLUu851E app: log_level: trace -chat_count_config: - test_chat_id_count: - chat_id_count: - moderators: - moderators_group: + moderators_group: -1001797154869 moderators_group_golang: moderators_group_java: moderators_group_python: moderators_group_1s: moderators_group_csharp: + +db_file_path: ./tg-bot-users/internal/sqlitedb/ \ No newline at end of file diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index 8f656da..d282b7d 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -11,7 +11,7 @@ import ( "time" ) -func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64) { +func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { data := update.CallbackQuery.Data @@ -45,7 +45,7 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin logger.Info(err) } - moderGroupList, err := functions.GetModeratorsGroup() + moderGroupList, err := functions.GetModeratorsGroup(cfg) if err != nil { logger.Error(err) } diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index 7ebc7e3..ebcb9c7 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -9,7 +9,7 @@ import ( "time" ) -func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { +func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, cfg *config.Config) { newUser := update.Message.NewChatMembers[0] chatId := update.Message.Chat.ID @@ -25,12 +25,12 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log if count%500 == 0 || count%500 == 1 || count%500 == 2 { - err = functions.AddNewJubileeUser(&newUser, count, groupName) + err = functions.AddNewJubileeUser(&newUser, count, groupName, cfg) if err != nil { logger.Error(err) } - moderGroupList, err := functions.GetModeratorsGroup() + moderGroupList, err := functions.GetModeratorsGroup(cfg) if err != nil { logger.Error(err) } diff --git a/internal/config/config.go b/internal/config/config.go index 76e0788..eca2c77 100755 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -18,6 +18,7 @@ type Config struct { AppConfig AppConfig `yaml:"app"` ChatCountConfig ChatCountConfig `yaml:"chat_count_config"` ModersGroupID ModersGroupID `yaml:"moderators"` + DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true"` } type AppConfig struct { diff --git a/internal/config/constants.go b/internal/config/constants.go index 083af3f..05e78e2 100755 --- a/internal/config/constants.go +++ b/internal/config/constants.go @@ -3,13 +3,3 @@ package config const StructDateTimeFormat = "2006-01-02 15:04" const StructDateFormat = "2006-01-02" const StructTimeFormat = "15:04" -const ( - Jubileelist = "jubileelist" -) - -var SocialMessage bool - -//var SocialChoice = SocialDown -//var SocialUP = "Включено" -//var SocialDown = "Выключено" -//var SocText = fmt.Sprintf("Социальные сообщения: %s", SocialChoice) diff --git a/internal/data/data.go b/internal/data/data.go index 86da48c..22e8ea6 100755 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -1,12 +1,8 @@ package data -import "time" - -//type User struct { -// ID int -// Name string -// Sex string -//} +import ( + "time" +) type BadWords struct { ID int diff --git a/internal/data/database.go b/internal/data/database.go new file mode 100644 index 0000000..22f5d8c --- /dev/null +++ b/internal/data/database.go @@ -0,0 +1,36 @@ +package data + +import ( + "database/sql" + "path/filepath" + "skbot/internal/config" + "skbot/pkg/logging" +) + +type BadWord struct { + logger *logging.Logger + wordsdb *sql.DB +} + +type DataBase interface { +} + +func NewBadWordDB(cfg *config.Config, logger *logging.Logger) (DataBase, error) { + word, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "badwords.db")) + if err != nil { + return nil, err + } + + return &BadWord{ + logger: logger, + wordsdb: word, + }, nil +} + +func NewModeratorsGroupDB(cfg *config.Config, logger *logging.Logger) (DataBase, error) { + return nil, nil +} + +func NewJubUsersDB(cfg *config.Config, logger *logging.Logger) (DataBase, error) { + return nil, nil +} diff --git a/internal/functions/functions.go b/internal/functions/functions.go index a0b132c..380e2e9 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -7,6 +7,8 @@ import ( tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" _ "github.com/mattn/go-sqlite3" "log" + "path/filepath" + "skbot/internal/config" "skbot/internal/data" "strings" ) @@ -40,13 +42,13 @@ func TrimSymbolsFromSlice(s []string) (words []string, err error) { return words, nil } -func CheckBadWords(badList []string) (clearList []string, haveBadWords bool, err error) { +func CheckBadWords(badList []string, cfg config.Config) (clearList []string, haveBadWords bool, err error) { var badWords []data.BadWords var badWord data.BadWords haveBadWords = false - db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/badwords.db") + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath+"badwords.db")) if err != nil { return } @@ -81,12 +83,12 @@ func CheckBadWords(badList []string) (clearList []string, haveBadWords bool, err } -func AddBadWord(word string) (bool, error) { +func AddBadWord(word string, cfg *config.Config) (bool, error) { var badWord data.BadWords var haveWord = false - db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/badwords.db") + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "badwords.db")) if err != nil { return false, err } @@ -178,11 +180,11 @@ func AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.Moderator return haveGroup, modGroups, nil } -func GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { +func GetModeratorsGroup(cfg *config.Config) (groups []data.ModeratorsGroup, err error) { var group data.ModeratorsGroup - db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/moderators.db") + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "moderators.db")) if err != nil { return nil, err } @@ -203,9 +205,9 @@ func GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { } -func AddNewJubileeUser(newUser *tgbotapi.User, serial int, groupName string) error { +func AddNewJubileeUser(newUser *tgbotapi.User, serial int, groupName string, cfg *config.Config) error { - db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/newJubileeUsers.db") + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) if err != nil { return err } diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 7642b6c..6f3c787 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -15,7 +15,7 @@ import ( var MesInfo tgbotapi.Update -func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64) { +func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { // trim symbols if len(update.Message.Text) > 0 { @@ -139,7 +139,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi }() - b, err := functions.AddBadWord(command[1]) + b, err := functions.AddBadWord(command[1], cfg) if err != nil { log.Println(err) } @@ -170,7 +170,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi } // check bad words in chat messages + - _, b, err := functions.CheckBadWords(command) + _, b, err := functions.CheckBadWords(command, *cfg) if err != nil { logger.Error("bad words error", err) } @@ -190,7 +190,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi badGuyID := update.Message.From.ID groupName := update.Message.Chat.Title - moderatorsGroups, err := functions.GetModeratorsGroup() + moderatorsGroups, err := functions.GetModeratorsGroup(cfg) if err != nil { logger.Error(err) } @@ -218,7 +218,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi if strings.Contains(strings.ToLower(command[0]), "меню") { chatId := update.Message.Chat.ID - moderatorGroups, err := functions.GetModeratorsGroup() + moderatorGroups, err := functions.GetModeratorsGroup(cfg) if err != nil { return } From 21d8a05a89095d422c23ca5215c8ae8c00d7734b Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 10 Jul 2022 02:24:24 +0700 Subject: [PATCH 09/36] conf --- conf.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/conf.yml b/conf.yml index 930d9c1..d3c7cc5 100755 --- a/conf.yml +++ b/conf.yml @@ -2,18 +2,15 @@ telegram: - tg_token: 5442143387:AAFPH2yakYUcUjPI8lHjTRjLR7ejvgmo7QU + tg_token: tg_sert: -youtube: - api_url: https://www.googleapis.com/youtube/v3 - access_token: AIzaSyBhSDVnyrB3kmPlibtEKlxySjgwLUu851E app: log_level: trace moderators: - moderators_group: -1001797154869 + moderators_group: moderators_group_golang: moderators_group_java: moderators_group_python: From 94df26da5e1038e0a44253a3807d3e30c7e6a46d Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 10 Jul 2022 05:37:08 +0700 Subject: [PATCH 10/36] readme, restruct fuctions --- README.md | 11 +++++ cmd/main.go | 66 ++++++++++++++++++++++--- internal/callbackmsg/callbackmsg.go | 77 +++++++++++++++++------------ internal/functions/functions.go | 4 +- internal/textmsg/textmsg.go | 29 +++++++++-- 5 files changed, 141 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 5b1e80b..59ef609 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,14 @@ # Список команд: +1. [x] **меню** _(Вызов только из групп модераторов.)_ +2. [x] **chatinfo** _(Вызов из любой группы, где есть бот администратор. Присылает сообщение с ID и названием группы в админку.)_ +3. [x] **moder** _(Вызов из любой группы, где есть бот. Присылает запрос в админку на добавление группы в список + администраторов. Действует ограничение по времени 60 секунд.)_ +4. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.) Бот так-же контролирует содержание нецензурных выражений + в группах, удаляет исходное сообщение, выводит предупреждение в группу. А так-же, присылает оповещение по + всем группам администраторов с данными нарушителя и копией сообщения._ +5. [x] **addmoderatorgroup + ID группы** _(Добавление группы администраторов по ID)_ +6. [x] Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит всем группам администраторов. + Список всех юбилейных пользователей можно вызвать из **меню администратора**. +7. [x] На большинство административных сообщений действует автоматическая очистка. diff --git a/cmd/main.go b/cmd/main.go index 9acd919..5004a0e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -20,6 +20,42 @@ func init() { flag.StringVar(&cfgPath, "config", "tg-bot-users/conf.yml", "config file path") } +// +//type Inst struct { +// logger *logging.Logger +// badword *data.BadWord +// jubiuser *data.JubUsers +// moders *data.ModerGroup +// update *tgbotapi.Update +// bot *tgbotapi.BotAPI +// cfg config.Config +//} +// +//func NewInst(cfg *config.Config, logger *logging.Logger, bot *tgbotapi.BotAPI) (*Inst, error) { +// +// badWord, err := data.NewBadWordDB(cfg) +// if err != nil { +// logger.Fatalf("error connect bad word database: %v", err) +// } +// jubUser, err := data.NewJubUsersDB(cfg) +// if err != nil { +// logger.Fatalf("error connect jubilee user database: %v", err) +// } +// moders, err := data.NewModeratorsGroupDB(cfg) +// if err != nil { +// logger.Errorf("error connect moderators group database: %v", err) +// } +// +// return &Inst{ +// logger: logger, +// badword: badWord, +// jubiuser: jubUser, +// moders: moders, +// bot: bot, +// cfg: config.Config{}, +// }, nil +//} + func main() { log.Print("config initializing") @@ -28,13 +64,26 @@ func main() { log.Print("logger initializing") logger := logging.GetLogger(cfg.AppConfig.LogLevel) + //BadWord, err := data.NewBadWordDB(cfg, logger) + //if err != nil { + // logger.Fatalf("error connect bad word database: %v", err) + //} + //JubUser, err := data.NewJubUsersDB(cfg, logger) + //if err != nil { + // logger.Fatalf("error connect jubilee user database: %v", err) + //} + //Moders, err := data.NewModeratorsGroupDB(cfg, logger) + //if err != nil { + // logger.Errorf("error connect moderators group database: %v", err) + //} + modGroupId := cfg.ModersGroupID.ModeratorsGroup - _, _, err := functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupGolang) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupJava) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupPython) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup1S) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupCSharp) + _, _, err := functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, cfg) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupGolang, cfg) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupJava, cfg) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupPython, cfg) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup1S, cfg) + _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupCSharp, cfg) if err != nil { logger.Info(err) } @@ -43,6 +92,9 @@ func main() { if err != nil { logger.Fatal(err) } + + //inst, err := data.NewInst(cfg, logger, bot) + defer bot.StopReceivingUpdates() for { @@ -77,7 +129,5 @@ func main() { log.Println(query) } - } - } diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index d282b7d..fb37531 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -78,24 +78,30 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin // add new moderators group case "add_new_mod": - if update.CallbackQuery.Message.Chat.ID == modGroupId { + newGroupName := textmsg.MesInfo.Message.Chat.Title + newGroupId := textmsg.MesInfo.Message.Chat.ID + + if newGroupId != 0 { + if update.CallbackQuery.Message.Chat.ID == modGroupId { - newGroupName := textmsg.MesInfo.Message.Chat.Title - newGroupId := textmsg.MesInfo.Message.Chat.ID - logger.Info(newGroupName, newGroupId) + logger.Info(newGroupName, newGroupId) - text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) - msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) - msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, - tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button5))) + text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) + msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) + msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, + tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button5))) - _, _ = bot.Send(msg) - _, _ = bot.Send(msgConf) + _, _ = bot.Send(msg) + _, _ = bot.Send(msgConf) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } } + } else { + _, _ = bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) + _, _ = bot.Request(tgbotapi.NewCallback(update.CallbackQuery.ID, "✅")) } case "add_new_mod_true": @@ -103,29 +109,38 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin newGroupName := textmsg.MesInfo.Message.Chat.Title newGroupId := textmsg.MesInfo.Message.Chat.ID - if update.CallbackQuery.Message.Chat.ID == modGroupId { + if newGroupId != 0 { + if update.CallbackQuery.Message.Chat.ID == modGroupId { - text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) - msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) - msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, - tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button6))) - _, _ = bot.Send(msg) - _, _ = bot.Send(msgConf) + text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) + msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) + msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, + tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button6))) + _, _ = bot.Send(msg) + _, _ = bot.Send(msgConf) - b, _, err := functions.AddModeratorsGroup(newGroupId) - if b && err != nil { - _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s уже есть.", newGroupName))) - } else if b && err == nil { + b, _, err := functions.AddModeratorsGroup(newGroupId, cfg) + if b && err != nil { + _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s уже есть.", newGroupName))) + } else if b && err == nil { - _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s успешно добавлена.", newGroupName))) - } else { - logger.Error(err) - } + _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s успешно добавлена.", newGroupName))) + } else { + logger.Error(err) + } + textmsg.MesInfo.Message.Chat.ID = 0 + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) + textmsg.MesInfo.Message.Chat.ID = 0 } + } else { + _, _ = bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) + _, _ = bot.Request(tgbotapi.NewCallback(update.CallbackQuery.ID, "✅")) } + } } diff --git a/internal/functions/functions.go b/internal/functions/functions.go index 380e2e9..06718d3 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -130,12 +130,12 @@ func AddBadWord(word string, cfg *config.Config) (bool, error) { } -func AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { +func AddModeratorsGroup(group int64, cfg *config.Config) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { var modGroup data.ModeratorsGroup haveGroup = false - db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/moderators.db") + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "moderators.db")) if err != nil { return haveGroup, nil, err } diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 6f3c787..6ebd113 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -15,6 +15,13 @@ import ( var MesInfo tgbotapi.Update +//type Inst struct { +// logger *logging.Logger +// badWord *data.BadWord +// jubUser *data.JubUsers +// moderGroup *data.ModeratorsGroup +//} + func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { // trim symbols @@ -89,9 +96,10 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi newModGroup, err := strconv.ParseInt(command[1], 10, 64) if err != nil { logger.Error(err) + } - b, _, err := functions.AddModeratorsGroup(newModGroup) + b, _, err := functions.AddModeratorsGroup(newModGroup, cfg) if err != nil { logger.Error(err) } @@ -249,23 +257,34 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi if strings.Contains(strings.ToLower(command[0]), "moder") { MesInfo = update + + go func() { + time.Sleep(60 * time.Second) + MesInfo.Message.Chat.ID = 0 + }() + chatId := update.Message.Chat.ID chatName := update.Message.Chat.Title userName := update.Message.From.FirstName userNick := update.Message.From.UserName - - logger.Info("mes from add moder ", modGroupId) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) text := fmt.Sprintf("Новый запрос на добавление группы администраторов:\nНазвание группы: %s\n"+ - "Уникальный номер группы: %d\nИмя пользователя: %s\nНик пользователя: @%s\nВремя запроса: %s", + "Уникальный номер группы: %d\nИмя пользователя: %s\nНик пользователя: @%s\nВремя запроса: %s\n"+ + "Подтвердите в течении 60 секунд, или проигнорируйте сообщение.", chatName, chatId, userName, userNick, time.Now().Format(config.StructDateTimeFormat)) msg := tgbotapi.NewMessage(modGroupId, text) msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button4)) - _, err = bot.Send(msg) + msgDel, err := bot.Send(msg) if err != nil { logger.Error(err) } + go func() { + time.Sleep(60 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(msgDel.Chat.ID, msgDel.MessageID)) + }() + } } From 70adc36634ec169b378246dd13821791b090ed0a Mon Sep 17 00:00:00 2001 From: AzatF Date: Mon, 11 Jul 2022 10:06:18 +0700 Subject: [PATCH 11/36] maked button congratulation new user --- README.md | 4 ++ cmd/main.go | 32 ++++----- internal/callbackmsg/callbackmsg.go | 100 ++++++++++++++++++++++++++-- internal/chatmembers/chatmembers.go | 82 +++++++++++++++++------ internal/data/data.go | 1 + internal/functions/functions.go | 49 +++++++++++--- internal/menu/menu.go | 19 ++++-- internal/textmsg/textmsg.go | 63 ------------------ 8 files changed, 231 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index 59ef609..1862a8b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # tg-bot-users 🤖 +Бот написан на языке GoLang. + # Список команд: 1. [x] **меню** _(Вызов только из групп модераторов.)_ @@ -11,5 +13,7 @@ всем группам администраторов с данными нарушителя и копией сообщения._ 5. [x] **addmoderatorgroup + ID группы** _(Добавление группы администраторов по ID)_ 6. [x] Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит всем группам администраторов. + Возможность поздравить юбилейного пользователя ответным сообщением есть только у главной админки. + Так-же, только в главную админку приходит сообщение если пользователь с таким ID уже есть в списке юбилейных. Список всех юбилейных пользователей можно вызвать из **меню администратора**. 7. [x] На большинство административных сообщений действует автоматическая очистка. diff --git a/cmd/main.go b/cmd/main.go index 5004a0e..332c1c3 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -103,31 +103,31 @@ func main() { if update.Message != nil { - // text messages operations - textmsg.WithTextQueryDo(update, bot, logger, modGroupId, cfg) + if update.Message.Text != "" { + // text messages operations + textmsg.WithTextQueryDo(update, bot, logger, modGroupId, cfg) - // social messages from bot in chat - socialmsg.WithSocialTextQueryDo(update, bot, logger) - } else if update.CallbackQuery != nil { - - callbackmsg.WithCallBackDo(update, bot, logger, modGroupId, cfg) - - } else if update.Message.Command() != "" { + // social messages from bot in chat + socialmsg.WithSocialTextQueryDo(update, bot, logger) + } else if update.Message.Command() != "" { - //com menu (only moderator's chats) - comandmsg.CommandQueryDo(update, bot, logger) - } else if update.Message.NewChatMembers != nil { + //com menu (only moderator's chats) + comandmsg.CommandQueryDo(update, bot, logger) + } else if update.Message.NewChatMembers != nil { - chatmembers.WithChatMembersDo(update, bot, logger, cfg) - } + chatmembers.WithChatMembersDo(update, bot, logger, cfg) + } - // TODO inline help - if update.InlineQuery != nil { + } else if update.CallbackQuery != nil { + callbackmsg.WithCallBackDo(update, bot, logger, modGroupId, cfg) + // TODO inline help + } else if update.InlineQuery != nil { log.Println("response from Inline query") query := update.InlineQuery.Query log.Println(query) } + } } diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index fb37531..4842fcd 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -3,7 +3,9 @@ package callbackmsg import ( "fmt" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "skbot/internal/chatmembers" "skbot/internal/config" + "skbot/internal/data" "skbot/internal/functions" "skbot/internal/menu" "skbot/internal/textmsg" @@ -13,9 +15,9 @@ import ( func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { - data := update.CallbackQuery.Data + callBackDoData := update.CallbackQuery.Data - switch data { + switch callBackDoData { // menu case "com_list": @@ -35,11 +37,12 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin }() // jubilee users + case "jubilee_list": var list string var count = 1 - users, err := functions.GetJubileeUsers() + users, err := functions.GetJubileeUsers(cfg) chatId := update.CallbackQuery.Message.Chat.ID if err != nil { logger.Info(err) @@ -76,6 +79,48 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin } // add new moderators group + + case "all_jubilee_list": + + var list string + var count = 1 + users, err := functions.GetAllJubileeUsers(cfg) + chatId := update.CallbackQuery.Message.Chat.ID + if err != nil { + logger.Info(err) + } + + moderGroupList, err := functions.GetModeratorsGroup(cfg) + if err != nil { + logger.Error(err) + } + + for _, group := range moderGroupList { + + if group.GroupID == chatId { + + for _, user := range users { + + text := fmt.Sprintf("№: %d, Группа: %s, Имя: %s, Ник: @%s, Номер: %d, "+ + "Время: %s ", user.UserID, user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.Format(config.StructDateTimeFormat)) + + list = list + text + "\n\n" + count++ + + } + } + } + msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список новых пользователей:\n"+list) + _, _ = bot.Send(msg) + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + + // add new moderators group + case "add_new_mod": newGroupName := textmsg.MesInfo.Message.Chat.Title @@ -114,10 +159,7 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) - msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, - tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button6))) _, _ = bot.Send(msg) - _, _ = bot.Send(msgConf) b, _, err := functions.AddModeratorsGroup(newGroupId, cfg) if b && err != nil { @@ -142,5 +184,51 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin _, _ = bot.Request(tgbotapi.NewCallback(update.CallbackQuery.ID, "✅")) } + case "new_user": + + msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) + _, _ = bot.Send(msg) + + var newUser data.JubileeUser + users, err := functions.GetJubileeUsers(cfg) + if err != nil { + logger.Error(err) + } + logger.Infof("from callback new user %d", chatmembers.NewUserID) + + for _, user := range users { + + if int64(user.UserID) == chatmembers.NewUserID { + newUser = user + } + } + + if newUser.UserID != 0 { + + text := fmt.Sprintf("🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! "+ + "Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉", newUser.UserName, newUser.Serial) + msg := tgbotapi.NewMessage(newUser.GroupID, text) + + _, _ = bot.Send(msg) + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + + } else { + + msg := tgbotapi.NewMessage(modGroupId, "ID пользователя == 0! Видимо прошло слишком много времени."+ + "Списки пользователей можно запросить из `меню`.") + msg.ParseMode = "markdown" + _, _ = bot.Send(msg) + + callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "❌") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + } + } + } diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index ebcb9c7..531d8f4 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -4,16 +4,24 @@ import ( "fmt" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "skbot/internal/config" + "skbot/internal/data" "skbot/internal/functions" + "skbot/internal/menu" "skbot/pkg/logging" "time" ) +var NewUserID int64 + func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, cfg *config.Config) { newUser := update.Message.NewChatMembers[0] + NewUserID = newUser.ID chatId := update.Message.Chat.ID groupName := update.Message.Chat.Title + userCount := 0 + + logger.Infof("from members NewUserID %d", NewUserID) if !newUser.IsBot { count, err := bot.GetChatMembersCount(tgbotapi.ChatMemberCountConfig{ @@ -23,12 +31,48 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log }, }) - if count%500 == 0 || count%500 == 1 || count%500 == 2 { + msg := tgbotapi.NewMessage(chatId, fmt.Sprintf("Рады вас приветствовать "+ + "%s! Давайте знакомиться, расскажите нам о себе пожалуйста.\n"+ + "Как вас зовут? \nИз какого вы города? \nЧто вас привело к нам?", newUser.FirstName)) + + ans, _ := bot.Send(msg) + + go func() { + + time.Sleep(60 * time.Second) + _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, ans.MessageID)) + }() + + if count%500 == 0 || count%500 == 1 || count%500 == 2 || count%3 == 0 { - err = functions.AddNewJubileeUser(&newUser, count, groupName, cfg) + err = functions.AddNewJubileeUser(&newUser, count, update, logger, cfg) if err != nil { logger.Error(err) } + } + + var newCheckUser data.JubileeUser + newUsers, err := functions.GetJubileeUsers(cfg) + if err != nil { + logger.Error(err) + } + + for _, user := range newUsers { + if int64(user.UserID) == NewUserID { + newCheckUser = user + userCount++ + } + } + + if userCount > 1 { + msg := tgbotapi.NewMessage(cfg.ModersGroupID.ModeratorsGroup, + fmt.Sprintf("*Внимание!* У нас новый пользователь! Но *найдено совпавдение* с таким ID `%d`, "+ + "рекомендую проверить весь список новых пользователей перед поздравлением.\nВызовите `меню`", newCheckUser.UserID)) + msg.ParseMode = "markdown" + _, _ = bot.Send(msg) + } + + if count%500 == 0 || count%3 == 0 { moderGroupList, err := functions.GetModeratorsGroup(cfg) if err != nil { @@ -37,27 +81,27 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log for _, group := range moderGroupList { - text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь\n%s "+ - "(@%s), %d. \nВремя вступления %s", - groupName, newUser.FirstName, newUser.UserName, count, - time.Now().Format(config.StructDateTimeFormat)) + if group.GroupID == cfg.ModersGroupID.ModeratorsGroup { - _, _ = bot.Send(tgbotapi.NewMessage(group.GroupID, text)) - } - - } + text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ + "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", + groupName, newUser.FirstName, newUser.UserName, count, + time.Now().Format(config.StructDateTimeFormat)) + msg := tgbotapi.NewMessage(group.GroupID, text) + msg.ReplyMarkup = menu.NewUserCongratulation - msg := tgbotapi.NewMessage(chatId, fmt.Sprintf("_Рады вас приветствовать_ "+ - "*%s*, _расскажите нам о себе пожалуйста._", newUser.FirstName)) + _, _ = bot.Send(msg) - msg.ParseMode = "markdown" - ans, _ := bot.Send(msg) + } else { + text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ + "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", + groupName, newUser.FirstName, newUser.UserName, count, + time.Now().Format(config.StructDateTimeFormat)) - go func() { - - time.Sleep(60 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, ans.MessageID)) - }() + _, _ = bot.Send(tgbotapi.NewMessage(group.GroupID, text)) + } + } + } } } diff --git a/internal/data/data.go b/internal/data/data.go index 22e8ea6..52e604d 100755 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -21,4 +21,5 @@ type JubileeUser struct { UserNick string Time time.Time GroupName string + GroupID int64 } diff --git a/internal/functions/functions.go b/internal/functions/functions.go index 06718d3..d04b177 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -10,6 +10,7 @@ import ( "path/filepath" "skbot/internal/config" "skbot/internal/data" + "skbot/pkg/logging" "strings" ) @@ -24,7 +25,7 @@ var ( addNewUsersDB = "CREATE TABLE IF NOT EXISTS newJubileeUsers (id INTEGER PRIMARY KEY, serial INTEGER NOT NULL, " + "user_id INTEGER NOT NULL, user_name VARCHAR (30) NOT NULL, user_nick VARCHAR (50) DEFAULT ('нет ника'), " + - "time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, group_name VARCHAR (50) NOT NULL)" + "time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, group_name VARCHAR (50) NOT NULL, group_id INTEGER NOT NULL)" ) func TrimSymbolsFromSlice(s []string) (words []string, err error) { @@ -205,7 +206,7 @@ func GetModeratorsGroup(cfg *config.Config) (groups []data.ModeratorsGroup, err } -func AddNewJubileeUser(newUser *tgbotapi.User, serial int, groupName string, cfg *config.Config) error { +func AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update, logger *logging.Logger, cfg *config.Config) error { db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) if err != nil { @@ -218,10 +219,14 @@ func AddNewJubileeUser(newUser *tgbotapi.User, serial int, groupName string, cfg if err != nil { return err } - _, _ = stat.Exec() + _, err = stat.Exec() + if err != nil { + logger.Error(err) + } stat, err = db.Prepare(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, "+ - "group_name) VALUES ('%d', '%d', '%s', '%s', '%s')", serial, newUser.ID, newUser.FirstName, newUser.UserName, groupName)) + "group_name, group_id) VALUES ('%d', '%d', '%s', '%s', '%s', '%d')", serial, newUser.ID, newUser.FirstName, + newUser.UserName, update.Message.Chat.Title, update.Message.Chat.ID)) if err != nil { log.Println(err) } @@ -233,12 +238,12 @@ func AddNewJubileeUser(newUser *tgbotapi.User, serial int, groupName string, cfg return nil } -func GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { +func GetJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err error) { var user data.JubileeUser var users []data.JubileeUser - db, err := sql.Open("sqlite3", "./tg-bot-users/internal/sqlitedb/newJubileeUsers.db") + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) if err != nil { return nil, err } @@ -250,12 +255,13 @@ func GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { } for rows.Next() { - err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, &user.Time, &user.GroupName) + err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, + &user.Time, &user.GroupName, &user.GroupID) users = append(users, user) } for _, v := range users { - if v.Serial%500 == 0 || v.Serial%500 == 1 || v.Serial%500 == 2 { + if v.Serial%500 == 0 || v.Serial%500 == 1 || v.Serial%500 == 2 || v.Serial%3 == 0 { jubUsers = append(jubUsers, v) } } @@ -263,3 +269,30 @@ func GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { return jubUsers, nil } + +func GetAllJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err error) { + + var user data.JubileeUser + var users []data.JubileeUser + + db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) + if err != nil { + return nil, err + } + defer db.Close() + + rows, err := db.Query("SELECT * FROM newJubileeUsers") + if err != nil { + return nil, err + } + + for rows.Next() { + err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, + &user.Time, &user.GroupName, &user.GroupID) + users = append(users, user) + } + + return users, nil + +} + diff --git a/internal/menu/menu.go b/internal/menu/menu.go index af86f22..17faec8 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -5,22 +5,27 @@ import ( ) const ComMenu = " Список доступных вам команд: 🛠 \n \n" + - "✅ `addmoderatorgroup` + номер _(добавление группы модераторов)._\n" + - "✅ `moder` _(отправляет запрос из группы на добавление в список групп модераторов)._\n" + - "✅ `chatinfo` _(информация о имени и ID группы будет отправлено в админку," + - " сообщение будет удалено из группы пользователей, если бот админ)_\n" + - "✅ *Мат + слово* _(Слово будет добавлено в базу)._\n" + "✅ `addmoderatorgroup` + номер _(добавление группы модераторов)._\n\n" + + "✅ `moder` _(отправляет запрос из группы где есть бот, на добавление этой группы в список групп модераторов)._\n\n" + + "✅ `chatinfo` _(отправляет информацию в админку о имени и ID группы, откуда отправляется команда" + + " сообщение будет удалено из группы отправителя, если бот админ)_\n\n" + + "✅ *Мат + слово* _(Слово будет добавлено в базу)._" var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow(button1), tgbotapi.NewInlineKeyboardRow(button2), - tgbotapi.NewInlineKeyboardRow(button3), + tgbotapi.NewInlineKeyboardRow(button8), ) var button1 = tgbotapi.NewInlineKeyboardButtonData("Список команд", "com_list") var button2 = tgbotapi.NewInlineKeyboardButtonData("Список юбилейный", "jubilee_list") +var button8 = tgbotapi.NewInlineKeyboardButtonData("Весь список новых пользователей ", "all_jubilee_list") var button3 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу администраторов", "add_mod") var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") -var Button6 = tgbotapi.NewInlineKeyboardButtonData("Я справился!", "") + +var NewUserCongratulation = tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("Поздравить", "new_user"), + )) diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 6ebd113..07ec60a 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -15,13 +15,6 @@ import ( var MesInfo tgbotapi.Update -//type Inst struct { -// logger *logging.Logger -// badWord *data.BadWord -// jubUser *data.JubUsers -// moderGroup *data.ModeratorsGroup -//} - func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { // trim symbols @@ -32,62 +25,6 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi logger.Info("error trim symbols from message") } - // menu - //if strings.Contains(strings.ToLower(command[0]), "меню") { - // - // chatMsgDel := update.Message.MessageID - // - // moderGroupList, err := functions.GetModeratorsGroup() - // if err != nil { - // logger.Error(err) - // } - // - // for _, group := range moderGroupList { - // - // if group.GroupID == update.Message.Chat.ID { - // - // del, _ := bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, menu.ComMenu)) - // - // go func() { - // time.Sleep(20 * time.Second) - // _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) - // _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, chatMsgDel)) - // }() - // } - // } - //} - - // check jubilee users ! - //if strings.Contains(strings.ToLower(command[0]), "списокюбилейный") { - // - // users, err := functions.GetJubileeUsers() - // chatId := update.Message.Chat.ID - // if err != nil { - // logger.Info(err) - // } - // - // moderGroupList, err := functions.GetModeratorsGroup() - // if err != nil { - // logger.Error(err) - // } - // - // for _, group := range moderGroupList { - // - // if group.GroupID == chatId { - // - // for _, user := range users { - // - // text := fmt.Sprintf("Группа: %s\nИмя: %s\nНик: @%s\nНомер вступления: %d\n"+ - // "Время вступления: %s ", user.GroupName, user.UserName, user.UserNick, - // user.Serial, user.Time.Format(config.StructDateTimeFormat)) - // - // _, _ = bot.Send(tgbotapi.NewMessage(chatId, text)) - // - // } - // } - // } - //} - // add moderator group if strings.Contains(strings.ToLower(command[0]), "addmoderatorgroup") { From 678a9e0edb6cad1948a1f604cc53429bbd717313 Mon Sep 17 00:00:00 2001 From: AzatF Date: Tue, 12 Jul 2022 02:33:16 +0700 Subject: [PATCH 12/36] --- --- cmd/main.go | 53 +-------------------------------------- internal/data/database.go | 35 ++++++++------------------ 2 files changed, 12 insertions(+), 76 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 332c1c3..b37b643 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -20,42 +20,6 @@ func init() { flag.StringVar(&cfgPath, "config", "tg-bot-users/conf.yml", "config file path") } -// -//type Inst struct { -// logger *logging.Logger -// badword *data.BadWord -// jubiuser *data.JubUsers -// moders *data.ModerGroup -// update *tgbotapi.Update -// bot *tgbotapi.BotAPI -// cfg config.Config -//} -// -//func NewInst(cfg *config.Config, logger *logging.Logger, bot *tgbotapi.BotAPI) (*Inst, error) { -// -// badWord, err := data.NewBadWordDB(cfg) -// if err != nil { -// logger.Fatalf("error connect bad word database: %v", err) -// } -// jubUser, err := data.NewJubUsersDB(cfg) -// if err != nil { -// logger.Fatalf("error connect jubilee user database: %v", err) -// } -// moders, err := data.NewModeratorsGroupDB(cfg) -// if err != nil { -// logger.Errorf("error connect moderators group database: %v", err) -// } -// -// return &Inst{ -// logger: logger, -// badword: badWord, -// jubiuser: jubUser, -// moders: moders, -// bot: bot, -// cfg: config.Config{}, -// }, nil -//} - func main() { log.Print("config initializing") @@ -64,19 +28,6 @@ func main() { log.Print("logger initializing") logger := logging.GetLogger(cfg.AppConfig.LogLevel) - //BadWord, err := data.NewBadWordDB(cfg, logger) - //if err != nil { - // logger.Fatalf("error connect bad word database: %v", err) - //} - //JubUser, err := data.NewJubUsersDB(cfg, logger) - //if err != nil { - // logger.Fatalf("error connect jubilee user database: %v", err) - //} - //Moders, err := data.NewModeratorsGroupDB(cfg, logger) - //if err != nil { - // logger.Errorf("error connect moderators group database: %v", err) - //} - modGroupId := cfg.ModersGroupID.ModeratorsGroup _, _, err := functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, cfg) _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupGolang, cfg) @@ -93,8 +44,6 @@ func main() { logger.Fatal(err) } - //inst, err := data.NewInst(cfg, logger, bot) - defer bot.StopReceivingUpdates() for { @@ -107,7 +56,7 @@ func main() { // text messages operations textmsg.WithTextQueryDo(update, bot, logger, modGroupId, cfg) - // social messages from bot in chat + // command messages socialmsg.WithSocialTextQueryDo(update, bot, logger) } else if update.Message.Command() != "" { diff --git a/internal/data/database.go b/internal/data/database.go index 22f5d8c..b16468a 100644 --- a/internal/data/database.go +++ b/internal/data/database.go @@ -1,36 +1,23 @@ package data import ( - "database/sql" - "path/filepath" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "skbot/internal/config" "skbot/pkg/logging" ) -type BadWord struct { - logger *logging.Logger - wordsdb *sql.DB +type Inst struct { + logger *logging.Logger + update *tgbotapi.Update + bot *tgbotapi.BotAPI + cfg config.Config } -type DataBase interface { -} - -func NewBadWordDB(cfg *config.Config, logger *logging.Logger) (DataBase, error) { - word, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "badwords.db")) - if err != nil { - return nil, err - } +func NewInst(cfg *config.Config, logger *logging.Logger, bot *tgbotapi.BotAPI) (*Inst, error) { - return &BadWord{ - logger: logger, - wordsdb: word, + return &Inst{ + logger: logger, + bot: bot, + cfg: config.Config{}, }, nil } - -func NewModeratorsGroupDB(cfg *config.Config, logger *logging.Logger) (DataBase, error) { - return nil, nil -} - -func NewJubUsersDB(cfg *config.Config, logger *logging.Logger) (DataBase, error) { - return nil, nil -} From d5c48360f56472889593ff755d1dd4afb584028d Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 14 Jul 2022 08:21:02 +0700 Subject: [PATCH 13/36] data restructed --- cmd/main.go | 25 +-- internal/callbackmsg/callbackmsg.go | 76 ++++---- internal/chatmembers/chatmembers.go | 37 ++-- internal/config/config.go | 23 +-- internal/data/data.go | 5 +- internal/data/database.go | 23 --- internal/functions/functions.go | 251 ++++++++++++++------------- internal/menu/menu.go | 5 +- internal/socialmsg/socialmsg.go | 27 --- internal/sqlitedb/badwords.db | Bin 8192 -> 0 bytes internal/sqlitedb/newJubileeUsers.db | Bin 8192 -> 0 bytes internal/textmsg/textmsg.go | 106 ++++++----- 12 files changed, 293 insertions(+), 285 deletions(-) delete mode 100644 internal/data/database.go delete mode 100644 internal/socialmsg/socialmsg.go delete mode 100755 internal/sqlitedb/badwords.db delete mode 100644 internal/sqlitedb/newJubileeUsers.db diff --git a/cmd/main.go b/cmd/main.go index b37b643..e497706 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -8,7 +8,6 @@ import ( "skbot/internal/comandmsg" "skbot/internal/config" "skbot/internal/functions" - "skbot/internal/socialmsg" "skbot/internal/textmsg" "skbot/pkg/client/telegram" "skbot/pkg/logging" @@ -28,13 +27,17 @@ func main() { log.Print("logger initializing") logger := logging.GetLogger(cfg.AppConfig.LogLevel) - modGroupId := cfg.ModersGroupID.ModeratorsGroup - _, _, err := functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, cfg) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupGolang, cfg) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupJava, cfg) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupPython, cfg) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup1S, cfg) - _, _, err = functions.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroupCSharp, cfg) + db, err := functions.NewFuncList(cfg, logger) + if err != nil { + logger.Fatal(err) + } + + err = db.NewData() + if err != nil { + logger.Error(err) + } + + _, _, err = db.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup) if err != nil { logger.Info(err) } @@ -54,10 +57,8 @@ func main() { if update.Message.Text != "" { // text messages operations - textmsg.WithTextQueryDo(update, bot, logger, modGroupId, cfg) + textmsg.WithTextQueryDo(update, bot, logger, cfg) - // command messages - socialmsg.WithSocialTextQueryDo(update, bot, logger) } else if update.Message.Command() != "" { //com menu (only moderator's chats) @@ -68,7 +69,7 @@ func main() { } } else if update.CallbackQuery != nil { - callbackmsg.WithCallBackDo(update, bot, logger, modGroupId, cfg) + callbackmsg.WithCallBackDo(update, bot, logger, cfg) // TODO inline help } else if update.InlineQuery != nil { log.Println("response from Inline query") diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index 4842fcd..2b7fddb 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -2,7 +2,7 @@ package callbackmsg import ( "fmt" - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + tgb "github.com/go-telegram-bot-api/telegram-bot-api/v5" "skbot/internal/chatmembers" "skbot/internal/config" "skbot/internal/data" @@ -13,8 +13,9 @@ import ( "time" ) -func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { +func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, cfg *config.Config) { + db, _ := functions.NewFuncList(cfg, logger) callBackDoData := update.CallbackQuery.Data switch callBackDoData { @@ -22,18 +23,18 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin // menu case "com_list": - msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, menu.ComMenu) + msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, menu.ComMenu) msg.ParseMode = "markdown" delMsg, _ := bot.Send(msg) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") if _, err := bot.Request(callback); err != nil { logger.Error(err) } go func() { time.Sleep(30 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.CallbackQuery.Message.Chat.ID, delMsg.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.CallbackQuery.Message.Chat.ID, delMsg.MessageID)) }() // jubilee users @@ -42,20 +43,20 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin var list string var count = 1 - users, err := functions.GetJubileeUsers(cfg) + users, err := db.GetJubileeUsers() chatId := update.CallbackQuery.Message.Chat.ID if err != nil { logger.Info(err) } - moderGroupList, err := functions.GetModeratorsGroup(cfg) + moderGroupList, err := db.GetModeratorsGroup() if err != nil { logger.Error(err) } for _, group := range moderGroupList { - if group.GroupID == chatId { + if group.ModerGroupID == chatId { for _, user := range users { @@ -69,11 +70,11 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin } } } - msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+list) + msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+list) msg.ParseMode = "markdown" _, _ = bot.Send(msg) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") if _, err := bot.Request(callback); err != nil { logger.Error(err) } @@ -84,20 +85,20 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin var list string var count = 1 - users, err := functions.GetAllJubileeUsers(cfg) + users, err := db.GetAllJubileeUsers() chatId := update.CallbackQuery.Message.Chat.ID if err != nil { logger.Info(err) } - moderGroupList, err := functions.GetModeratorsGroup(cfg) + moderGroupList, err := db.GetModeratorsGroup() if err != nil { logger.Error(err) } for _, group := range moderGroupList { - if group.GroupID == chatId { + if group.ModerGroupID == chatId { for _, user := range users { @@ -111,10 +112,10 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin } } } - msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список новых пользователей:\n"+list) + msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список новых пользователей:\n"+list) _, _ = bot.Send(msg) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") if _, err := bot.Request(callback); err != nil { logger.Error(err) } @@ -127,26 +128,26 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin newGroupId := textmsg.MesInfo.Message.Chat.ID if newGroupId != 0 { - if update.CallbackQuery.Message.Chat.ID == modGroupId { + if update.CallbackQuery.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { logger.Info(newGroupName, newGroupId) text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) - msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) - msgConf := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, - tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button5))) + msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) + msgConf := tgb.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, + tgb.NewInlineKeyboardMarkup(tgb.NewInlineKeyboardRow(menu.Button5))) _, _ = bot.Send(msg) _, _ = bot.Send(msgConf) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") if _, err := bot.Request(callback); err != nil { logger.Error(err) } } } else { - _, _ = bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) - _, _ = bot.Request(tgbotapi.NewCallback(update.CallbackQuery.ID, "✅")) + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } case "add_new_mod_true": @@ -155,24 +156,24 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin newGroupId := textmsg.MesInfo.Message.Chat.ID if newGroupId != 0 { - if update.CallbackQuery.Message.Chat.ID == modGroupId { + if update.CallbackQuery.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) - msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) + msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) _, _ = bot.Send(msg) - b, _, err := functions.AddModeratorsGroup(newGroupId, cfg) + b, _, err := db.AddModeratorsGroup(newGroupId) if b && err != nil { - _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s уже есть.", newGroupName))) + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("Группа %s уже есть.", newGroupName))) } else if b && err == nil { - _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Группа %s успешно добавлена.", newGroupName))) + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("Группа %s успешно добавлена.", newGroupName))) } else { logger.Error(err) } textmsg.MesInfo.Message.Chat.ID = 0 - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") if _, err := bot.Request(callback); err != nil { logger.Error(err) } @@ -180,17 +181,17 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin textmsg.MesInfo.Message.Chat.ID = 0 } } else { - _, _ = bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) - _, _ = bot.Request(tgbotapi.NewCallback(update.CallbackQuery.ID, "✅")) + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } case "new_user": - msg := tgbotapi.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) + msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) _, _ = bot.Send(msg) var newUser data.JubileeUser - users, err := functions.GetJubileeUsers(cfg) + users, err := db.GetJubileeUsers() if err != nil { logger.Error(err) } @@ -205,25 +206,24 @@ func WithCallBackDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggin if newUser.UserID != 0 { - text := fmt.Sprintf("🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! "+ - "Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉", newUser.UserName, newUser.Serial) - msg := tgbotapi.NewMessage(newUser.GroupID, text) + text := fmt.Sprintf(cfg.MsgText.MsgToChatIfNewUser, newUser.UserName, newUser.Serial) + msg := tgb.NewMessage(newUser.GroupID, text) _, _ = bot.Send(msg) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "✅") + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") if _, err := bot.Request(callback); err != nil { logger.Error(err) } } else { - msg := tgbotapi.NewMessage(modGroupId, "ID пользователя == 0! Видимо прошло слишком много времени."+ + msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "ID пользователя == 0! Видимо прошло слишком много времени."+ "Списки пользователей можно запросить из `меню`.") msg.ParseMode = "markdown" _, _ = bot.Send(msg) - callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "❌") + callback := tgb.NewCallback(update.CallbackQuery.ID, "❌") if _, err := bot.Request(callback); err != nil { logger.Error(err) } diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index 531d8f4..a854842 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -2,7 +2,7 @@ package chatmembers import ( "fmt" - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + tgb "github.com/go-telegram-bot-api/telegram-bot-api/v5" "skbot/internal/config" "skbot/internal/data" "skbot/internal/functions" @@ -13,7 +13,9 @@ import ( var NewUserID int64 -func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, cfg *config.Config) { +func WithChatMembersDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, cfg *config.Config) { + + db, _ := functions.NewFuncList(cfg, logger) newUser := update.Message.NewChatMembers[0] NewUserID = newUser.ID @@ -24,14 +26,15 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log logger.Infof("from members NewUserID %d", NewUserID) if !newUser.IsBot { - count, err := bot.GetChatMembersCount(tgbotapi.ChatMemberCountConfig{ - ChatConfig: tgbotapi.ChatConfig{ + + count, err := bot.GetChatMembersCount(tgb.ChatMemberCountConfig{ + ChatConfig: tgb.ChatConfig{ ChatID: chatId, SuperGroupUsername: groupName, }, }) - msg := tgbotapi.NewMessage(chatId, fmt.Sprintf("Рады вас приветствовать "+ + msg := tgb.NewMessage(chatId, fmt.Sprintf("Рады вас приветствовать "+ "%s! Давайте знакомиться, расскажите нам о себе пожалуйста.\n"+ "Как вас зовут? \nИз какого вы города? \nЧто вас привело к нам?", newUser.FirstName)) @@ -40,19 +43,19 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log go func() { time.Sleep(60 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, ans.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(chatId, ans.MessageID)) }() - if count%500 == 0 || count%500 == 1 || count%500 == 2 || count%3 == 0 { + if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%3 == 0 { - err = functions.AddNewJubileeUser(&newUser, count, update, logger, cfg) + err = db.AddNewJubileeUser(&newUser, count, update) if err != nil { logger.Error(err) } } var newCheckUser data.JubileeUser - newUsers, err := functions.GetJubileeUsers(cfg) + newUsers, err := db.GetJubileeUsers() if err != nil { logger.Error(err) } @@ -65,29 +68,30 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log } if userCount > 1 { - msg := tgbotapi.NewMessage(cfg.ModersGroupID.ModeratorsGroup, + msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("*Внимание!* У нас новый пользователь! Но *найдено совпавдение* с таким ID `%d`, "+ "рекомендую проверить весь список новых пользователей перед поздравлением.\nВызовите `меню`", newCheckUser.UserID)) + msg.ParseMode = "markdown" _, _ = bot.Send(msg) } + //TODO FIX count 3 + if count%cfg.Multiplicity == 0 || count%3 == 0 { - if count%500 == 0 || count%3 == 0 { - - moderGroupList, err := functions.GetModeratorsGroup(cfg) + moderGroupList, err := db.GetModeratorsGroup() if err != nil { logger.Error(err) } for _, group := range moderGroupList { - if group.GroupID == cfg.ModersGroupID.ModeratorsGroup { + if group.ModerGroupID == cfg.ModersGroupID.ModeratorsGroup { text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", groupName, newUser.FirstName, newUser.UserName, count, time.Now().Format(config.StructDateTimeFormat)) - msg := tgbotapi.NewMessage(group.GroupID, text) + msg := tgb.NewMessage(group.ModerGroupID, text) msg.ReplyMarkup = menu.NewUserCongratulation _, _ = bot.Send(msg) @@ -98,10 +102,9 @@ func WithChatMembersDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *log groupName, newUser.FirstName, newUser.UserName, count, time.Now().Format(config.StructDateTimeFormat)) - _, _ = bot.Send(tgbotapi.NewMessage(group.GroupID, text)) + _, _ = bot.Send(tgb.NewMessage(group.ModerGroupID, text)) } } } } - } diff --git a/internal/config/config.go b/internal/config/config.go index eca2c77..59d12b2 100755 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -11,14 +11,12 @@ type Config struct { Token string `yaml:"tg_token" env:"TG-BOT-TOKEN" env-required:"true"` Sert string `yaml:"tg_sert"` } - YouTube struct { - APIURL string `yaml:"api_url"` - AccessToken string `yaml:"access_token"` - } AppConfig AppConfig `yaml:"app"` ChatCountConfig ChatCountConfig `yaml:"chat_count_config"` ModersGroupID ModersGroupID `yaml:"moderators"` + MsgText MsgText `yaml:"msg_text"` DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true"` + Multiplicity int `yaml:"multiplicity" env:"multiplicity" env-required:"true"` } type AppConfig struct { @@ -31,12 +29,17 @@ type ChatCountConfig struct { } type ModersGroupID struct { - ModeratorsGroup int64 `yaml:"moderators_group" env:"moderators_group" env-required:"true"` - ModeratorsGroupGolang int64 `yaml:"moderators_group_golang" env:"moderators_group_golang"` - ModeratorsGroupJava int64 `yaml:"moderators_group_java" env:"moderators_group_java"` - ModeratorsGroupPython int64 `yaml:"moderators_group_python" env:"moderators_group_python"` - ModeratorsGroup1S int64 `yaml:"moderators_group_1s" env:"moderators_group_1s"` - ModeratorsGroupCSharp int64 `yaml:"moderators_group_csharp" env:"moderators_group_csharp"` + ModeratorsGroup int64 `yaml:"moderators_group" env:"moderators_group" env-required:"true"` + //ModeratorsGroupGolang int64 `yaml:"moderators_group_golang" env:"moderators_group_golang"` + //ModeratorsGroupJava int64 `yaml:"moderators_group_java" env:"moderators_group_java"` + //ModeratorsGroupPython int64 `yaml:"moderators_group_python" env:"moderators_group_python"` + //ModeratorsGroup1S int64 `yaml:"moderators_group_1s" env:"moderators_group_1s"` + //ModeratorsGroupCSharp int64 `yaml:"moderators_group_csharp" env:"moderators_group_csharp"` +} + +type MsgText struct { + MsgOfBadWordToUserChat string `yaml:"msg_of_bad_word_to_user_chat" env:"MSG-OF-BAD-WORDS-TO-USER-CHAT" env-required:"true"` + MsgToChatIfNewUser string `yaml:"msg_to_chat_if_new_user" env:"MSG-TO-CHAT-IF-NEW-USER" env-required:"true"` } var instance *Config diff --git a/internal/data/data.go b/internal/data/data.go index 52e604d..f512b4a 100755 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -9,8 +9,9 @@ type BadWords struct { Word string } type ModeratorsGroup struct { - ID int - GroupID int64 + ID int + ModerGroupID int64 + UserGroupID int64 } type JubileeUser struct { diff --git a/internal/data/database.go b/internal/data/database.go deleted file mode 100644 index b16468a..0000000 --- a/internal/data/database.go +++ /dev/null @@ -1,23 +0,0 @@ -package data - -import ( - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" - "skbot/internal/config" - "skbot/pkg/logging" -) - -type Inst struct { - logger *logging.Logger - update *tgbotapi.Update - bot *tgbotapi.BotAPI - cfg config.Config -} - -func NewInst(cfg *config.Config, logger *logging.Logger, bot *tgbotapi.BotAPI) (*Inst, error) { - - return &Inst{ - logger: logger, - bot: bot, - cfg: config.Config{}, - }, nil -} diff --git a/internal/functions/functions.go b/internal/functions/functions.go index d04b177..91cd21f 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -7,26 +7,73 @@ import ( tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" _ "github.com/mattn/go-sqlite3" "log" - "path/filepath" + "path" "skbot/internal/config" "skbot/internal/data" "skbot/pkg/logging" "strings" ) -var ( - qb = "CREATE TABLE IF NOT EXISTS badwords (id INTEGER PRIMARY KEY, word VARCHAR (30) NOT NULL)" +type list struct { + cfg *config.Config + logger *logging.Logger + db *sql.DB +} - qbu = "SELECT * FROM badwords" +func NewFuncList(cfg *config.Config, logger *logging.Logger) (FuncList, error) { - mod = "CREATE TABLE IF NOT EXISTS moderators (id INTEGER PRIMARY KEY, groupid INTEGER NOT NULL)" + liteDb, err := sql.Open("sqlite3", path.Join(cfg.DBFilePath, "skb_bot_db.db")) + if err != nil { + logger.Fatalf("error open database %v", err) + } - modSel = "SELECT * FROM moderators" + return &list{ + cfg: cfg, + logger: logger, + db: liteDb, + }, nil - addNewUsersDB = "CREATE TABLE IF NOT EXISTS newJubileeUsers (id INTEGER PRIMARY KEY, serial INTEGER NOT NULL, " + - "user_id INTEGER NOT NULL, user_name VARCHAR (30) NOT NULL, user_nick VARCHAR (50) DEFAULT ('нет ника'), " + - "time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, group_name VARCHAR (50) NOT NULL, group_id INTEGER NOT NULL)" -) +} + +func (l *list) NewData() error { + + stat, err := l.db.Prepare("CREATE TABLE IF NOT EXISTS moderators " + + "(id INTEGER PRIMARY KEY, moder_group_id INTEGER NOT NULL, user_group_id INTEGER DEFAULT 0)") + _, err = stat.Exec() + if err != nil { + return err + } + + stat, err = l.db.Prepare("CREATE TABLE IF NOT EXISTS bad_words " + + "(id INTEGER PRIMARY KEY, word VARCHAR (30) NOT NULL)") + _, err = stat.Exec() + if err != nil { + return err + } + + stat, err = l.db.Prepare("CREATE TABLE IF NOT EXISTS newJubileeUsers " + + "(id INTEGER PRIMARY KEY, serial INTEGER NOT NULL, " + + "user_id INTEGER NOT NULL, user_name VARCHAR (30) NOT NULL, " + + "user_nick VARCHAR (50) DEFAULT ('нет ника'), time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " + + "group_name VARCHAR (50) NOT NULL, group_id INTEGER NOT NULL)") + _, err = stat.Exec() + if err != nil { + return err + } + return nil +} + +type FuncList interface { + NewData() error + AddUserGroupList(moderGroup, userGroup int64) (bool, error) + CheckBadWords(badList []string) (clearList []string, haveBadWords bool, err error) + AddBadWord(word string) (bool, error) + AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) + GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) + AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update) error + GetJubileeUsers() (jubUsers []data.JubileeUser, err error) + GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) +} func TrimSymbolsFromSlice(s []string) (words []string, err error) { @@ -43,24 +90,17 @@ func TrimSymbolsFromSlice(s []string) (words []string, err error) { return words, nil } -func CheckBadWords(badList []string, cfg config.Config) (clearList []string, haveBadWords bool, err error) { +func (l *list) CheckBadWords(badList []string) (clearList []string, haveBadWords bool, err error) { var badWords []data.BadWords var badWord data.BadWords haveBadWords = false - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath+"badwords.db")) - if err != nil { - return - } - - rows, err := db.Query(qbu) + rows, err := l.db.Query("SELECT * FROM bad_words") if err != nil { return nil, false, err } - defer db.Close() - for rows.Next() { err = rows.Scan(&badWord.ID, &badWord.Word) badWords = append(badWords, badWord) @@ -72,41 +112,25 @@ func CheckBadWords(badList []string, cfg config.Config) (clearList []string, hav if word == bad.Word { - log.Println("найдено совпадение матерного слова в базе", word) + l.logger.Infof("найдено совпадение матерного слова в базе: %s", word) haveBadWords = true } - } - } return clearList, haveBadWords, err } -func AddBadWord(word string, cfg *config.Config) (bool, error) { +func (l *list) AddBadWord(word string) (bool, error) { var badWord data.BadWords var haveWord = false - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "badwords.db")) - if err != nil { - return false, err - } - - stat, err := db.Prepare(qb) + rows, err := l.db.Query("SELECT * FROM bad_words") if err != nil { - return false, err } - _, _ = stat.Exec() - - rows, err := db.Query(qbu) - if err != nil { - } - - defer db.Close() - for rows.Next() { err = rows.Scan(&badWord.ID, &badWord.Word) if badWord.Word == word { @@ -117,8 +141,7 @@ func AddBadWord(word string, cfg *config.Config) (bool, error) { if !haveWord { - stat, err = db.Prepare(fmt.Sprintf("INSERT INTO badwords (word) VALUES ('%s')", word)) - stat.Exec() + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO bad_words (word) VALUES ('%s')", word)) if err != nil { return false, errors.New("ошибка добавления матерного слова в базу") @@ -131,106 +154,63 @@ func AddBadWord(word string, cfg *config.Config) (bool, error) { } -func AddModeratorsGroup(group int64, cfg *config.Config) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { +func (l *list) AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { var modGroup data.ModeratorsGroup haveGroup = false - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "moderators.db")) - if err != nil { - return haveGroup, nil, err - } - - defer db.Close() - - stat, err := db.Prepare(mod) - if err != nil { - log.Println(err) - } - - _, err = stat.Exec() - if err != nil { - return haveGroup, nil, err - } - - rows, err := db.Query(modSel) + rows, err := l.db.Query("SELECT * FROM moderators") if err != nil { log.Println(err) } for rows.Next() { - err = rows.Scan(&modGroup.ID, &modGroup.GroupID) + err = rows.Scan(&modGroup.ID, &modGroup.ModerGroupID, &modGroup.UserGroupID) modGroups = append(modGroups, modGroup) } for _, grp := range modGroups { - if grp.GroupID == group { + if grp.ModerGroupID == group { haveGroup = true return haveGroup, modGroups, errors.New("have group") } } if !haveGroup && group != 0 { - stat, err = db.Prepare(fmt.Sprintf("INSERT INTO moderators (groupid) VALUES ('%d')", group)) + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id) VALUES ('%d')", group)) if err != nil { log.Println(err) } - _, _ = stat.Exec() + haveGroup = true } + return haveGroup, modGroups, nil } -func GetModeratorsGroup(cfg *config.Config) (groups []data.ModeratorsGroup, err error) { +func (l *list) GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { - var group data.ModeratorsGroup - - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "moderators.db")) - if err != nil { - return nil, err - } - - defer db.Close() - - rows, err := db.Query(modSel) + rows, err := l.db.Query("SELECT * FROM moderators") if err != nil { log.Println(err) } + var group data.ModeratorsGroup for rows.Next() { - err = rows.Scan(&group.ID, &group.GroupID) + err = rows.Scan(&group.ID, &group.ModerGroupID, &group.UserGroupID) groups = append(groups, group) } - return + return groups, nil } -func AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update, logger *logging.Logger, cfg *config.Config) error { +func (l *list) AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update) error { - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) - if err != nil { - return err - } - defer db.Close() - - log.Println("создание таблицы") - stat, err := db.Prepare(addNewUsersDB) - if err != nil { - return err - } - _, err = stat.Exec() - if err != nil { - logger.Error(err) - } - - stat, err = db.Prepare(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, "+ + _, err := l.db.Exec(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, "+ "group_name, group_id) VALUES ('%d', '%d', '%s', '%s', '%s', '%d')", serial, newUser.ID, newUser.FirstName, newUser.UserName, update.Message.Chat.Title, update.Message.Chat.ID)) - if err != nil { - log.Println(err) - } - _, err = stat.Exec() + if err != nil { log.Println(err) } @@ -238,18 +218,13 @@ func AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Updat return nil } -func GetJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err error) { +func (l *list) GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { var user data.JubileeUser var users []data.JubileeUser - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) - if err != nil { - return nil, err - } - defer db.Close() - - rows, err := db.Query("SELECT * FROM newJubileeUsers") + //TODO limit 3 last users + rows, err := l.db.Query("SELECT * FROM newJubileeUsers") if err != nil { return nil, err } @@ -259,9 +234,10 @@ func GetJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err error &user.Time, &user.GroupName, &user.GroupID) users = append(users, user) } - + //TODO FIX serial 3 for _, v := range users { - if v.Serial%500 == 0 || v.Serial%500 == 1 || v.Serial%500 == 2 || v.Serial%3 == 0 { + + if v.Serial%l.cfg.Multiplicity == 0 || v.Serial%l.cfg.Multiplicity == 1 || v.Serial%l.cfg.Multiplicity == 2 || v.Serial%3 == 0 { jubUsers = append(jubUsers, v) } } @@ -270,18 +246,12 @@ func GetJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err error } -func GetAllJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err error) { +func (l *list) GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) { var user data.JubileeUser var users []data.JubileeUser - db, err := sql.Open("sqlite3", filepath.Join(cfg.DBFilePath, "newJubileeUsers.db")) - if err != nil { - return nil, err - } - defer db.Close() - - rows, err := db.Query("SELECT * FROM newJubileeUsers") + rows, err := l.db.Query("SELECT * FROM newJubileeUsers") if err != nil { return nil, err } @@ -296,3 +266,52 @@ func GetAllJubileeUsers(cfg *config.Config) (jubUsers []data.JubileeUser, err er } +func (l *list) AddUserGroupList(moderGroup, userGroup int64) (bool, error) { + + var moderatorGroup data.ModeratorsGroup + var moderatorGroups []data.ModeratorsGroup + //var haveGroup bool + + l.logger.Infof("moder from func %d", moderGroup) + + rows, err := l.db.Query("SELECT * FROM moderators") + if err != nil { + return false, err + } + + for rows.Next() { + err := rows.Scan(&moderatorGroup.ID, &moderatorGroup.ModerGroupID, &moderatorGroup.UserGroupID) + if err != nil { + return false, err + } + + if moderatorGroup.UserGroupID == userGroup { + return true, err + } + + moderatorGroups = append(moderatorGroups, moderatorGroup) + } + + for _, group := range moderatorGroups { + if group.ModerGroupID == moderGroup && group.UserGroupID == 0 { + _, err = l.db.Exec(fmt.Sprintf("UPDATE moderators SET (user_group_id) = ('%d') WHERE moder_group_id = ('%d')", userGroup, moderGroup)) + if err != nil { + return false, err + } + return false, nil + break + } + } + + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id, user_group_id) VALUES ('%d', '%d)", userGroup, moderGroup)) + if err != nil { + return false, err + } + + return false, nil + +} + +//func GetUserGroupList(update tgbotapi.Update) { +// +//} diff --git a/internal/menu/menu.go b/internal/menu/menu.go index 17faec8..a41e875 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -6,7 +6,10 @@ import ( const ComMenu = " Список доступных вам команд: 🛠 \n \n" + "✅ `addmoderatorgroup` + номер _(добавление группы модераторов)._\n\n" + - "✅ `moder` _(отправляет запрос из группы где есть бот, на добавление этой группы в список групп модераторов)._\n\n" + + "✅ `add-moder-group` _(отправляет запрос из группы где есть бот, на добавление этой группы в список групп модераторов)._\n\n" + + "✅ `add-moder-user-link` _(связывает группу модераторов и пользователей. Введите команду, " + + "затем через пробел номер группы модераторов (должна существовать в базе), затем через пробел номер группы пользователей. " + + "Работает только из главной админки)._\n\n" + "✅ `chatinfo` _(отправляет информацию в админку о имени и ID группы, откуда отправляется команда" + " сообщение будет удалено из группы отправителя, если бот админ)_\n\n" + "✅ *Мат + слово* _(Слово будет добавлено в базу)._" diff --git a/internal/socialmsg/socialmsg.go b/internal/socialmsg/socialmsg.go deleted file mode 100644 index 5d1999a..0000000 --- a/internal/socialmsg/socialmsg.go +++ /dev/null @@ -1,27 +0,0 @@ -package socialmsg - -import ( - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" - "skbot/internal/functions" - "skbot/pkg/logging" - "strings" -) - -func WithSocialTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { - - // trim symbols and make slice from text message - if len(update.Message.Text) > 0 { - - command, err := functions.TrimSymbolsFromSlice(strings.Split(update.Message.Text, " ")) - if err != nil { - logger.Info("error trim symbols from message") - } - - switch strings.ToLower(command[0]) { - case "": - - default: - - } - } -} diff --git a/internal/sqlitedb/badwords.db b/internal/sqlitedb/badwords.db deleted file mode 100755 index 67af31940cc394ac5810f144df5744e0bd8b98be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeH~K~ED=5XawkQLM0USWzoN!{cB=jT#f=;LR0RB-Vm!H9=2piiSkeSexj91GQ0N ztTa7&@e_ElAjHz9)eqodUOam9=+&ba=hbe6lXo*OyV*ChGynO&-=6l?&E#@%N!`yE zRx(93C5D7$iAzceA;#&B&>b#|Hhp10PZR%Zjf->lrX8xX;EkY*7ZYFtOn?b60Vco% zm;e)C0!)AjFaaj;m%sz7KNgQ$rHNuD`*10n$vw#za*xAjWG3*vw6D_M<)p8|teRZT zskv0zpY;Q^5X{~1f<<-RUp%8sv%2F2GuOO8O-`LpsMLH~rEVva3G;70CNBv13E$x> ze1`Y%7GA?DJc2CD!xcCUqc8{;N;J+o{#%+XN5OaRF5lryH*qOL7Qx^t`1 zLE2u;KV2x~-2r2=WDcvJ(I66Y4pScmTco?DE72$wcTZP^L&iYQ5ANs}PJcLp9An)* zXb2h*WB?obCD!2pwdfL^cHPKPP2awn?m*k9^xAXQtr zyaGbvDYzgZB<^rP3NOG@@N;Ed$)WfVK#1FnY^_K0&5ZWDdG~?sM*IkOxFj&;jskSapKe*&$J!|pH+ zJG|Al_#SMty%NYtzT2PGI`Pl6H?m)mpi#P9D915mhgf!qE9RCEW z64+w5t*-4rVQu_GX=Q*u5+jXq=&Wvq#IcFWGH>;Gu3r6FU z-mm-P@yY&T{BNGkJtx|G?S!?pjz&Xa=!UVO*Ee(nj7p=j*{E)Ez53{>QLfjn{7qlQ zO!{fM@i@b>lE^Vrq4Z~>YdeTwOTy!kSj&B)>#=JL=Ux@kTWyybC ka0AahJvcj>!(Ue}=EwXOB@~CJp|)zcUG0r=;|ssI20 diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 07ec60a..32023aa 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -2,7 +2,7 @@ package textmsg import ( "fmt" - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + tgb "github.com/go-telegram-bot-api/telegram-bot-api/v5" "log" "skbot/internal/config" "skbot/internal/functions" @@ -13,9 +13,11 @@ import ( "time" ) -var MesInfo tgbotapi.Update +var MesInfo tgb.Update -func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger, modGroupId int64, cfg *config.Config) { +func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, cfg *config.Config) { + + db, _ := functions.NewFuncList(cfg, logger) // trim symbols if len(update.Message.Text) > 0 { @@ -28,7 +30,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi // add moderator group if strings.Contains(strings.ToLower(command[0]), "addmoderatorgroup") { - if update.Message.Chat.ID == modGroupId { + if update.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { newModGroup, err := strconv.ParseInt(command[1], 10, 64) if err != nil { @@ -36,19 +38,19 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi } - b, _, err := functions.AddModeratorsGroup(newModGroup, cfg) + b, _, err := db.AddModeratorsGroup(newModGroup) if err != nil { logger.Error(err) } if b && err != nil { - _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Такая группа уже есть: %d", newModGroup))) + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("Такая группа уже есть: %d", newModGroup))) } if b && err == nil { - _, _ = bot.Send(tgbotapi.NewMessage(modGroupId, fmt.Sprintf("Успешно добавлена: %d", newModGroup))) + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("Успешно добавлена: %d", newModGroup))) } } @@ -56,17 +58,19 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi // new users count + if strings.Contains(strings.ToLower(command[0]), "chatinfo") { + delMes := update.Message.MessageID chatId := update.Message.Chat.ID groupName := update.Message.Chat.Title go func() { - _, _ = bot.Send(tgbotapi.NewDeleteMessage(chatId, delMes)) + _, _ = bot.Send(tgb.NewDeleteMessage(chatId, delMes)) }() - msg := tgbotapi.NewMessage(modGroupId, fmt.Sprintf( + msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf( "ID группы: `%d`\nИмя группы: *%s*", chatId, groupName)) msg.ParseMode = "markdown" + _, err = bot.Send(msg) if err != nil { logger.Error(err) @@ -80,44 +84,43 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi go func() { time.Sleep(5 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) }() - b, err := functions.AddBadWord(command[1], cfg) + b, err := db.AddBadWord(command[1]) if err != nil { log.Println(err) } if b == true && err == nil { - del, _ := bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Уже есть.")) + del, _ := bot.Send(tgb.NewMessage(update.Message.Chat.ID, "Уже есть.")) go func() { time.Sleep(5 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) }() } else if b == true && err != nil { - del, _ := bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Добавлено.")) + del, _ := bot.Send(tgb.NewMessage(update.Message.Chat.ID, "Добавлено.")) go func() { time.Sleep(5 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) }() - } } } // check bad words in chat messages + - _, b, err := functions.CheckBadWords(command, *cfg) + _, b, err := db.CheckBadWords(command) if err != nil { - logger.Error("bad words error", err) + logger.Error("bad words error: ", err) } // message to chat where found bad word, copy to moderators groups + @@ -127,7 +130,7 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi badText := update.Message.Text go func() { - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, msgID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, msgID)) }() badGuyName := update.Message.From.FirstName @@ -135,27 +138,27 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi badGuyID := update.Message.From.ID groupName := update.Message.Chat.Title - moderatorsGroups, err := functions.GetModeratorsGroup(cfg) + moderatorsGroups, err := db.GetModeratorsGroup() if err != nil { logger.Error(err) } + for _, v := range moderatorsGroups { - modMess := tgbotapi.NewMessage(v.GroupID, fmt.Sprintf( - "Замечены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ + modMess := tgb.NewMessage(v.ModerGroupID, fmt.Sprintf( + "Найдены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ "@%s\nID пользователя: %d\nТекст сообщения: %s\nВремя: %s\nОригинал сообщения удален из чата.", groupName, badGuyName, badGuyNick, badGuyID, badText, time.Now().Format(config.StructDateTimeFormat))) _, _ = bot.Send(modMess) } - cleanAnswer := tgbotapi.NewMessage(update.Message.Chat.ID, fmt.Sprintf( - "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. "+ - "Сообщение удалено, надеемся на ваше понимание.", groupName)) + cleanAnswer := tgb.NewMessage(update.Message.Chat.ID, fmt.Sprintf( + cfg.MsgText.MsgOfBadWordToUserChat, groupName)) del, _ := bot.Send(cleanAnswer) go func() { time.Sleep(30 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) }() } @@ -163,16 +166,16 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi if strings.Contains(strings.ToLower(command[0]), "меню") { chatId := update.Message.Chat.ID - moderatorGroups, err := functions.GetModeratorsGroup(cfg) + moderatorGroups, err := db.GetModeratorsGroup() if err != nil { return } for _, group := range moderatorGroups { - if group.GroupID == chatId { + if group.ModerGroupID == chatId { - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "30 seconds") + msg := tgb.NewMessage(update.Message.Chat.ID, "30 seconds") msg.ReplyMarkup = menu.NumericKeyboard @@ -183,15 +186,14 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi go func() { time.Sleep(30 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, delMes.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, delMes.MessageID)) }() + break } - } - } - if strings.Contains(strings.ToLower(command[0]), "moder") { + if strings.Contains(strings.ToLower(command[0]), "add-moder-group") { MesInfo = update @@ -204,14 +206,17 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi chatName := update.Message.Chat.Title userName := update.Message.From.FirstName userNick := update.Message.From.UserName - _, _ = bot.Send(tgbotapi.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) text := fmt.Sprintf("Новый запрос на добавление группы администраторов:\nНазвание группы: %s\n"+ "Уникальный номер группы: %d\nИмя пользователя: %s\nНик пользователя: @%s\nВремя запроса: %s\n"+ "Подтвердите в течении 60 секунд, или проигнорируйте сообщение.", chatName, chatId, userName, userNick, time.Now().Format(config.StructDateTimeFormat)) - msg := tgbotapi.NewMessage(modGroupId, text) - msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(tgbotapi.NewInlineKeyboardRow(menu.Button4)) + + msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, text) + msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup(tgb.NewInlineKeyboardRow(menu.Button4)) + msgDel, err := bot.Send(msg) if err != nil { logger.Error(err) @@ -219,11 +224,34 @@ func WithTextQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *loggi go func() { time.Sleep(60 * time.Second) - _, _ = bot.Send(tgbotapi.NewDeleteMessage(msgDel.Chat.ID, msgDel.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(msgDel.Chat.ID, msgDel.MessageID)) }() + } + + if strings.Contains(strings.ToLower(command[0]), "add-moder-user-link") { + + if update.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { + + moderGroup, _ := strconv.ParseInt(command[1], 10, 64) + userGroup, _ := strconv.ParseInt(command[2], 10, 64) + logger.Infof("moder %d", moderGroup) + logger.Infof("user %d", userGroup) + + b, err = db.AddUserGroupList(moderGroup, userGroup) + if !b && err != nil { + logger.Error(err) + } + + if b && err == nil { + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "Такая группа пользователей уже есть в базе.")) + } + if !b && err == nil { + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "Успешно добавлено.")) + } + + } } } - } From ec0dd1e7c108da5ad5bc845bb74f4f3befcdee74 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 14 Jul 2022 08:22:29 +0700 Subject: [PATCH 14/36] commands deleted --- internal/comandmsg/comandmsg.go | 61 --------------------------------- 1 file changed, 61 deletions(-) diff --git a/internal/comandmsg/comandmsg.go b/internal/comandmsg/comandmsg.go index 2a240a0..3952e82 100644 --- a/internal/comandmsg/comandmsg.go +++ b/internal/comandmsg/comandmsg.go @@ -7,65 +7,4 @@ import ( func CommandQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { - // com menu (only moderator's chats) ---------------------------- - //if update.Message.Command() == "menu" { - // - // moderGroupList, err := functions.GetModeratorsGroup() - // if err != nil { - // logger.Error(err) - // } - // - // for _, group := range moderGroupList { - // - // if group.GroupID == update.Message.Chat.ID { - // - // msg := tgbotapi.NewMessage(update.Message.Chat.ID, menu.ComMenu) - // - // del, _ := bot.Send(msg) - // - // go func() { - // time.Sleep(60 * time.Second) - // msDel := tgbotapi.NewDeleteMessage(update.Message.Chat.ID, del.MessageID) - // _, _ = bot.Send(msDel) - // - // }() - // - // } - // } - // - //} - - // LIST of all jubilee users -------------------------------------- - //if update.Message.Command() == "jubileelist" { - // - // users, err := functions.GetJubileeUsers() - // chatId := update.Message.Chat.ID - // if err != nil { - // logger.Info(err) - // } - // - // moderGroupList, err := functions.GetModeratorsGroup() - // if err != nil { - // logger.Error(err) - // } - // for _, group := range moderGroupList { - // - // if group.GroupID == chatId { - // - // for _, user := range users { - // - // text := fmt.Sprintf("*Группа:* _%s_\n*Имя:* %s\n*Ник:* @%s\n*Номер вступления:* %d\n"+ - // "*Время вступления:* %s ", user.GroupName, user.UserName, user.UserNick, - // user.Serial, user.Time.Format(config.StructDateTimeFormat)) - // - // msg := tgbotapi.NewMessage(chatId, text) - // msg.ParseMode = "markdown" - // _, _ = bot.Send(msg) - // - // } - // } - // } - // - //} - } From 857bd1a58790c780fe78f72e80826a185ac50900 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 14 Jul 2022 12:44:07 +0700 Subject: [PATCH 15/36] added rules --- cmd/main.go | 12 +- internal/callbackmsg/callbackmsg.go | 29 ++++- internal/chatmembers/chatmembers.go | 124 ++++++++++---------- internal/data/data.go | 8 +- internal/functions/functions.go | 53 +++++---- internal/menu/menu.go | 7 +- internal/textmsg/textmsg.go | 175 ++++++++++++++++------------ 7 files changed, 240 insertions(+), 168 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index e497706..540230e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + tgb "github.com/go-telegram-bot-api/telegram-bot-api/v5" "log" "skbot/internal/callbackmsg" "skbot/internal/chatmembers" @@ -37,15 +38,17 @@ func main() { logger.Error(err) } - _, _, err = db.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup) + updChan, bot, err := telegram.StartBotByChan(cfg, logger) if err != nil { - logger.Info(err) + logger.Fatal(err) } - updChan, bot, err := telegram.StartBotByChan(cfg, logger) + groupInfo, _ := bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "test")) + _, _, err = db.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, groupInfo.Chat.Title) if err != nil { - logger.Fatal(err) + logger.Info(err) } + _, _ = bot.Send(tgb.NewDeleteMessage(groupInfo.Chat.ID, groupInfo.MessageID)) defer bot.StopReceivingUpdates() @@ -78,6 +81,5 @@ func main() { log.Println(query) } - } } diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index 2b7fddb..dfbdbe1 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -162,7 +162,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) _, _ = bot.Send(msg) - b, _, err := db.AddModeratorsGroup(newGroupId) + b, _, err := db.AddModeratorsGroup(newGroupId, newGroupName) if b && err != nil { _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("Группа %s уже есть.", newGroupName))) } else if b && err == nil { @@ -185,7 +185,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } - case "new_user": + case "congratulation_new_user": msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) _, _ = bot.Send(msg) @@ -229,6 +229,31 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, } } + case "moderator_group_list": + + var list = "Список групп модераторов и пользователей: " + + groups, err := db.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + + for _, group := range groups { + + text := fmt.Sprintf("\n№: %d\nМодераторы: %s\nПользователи: %s", group.ID, + group.ModerGroupTitle, group.UserGroupTitle) + + list = list + text + "\n\n" + + } + + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, list)) + + callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") + if _, err := bot.Request(callback); err != nil { + logger.Error(err) + } + } } diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index a854842..c059390 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -27,82 +27,88 @@ func WithChatMembersDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logge if !newUser.IsBot { - count, err := bot.GetChatMembersCount(tgb.ChatMemberCountConfig{ - ChatConfig: tgb.ChatConfig{ - ChatID: chatId, - SuperGroupUsername: groupName, - }, - }) + moderGroupList, err := db.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } - msg := tgb.NewMessage(chatId, fmt.Sprintf("Рады вас приветствовать "+ - "%s! Давайте знакомиться, расскажите нам о себе пожалуйста.\n"+ - "Как вас зовут? \nИз какого вы города? \nЧто вас привело к нам?", newUser.FirstName)) + for _, group := range moderGroupList { - ans, _ := bot.Send(msg) + if update.Message.Chat.ID == group.UserGroupID { - go func() { + count, err := bot.GetChatMembersCount(tgb.ChatMemberCountConfig{ + ChatConfig: tgb.ChatConfig{ + ChatID: chatId, + SuperGroupUsername: groupName, + }, + }) - time.Sleep(60 * time.Second) - _, _ = bot.Send(tgb.NewDeleteMessage(chatId, ans.MessageID)) - }() + msg := tgb.NewMessage(chatId, fmt.Sprintf("Рады вас приветствовать "+ + "%s! Давайте знакомиться, расскажите нам о себе пожалуйста.\n"+ + "Как вас зовут? \nИз какого вы города? \nЧто вас привело к нам?", newUser.FirstName)) - if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%3 == 0 { + ans, _ := bot.Send(msg) - err = db.AddNewJubileeUser(&newUser, count, update) - if err != nil { - logger.Error(err) - } - } + go func() { - var newCheckUser data.JubileeUser - newUsers, err := db.GetJubileeUsers() - if err != nil { - logger.Error(err) - } + time.Sleep(60 * time.Second) + _, _ = bot.Send(tgb.NewDeleteMessage(chatId, ans.MessageID)) + }() - for _, user := range newUsers { - if int64(user.UserID) == NewUserID { - newCheckUser = user - userCount++ - } - } + if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%3 == 0 { - if userCount > 1 { - msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, - fmt.Sprintf("*Внимание!* У нас новый пользователь! Но *найдено совпавдение* с таким ID `%d`, "+ - "рекомендую проверить весь список новых пользователей перед поздравлением.\nВызовите `меню`", newCheckUser.UserID)) + err = db.AddNewJubileeUser(&newUser, count, update) + if err != nil { + logger.Error(err) + } + } - msg.ParseMode = "markdown" - _, _ = bot.Send(msg) - } - //TODO FIX count 3 - if count%cfg.Multiplicity == 0 || count%3 == 0 { + var newCheckUser data.JubileeUser + newUsers, err := db.GetJubileeUsers() + if err != nil { + logger.Error(err) + } - moderGroupList, err := db.GetModeratorsGroup() - if err != nil { - logger.Error(err) - } + for _, user := range newUsers { + if int64(user.UserID) == NewUserID { + newCheckUser = user + userCount++ + } + } - for _, group := range moderGroupList { + if userCount > 1 { + msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, + fmt.Sprintf("*Внимание!* У нас новый пользователь! Но *найдено совпавдение* с таким ID `%d`, "+ + "рекомендую проверить весь список новых пользователей перед поздравлением.\nВызовите `меню`", newCheckUser.UserID)) - if group.ModerGroupID == cfg.ModersGroupID.ModeratorsGroup { + msg.ParseMode = "markdown" + _, _ = bot.Send(msg) + } + //TODO FIX count 3 + if count%cfg.Multiplicity == 0 || count%3 == 0 { - text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ - "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", - groupName, newUser.FirstName, newUser.UserName, count, - time.Now().Format(config.StructDateTimeFormat)) - msg := tgb.NewMessage(group.ModerGroupID, text) - msg.ReplyMarkup = menu.NewUserCongratulation + for _, group := range moderGroupList { - _, _ = bot.Send(msg) + if group.ModerGroupID == cfg.ModersGroupID.ModeratorsGroup { + + text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ + "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", + groupName, newUser.FirstName, newUser.UserName, count, + time.Now().Format(config.StructDateTimeFormat)) + msg := tgb.NewMessage(group.ModerGroupID, text) + msg.ReplyMarkup = menu.NewUserCongratulation + + _, _ = bot.Send(msg) - } else { - text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ - "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", - groupName, newUser.FirstName, newUser.UserName, count, - time.Now().Format(config.StructDateTimeFormat)) + } else if update.Message.Chat.ID == group.UserGroupID { + text := fmt.Sprintf("🎉 В группу: %s вступил юбилейный пользователь!\nИмя: %s "+ + "\nНик: @%s, \nНомер вступления: %d. \nВремя вступления %s", + groupName, newUser.FirstName, newUser.UserName, count, + time.Now().Format(config.StructDateTimeFormat)) - _, _ = bot.Send(tgb.NewMessage(group.ModerGroupID, text)) + _, _ = bot.Send(tgb.NewMessage(group.ModerGroupID, text)) + } + } } } } diff --git a/internal/data/data.go b/internal/data/data.go index f512b4a..25261c1 100755 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -9,9 +9,11 @@ type BadWords struct { Word string } type ModeratorsGroup struct { - ID int - ModerGroupID int64 - UserGroupID int64 + ID int + ModerGroupID int64 + ModerGroupTitle string + UserGroupID int64 + UserGroupTitle string } type JubileeUser struct { diff --git a/internal/functions/functions.go b/internal/functions/functions.go index 91cd21f..f2d5146 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -38,7 +38,8 @@ func NewFuncList(cfg *config.Config, logger *logging.Logger) (FuncList, error) { func (l *list) NewData() error { stat, err := l.db.Prepare("CREATE TABLE IF NOT EXISTS moderators " + - "(id INTEGER PRIMARY KEY, moder_group_id INTEGER NOT NULL, user_group_id INTEGER DEFAULT 0)") + "(id INTEGER PRIMARY KEY, moder_group_id INTEGER NOT NULL, moder_group_title TEXT DEFAULT no_title, " + + "user_group_id INTEGER DEFAULT 0, user_group_title TEXT DEFAULT no_title)") _, err = stat.Exec() if err != nil { return err @@ -65,10 +66,10 @@ func (l *list) NewData() error { type FuncList interface { NewData() error - AddUserGroupList(moderGroup, userGroup int64) (bool, error) + AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTitle string) (bool, error) CheckBadWords(badList []string) (clearList []string, haveBadWords bool, err error) AddBadWord(word string) (bool, error) - AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) + AddModeratorsGroup(group int64, title string) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update) error GetJubileeUsers() (jubUsers []data.JubileeUser, err error) @@ -154,7 +155,7 @@ func (l *list) AddBadWord(word string) (bool, error) { } -func (l *list) AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { +func (l *list) AddModeratorsGroup(group int64, title string) (haveGroup bool, modGroups []data.ModeratorsGroup, err error) { var modGroup data.ModeratorsGroup haveGroup = false @@ -165,7 +166,7 @@ func (l *list) AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data } for rows.Next() { - err = rows.Scan(&modGroup.ID, &modGroup.ModerGroupID, &modGroup.UserGroupID) + err = rows.Scan(&modGroup.ID, &modGroup.ModerGroupID, &modGroup.ModerGroupTitle, &modGroup.UserGroupID, &modGroup.UserGroupTitle) modGroups = append(modGroups, modGroup) } @@ -177,7 +178,8 @@ func (l *list) AddModeratorsGroup(group int64) (haveGroup bool, modGroups []data } if !haveGroup && group != 0 { - _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id) VALUES ('%d')", group)) + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id, moder_group_title, user_group_id , "+ + "user_group_title) VALUES ('%d', '%s', '0', 'Без пользователей.')", group, title)) if err != nil { log.Println(err) } @@ -197,7 +199,7 @@ func (l *list) GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { var group data.ModeratorsGroup for rows.Next() { - err = rows.Scan(&group.ID, &group.ModerGroupID, &group.UserGroupID) + err = rows.Scan(&group.ID, &group.ModerGroupID, &group.ModerGroupTitle, &group.UserGroupID, &group.UserGroupTitle) groups = append(groups, group) } @@ -266,11 +268,11 @@ func (l *list) GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) { } -func (l *list) AddUserGroupList(moderGroup, userGroup int64) (bool, error) { +func (l *list) AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTitle string) (bool, error) { var moderatorGroup data.ModeratorsGroup var moderatorGroups []data.ModeratorsGroup - //var haveGroup bool + var haveGroup = false l.logger.Infof("moder from func %d", moderGroup) @@ -280,38 +282,41 @@ func (l *list) AddUserGroupList(moderGroup, userGroup int64) (bool, error) { } for rows.Next() { - err := rows.Scan(&moderatorGroup.ID, &moderatorGroup.ModerGroupID, &moderatorGroup.UserGroupID) + err := rows.Scan(&moderatorGroup.ID, &moderatorGroup.ModerGroupID, &moderatorGroup.ModerGroupTitle, &moderatorGroup.UserGroupID, &moderatorGroup.UserGroupTitle) if err != nil { return false, err } - if moderatorGroup.UserGroupID == userGroup { - return true, err - } - moderatorGroups = append(moderatorGroups, moderatorGroup) } for _, group := range moderatorGroups { - if group.ModerGroupID == moderGroup && group.UserGroupID == 0 { - _, err = l.db.Exec(fmt.Sprintf("UPDATE moderators SET (user_group_id) = ('%d') WHERE moder_group_id = ('%d')", userGroup, moderGroup)) + + if group.ModerGroupID == moderGroup && group.UserGroupID == userGroup { + haveGroup = true + return true, nil + + } else if group.ModerGroupID == moderGroup && group.UserGroupID == 0 { + _, err = l.db.Exec(fmt.Sprintf("UPDATE moderators SET (user_group_id, user_group_title) = ('%d', '%s') "+ + "WHERE moder_group_id = ('%d')", userGroup, userTitle, moderGroup)) if err != nil { return false, err } + + haveGroup = true return false, nil - break + } } - _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id, user_group_id) VALUES ('%d', '%d)", userGroup, moderGroup)) - if err != nil { - return false, err + if !haveGroup { + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id, moder_group_title, user_group_id, user_group_title) "+ + "VALUES ('%d', '%s', '%d', '%s')", moderGroup, moderTitle, userGroup, userTitle)) + if err != nil { + return false, err + } } return false, nil } - -//func GetUserGroupList(update tgbotapi.Update) { -// -//} diff --git a/internal/menu/menu.go b/internal/menu/menu.go index a41e875..a288951 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -8,7 +8,7 @@ const ComMenu = " Список доступных вам команд: 🛠 "✅ `addmoderatorgroup` + номер _(добавление группы модераторов)._\n\n" + "✅ `add-moder-group` _(отправляет запрос из группы где есть бот, на добавление этой группы в список групп модераторов)._\n\n" + "✅ `add-moder-user-link` _(связывает группу модераторов и пользователей. Введите команду, " + - "затем через пробел номер группы модераторов (должна существовать в базе), затем через пробел номер группы пользователей. " + + "затем через пробел номер группы модераторов, затем через пробел номер группы пользователей. " + "Работает только из главной админки)._\n\n" + "✅ `chatinfo` _(отправляет информацию в админку о имени и ID группы, откуда отправляется команда" + " сообщение будет удалено из группы отправителя, если бот админ)_\n\n" + @@ -18,17 +18,18 @@ var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow(button1), tgbotapi.NewInlineKeyboardRow(button2), tgbotapi.NewInlineKeyboardRow(button8), + tgbotapi.NewInlineKeyboardRow(button3), ) var button1 = tgbotapi.NewInlineKeyboardButtonData("Список команд", "com_list") var button2 = tgbotapi.NewInlineKeyboardButtonData("Список юбилейный", "jubilee_list") var button8 = tgbotapi.NewInlineKeyboardButtonData("Весь список новых пользователей ", "all_jubilee_list") -var button3 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу администраторов", "add_mod") +var button3 = tgbotapi.NewInlineKeyboardButtonData("Список групп модераторов и пользователей.", "moderator_group_list") var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") var NewUserCongratulation = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( - tgbotapi.NewInlineKeyboardButtonData("Поздравить", "new_user"), + tgbotapi.NewInlineKeyboardButtonData("Поздравить", "congratulation_new_user"), )) diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 32023aa..1ceca06 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -27,6 +27,60 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, logger.Info("error trim symbols from message") } + // check bad words in chat messages + + _, b, err := db.CheckBadWords(command) + if err != nil { + logger.Error("bad words error: ", err) + } + + // message to chat where found bad word, copy to moderators groups + + if b && strings.ToLower(command[0]) != "мат" { + + msgID := update.Message.MessageID + badText := update.Message.Text + + go func() { + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, msgID)) + }() + + badGuyName := update.Message.From.FirstName + badGuyNick := update.Message.From.UserName + badGuyID := update.Message.From.ID + groupName := update.Message.Chat.Title + + moderatorsGroups, err := db.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } + + for _, v := range moderatorsGroups { + + if v.UserGroupID == update.Message.Chat.ID { + + modMess := tgb.NewMessage(v.ModerGroupID, fmt.Sprintf( + "Найдены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ + "@%s\nID пользователя: %d\nТекст сообщения: %s\nВремя: %s\nОригинал сообщения удален из чата.", + groupName, badGuyName, badGuyNick, badGuyID, badText, time.Now().Format(config.StructDateTimeFormat))) + + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf( + "Найдены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ + "@%s\nID пользователя: %d\nТекст сообщения: %s\nВремя: %s\nОригинал сообщения удален из чата.", + groupName, badGuyName, badGuyNick, badGuyID, badText, time.Now().Format(config.StructDateTimeFormat)))) + _, _ = bot.Send(modMess) + } + + } + + cleanAnswer := tgb.NewMessage(update.Message.Chat.ID, fmt.Sprintf( + cfg.MsgText.MsgOfBadWordToUserChat, groupName)) + del, _ := bot.Send(cleanAnswer) + + go func() { + time.Sleep(30 * time.Second) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + }() + } + // add moderator group if strings.Contains(strings.ToLower(command[0]), "addmoderatorgroup") { @@ -37,11 +91,13 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, logger.Error(err) } + info, _ := bot.Send(tgb.NewMessage(newModGroup, "test")) - b, _, err := db.AddModeratorsGroup(newModGroup) + b, _, err := db.AddModeratorsGroup(newModGroup, info.Chat.Title) if err != nil { logger.Error(err) } + _, _ = bot.Send(tgb.NewDeleteMessage(newModGroup, info.MessageID)) if b && err != nil { @@ -78,88 +134,51 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, } // add bad words to the base + - if strings.Contains(strings.ToLower(command[0]), "мат") { - - if len(command) > 1 { - - go func() { - time.Sleep(5 * time.Second) - _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) + if strings.Contains(strings.ToLower(command[0]), "мат") && len(command) > 1 { - }() - - b, err := db.AddBadWord(command[1]) - if err != nil { - log.Println(err) - } + moderators, err := db.GetModeratorsGroup() + if err != nil { + logger.Error(err) + } - if b == true && err == nil { + for _, moder := range moderators { - del, _ := bot.Send(tgb.NewMessage(update.Message.Chat.ID, "Уже есть.")) + if update.Message.Chat.ID == moder.ModerGroupID { go func() { - time.Sleep(5 * time.Second) - _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) }() - } else if b == true && err != nil { + b, err := db.AddBadWord(command[1]) + if err != nil { + log.Println(err) + } - del, _ := bot.Send(tgb.NewMessage(update.Message.Chat.ID, "Добавлено.")) + if b == true && err == nil { - go func() { - - time.Sleep(5 * time.Second) - _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) - }() - } - } - } - - // check bad words in chat messages + - _, b, err := db.CheckBadWords(command) - if err != nil { - logger.Error("bad words error: ", err) - } + del, _ := bot.Send(tgb.NewMessage(update.Message.Chat.ID, "Уже есть.")) - // message to chat where found bad word, copy to moderators groups + - if b && strings.ToLower(command[0]) != "мат" { + go func() { - msgID := update.Message.MessageID - badText := update.Message.Text + time.Sleep(5 * time.Second) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) - go func() { - _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, msgID)) - }() + }() - badGuyName := update.Message.From.FirstName - badGuyNick := update.Message.From.UserName - badGuyID := update.Message.From.ID - groupName := update.Message.Chat.Title + } else if b == true && err != nil { - moderatorsGroups, err := db.GetModeratorsGroup() - if err != nil { - logger.Error(err) - } + del, _ := bot.Send(tgb.NewMessage(update.Message.Chat.ID, "Добавлено.")) - for _, v := range moderatorsGroups { - modMess := tgb.NewMessage(v.ModerGroupID, fmt.Sprintf( - "Найдены нецензурные выражения:\nГруппа: %s\nИмя пользователя: %s\nНик пользователя: "+ - "@%s\nID пользователя: %d\nТекст сообщения: %s\nВремя: %s\nОригинал сообщения удален из чата.", - groupName, badGuyName, badGuyNick, badGuyID, badText, time.Now().Format(config.StructDateTimeFormat))) + go func() { - _, _ = bot.Send(modMess) + time.Sleep(5 * time.Second) + _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) + }() + } + } } - - cleanAnswer := tgb.NewMessage(update.Message.Chat.ID, fmt.Sprintf( - cfg.MsgText.MsgOfBadWordToUserChat, groupName)) - del, _ := bot.Send(cleanAnswer) - - go func() { - time.Sleep(30 * time.Second) - _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, del.MessageID)) - }() } // menu moderators groups + @@ -175,7 +194,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) - msg := tgb.NewMessage(update.Message.Chat.ID, "30 seconds") + msg := tgb.NewMessage(update.Message.Chat.ID, "60 секунд") msg.ReplyMarkup = menu.NumericKeyboard @@ -185,7 +204,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, } go func() { - time.Sleep(30 * time.Second) + time.Sleep(60 * time.Second) _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, delMes.MessageID)) }() break @@ -234,10 +253,25 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, moderGroup, _ := strconv.ParseInt(command[1], 10, 64) userGroup, _ := strconv.ParseInt(command[2], 10, 64) - logger.Infof("moder %d", moderGroup) - logger.Infof("user %d", userGroup) - b, err = db.AddUserGroupList(moderGroup, userGroup) + moderInfo, err1 := bot.Send(tgb.NewMessage(moderGroup, "test")) + if err != nil { + logger.Error(err1) + } else { + _, _ = bot.Send(tgb.NewDeleteMessage(moderInfo.Chat.ID, moderInfo.MessageID)) + } + + userInfo, err2 := bot.Send(tgb.NewMessage(userGroup, "test")) + if err2 != nil { + logger.Error(err2) + } else { + _, _ = bot.Send(tgb.NewDeleteMessage(userInfo.Chat.ID, userInfo.MessageID)) + } + + //_, _ = bot.Send(tgb.NewDeleteMessage(moderInfo.Chat.ID, moderInfo.MessageID)) + //_, _ = bot.Send(tgb.NewDeleteMessage(userInfo.Chat.ID, userInfo.MessageID)) + + b, err = db.AddUserGroupList(moderGroup, userGroup, moderInfo.Chat.Title, userInfo.Chat.Title) if !b && err != nil { logger.Error(err) } @@ -248,10 +282,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, if !b && err == nil { _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "Успешно добавлено.")) } - } - } - } } From dbfe8f002932df74fbafccd6009b2042e4a1d5f0 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 14 Jul 2022 13:05:39 +0700 Subject: [PATCH 16/36] conf add, need remove number 2 --- conf2.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 conf2.yml diff --git a/conf2.yml b/conf2.yml new file mode 100755 index 0000000..62d7bb8 --- /dev/null +++ b/conf2.yml @@ -0,0 +1,24 @@ +--- + +multiplicity: 500 + +telegram: + tg_token: + tg_sert: + +app: + log_level: trace + +moderators: + moderators_group: + +db_file_path: ./tg-bot-users/internal/sqlitedb/ + +msg_text: + #---Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. + #---Используется форматированный вывод текста, вставка названия группы в сообщении. (%s) +msg_of_bad_word_to_user_chat: "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." + + #---Текст приветствия в группу при вступлении в группу нового пользователя. + #---Используется форматированный вывод текста, вставка имени пользователя и номера вступления в сообщении. (%s, %d) +msg_to_chat_if_new_user: "🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" From 905a040f8c212e8fb2fea6642a9c959c7b302450 Mon Sep 17 00:00:00 2001 From: AzatF Date: Fri, 15 Jul 2022 09:50:41 +0700 Subject: [PATCH 17/36] time local fix --- README.md | 12 +++++++----- cmd/main.go | 17 +++++++++++++---- internal/callbackmsg/callbackmsg.go | 14 +++++++++----- internal/functions/functions.go | 13 ++++++++----- internal/menu/menu.go | 3 ++- internal/textmsg/textmsg.go | 8 ++------ 6 files changed, 41 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 1862a8b..173c105 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,14 @@ 2. [x] **chatinfo** _(Вызов из любой группы, где есть бот администратор. Присылает сообщение с ID и названием группы в админку.)_ 3. [x] **moder** _(Вызов из любой группы, где есть бот. Присылает запрос в админку на добавление группы в список администраторов. Действует ограничение по времени 60 секунд.)_ -4. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.) Бот так-же контролирует содержание нецензурных выражений +4. [x] **add-moder-user-link** _(Вызов только из главной админки. Связывает группу модераторов и пользователей для + персонализации оповещений о новых пользователях и нарушениях состава текста в группе.)_ +5. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.) Бот так-же контролирует содержание нецензурных выражений в группах, удаляет исходное сообщение, выводит предупреждение в группу. А так-же, присылает оповещение по всем группам администраторов с данными нарушителя и копией сообщения._ -5. [x] **addmoderatorgroup + ID группы** _(Добавление группы администраторов по ID)_ -6. [x] Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит всем группам администраторов. - Возможность поздравить юбилейного пользователя ответным сообщением есть только у главной админки. +6. [x] **addmoderatorgroup + ID группы** _(Добавление группы администраторов по ID из чата админки.)_ +7. [x] Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит настроенным группам администраторов. + Копия в главную админку. Возможность поздравить юбилейного пользователя ответным сообщением есть только у главной админки. Так-же, только в главную админку приходит сообщение если пользователь с таким ID уже есть в списке юбилейных. Список всех юбилейных пользователей можно вызвать из **меню администратора**. -7. [x] На большинство административных сообщений действует автоматическая очистка. +8. [x] На большинство административных сообщений действует автоматическая очистка. diff --git a/cmd/main.go b/cmd/main.go index 540230e..be82103 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -43,12 +43,21 @@ func main() { logger.Fatal(err) } - groupInfo, _ := bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "test")) - _, _, err = db.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, groupInfo.Chat.Title) + moderGroup, err := db.GetModeratorsGroup() if err != nil { - logger.Info(err) + logger.Error(err) + } + + if len(moderGroup) == 0 { + + groupInfo, _ := bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "test")) + _, _, err = db.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, groupInfo.Chat.Title) + if err != nil { + logger.Info(err) + } + _, _ = bot.Send(tgb.NewDeleteMessage(groupInfo.Chat.ID, groupInfo.MessageID)) + } - _, _ = bot.Send(tgb.NewDeleteMessage(groupInfo.Chat.ID, groupInfo.MessageID)) defer bot.StopReceivingUpdates() diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index dfbdbe1..e7f0ba8 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -20,7 +20,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, switch callBackDoData { - // menu + // command list case "com_list": msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, menu.ComMenu) @@ -37,8 +37,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Send(tgb.NewDeleteMessage(update.CallbackQuery.Message.Chat.ID, delMsg.MessageID)) }() - // jubilee users - + // jubilee users case "jubilee_list": var list string @@ -61,8 +60,8 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, for _, user := range users { text := fmt.Sprintf("№: `%d` \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ - "Время: *%s* ", user.UserID, user.GroupName, user.UserName, user.UserNick, - user.Serial, user.Time.Format(config.StructDateTimeFormat)) + "Время: *%s* ", user.ID, user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.UTC().Format(config.StructDateTimeFormat)) list = list + text + "\n\n" count++ @@ -254,6 +253,11 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, logger.Error(err) } + case "remove_button": + + msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) + _, _ = bot.Send(msg) + } } diff --git a/internal/functions/functions.go b/internal/functions/functions.go index f2d5146..6f572cd 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -12,6 +12,7 @@ import ( "skbot/internal/data" "skbot/pkg/logging" "strings" + "time" ) type list struct { @@ -209,12 +210,14 @@ func (l *list) GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { func (l *list) AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update) error { - _, err := l.db.Exec(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, "+ - "group_name, group_id) VALUES ('%d', '%d', '%s', '%s', '%s', '%d')", serial, newUser.ID, newUser.FirstName, - newUser.UserName, update.Message.Chat.Title, update.Message.Chat.ID)) + t := time.Now().Local().Format(config.StructDateTimeFormat) + + _, err := l.db.Exec(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, time, "+ + "group_name, group_id) VALUES ('%d', '%d', '%s', '%s', '%s', '%s', '%d')", serial, newUser.ID, newUser.FirstName, + newUser.UserName, t, update.Message.Chat.Title, update.Message.Chat.ID)) if err != nil { - log.Println(err) + l.logger.Error(err) } return nil @@ -226,7 +229,7 @@ func (l *list) GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { var users []data.JubileeUser //TODO limit 3 last users - rows, err := l.db.Query("SELECT * FROM newJubileeUsers") + rows, err := l.db.Query("SELECT * FROM newJubileeUsers ORDER BY id DESC LIMIT 4 ") if err != nil { return nil, err } diff --git a/internal/menu/menu.go b/internal/menu/menu.go index a288951..f2d919e 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -9,7 +9,7 @@ const ComMenu = " Список доступных вам команд: 🛠 "✅ `add-moder-group` _(отправляет запрос из группы где есть бот, на добавление этой группы в список групп модераторов)._\n\n" + "✅ `add-moder-user-link` _(связывает группу модераторов и пользователей. Введите команду, " + "затем через пробел номер группы модераторов, затем через пробел номер группы пользователей. " + - "Работает только из главной админки)._\n\n" + + "Внимательно проверьте правильность номеров групп)._\n\n" + "✅ `chatinfo` _(отправляет информацию в админку о имени и ID группы, откуда отправляется команда" + " сообщение будет удалено из группы отправителя, если бот админ)_\n\n" + "✅ *Мат + слово* _(Слово будет добавлено в базу)._" @@ -32,4 +32,5 @@ var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "ad var NewUserCongratulation = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("Поздравить", "congratulation_new_user"), + tgbotapi.NewInlineKeyboardButtonData("Отклонить", "remove_button"), )) diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 1ceca06..27eeab6 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -257,19 +257,15 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, moderInfo, err1 := bot.Send(tgb.NewMessage(moderGroup, "test")) if err != nil { logger.Error(err1) - } else { - _, _ = bot.Send(tgb.NewDeleteMessage(moderInfo.Chat.ID, moderInfo.MessageID)) } userInfo, err2 := bot.Send(tgb.NewMessage(userGroup, "test")) if err2 != nil { logger.Error(err2) - } else { - _, _ = bot.Send(tgb.NewDeleteMessage(userInfo.Chat.ID, userInfo.MessageID)) } - //_, _ = bot.Send(tgb.NewDeleteMessage(moderInfo.Chat.ID, moderInfo.MessageID)) - //_, _ = bot.Send(tgb.NewDeleteMessage(userInfo.Chat.ID, userInfo.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(moderInfo.Chat.ID, moderInfo.MessageID)) + _, _ = bot.Send(tgb.NewDeleteMessage(userInfo.Chat.ID, userInfo.MessageID)) b, err = db.AddUserGroupList(moderGroup, userGroup, moderInfo.Chat.Title, userInfo.Chat.Title) if !b && err != nil { From f8aa60a76940325685ce1c2b2ebb9a3bcb0c1d79 Mon Sep 17 00:00:00 2001 From: AzatF Date: Fri, 15 Jul 2022 13:10:47 +0700 Subject: [PATCH 18/36] fixed button functions --- README.md | 49 ++++++++---- cmd/main.go | 4 + conf2.yml | 11 ++- internal/callbackmsg/callbackmsg.go | 114 ++++++++++++++++------------ internal/chatmembers/chatmembers.go | 2 +- internal/config/config.go | 23 ++---- internal/functions/functions.go | 26 ++++--- internal/menu/menu.go | 6 +- internal/textmsg/textmsg.go | 5 +- 9 files changed, 148 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index 173c105..a993f9d 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,43 @@ Бот написан на языке GoLang. +# Список функций: + + +1. Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит связанным группам модераторов. + Копия в админку. Возможность поздравить юбилейного пользователя ответным сообщением, есть только у админки. + Но и из любой группы модераторов можно вызвать список последних юбилейных пользователей и поздравить пользователя. + (Первое поздравление из админки сделано в целях исключения дублирования нажатия "поздравить" из + админки и связанной группы модераторов.) + +2. При совпадении ID пользователя в списке юбилейных пользователей в админку приходит уведомление. +3. Список трех последних юбилейных пользователей можно вызвать из **меню администратора**. +4. Список всех юбилейных пользователей можно вызвать из **меню администратора**. +5. Список всех команд можно вызвать из **меню администратора**. Доступно прямое копирование команды нажатием на неё. +6. В меню встроена кнопка "Памятка модераторам", выводит текст в виде сообщения. Текст задается перед запуском в файле конфигурации. +7. Функция фильтрации содержания нецензурных слов в тесте сообщений в группах пользователей. +8. Функция пополнения списка нецензурных слов. Доступно в только в группах модераторов и админке. +9. Функция передачи ID и названия группы автоматическим сообщением в админку. +10. Реализовано несколько вариантов добавления групп модераторов: + 1 - Запрос из любой группы с ботом командой "", запрос приходит в админку, далее принимается решение одобрить или нет. + 2 - Примой командой с номером группы. Доступно из админки. + 3 - При связывании групп модераторов и пользователей, если группа модераторов не найдена в списке доступных. + (функция добавления группы модераторов без связывания с группами пользователей реализована с целью дальнейшего расширения функционала бота.) +11. Функция просмотра всех групп модераторов и пользователей. +12. Функция фильтрации символов в словах сообщений. Сделано с целью предотвращения маскировки нецензурных слов в сообщениях. + Пополнить или изменить список символов можно в файле конфигурации. +13. На большинство административных сообщений действует автоматическая очистка. + + + + # Список команд: -1. [x] **меню** _(Вызов только из групп модераторов.)_ +1. [x] **меню** _(Вызов только из групп модераторов и админки.)_ 2. [x] **chatinfo** _(Вызов из любой группы, где есть бот администратор. Присылает сообщение с ID и названием группы в админку.)_ 3. [x] **moder** _(Вызов из любой группы, где есть бот. Присылает запрос в админку на добавление группы в список - администраторов. Действует ограничение по времени 60 секунд.)_ -4. [x] **add-moder-user-link** _(Вызов только из главной админки. Связывает группу модераторов и пользователей для - персонализации оповещений о новых пользователях и нарушениях состава текста в группе.)_ -5. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.) Бот так-же контролирует содержание нецензурных выражений - в группах, удаляет исходное сообщение, выводит предупреждение в группу. А так-же, присылает оповещение по - всем группам администраторов с данными нарушителя и копией сообщения._ -6. [x] **addmoderatorgroup + ID группы** _(Добавление группы администраторов по ID из чата админки.)_ -7. [x] Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит настроенным группам администраторов. - Копия в главную админку. Возможность поздравить юбилейного пользователя ответным сообщением есть только у главной админки. - Так-же, только в главную админку приходит сообщение если пользователь с таким ID уже есть в списке юбилейных. - Список всех юбилейных пользователей можно вызвать из **меню администратора**. -8. [x] На большинство административных сообщений действует автоматическая очистка. + модераторов. Действует ограничение по времени 60 секунд.)_ +4. [x] **add-moder-user-link** _(Вызов только из админки. Связывает группу модераторов и пользователей для + персонализации оповещений о новых пользователях и нецензурных слов в группе.)_ +5. [x] **addmoderatorgroup + ID группы** _(Добавление группы модераторов по ID из админки.)_ +6. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.) diff --git a/cmd/main.go b/cmd/main.go index be82103..971966c 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -75,15 +75,19 @@ func main() { //com menu (only moderator's chats) comandmsg.CommandQueryDo(update, bot, logger) + } else if update.Message.NewChatMembers != nil { chatmembers.WithChatMembersDo(update, bot, logger, cfg) } } else if update.CallbackQuery != nil { + callbackmsg.WithCallBackDo(update, bot, logger, cfg) // TODO inline help + } else if update.InlineQuery != nil { + log.Println("response from Inline query") query := update.InlineQuery.Query diff --git a/conf2.yml b/conf2.yml index 62d7bb8..1f7c806 100755 --- a/conf2.yml +++ b/conf2.yml @@ -12,13 +12,20 @@ app: moderators: moderators_group: + db_file_path: ./tg-bot-users/internal/sqlitedb/ msg_text: #---Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. #---Используется форматированный вывод текста, вставка названия группы в сообщении. (%s) -msg_of_bad_word_to_user_chat: "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." + msg_of_bad_word_to_user_chat: "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." #---Текст приветствия в группу при вступлении в группу нового пользователя. #---Используется форматированный вывод текста, вставка имени пользователя и номера вступления в сообщении. (%s, %d) -msg_to_chat_if_new_user: "🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" + msg_to_chat_if_new_user: "🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" + + #---Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" + msg_moderator_member: "В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что то еще на усмотрение администратора." + + #---Список символов для удаления из строк при проверке слов в сообщениях. + msg_trim_symbol: "([]{}*).,!?;:" \ No newline at end of file diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index e7f0ba8..17c9672 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -10,6 +10,8 @@ import ( "skbot/internal/menu" "skbot/internal/textmsg" "skbot/pkg/logging" + "strconv" + "strings" "time" ) @@ -18,6 +20,33 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, db, _ := functions.NewFuncList(cfg, logger) callBackDoData := update.CallbackQuery.Data + callInfo := strings.Split(callBackDoData, " ") + + var localUserId []string + + if callInfo[0] == "congratulation_again" && len(callInfo) > 1 { + + luckyMan, err := strconv.Atoi(callInfo[1]) + if err != nil { + logger.Error(err) + } + + jubileeUsers, err := db.GetAllJubileeUsers() + if err != nil { + logger.Error(err) + } + + user := jubileeUsers[luckyMan-1] + + _, _ = bot.Send(tgb.NewMessage(user.GroupID, fmt.Sprintf(cfg.MsgText.MsgToChatIfNewUser, user.UserName, user.Serial))) + + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) + + msg2 := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) + _, _ = bot.Send(msg2) + + } + switch callBackDoData { // command list @@ -27,10 +56,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, msg.ParseMode = "markdown" delMsg, _ := bot.Send(msg) - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) go func() { time.Sleep(30 * time.Second) @@ -40,8 +66,6 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, // jubilee users case "jubilee_list": - var list string - var count = 1 users, err := db.GetJubileeUsers() chatId := update.CallbackQuery.Message.Chat.ID if err != nil { @@ -63,27 +87,28 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, "Время: *%s* ", user.ID, user.GroupName, user.UserName, user.UserNick, user.Serial, user.Time.UTC().Format(config.StructDateTimeFormat)) - list = list + text + "\n\n" - count++ + localUserId = append(localUserId, strconv.Itoa(user.ID)) + msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+text) + msg.ParseMode = "markdown" + msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup( + tgb.NewInlineKeyboardRow( + tgb.NewInlineKeyboardButtonData("Поздравить", "congratulation_again"+" "+strconv.Itoa(user.ID)), + tgb.NewInlineKeyboardButtonData("Отклонить", "remove_button"), + )) + _, _ = bot.Send(msg) } } } - msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+list) - msg.ParseMode = "markdown" - _, _ = bot.Send(msg) - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) // add new moderators group case "all_jubilee_list": var list string - var count = 1 + users, err := db.GetAllJubileeUsers() chatId := update.CallbackQuery.Message.Chat.ID if err != nil { @@ -106,18 +131,14 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, user.Serial, user.Time.Format(config.StructDateTimeFormat)) list = list + text + "\n\n" - count++ } } } - msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список новых пользователей:\n"+list) - _, _ = bot.Send(msg) - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список новых пользователей:\n"+list)) + + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) // add new moderators group @@ -127,6 +148,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, newGroupId := textmsg.MesInfo.Message.Chat.ID if newGroupId != 0 { + if update.CallbackQuery.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { logger.Info(newGroupName, newGroupId) @@ -139,12 +161,11 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Send(msg) _, _ = bot.Send(msgConf) - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } + } else { + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } @@ -155,6 +176,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, newGroupId := textmsg.MesInfo.Message.Chat.ID if newGroupId != 0 { + if update.CallbackQuery.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) @@ -162,7 +184,9 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Send(msg) b, _, err := db.AddModeratorsGroup(newGroupId, newGroupName) + if b && err != nil { + _, _ = bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, fmt.Sprintf("Группа %s уже есть.", newGroupName))) } else if b && err == nil { @@ -170,16 +194,14 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, } else { logger.Error(err) } - textmsg.MesInfo.Message.Chat.ID = 0 - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) textmsg.MesInfo.Message.Chat.ID = 0 } + } else { + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Время вышло, повторите запрос.")) _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } @@ -194,7 +216,6 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, if err != nil { logger.Error(err) } - logger.Infof("from callback new user %d", chatmembers.NewUserID) for _, user := range users { @@ -210,22 +231,17 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Send(msg) - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) } else { msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "ID пользователя == 0! Видимо прошло слишком много времени."+ "Списки пользователей можно запросить из `меню`.") msg.ParseMode = "markdown" + _, _ = bot.Send(msg) + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "❌")) - callback := tgb.NewCallback(update.CallbackQuery.ID, "❌") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } } case "moderator_group_list": @@ -242,21 +258,23 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, text := fmt.Sprintf("\n№: %d\nМодераторы: %s\nПользователи: %s", group.ID, group.ModerGroupTitle, group.UserGroupTitle) - list = list + text + "\n\n" + list = list + text + "\n" } _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, list)) - callback := tgb.NewCallback(update.CallbackQuery.ID, "✅") - if _, err := bot.Request(callback); err != nil { - logger.Error(err) - } + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) + + case "moderator_member": + + _, _ = bot.Send(tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, cfg.MsgText.MsgModeratorMember)) + + _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "📩")) case "remove_button": - msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text) - _, _ = bot.Send(msg) + _, _ = bot.Send(tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, update.CallbackQuery.Message.Text)) } diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index c059390..190f260 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -54,7 +54,7 @@ func WithChatMembersDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logge time.Sleep(60 * time.Second) _, _ = bot.Send(tgb.NewDeleteMessage(chatId, ans.MessageID)) }() - + // TODO fix count 3 if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%3 == 0 { err = db.AddNewJubileeUser(&newUser, count, update) diff --git a/internal/config/config.go b/internal/config/config.go index 59d12b2..ee5bd2d 100755 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -11,35 +11,26 @@ type Config struct { Token string `yaml:"tg_token" env:"TG-BOT-TOKEN" env-required:"true"` Sert string `yaml:"tg_sert"` } - AppConfig AppConfig `yaml:"app"` - ChatCountConfig ChatCountConfig `yaml:"chat_count_config"` - ModersGroupID ModersGroupID `yaml:"moderators"` - MsgText MsgText `yaml:"msg_text"` - DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true"` - Multiplicity int `yaml:"multiplicity" env:"multiplicity" env-required:"true"` + AppConfig AppConfig `yaml:"app"` + ModersGroupID ModersGroupID `yaml:"moderators"` + MsgText MsgText `yaml:"msg_text"` + DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true"` + Multiplicity int `yaml:"multiplicity" env:"multiplicity" env-required:"true"` } type AppConfig struct { LogLevel string `yaml:"log_level" env:"TG-BOT-LogLevel" env-default:"error" env-required:"true"` } -type ChatCountConfig struct { - TestChatIdCount int64 `yaml:"test_chat_id_count"` - ChatIdCount int64 `yaml:"chat_id_count"` -} - type ModersGroupID struct { ModeratorsGroup int64 `yaml:"moderators_group" env:"moderators_group" env-required:"true"` - //ModeratorsGroupGolang int64 `yaml:"moderators_group_golang" env:"moderators_group_golang"` - //ModeratorsGroupJava int64 `yaml:"moderators_group_java" env:"moderators_group_java"` - //ModeratorsGroupPython int64 `yaml:"moderators_group_python" env:"moderators_group_python"` - //ModeratorsGroup1S int64 `yaml:"moderators_group_1s" env:"moderators_group_1s"` - //ModeratorsGroupCSharp int64 `yaml:"moderators_group_csharp" env:"moderators_group_csharp"` } type MsgText struct { MsgOfBadWordToUserChat string `yaml:"msg_of_bad_word_to_user_chat" env:"MSG-OF-BAD-WORDS-TO-USER-CHAT" env-required:"true"` MsgToChatIfNewUser string `yaml:"msg_to_chat_if_new_user" env:"MSG-TO-CHAT-IF-NEW-USER" env-required:"true"` + MsgModeratorMember string `yaml:"msg_moderator_member" env:"msg_moderator_member"` + MsgTrimSymbol string `yaml:"msg_trim_symbol"` } var instance *Config diff --git a/internal/functions/functions.go b/internal/functions/functions.go index 6f572cd..9b402b7 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -77,13 +77,13 @@ type FuncList interface { GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) } -func TrimSymbolsFromSlice(s []string) (words []string, err error) { +func TrimSymbolsFromSlice(s []string, cfg *config.Config) (words []string, err error) { var messageUpd []string for _, k := range s { - k = strings.Trim(k, "([]{}*).,!") + k = strings.Trim(k, cfg.MsgText.MsgTrimSymbol) messageUpd = append(messageUpd, k) } @@ -167,18 +167,22 @@ func (l *list) AddModeratorsGroup(group int64, title string) (haveGroup bool, mo } for rows.Next() { + err = rows.Scan(&modGroup.ID, &modGroup.ModerGroupID, &modGroup.ModerGroupTitle, &modGroup.UserGroupID, &modGroup.UserGroupTitle) modGroups = append(modGroups, modGroup) } for _, grp := range modGroups { + if grp.ModerGroupID == group { + haveGroup = true return haveGroup, modGroups, errors.New("have group") } } if !haveGroup && group != 0 { + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id, moder_group_title, user_group_id , "+ "user_group_title) VALUES ('%d', '%s', '0', 'Без пользователей.')", group, title)) if err != nil { @@ -199,7 +203,9 @@ func (l *list) GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { } var group data.ModeratorsGroup + for rows.Next() { + err = rows.Scan(&group.ID, &group.ModerGroupID, &group.ModerGroupTitle, &group.UserGroupID, &group.UserGroupTitle) groups = append(groups, group) } @@ -211,7 +217,7 @@ func (l *list) GetModeratorsGroup() (groups []data.ModeratorsGroup, err error) { func (l *list) AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update) error { t := time.Now().Local().Format(config.StructDateTimeFormat) - + _, err := l.db.Exec(fmt.Sprintf("INSERT INTO newJubileeUsers (serial, user_id, user_name, user_nick, time, "+ "group_name, group_id) VALUES ('%d', '%d', '%s', '%s', '%s', '%s', '%d')", serial, newUser.ID, newUser.FirstName, newUser.UserName, t, update.Message.Chat.Title, update.Message.Chat.ID)) @@ -228,17 +234,18 @@ func (l *list) GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { var user data.JubileeUser var users []data.JubileeUser - //TODO limit 3 last users - rows, err := l.db.Query("SELECT * FROM newJubileeUsers ORDER BY id DESC LIMIT 4 ") + rows, err := l.db.Query("SELECT * FROM newJubileeUsers ORDER BY id DESC LIMIT 3 ") if err != nil { return nil, err } for rows.Next() { + err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, &user.Time, &user.GroupName, &user.GroupID) users = append(users, user) } + //TODO FIX serial 3 for _, v := range users { @@ -262,6 +269,7 @@ func (l *list) GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) { } for rows.Next() { + err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, &user.Time, &user.GroupName, &user.GroupID) users = append(users, user) @@ -277,14 +285,13 @@ func (l *list) AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTit var moderatorGroups []data.ModeratorsGroup var haveGroup = false - l.logger.Infof("moder from func %d", moderGroup) - rows, err := l.db.Query("SELECT * FROM moderators") if err != nil { return false, err } for rows.Next() { + err := rows.Scan(&moderatorGroup.ID, &moderatorGroup.ModerGroupID, &moderatorGroup.ModerGroupTitle, &moderatorGroup.UserGroupID, &moderatorGroup.UserGroupTitle) if err != nil { return false, err @@ -296,10 +303,12 @@ func (l *list) AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTit for _, group := range moderatorGroups { if group.ModerGroupID == moderGroup && group.UserGroupID == userGroup { + haveGroup = true return true, nil } else if group.ModerGroupID == moderGroup && group.UserGroupID == 0 { + _, err = l.db.Exec(fmt.Sprintf("UPDATE moderators SET (user_group_id, user_group_title) = ('%d', '%s') "+ "WHERE moder_group_id = ('%d')", userGroup, userTitle, moderGroup)) if err != nil { @@ -308,11 +317,11 @@ func (l *list) AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTit haveGroup = true return false, nil - } } if !haveGroup { + _, err = l.db.Exec(fmt.Sprintf("INSERT INTO moderators (moder_group_id, moder_group_title, user_group_id, user_group_title) "+ "VALUES ('%d', '%s', '%d', '%s')", moderGroup, moderTitle, userGroup, userTitle)) if err != nil { @@ -321,5 +330,4 @@ func (l *list) AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTit } return false, nil - } diff --git a/internal/menu/menu.go b/internal/menu/menu.go index f2d919e..760213f 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -19,12 +19,14 @@ var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow(button2), tgbotapi.NewInlineKeyboardRow(button8), tgbotapi.NewInlineKeyboardRow(button3), + tgbotapi.NewInlineKeyboardRow(button9), ) var button1 = tgbotapi.NewInlineKeyboardButtonData("Список команд", "com_list") -var button2 = tgbotapi.NewInlineKeyboardButtonData("Список юбилейный", "jubilee_list") -var button8 = tgbotapi.NewInlineKeyboardButtonData("Весь список новых пользователей ", "all_jubilee_list") +var button2 = tgbotapi.NewInlineKeyboardButtonData("Список юбилейный (крайние трое)", "jubilee_list") +var button8 = tgbotapi.NewInlineKeyboardButtonData("Весь список юбилейных пользователей ", "all_jubilee_list") var button3 = tgbotapi.NewInlineKeyboardButtonData("Список групп модераторов и пользователей.", "moderator_group_list") +var button9 = tgbotapi.NewInlineKeyboardButtonData("Памятка модераторам.", "moderator_member") var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 27eeab6..67c6063 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -22,7 +22,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, // trim symbols if len(update.Message.Text) > 0 { - command, err := functions.TrimSymbolsFromSlice(strings.Split(update.Message.Text, " ")) + command, err := functions.TrimSymbolsFromSlice(strings.Split(update.Message.Text, " "), cfg) if err != nil { logger.Info("error trim symbols from message") } @@ -91,6 +91,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, logger.Error(err) } + info, _ := bot.Send(tgb.NewMessage(newModGroup, "test")) b, _, err := db.AddModeratorsGroup(newModGroup, info.Chat.Title) @@ -189,7 +190,9 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, if err != nil { return } + for _, group := range moderatorGroups { + if group.ModerGroupID == chatId { _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) From c1e0eddbe8c0e34891b754a4354966c345043149 Mon Sep 17 00:00:00 2001 From: AzatF Date: Fri, 15 Jul 2022 13:12:30 +0700 Subject: [PATCH 19/36] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a993f9d..7040bc5 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,4 @@ 4. [x] **add-moder-user-link** _(Вызов только из админки. Связывает группу модераторов и пользователей для персонализации оповещений о новых пользователях и нецензурных слов в группе.)_ 5. [x] **addmoderatorgroup + ID группы** _(Добавление группы модераторов по ID из админки.)_ -6. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.) +6. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.)_ From 81c0ea06c0e2da9c57ac41e171a1a5de5f07222d Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 16 Jul 2022 01:15:48 +0700 Subject: [PATCH 20/36] users id refactor --- README.md | 21 +++++++++++++++++++++ cmd/main.go | 3 ++- internal/callbackmsg/callbackmsg.go | 4 ++-- internal/menu/menu.go | 6 ++++-- internal/textmsg/textmsg.go | 2 +- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7040bc5..823d420 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,24 @@ персонализации оповещений о новых пользователях и нецензурных слов в группе.)_ 5. [x] **addmoderatorgroup + ID группы** _(Добавление группы модераторов по ID из админки.)_ 6. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.)_ + + +# Конфигурация приложения: + + +- tg_token: Токен для вашего бота, полученный от BotFather. +- tg_sert: SSL сертификат (не обязательно), требуется при запуске бота на WebHook. + +- log_level: Уровень логирования приложения. panic, fatal, error, warning, info, debug, trace. + +- moderators_group: ID группы админки + +- db_file_path: Путь к папке с базой данных. Создается при отсутствии автоматически. (./tg-bot-users/internal/sqlitedb/) + +- msg_of_bad_word_to_user_chat: Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. + +- msg_to_chat_if_new_user: Текст приветствия в группу при вступлении в группу нового пользователя. + +- msg_moderator_member: Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" + +- msg_trim_symbol: Список символов для удаления из строк при проверке слов в сообщениях. \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go index 971966c..b5d182b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -74,7 +74,7 @@ func main() { } else if update.Message.Command() != "" { //com menu (only moderator's chats) - comandmsg.CommandQueryDo(update, bot, logger) + comandmsg.CommandQueryDo(update, bot, logger, cfg) } else if update.Message.NewChatMembers != nil { @@ -94,5 +94,6 @@ func main() { log.Println(query) } + } } diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index 17c9672..ea0263c 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -127,7 +127,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, for _, user := range users { text := fmt.Sprintf("№: %d, Группа: %s, Имя: %s, Ник: @%s, Номер: %d, "+ - "Время: %s ", user.UserID, user.GroupName, user.UserName, user.UserNick, + "Время: %s ", user.ID, user.GroupName, user.UserName, user.UserNick, user.Serial, user.Time.Format(config.StructDateTimeFormat)) list = list + text + "\n\n" @@ -156,7 +156,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, text := fmt.Sprintf("Внимание! Вы подтверждаетете добавление группы: \n %s \nв список администраторов.", newGroupName) msg := tgb.NewEditMessageText(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, text) msgConf := tgb.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, - tgb.NewInlineKeyboardMarkup(tgb.NewInlineKeyboardRow(menu.Button5))) + tgb.NewInlineKeyboardMarkup(tgb.NewInlineKeyboardRow(menu.Button5, menu.Button11))) _, _ = bot.Send(msg) _, _ = bot.Send(msgConf) diff --git a/internal/menu/menu.go b/internal/menu/menu.go index 760213f..91289e3 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -30,9 +30,11 @@ var button9 = tgbotapi.NewInlineKeyboardButtonData("Памятка модера var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") +var Button10 = tgbotapi.NewInlineKeyboardButtonData("Поздравить", "congratulation_new_user") +var Button11 = tgbotapi.NewInlineKeyboardButtonData("Отклонить", "remove_button") var NewUserCongratulation = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( - tgbotapi.NewInlineKeyboardButtonData("Поздравить", "congratulation_new_user"), - tgbotapi.NewInlineKeyboardButtonData("Отклонить", "remove_button"), + Button10, + Button11, )) diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 67c6063..09730a9 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -237,7 +237,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, chatName, chatId, userName, userNick, time.Now().Format(config.StructDateTimeFormat)) msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, text) - msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup(tgb.NewInlineKeyboardRow(menu.Button4)) + msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup(tgb.NewInlineKeyboardRow(menu.Button4, menu.Button11)) msgDel, err := bot.Send(msg) if err != nil { From e6ada379fbe641726d4e7260c2ad07a75d79211e Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 16 Jul 2022 04:33:59 +0700 Subject: [PATCH 21/36] main --- cmd/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/main.go b/cmd/main.go index b5d182b..d2308b4 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,7 +17,7 @@ import ( var cfgPath string func init() { - flag.StringVar(&cfgPath, "config", "tg-bot-users/conf.yml", "config file path") + flag.StringVar(&cfgPath, "config", "/home/azat/GolandProjects/telegram_bot_skb/etc/tgbot/conf.yml", "config file path") } func main() { From cf277235bce68b95a60b84cb422f4ffafbe90952 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sat, 16 Jul 2022 19:59:26 +0700 Subject: [PATCH 22/36] makefike --- Dockerfile | 9 +++++---- Makefile | 1 + folders.tar.gz | Bin 0 -> 175 bytes 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 folders.tar.gz diff --git a/Dockerfile b/Dockerfile index 7478e47..69c6fd2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ -FROM golang:1.18.3 as builder +FROM golang:1.18.3 as builder +LABEL stage=tgbotbuilder WORKDIR /src COPY go.mod . @@ -9,10 +10,10 @@ RUN go mod download COPY . . RUN make build +RUN mkdir -p /etc/tgbot && mkdir /data FROM scratch - COPY --from=builder /app /app +ADD folders.tar.gz / -ENTRYPOINT [ "/app" ] -#EXPOSE 80 \ No newline at end of file +ENTRYPOINT [ "/app" ] \ No newline at end of file diff --git a/Makefile b/Makefile index 6b0fb1c..a589b8e 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ build: image: docker build -t skillbot:latest . + docker image prune -f --filter label=stage=tgbotbuilder run: go run cmd/main.go \ No newline at end of file diff --git a/folders.tar.gz b/folders.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1bf6740e5ee37beea0ca531adac9a3c8efcecd49 GIT binary patch literal 175 zcmb2|=3oE==C@ZIxegf!I9#;!^1q-qbBU$@6{V(#jK_bsZf%m@7`sH_&-Rl_kt}sa zrOHQVE|)m8<(9;m=fBjh?Y_49vtMY>*0|n~g@3NPyi4|T4n6tQ?AvvdlKbcW-ufS0 zTI^*xwU(v$zr^(~*Db!6OX>Xm9$+48CpM39_OIUtU(2^G{Vx~y_w&yS&y&_C9R3sk YYqi#Yd5EjPWWrSTqKUd~3>pj!0EgRBjsO4v literal 0 HcmV?d00001 From 175b9fcba3e71c3f1106a05378acc27b5b0c77a5 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 17 Jul 2022 06:35:01 +0700 Subject: [PATCH 23/36] mkdir --- internal/functions/functions.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/functions/functions.go b/internal/functions/functions.go index 9b402b7..f806e64 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -7,6 +7,7 @@ import ( tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" _ "github.com/mattn/go-sqlite3" "log" + "os" "path" "skbot/internal/config" "skbot/internal/data" @@ -23,6 +24,11 @@ type list struct { func NewFuncList(cfg *config.Config, logger *logging.Logger) (FuncList, error) { + err := os.MkdirAll(cfg.DBFilePath, 0777) + if err != nil { + logger.Error(err) + } + liteDb, err := sql.Open("sqlite3", path.Join(cfg.DBFilePath, "skb_bot_db.db")) if err != nil { logger.Fatalf("error open database %v", err) From 5cdf159a7733abb00677d1e958c583dd1054b254 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 17 Jul 2022 07:04:39 +0700 Subject: [PATCH 24/36] main --- cmd/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/main.go b/cmd/main.go index d2308b4..e43ab7c 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,7 +17,7 @@ import ( var cfgPath string func init() { - flag.StringVar(&cfgPath, "config", "/home/azat/GolandProjects/telegram_bot_skb/etc/tgbot/conf.yml", "config file path") + flag.StringVar(&cfgPath, "config", "/conf.yml", "config file path") } func main() { From faedacb90f8234c909c3740897eee989d6a5bf94 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 17 Jul 2022 07:08:44 +0700 Subject: [PATCH 25/36] conf --- cmd/main.go | 2 +- conf.yml | 25 ++++++++++++++++++------- conf2.yml | 31 ------------------------------- 3 files changed, 19 insertions(+), 39 deletions(-) delete mode 100755 conf2.yml diff --git a/cmd/main.go b/cmd/main.go index e43ab7c..b8005ce 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,7 +17,7 @@ import ( var cfgPath string func init() { - flag.StringVar(&cfgPath, "config", "/conf.yml", "config file path") + flag.StringVar(&cfgPath, "config", "/tg-bot-users/conf.yml", "config file path") } func main() { diff --git a/conf.yml b/conf.yml index d3c7cc5..01b1fc0 100755 --- a/conf.yml +++ b/conf.yml @@ -1,20 +1,31 @@ --- +multiplicity: 500 telegram: tg_token: tg_sert: - app: log_level: trace moderators: moderators_group: - moderators_group_golang: - moderators_group_java: - moderators_group_python: - moderators_group_1s: - moderators_group_csharp: -db_file_path: ./tg-bot-users/internal/sqlitedb/ \ No newline at end of file + +db_file_path: ./internal/sqlitedb/ + +msg_text: +#---Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. +#---Используется форматированный вывод текста, вставка названия группы в сообщении. (%s) + msg_of_bad_word_to_user_chat: "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." + +#---Текст приветствия в группу при вступлении в группу нового пользователя. +#---Используется форматированный вывод текста, вставка имени пользователя и номера вступления в сообщении. (%s, %d) + msg_to_chat_if_new_user: "🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" + +#---Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" + msg_moderator_member: "В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что то еще на усмотрение администратора." + +#---Список символов для удаления из строк при проверке слов в сообщениях. + msg_trim_symbol: "([]{}*).,!?;:" \ No newline at end of file diff --git a/conf2.yml b/conf2.yml deleted file mode 100755 index 1f7c806..0000000 --- a/conf2.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- - -multiplicity: 500 - -telegram: - tg_token: - tg_sert: - -app: - log_level: trace - -moderators: - moderators_group: - - -db_file_path: ./tg-bot-users/internal/sqlitedb/ - -msg_text: - #---Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. - #---Используется форматированный вывод текста, вставка названия группы в сообщении. (%s) - msg_of_bad_word_to_user_chat: "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." - - #---Текст приветствия в группу при вступлении в группу нового пользователя. - #---Используется форматированный вывод текста, вставка имени пользователя и номера вступления в сообщении. (%s, %d) - msg_to_chat_if_new_user: "🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" - - #---Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" - msg_moderator_member: "В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что то еще на усмотрение администратора." - - #---Список символов для удаления из строк при проверке слов в сообщениях. - msg_trim_symbol: "([]{}*).,!?;:" \ No newline at end of file From 030c1a0aa11dc7373575eb7cb56c548bc4c442b2 Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 17 Jul 2022 12:41:18 +0700 Subject: [PATCH 26/36] check congrat --- cmd/main.go | 1 + internal/callbackmsg/callbackmsg.go | 69 ++++++++++++++++++++++------- internal/chatmembers/chatmembers.go | 27 ++++++++--- internal/data/data.go | 1 + internal/functions/functions.go | 20 +++++++-- internal/menu/menu.go | 8 +--- internal/textmsg/textmsg.go | 2 + 7 files changed, 95 insertions(+), 33 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index b8005ce..c5a80f5 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,6 +17,7 @@ import ( var cfgPath string func init() { + //flag.StringVar(&cfgPath, "config", "/tg-bot-users/conf.yml", "config file path") flag.StringVar(&cfgPath, "config", "/tg-bot-users/conf.yml", "config file path") } diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index ea0263c..5984c53 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -38,6 +38,11 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, user := jubileeUsers[luckyMan-1] + err = db.MarkUser(user.ID) + if err != nil { + logger.Error(err) + } + _, _ = bot.Send(tgb.NewMessage(user.GroupID, fmt.Sprintf(cfg.MsgText.MsgToChatIfNewUser, user.UserName, user.Serial))) _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) @@ -83,19 +88,40 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, for _, user := range users { - text := fmt.Sprintf("№: `%d` \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ - "Время: *%s* ", user.ID, user.GroupName, user.UserName, user.UserNick, - user.Serial, user.Time.UTC().Format(config.StructDateTimeFormat)) - - localUserId = append(localUserId, strconv.Itoa(user.ID)) - msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+text) - msg.ParseMode = "markdown" - msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup( - tgb.NewInlineKeyboardRow( - tgb.NewInlineKeyboardButtonData("Поздравить", "congratulation_again"+" "+strconv.Itoa(user.ID)), - tgb.NewInlineKeyboardButtonData("Отклонить", "remove_button"), - )) - _, _ = bot.Send(msg) + var congrated string + if user.Marked == 1 { + congrated = "Уже поздравлен 👑👑👑" + } else { + congrated = "Не поздравлен 🎉" + } + + if user.Marked != 1 { + + text := fmt.Sprintf("№: `%d`, %s \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ + "Время: *%s* ", user.ID, congrated, user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.UTC().Format(config.StructDateTimeFormat)) + + localUserId = append(localUserId, strconv.Itoa(user.ID)) + msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+text) + msg.ParseMode = "markdown" + msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup( + tgb.NewInlineKeyboardRow( + tgb.NewInlineKeyboardButtonData("Поздравить", "congratulation_again"+" "+strconv.Itoa(user.ID)), + tgb.NewInlineKeyboardButtonData("Отклонить", "remove_button"), + )) + _, _ = bot.Send(msg) + } else { + + text := fmt.Sprintf("№: `%d`, %s \nГруппа: *%s*\nИмя: *%s* Ник: *@%s*\nНомер: *%d* "+ + "Время: *%s* ", user.ID, congrated, user.GroupName, user.UserName, user.UserNick, + user.Serial, user.Time.UTC().Format(config.StructDateTimeFormat)) + + localUserId = append(localUserId, strconv.Itoa(user.ID)) + msg := tgb.NewMessage(update.CallbackQuery.Message.Chat.ID, "Список юбилейный:\n"+text) + msg.ParseMode = "markdown" + + _, _ = bot.Send(msg) + } } } @@ -126,8 +152,15 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, for _, user := range users { - text := fmt.Sprintf("№: %d, Группа: %s, Имя: %s, Ник: @%s, Номер: %d, "+ - "Время: %s ", user.ID, user.GroupName, user.UserName, user.UserNick, + var congrated string + if user.Marked == 1 { + congrated = "Уже поздравлен 👑👑👑" + } else { + congrated = "Не поздравлен 🎉" + } + + text := fmt.Sprintf("№: %d, %s Группа: %s, Имя: %s, Ник: @%s, Номер: %d, "+ + "Время: %s ", user.ID, congrated, user.GroupName, user.UserName, user.UserNick, user.Serial, user.Time.Format(config.StructDateTimeFormat)) list = list + text + "\n\n" @@ -226,6 +259,12 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, if newUser.UserID != 0 { + err = db.MarkUser(newUser.ID) + if err != nil { + logger.Error(err) + } + logger.Infof("newUser ID %d", newUser.ID) + text := fmt.Sprintf(cfg.MsgText.MsgToChatIfNewUser, newUser.UserName, newUser.Serial) msg := tgb.NewMessage(newUser.GroupID, text) diff --git a/internal/chatmembers/chatmembers.go b/internal/chatmembers/chatmembers.go index 190f260..e81597b 100644 --- a/internal/chatmembers/chatmembers.go +++ b/internal/chatmembers/chatmembers.go @@ -6,8 +6,8 @@ import ( "skbot/internal/config" "skbot/internal/data" "skbot/internal/functions" - "skbot/internal/menu" "skbot/pkg/logging" + "strconv" "time" ) @@ -55,7 +55,7 @@ func WithChatMembersDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logge _, _ = bot.Send(tgb.NewDeleteMessage(chatId, ans.MessageID)) }() // TODO fix count 3 - if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%3 == 0 { + if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%4 == 0 { err = db.AddNewJubileeUser(&newUser, count, update) if err != nil { @@ -64,28 +64,35 @@ func WithChatMembersDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logge } var newCheckUser data.JubileeUser - newUsers, err := db.GetJubileeUsers() + newUsers, err := db.GetAllJubileeUsers() if err != nil { logger.Error(err) } + var congrated string + for _, user := range newUsers { if int64(user.UserID) == NewUserID { newCheckUser = user userCount++ } } + if newCheckUser.Marked == 1 { + congrated = "Уже поздравлен 👑👑👑" + } else { + congrated = "Не поздравлен 🎉" + } if userCount > 1 { msg := tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, - fmt.Sprintf("*Внимание!* У нас новый пользователь! Но *найдено совпавдение* с таким ID `%d`, "+ - "рекомендую проверить весь список новых пользователей перед поздравлением.\nВызовите `меню`", newCheckUser.UserID)) + fmt.Sprintf("*Внимание!* У нас новый пользователь! %s, Но *найдено совпавдение* с таким ID `%d`, "+ + "рекомендую проверить весь список новых пользователей перед поздравлением.\nВызовите `меню`", congrated, newCheckUser.UserID)) msg.ParseMode = "markdown" _, _ = bot.Send(msg) } //TODO FIX count 3 - if count%cfg.Multiplicity == 0 || count%3 == 0 { + if count%cfg.Multiplicity == 0 || count%cfg.Multiplicity == 1 || count%cfg.Multiplicity == 2 || count%4 == 0 { for _, group := range moderGroupList { @@ -96,7 +103,13 @@ func WithChatMembersDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logge groupName, newUser.FirstName, newUser.UserName, count, time.Now().Format(config.StructDateTimeFormat)) msg := tgb.NewMessage(group.ModerGroupID, text) - msg.ReplyMarkup = menu.NewUserCongratulation + msg.ReplyMarkup = tgb.NewInlineKeyboardMarkup( + tgb.NewInlineKeyboardRow( + tgb.NewInlineKeyboardButtonData("Поздравить", "congratulation_again"+" "+strconv.Itoa(newCheckUser.ID)), + tgb.NewInlineKeyboardButtonData("Отклонить", "remove_button"), + )) + + logger.Infof("user ID %d from chatMembers", newCheckUser.ID) _, _ = bot.Send(msg) diff --git a/internal/data/data.go b/internal/data/data.go index 25261c1..685f357 100755 --- a/internal/data/data.go +++ b/internal/data/data.go @@ -25,4 +25,5 @@ type JubileeUser struct { Time time.Time GroupName string GroupID int64 + Marked int } diff --git a/internal/functions/functions.go b/internal/functions/functions.go index f806e64..1798d9d 100755 --- a/internal/functions/functions.go +++ b/internal/functions/functions.go @@ -63,7 +63,7 @@ func (l *list) NewData() error { "(id INTEGER PRIMARY KEY, serial INTEGER NOT NULL, " + "user_id INTEGER NOT NULL, user_name VARCHAR (30) NOT NULL, " + "user_nick VARCHAR (50) DEFAULT ('нет ника'), time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " + - "group_name VARCHAR (50) NOT NULL, group_id INTEGER NOT NULL)") + "group_name VARCHAR (50) NOT NULL, group_id INTEGER NOT NULL, mark INTEGER DEFAULT 0)") _, err = stat.Exec() if err != nil { return err @@ -81,6 +81,7 @@ type FuncList interface { AddNewJubileeUser(newUser *tgbotapi.User, serial int, update tgbotapi.Update) error GetJubileeUsers() (jubUsers []data.JubileeUser, err error) GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) + MarkUser(userId int) error } func TrimSymbolsFromSlice(s []string, cfg *config.Config) (words []string, err error) { @@ -248,14 +249,14 @@ func (l *list) GetJubileeUsers() (jubUsers []data.JubileeUser, err error) { for rows.Next() { err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, - &user.Time, &user.GroupName, &user.GroupID) + &user.Time, &user.GroupName, &user.GroupID, &user.Marked) users = append(users, user) } //TODO FIX serial 3 for _, v := range users { - if v.Serial%l.cfg.Multiplicity == 0 || v.Serial%l.cfg.Multiplicity == 1 || v.Serial%l.cfg.Multiplicity == 2 || v.Serial%3 == 0 { + if v.Serial%l.cfg.Multiplicity == 0 || v.Serial%l.cfg.Multiplicity == 1 || v.Serial%l.cfg.Multiplicity == 2 || v.Serial%4 == 0 { jubUsers = append(jubUsers, v) } } @@ -277,7 +278,7 @@ func (l *list) GetAllJubileeUsers() (jubUsers []data.JubileeUser, err error) { for rows.Next() { err = rows.Scan(&user.ID, &user.Serial, &user.UserID, &user.UserName, &user.UserNick, - &user.Time, &user.GroupName, &user.GroupID) + &user.Time, &user.GroupName, &user.GroupID, &user.Marked) users = append(users, user) } @@ -337,3 +338,14 @@ func (l *list) AddUserGroupList(moderGroup, userGroup int64, moderTitle, userTit return false, nil } + +func (l *list) MarkUser(userId int) error { + + _, err := l.db.Exec(fmt.Sprintf("UPDATE newJubileeUsers SET (mark) = (1) WHERE id = ('%d')", userId)) + if err != nil { + l.logger.Error(err) + } + + return nil + +} diff --git a/internal/menu/menu.go b/internal/menu/menu.go index 91289e3..c965bcd 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -30,11 +30,5 @@ var button9 = tgbotapi.NewInlineKeyboardButtonData("Памятка модера var Button4 = tgbotapi.NewInlineKeyboardButtonData("Добавить группу", "add_new_mod") var Button5 = tgbotapi.NewInlineKeyboardButtonData("Да, я уверен!", "add_new_mod_true") -var Button10 = tgbotapi.NewInlineKeyboardButtonData("Поздравить", "congratulation_new_user") -var Button11 = tgbotapi.NewInlineKeyboardButtonData("Отклонить", "remove_button") -var NewUserCongratulation = tgbotapi.NewInlineKeyboardMarkup( - tgbotapi.NewInlineKeyboardRow( - Button10, - Button11, - )) +var Button11 = tgbotapi.NewInlineKeyboardButtonData("Отклонить", "remove_button") diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 09730a9..46a630d 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -215,6 +215,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, } } + // add moder group if strings.Contains(strings.ToLower(command[0]), "add-moder-group") { MesInfo = update @@ -250,6 +251,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, }() } + // user groups link with moder group if strings.Contains(strings.ToLower(command[0]), "add-moder-user-link") { if update.Message.Chat.ID == cfg.ModersGroupID.ModeratorsGroup { From 0312344512f2345c41efdd2d7671ebbb6c1afc9a Mon Sep 17 00:00:00 2001 From: AzatF Date: Sun, 17 Jul 2022 12:50:03 +0700 Subject: [PATCH 27/36] main --- cmd/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/main.go b/cmd/main.go index c5a80f5..b8005ce 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,7 +17,6 @@ import ( var cfgPath string func init() { - //flag.StringVar(&cfgPath, "config", "/tg-bot-users/conf.yml", "config file path") flag.StringVar(&cfgPath, "config", "/tg-bot-users/conf.yml", "config file path") } From 3224c09869d91233c6c3f6eafec84bae8773ed1d Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 01:01:16 +0700 Subject: [PATCH 28/36] dockerfile final version --- Dockerfile | 10 +++++++- README.md | 36 +++++++++++++++++++++-------- cmd/main.go | 7 ++---- conf.yml | 31 ------------------------- etc/tgbot/.env | 13 +++++++++++ internal/callbackmsg/callbackmsg.go | 2 +- internal/config/config.go | 22 +++++++++--------- internal/menu/menu.go | 5 ++-- internal/textmsg/textmsg.go | 2 +- 9 files changed, 67 insertions(+), 61 deletions(-) delete mode 100755 conf.yml create mode 100644 etc/tgbot/.env diff --git a/Dockerfile b/Dockerfile index 69c6fd2..50797dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,8 @@ FROM golang:1.18.3 as builder LABEL stage=tgbotbuilder WORKDIR /src +RESTART POLICY: --RESTART + COPY go.mod . COPY go.sum . RUN go mod download @@ -10,10 +12,16 @@ RUN go mod download COPY . . RUN make build -RUN mkdir -p /etc/tgbot && mkdir /data + +FROM alpine:latest as certs +LABEL stage=tgbotbuilder +RUN apk --update add ca-certificates FROM scratch +COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt COPY --from=builder /app /app ADD folders.tar.gz / + + ENTRYPOINT [ "/app" ] \ No newline at end of file diff --git a/README.md b/README.md index 823d420..96d5a11 100644 --- a/README.md +++ b/README.md @@ -46,20 +46,38 @@ # Конфигурация приложения: +### Запуск приложения локально: /etc/tgbot/.env - tg_token: Токен для вашего бота, полученный от BotFather. +--- - tg_sert: SSL сертификат (не обязательно), требуется при запуске бота на WebHook. - +--- - log_level: Уровень логирования приложения. panic, fatal, error, warning, info, debug, trace. - +--- - moderators_group: ID группы админки - -- db_file_path: Путь к папке с базой данных. Создается при отсутствии автоматически. (./tg-bot-users/internal/sqlitedb/) - +--- - msg_of_bad_word_to_user_chat: Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. - +--- - msg_to_chat_if_new_user: Текст приветствия в группу при вступлении в группу нового пользователя. - +--- - msg_moderator_member: Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" - -- msg_trim_symbol: Список символов для удаления из строк при проверке слов в сообщениях. \ No newline at end of file +--- +- msg_trim_symbol: Список символов для удаления из строк при проверке слов в сообщениях. +--- + +# Запуск в Докер-контейнере: + +- Команда "make image" создает образ приложения. +--- +- Вам нужно создать `volume` под вашу базу данных командой "docker create volume `data`" + Где `data` путь к базе +--- +- При первом запуске контейнера вам нужно указать вашу базу и путь к файлу конфигурации, аргументами: + docker run -v `data`:/data -v `env-path`:/etc/tgbot skillbot:latest +--- +- Последующие запуски этого контейнера (а так-же последующих с таким же адресом базы) `docker start name`, где `name` это имя контейнера либо его ID, + сохранят базу данных предыдущих сеансов работы контейнера. + +### Примеры: + +- docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go index b8005ce..87d0b4e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,7 +17,7 @@ import ( var cfgPath string func init() { - flag.StringVar(&cfgPath, "config", "/tg-bot-users/conf.yml", "config file path") + flag.StringVar(&cfgPath, "config", "./etc/tgbot/.env", "config file path") } func main() { @@ -88,12 +88,9 @@ func main() { } else if update.InlineQuery != nil { - log.Println("response from Inline query") query := update.InlineQuery.Query - - log.Println(query) + logger.Printf("response from Inline query: %s", query) } - } } diff --git a/conf.yml b/conf.yml deleted file mode 100755 index 01b1fc0..0000000 --- a/conf.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- - -multiplicity: 500 - -telegram: - tg_token: - tg_sert: - -app: - log_level: trace - -moderators: - moderators_group: - - -db_file_path: ./internal/sqlitedb/ - -msg_text: -#---Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. -#---Используется форматированный вывод текста, вставка названия группы в сообщении. (%s) - msg_of_bad_word_to_user_chat: "Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." - -#---Текст приветствия в группу при вступлении в группу нового пользователя. -#---Используется форматированный вывод текста, вставка имени пользователя и номера вступления в сообщении. (%s, %d) - msg_to_chat_if_new_user: "🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" - -#---Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" - msg_moderator_member: "В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что то еще на усмотрение администратора." - -#---Список символов для удаления из строк при проверке слов в сообщениях. - msg_trim_symbol: "([]{}*).,!?;:" \ No newline at end of file diff --git a/etc/tgbot/.env b/etc/tgbot/.env new file mode 100644 index 0000000..1005e4d --- /dev/null +++ b/etc/tgbot/.env @@ -0,0 +1,13 @@ +MULTIPLICITY=500 + +TG-BOT-TOKEN=(здесь ваш токен от бота, полученный от BotFather) +TG-BOT-LOG-LEVEL=(уровень логирования. По умолчанию trace.) + +MODERATORS-GROUP=(здесь ID группы администраторов (админки).) + +DB-FILE-PATH=./data + +MSG-OF-BAD-WORDS-TO-USER-CHAT="Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." +MSG-TO-CHAT-IF-NEW-USER="🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" +MSG-MODERATOR-MEMBER="В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что то еще на усмотрение администратора." +MSG-TRIM-SYMBOL="([]{}*).,!?;:" \ No newline at end of file diff --git a/internal/callbackmsg/callbackmsg.go b/internal/callbackmsg/callbackmsg.go index 5984c53..73f217d 100644 --- a/internal/callbackmsg/callbackmsg.go +++ b/internal/callbackmsg/callbackmsg.go @@ -64,7 +64,7 @@ func WithCallBackDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Request(tgb.NewCallback(update.CallbackQuery.ID, "✅")) go func() { - time.Sleep(30 * time.Second) + time.Sleep(60 * time.Second) _, _ = bot.Send(tgb.NewDeleteMessage(update.CallbackQuery.Message.Chat.ID, delMsg.MessageID)) }() diff --git a/internal/config/config.go b/internal/config/config.go index ee5bd2d..6b84a23 100755 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -9,28 +9,28 @@ import ( type Config struct { Telegram struct { Token string `yaml:"tg_token" env:"TG-BOT-TOKEN" env-required:"true"` - Sert string `yaml:"tg_sert"` - } - AppConfig AppConfig `yaml:"app"` - ModersGroupID ModersGroupID `yaml:"moderators"` - MsgText MsgText `yaml:"msg_text"` - DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true"` - Multiplicity int `yaml:"multiplicity" env:"multiplicity" env-required:"true"` + Sert string `yaml:"tg_sert" env:"TG-BOT-SERT"` + } `yaml:"telegram" env:"TELEGRAM"` + AppConfig AppConfig `yaml:"app" env:"APP"` + ModersGroupID ModersGroupID `yaml:"moderators" enc:"MODERATORS"` + MsgText MsgText `yaml:"msg_text" env:"MSG-TEXT"` + DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true" env-required:"./internal/sqlitedb/"` + Multiplicity int `yaml:"multiplicity" env:"MULTIPLICITY" env-required:"true"` } type AppConfig struct { - LogLevel string `yaml:"log_level" env:"TG-BOT-LogLevel" env-default:"error" env-required:"true"` + LogLevel string `yaml:"log_level" env:"TG-BOT-LOG-LEVEL" env-default:"trace" env-required:"true"` } type ModersGroupID struct { - ModeratorsGroup int64 `yaml:"moderators_group" env:"moderators_group" env-required:"true"` + ModeratorsGroup int64 `yaml:"moderators_group" env:"MODERATORS-GROUP" env-required:"true"` } type MsgText struct { MsgOfBadWordToUserChat string `yaml:"msg_of_bad_word_to_user_chat" env:"MSG-OF-BAD-WORDS-TO-USER-CHAT" env-required:"true"` MsgToChatIfNewUser string `yaml:"msg_to_chat_if_new_user" env:"MSG-TO-CHAT-IF-NEW-USER" env-required:"true"` - MsgModeratorMember string `yaml:"msg_moderator_member" env:"msg_moderator_member"` - MsgTrimSymbol string `yaml:"msg_trim_symbol"` + MsgModeratorMember string `yaml:"msg_moderator_member" env:"MSG-MODERATOR-MEMBER"` + MsgTrimSymbol string `yaml:"msg_trim_symbol" env:"MSG-TRIM-SYMBOL"` } var instance *Config diff --git a/internal/menu/menu.go b/internal/menu/menu.go index c965bcd..29b28f4 100755 --- a/internal/menu/menu.go +++ b/internal/menu/menu.go @@ -10,8 +10,9 @@ const ComMenu = " Список доступных вам команд: 🛠 "✅ `add-moder-user-link` _(связывает группу модераторов и пользователей. Введите команду, " + "затем через пробел номер группы модераторов, затем через пробел номер группы пользователей. " + "Внимательно проверьте правильность номеров групп)._\n\n" + - "✅ `chatinfo` _(отправляет информацию в админку о имени и ID группы, откуда отправляется команда" + - " сообщение будет удалено из группы отправителя, если бот админ)_\n\n" + + "✅ `chatinfo` _(отправляет информацию в админку о имени и ID группы, откуда отправляется команда.\n" + + "Номер можно скопировать нажатием, для удобства добавления связи групп модераторов и пользователей.\n" + + "Сообщение будет удалено из группы отправителя, если бот админ)_\n\n" + "✅ *Мат + слово* _(Слово будет добавлено в базу)._" var NumericKeyboard = tgbotapi.NewInlineKeyboardMarkup( diff --git a/internal/textmsg/textmsg.go b/internal/textmsg/textmsg.go index 46a630d..4f8c403 100644 --- a/internal/textmsg/textmsg.go +++ b/internal/textmsg/textmsg.go @@ -197,7 +197,7 @@ func WithTextQueryDo(update tgb.Update, bot *tgb.BotAPI, logger *logging.Logger, _, _ = bot.Send(tgb.NewDeleteMessage(update.Message.Chat.ID, update.Message.MessageID)) - msg := tgb.NewMessage(update.Message.Chat.ID, "60 секунд") + msg := tgb.NewMessage(update.Message.Chat.ID, "Меню закроется через 1 минуту") msg.ReplyMarkup = menu.NumericKeyboard From 09dc067ff614613f0764f965b9250558b2b9dcc8 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 01:37:44 +0700 Subject: [PATCH 29/36] docker --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 50797dd..5d46ffa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,6 @@ FROM golang:1.18.3 as builder LABEL stage=tgbotbuilder WORKDIR /src -RESTART POLICY: --RESTART COPY go.mod . COPY go.sum . From f5025ff1229c3d05b447451c983be769976fca82 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 02:15:21 +0700 Subject: [PATCH 30/36] readme + config --- README.md | 34 ++++++++++++++-------------------- internal/config/config.go | 4 ++-- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 96d5a11..4888a4a 100644 --- a/README.md +++ b/README.md @@ -48,36 +48,30 @@ ### Запуск приложения локально: /etc/tgbot/.env -- tg_token: Токен для вашего бота, полученный от BotFather. ---- -- tg_sert: SSL сертификат (не обязательно), требуется при запуске бота на WebHook. ---- -- log_level: Уровень логирования приложения. panic, fatal, error, warning, info, debug, trace. ---- -- moderators_group: ID группы админки ---- -- msg_of_bad_word_to_user_chat: Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов. ---- -- msg_to_chat_if_new_user: Текст приветствия в группу при вступлении в группу нового пользователя. ---- -- msg_moderator_member: Текст памятка модераторам. Выводится при нажатии на кнопку "Памятка модераторам" ---- -- msg_trim_symbol: Список символов для удаления из строк при проверке слов в сообщениях. ---- +| ПАРАМЕТР: | ОПИСАНИЕ: | +|:-----------------------------:|:-----------------------------------------------------------------------------------------------:| +| TG-BOT-TOKEN | Токен для вашего бота, полученный от BotFather | +| MULTIPLICITY | Кратность выявления новых пользователей | +| TG-BOT-LOG-LEVEL | Уровень логирования приложения. `panic`, `fatal`, `error`, `warning`, `info`, `debug`, `trace` | +| MODERATORS-GROUP | ID группы админки | +| MSG-OF-BAD-WORDS-TO-USER-CHAT | Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов | +| MSG-TO-CHAT-IF-NEW-USER | Текст приветствия в группу при вступлении в группу нового пользователя | +| MSG-MODERATOR-MEMBER | Текст памятка модераторам. Выводится при нажатии на кнопку `Памятка модераторам` | +| MSG-TRIM-SYMBOL | Список символов для удаления из строк при проверке слов в сообщениях | + # Запуск в Докер-контейнере: - Команда "make image" создает образ приложения. --- - Вам нужно создать `volume` под вашу базу данных командой "docker create volume `data`" - Где `data` путь к базе --- -- При первом запуске контейнера вам нужно указать вашу базу и путь к файлу конфигурации, аргументами: - docker run -v `data`:/data -v `env-path`:/etc/tgbot skillbot:latest +- При первом запуске контейнера вам нужно указать путь к вашей базе данных (`db/path`) и путь к файлу конфигурации, аргументами: + docker run -v `db/path`:/data -v `env-path`:/etc/tgbot skillbot:latest --- - Последующие запуски этого контейнера (а так-же последующих с таким же адресом базы) `docker start name`, где `name` это имя контейнера либо его ID, сохранят базу данных предыдущих сеансов работы контейнера. ### Примеры: -- docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest \ No newline at end of file +> docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest \ No newline at end of file diff --git a/internal/config/config.go b/internal/config/config.go index 6b84a23..010aa5d 100755 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -14,8 +14,8 @@ type Config struct { AppConfig AppConfig `yaml:"app" env:"APP"` ModersGroupID ModersGroupID `yaml:"moderators" enc:"MODERATORS"` MsgText MsgText `yaml:"msg_text" env:"MSG-TEXT"` - DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true" env-required:"./internal/sqlitedb/"` - Multiplicity int `yaml:"multiplicity" env:"MULTIPLICITY" env-required:"true"` + DBFilePath string `yaml:"db_file_path" env:"DB-FILE-PATH" env-required:"true" env-default:"./internal/sqlitedb/"` + Multiplicity int `yaml:"multiplicity" env:"MULTIPLICITY" env-default:"500"` } type AppConfig struct { From 1985d36069f514b9ee7c6650539b5406e6da547c Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 03:11:39 +0700 Subject: [PATCH 31/36] readme --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4888a4a..a41af38 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # tg-bot-users 🤖 -Бот написан на языке GoLang. +Телеграм бот написан на языке GoLang. +База данных построена на SQLite3 # Список функций: @@ -59,6 +60,7 @@ | MSG-MODERATOR-MEMBER | Текст памятка модераторам. Выводится при нажатии на кнопку `Памятка модераторам` | | MSG-TRIM-SYMBOL | Список символов для удаления из строк при проверке слов в сообщениях | +Запуск приложения из папки cmd - go run main.go # Запуск в Докер-контейнере: @@ -73,5 +75,7 @@ сохранят базу данных предыдущих сеансов работы контейнера. ### Примеры: +``` +docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest +``` -> docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest \ No newline at end of file From 83d701776a7aa267b43654cf1e7a23d2b1d3ede2 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 03:28:56 +0700 Subject: [PATCH 32/36] readme --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a41af38..11dc498 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ | MSG-MODERATOR-MEMBER | Текст памятка модераторам. Выводится при нажатии на кнопку `Памятка модераторам` | | MSG-TRIM-SYMBOL | Список символов для удаления из строк при проверке слов в сообщениях | + +Клонировать репозиторий, обновить пакеты командой `go mod tidy` , убедиться что все пакеты скачаны и установлены. Запуск приложения из папки cmd - go run main.go # Запуск в Докер-контейнере: @@ -76,6 +78,17 @@ ### Примеры: ``` +docker create volume skilbot_data +``` +``` +make image +``` +``` docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest ``` - +``` +docker stop name +``` +``` +docker start name +``` \ No newline at end of file From c1fc4debe600c4af0dd28a8b55315c1f534612aa Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 03:30:44 +0700 Subject: [PATCH 33/36] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 11dc498..f255513 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ ### Примеры: ``` -docker create volume skilbot_data +docker create volume tgbot_data ``` ``` make image From 153e96ade0dc35c0dd70f0a377719b852167fd85 Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 03:33:31 +0700 Subject: [PATCH 34/36] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f255513..3a81ae8 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ - Команда "make image" создает образ приложения. --- -- Вам нужно создать `volume` под вашу базу данных командой "docker create volume `data`" +- Вам нужно создать `volume` под вашу базу данных командой "docker create volume `tgbot_data`" --- - При первом запуске контейнера вам нужно указать путь к вашей базе данных (`db/path`) и путь к файлу конфигурации, аргументами: docker run -v `db/path`:/data -v `env-path`:/etc/tgbot skillbot:latest From 4e370f14885b95349fba8e459ab6112f5abf445a Mon Sep 17 00:00:00 2001 From: AzatF Date: Thu, 21 Jul 2022 07:37:44 +0700 Subject: [PATCH 35/36] comand del --- cmd/main.go | 6 ------ internal/comandmsg/comandmsg.go | 10 ---------- 2 files changed, 16 deletions(-) delete mode 100644 internal/comandmsg/comandmsg.go diff --git a/cmd/main.go b/cmd/main.go index 87d0b4e..ede9269 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -6,7 +6,6 @@ import ( "log" "skbot/internal/callbackmsg" "skbot/internal/chatmembers" - "skbot/internal/comandmsg" "skbot/internal/config" "skbot/internal/functions" "skbot/internal/textmsg" @@ -71,11 +70,6 @@ func main() { // text messages operations textmsg.WithTextQueryDo(update, bot, logger, cfg) - } else if update.Message.Command() != "" { - - //com menu (only moderator's chats) - comandmsg.CommandQueryDo(update, bot, logger, cfg) - } else if update.Message.NewChatMembers != nil { chatmembers.WithChatMembersDo(update, bot, logger, cfg) diff --git a/internal/comandmsg/comandmsg.go b/internal/comandmsg/comandmsg.go deleted file mode 100644 index 3952e82..0000000 --- a/internal/comandmsg/comandmsg.go +++ /dev/null @@ -1,10 +0,0 @@ -package comandmsg - -import ( - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" - "skbot/pkg/logging" -) - -func CommandQueryDo(update tgbotapi.Update, bot *tgbotapi.BotAPI, logger *logging.Logger) { - -} From c68576ab3640d42281950c6b8998c1f9baeb3b93 Mon Sep 17 00:00:00 2001 From: AzatF Date: Fri, 22 Jul 2022 01:04:11 +0700 Subject: [PATCH 36/36] docker image link added --- Dockerfile | 1 - README.md | 6 +++++- etc/tgbot/.env | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5d46ffa..2ce0f66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,6 @@ FROM golang:1.18.3 as builder LABEL stage=tgbotbuilder WORKDIR /src - COPY go.mod . COPY go.sum . RUN go mod download diff --git a/README.md b/README.md index 3a81ae8..eea8bd3 100644 --- a/README.md +++ b/README.md @@ -91,4 +91,8 @@ docker stop name ``` ``` docker start name -``` \ No newline at end of file +``` + +### Ссылка на образ: + +- [Skillbot v1.0](https://hub.docker.com/repository/docker/azatf/skillbot) \ No newline at end of file diff --git a/etc/tgbot/.env b/etc/tgbot/.env index 1005e4d..176cf65 100644 --- a/etc/tgbot/.env +++ b/etc/tgbot/.env @@ -9,5 +9,5 @@ DB-FILE-PATH=./data MSG-OF-BAD-WORDS-TO-USER-CHAT="Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание." MSG-TO-CHAT-IF-NEW-USER="🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉" -MSG-MODERATOR-MEMBER="В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что то еще на усмотрение администратора." +MSG-MODERATOR-MEMBER="В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что-то еще на усмотрение администратора." MSG-TRIM-SYMBOL="([]{}*).,!?;:" \ No newline at end of file