From a9bf4f5a8f230ec7fb158cdaaea56e3debd0df5d Mon Sep 17 00:00:00 2001 From: far-galaxy Date: Thu, 3 Aug 2023 15:49:51 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5:=20=D0=B1=D0=BE=D1=82=20=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=BD=D0=B0=D0=B6=D0=B8=D0=BC=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE:=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BA=D0=BD=D0=BE?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 2 +- modules/tg/bot.go | 20 ++++++++++++-------- modules/tg/handlers.go | 24 +++++++++++------------- modules/tg/tg_test.go | 19 ++++++++++++++++++- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/main.go b/main.go index 11c6bf2..4c166f5 100644 --- a/main.go +++ b/main.go @@ -28,7 +28,7 @@ func main() { } for update := range *bot.Updates { - err := bot.HandleUpdate(update) + _, err := bot.HandleUpdate(update) if err != nil { log.Println(err) } diff --git a/modules/tg/bot.go b/modules/tg/bot.go index 3dbdc46..c38cb4c 100644 --- a/modules/tg/bot.go +++ b/modules/tg/bot.go @@ -5,6 +5,7 @@ import ( "io" "log" "os" + "strings" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" @@ -112,46 +113,49 @@ func InitUser(db *xorm.Engine, user *tgbotapi.User) (*database.TgUser, error) { return &tg_user, nil } -func (bot *Bot) HandleUpdate(update tgbotapi.Update) error { +func (bot *Bot) HandleUpdate(update tgbotapi.Update) (tgbotapi.Message, error) { + nilMsg := tgbotapi.Message{} if update.Message != nil { msg := update.Message user, err := InitUser(bot.DB, msg.From) if err != nil { - return err + return nilMsg, err } bot.Debug.Printf("Message [%d] <%s> %s", user.L9Id, user.Name, msg.Text) switch user.PosTag { case database.NotStarted: err = bot.Start(user) case database.Ready: - err = bot.Find(user, msg.Text) + return bot.Find(user, msg.Text) default: bot.Etc(user) } if err != nil { - return err + return nilMsg, err } } if update.CallbackQuery != nil { query := update.CallbackQuery user, err := InitUser(bot.DB, query.From) if err != nil { - return err + return nilMsg, err } bot.Debug.Printf("Callback [%d] <%s> %s", user.L9Id, user.Name, query.Data) switch user.PosTag { case database.NotStarted: err = bot.Start(user) case database.Ready: - err = bot.GetShedule(user, query) + if !strings.Contains(query.Data, "sh") { + err = bot.GetShedule(user, query) + } default: bot.Etc(user) } if err != nil { - return err + return nilMsg, err } callback := tgbotapi.NewCallback(query.ID, query.Data) bot.TG.Request(callback) } - return nil + return nilMsg, nil } diff --git a/modules/tg/handlers.go b/modules/tg/handlers.go index 99ce5c8..2e3e467 100644 --- a/modules/tg/handlers.go +++ b/modules/tg/handlers.go @@ -28,7 +28,7 @@ func (bot *Bot) Start(user *database.TgUser) error { } // Поиск расписания по запросу -func (bot *Bot) Find(user *database.TgUser, query string) error { +func (bot *Bot) Find(user *database.TgUser, query string) (tgbotapi.Message, error) { // Поиск в БД var groups []database.Group bot.DB.Where(builder.Like{"GroupName", query}).Find(&groups) @@ -81,7 +81,9 @@ func (bot *Bot) Find(user *database.TgUser, query string) error { tgbotapi.NewKeyboardButton("Моё расписание"), }) msg.ReplyMarkup = keyboard - bot.TG.Send(msg) + user.PosTag = database.Ready + bot.DB.Update(user) + return bot.TG.Send(msg) } else { var sheduleId int64 var isGroup bool @@ -103,27 +105,24 @@ func (bot *Bot) Find(user *database.TgUser, query string) error { shedule.SheduleId, ), ) - bot.TG.Send(msg) + return bot.TG.Send(msg) /* err := bot.GetSummary([]database.ShedulesInUser{shedule}, false) if err != nil { return err }*/ } - user.PosTag = database.Ready - err := bot.UpdateUserDB(user) - return err // Если получено несколько групп } else if len(allGroups) != 0 { msg := tgbotapi.NewMessage(user.TgId, "Вот что я нашёл\nВыбери нужную группу") msg.ReplyMarkup = GenerateKeyboard(GenerateGroupsArray(allGroups, user.PosTag == database.Add)) - bot.TG.Send(msg) + return bot.TG.Send(msg) // Если получено несколько преподавателей } else if len(allTeachers) != 0 { msg := tgbotapi.NewMessage(user.TgId, "Вот что я нашёл\nВыбери нужного преподавателя") msg.ReplyMarkup = GenerateKeyboard(GenerateTeachersArray(allTeachers, user.PosTag == database.Add)) - bot.TG.Send(msg) + return bot.TG.Send(msg) // Если ничего не получено } else { var msg tgbotapi.MessageConfig @@ -141,17 +140,16 @@ func (bot *Bot) Find(user *database.TgUser, query string) error { ) } - bot.TG.Send(msg) + return bot.TG.Send(msg) } - user.PosTag = database.Ready - _, err := bot.DB.Update(user) - return err } // Получить расписание из кнопки -// TODO: проверять валидность данных кнопки func (bot *Bot) GetShedule(user *database.TgUser, query *tgbotapi.CallbackQuery) error { data := strings.Split(query.Data, "_") + if len(data) != 3 { + return fmt.Errorf("wrong button format: %s", query.Data) + } isGroup := data[1] == "group" isAdd := data[0] == "true" groupId, err := strconv.ParseInt(data[2], 0, 64) diff --git a/modules/tg/tg_test.go b/modules/tg/tg_test.go index 08a9c99..6b703e3 100644 --- a/modules/tg/tg_test.go +++ b/modules/tg/tg_test.go @@ -103,14 +103,31 @@ func TestHandleUpdate(t *testing.T) { From: &user, }, } + var messages []tgbotapi.Message + + // Бот общается с ботом for i, query := range dialog { if i == len(dialog)-1 { ssau_parser.HeadURL = "https://sasau.ru" } update.Message.Text = query - err := bot.HandleUpdate(update) + msg, err := bot.HandleUpdate(update) if err != nil { log.Fatal(err) } + messages = append(messages, msg) + } + + // Бот нажимает на кнопки за пользователя + update = tgbotapi.Update{ + CallbackQuery: &tgbotapi.CallbackQuery{ + From: &user, + Message: &messages[3], + Data: *messages[3].ReplyMarkup.InlineKeyboard[0][0].CallbackData, + }, + } + _, err := bot.HandleUpdate(update) + if err != nil { + log.Fatal(err) } }