Добавлено: подтверждение выбора

This commit is contained in:
far-galaxy 2023-03-08 14:03:27 +04:00
parent e9470f1bd2
commit 7f268865ea
6 changed files with 91 additions and 21 deletions

27
main.go
View File

@ -3,6 +3,7 @@ package main
import ( import (
"log" "log"
"os" "os"
"strings"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/tg" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/tg"
@ -20,15 +21,19 @@ func main() {
} }
bot := new(tg.Bot) 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() updates := bot.GetUpdates()
for update := range *updates { for update := range *updates {
if update.Message != nil { 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 { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -36,11 +41,25 @@ func main() {
if tg_user.PosTag == "not_started" { if tg_user.PosTag == "not_started" {
bot.Start() bot.Start()
} else if tg_user.PosTag == "add" { } else if tg_user.PosTag == "add" {
bot.Find(update.Message.Text) bot.Find(msg.Text)
} else { } else {
bot.Etc() 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")
}
}
} }
} }

View File

@ -13,6 +13,13 @@ type TgUser struct {
PosTag string PosTag string
} }
type ShedulesInUser struct {
UID int64 `xorm:"pk"`
L9Id int64
IsTeacher bool
SheduleId int64
}
type Group struct { type Group struct {
GroupId int64 `xorm:"pk"` GroupId int64 `xorm:"pk"`
GroupName string GroupName string

View File

@ -17,7 +17,7 @@ func Connect(user, pass, db string) (*xorm.Engine, error) {
engine.ShowSQL(true) engine.ShowSQL(true)
engine.SetMapper(names.SameMapper{}) engine.SetMapper(names.SameMapper{})
err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}, &Teacher{}) err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}, &Teacher{}, &ShedulesInUser{})
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -14,17 +14,18 @@ type Bot struct {
TG_user database.TgUser 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 var err error
bot.TG, err = tgbotapi.NewBotAPI(token) bot.TG, err = tgbotapi.NewBotAPI(token)
if err != nil { if err != nil {
log.Fatal(err) return err
} }
bot.TG.Debug = true bot.TG.Debug = true
bot.DB = engine bot.DB = engine
log.Printf("Authorized on account %s", bot.TG.Self.UserName) log.Printf("Authorized on account %s", bot.TG.Self.UserName)
return nil
} }
func (bot *Bot) GetUpdates() *tgbotapi.UpdatesChannel { func (bot *Bot) GetUpdates() *tgbotapi.UpdatesChannel {

View File

@ -2,6 +2,7 @@ package tg
import ( import (
"log" "log"
"strconv"
"strings" "strings"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
@ -10,10 +11,10 @@ import (
"xorm.io/builder" "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 db := &bot.DB
var users []database.TgUser 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 { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -31,8 +32,8 @@ func (bot *Bot) InitUser(msg *tgbotapi.Message) (*database.TgUser, error) {
tg_user = database.TgUser{ tg_user = database.TgUser{
L9Id: l9id, L9Id: l9id,
Name: msg.From.UserName, Name: name,
TgId: msg.Chat.ID, TgId: id,
PosTag: "not_started", PosTag: "not_started",
} }
_, err = db.Insert(user, tg_user) _, err = db.Insert(user, tg_user)
@ -46,17 +47,18 @@ func (bot *Bot) InitUser(msg *tgbotapi.Message) (*database.TgUser, error) {
return &tg_user, nil return &tg_user, nil
} }
func (bot *Bot) Start() { func (bot *Bot) Start() error {
bot.TG_user.PosTag = "add" bot.TG_user.PosTag = "add"
_, err := bot.DB.Update(bot.TG_user) _, err := bot.DB.Update(bot.TG_user)
if err != nil { if err != nil {
log.Fatal(err) return err
} }
msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Hello!") msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Привет! Введи свой номер группы или фамилию преподавателя")
bot.TG.Send(msg) _, err = bot.TG.Send(msg)
return err
} }
func (bot *Bot) Find(query string) { func (bot *Bot) Find(query string) error {
var groups []database.Group var groups []database.Group
bot.DB.Where(builder.Like{"GroupName", query}).Find(&groups) bot.DB.Where(builder.Like{"GroupName", query}).Find(&groups)
@ -102,21 +104,62 @@ func (bot *Bot) Find(query string) {
} }
if len(allGroups) != 0 { 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) msg.ReplyMarkup = GenerateKeyboard(GenerateGroupsArray(allGroups), query)
bot.TG.Send(msg) bot.TG.Send(msg)
} else if len(allTeachers) != 0 { } 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) msg.ReplyMarkup = GenerateKeyboard(GenerateTeachersArray(allTeachers), query)
bot.TG.Send(msg) bot.TG.Send(msg)
} else { } else {
msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Nothing found ):") msg := tgbotapi.NewMessage(bot.TG_user.TgId, "К сожалению, я ничего не нашёл ):\nПроверь свой запрос")
bot.TG.Send(msg) 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() { func (bot *Bot) Etc() {
msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Oops!") msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Oй!")
bot.TG.Send(msg) bot.TG.Send(msg)
} }

View File

@ -37,7 +37,7 @@ func GenerateKeyboard(array []tgbotapi.InlineKeyboardButton, query string) tgbot
} }
} }
markup = append(markup, keys) 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}) markup = append(markup, []tgbotapi.InlineKeyboardButton{no_one})
return tgbotapi.InlineKeyboardMarkup{InlineKeyboard: markup} return tgbotapi.InlineKeyboardMarkup{InlineKeyboard: markup}
} }