Добавлено: подтверждение выбора
This commit is contained in:
parent
e9470f1bd2
commit
7f268865ea
27
main.go
27
main.go
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue