From 7f268865ea086e583228bbdcd9e2bfc94e17c75b Mon Sep 17 00:00:00 2001 From: far-galaxy Date: Wed, 8 Mar 2023 14:03:27 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE:=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=8B=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 27 +++++++++-- modules/database/database_struct.go | 7 +++ modules/database/mysql.go | 2 +- modules/tg/bot.go | 5 ++- modules/tg/handlers.go | 69 +++++++++++++++++++++++------ modules/tg/utils.go | 2 +- 6 files changed, 91 insertions(+), 21 deletions(-) diff --git a/main.go b/main.go index 3da4c1a..22ced70 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "log" "os" + "strings" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/tg" @@ -20,15 +21,19 @@ func main() { } bot := new(tg.Bot) - bot.InitBot(os.Getenv("TELEGRAM_APITOKEN"), *engine) + err = bot.InitBot(os.Getenv("TELEGRAM_APITOKEN"), *engine) + if err != nil { + log.Fatal(err) + } updates := bot.GetUpdates() for update := range *updates { if update.Message != nil { - log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) + msg := update.Message + log.Printf("Message [%s] %s", msg.From.UserName, msg.Text) - tg_user, err := bot.InitUser(update.Message) + tg_user, err := bot.InitUser(msg.From.ID, msg.From.UserName) if err != nil { log.Fatal(err) } @@ -36,11 +41,25 @@ func main() { if tg_user.PosTag == "not_started" { bot.Start() } else if tg_user.PosTag == "add" { - bot.Find(update.Message.Text) + bot.Find(msg.Text) } else { bot.Etc() } } + + if update.CallbackQuery != nil { + query := update.CallbackQuery + log.Printf("Callback [%s] %s", query.From.UserName, query.Data) + + tg_user, err := bot.InitUser(query.From.ID, query.From.UserName) + if err != nil { + log.Fatal(err) + } + + if strings.Contains(tg_user.PosTag, "confirm") { + bot.Confirm(query, tg_user, tg_user.PosTag == "confirm_group") + } + } } } diff --git a/modules/database/database_struct.go b/modules/database/database_struct.go index 9a5a2e5..393a87a 100644 --- a/modules/database/database_struct.go +++ b/modules/database/database_struct.go @@ -13,6 +13,13 @@ type TgUser struct { PosTag string } +type ShedulesInUser struct { + UID int64 `xorm:"pk"` + L9Id int64 + IsTeacher bool + SheduleId int64 +} + type Group struct { GroupId int64 `xorm:"pk"` GroupName string diff --git a/modules/database/mysql.go b/modules/database/mysql.go index 33e432e..1344a02 100644 --- a/modules/database/mysql.go +++ b/modules/database/mysql.go @@ -17,7 +17,7 @@ func Connect(user, pass, db string) (*xorm.Engine, error) { engine.ShowSQL(true) engine.SetMapper(names.SameMapper{}) - err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}, &Teacher{}) + err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}, &Teacher{}, &ShedulesInUser{}) if err != nil { return nil, err } diff --git a/modules/tg/bot.go b/modules/tg/bot.go index 9dd715d..0684eb9 100644 --- a/modules/tg/bot.go +++ b/modules/tg/bot.go @@ -14,17 +14,18 @@ type Bot struct { TG_user database.TgUser } -func (bot *Bot) InitBot(token string, engine xorm.Engine) { +func (bot *Bot) InitBot(token string, engine xorm.Engine) error { var err error bot.TG, err = tgbotapi.NewBotAPI(token) if err != nil { - log.Fatal(err) + return err } bot.TG.Debug = true bot.DB = engine log.Printf("Authorized on account %s", bot.TG.Self.UserName) + return nil } func (bot *Bot) GetUpdates() *tgbotapi.UpdatesChannel { diff --git a/modules/tg/handlers.go b/modules/tg/handlers.go index fd8d585..d04f9eb 100644 --- a/modules/tg/handlers.go +++ b/modules/tg/handlers.go @@ -2,6 +2,7 @@ package tg import ( "log" + "strconv" "strings" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" @@ -10,10 +11,10 @@ import ( "xorm.io/builder" ) -func (bot *Bot) InitUser(msg *tgbotapi.Message) (*database.TgUser, error) { +func (bot *Bot) InitUser(id int64, name string) (*database.TgUser, error) { db := &bot.DB var users []database.TgUser - err := db.Find(&users, &database.TgUser{TgId: msg.Chat.ID}) + err := db.Find(&users, &database.TgUser{TgId: id}) if err != nil { log.Fatal(err) } @@ -31,8 +32,8 @@ func (bot *Bot) InitUser(msg *tgbotapi.Message) (*database.TgUser, error) { tg_user = database.TgUser{ L9Id: l9id, - Name: msg.From.UserName, - TgId: msg.Chat.ID, + Name: name, + TgId: id, PosTag: "not_started", } _, err = db.Insert(user, tg_user) @@ -46,17 +47,18 @@ func (bot *Bot) InitUser(msg *tgbotapi.Message) (*database.TgUser, error) { return &tg_user, nil } -func (bot *Bot) Start() { +func (bot *Bot) Start() error { bot.TG_user.PosTag = "add" _, err := bot.DB.Update(bot.TG_user) if err != nil { - log.Fatal(err) + return err } - msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Hello!") - bot.TG.Send(msg) + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Привет! Введи свой номер группы или фамилию преподавателя") + _, err = bot.TG.Send(msg) + return err } -func (bot *Bot) Find(query string) { +func (bot *Bot) Find(query string) error { var groups []database.Group bot.DB.Where(builder.Like{"GroupName", query}).Find(&groups) @@ -102,21 +104,62 @@ func (bot *Bot) Find(query string) { } if len(allGroups) != 0 { - msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Many groups in base. Please sekect one") + if bot.TG_user.PosTag == "add" { + bot.TG_user.PosTag = "confirm_group" + } + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Вот что я нашёл.\nВыбери свою группу") msg.ReplyMarkup = GenerateKeyboard(GenerateGroupsArray(allGroups), query) bot.TG.Send(msg) } else if len(allTeachers) != 0 { - msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Many teachers in base. Please sekect one") + if bot.TG_user.PosTag == "add" { + bot.TG_user.PosTag = "confirm_teacher" + } + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Вот что я нашёл.\nВыбери нужного преподавателя") msg.ReplyMarkup = GenerateKeyboard(GenerateTeachersArray(allTeachers), query) bot.TG.Send(msg) } else { - msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Nothing found ):") + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "К сожалению, я ничего не нашёл ):\nПроверь свой запрос") bot.TG.Send(msg) } + _, err := bot.DB.Update(bot.TG_user) + return err +} + +func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery, tg_user *database.TgUser, isGroup bool) { + groupId, err := strconv.ParseInt(query.Data, 0, 64) + if err != nil { + log.Fatal(err) + } + var groups []database.ShedulesInUser + err = bot.DB.Find(&groups, &database.ShedulesInUser{ + SheduleId: groupId, + IsTeacher: !isGroup, + }) + if err != nil { + log.Fatal(err) + } + if len(groups) == 0 { + shInUser := database.ShedulesInUser{ + L9Id: tg_user.L9Id, + IsTeacher: !isGroup, + SheduleId: groupId, + } + bot.DB.InsertOne(shInUser) + delete := tgbotapi.NewDeleteMessage(query.From.ID, query.Message.MessageID) + bot.TG.Request(delete) + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Подключено!") + bot.TG.Send(msg) + + tg_user.PosTag = "ready" + bot.DB.Update(tg_user) + } else { + callback := tgbotapi.NewCallback(query.ID, "Эта группа уже подключена!") + bot.TG.Request(callback) + } } func (bot *Bot) Etc() { - msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Oops!") + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Oй!") bot.TG.Send(msg) } diff --git a/modules/tg/utils.go b/modules/tg/utils.go index eb91834..89d3dd5 100644 --- a/modules/tg/utils.go +++ b/modules/tg/utils.go @@ -37,7 +37,7 @@ func GenerateKeyboard(array []tgbotapi.InlineKeyboardButton, query string) tgbot } } markup = append(markup, keys) - no_one := tgbotapi.NewInlineKeyboardButtonData("No one", "no_one_"+query) + no_one := tgbotapi.NewInlineKeyboardButtonData("Отмена", "cancel") markup = append(markup, []tgbotapi.InlineKeyboardButton{no_one}) return tgbotapi.InlineKeyboardMarkup{InlineKeyboard: markup} }