2023-02-22 16:23:38 +03:00
|
|
|
|
package tg
|
|
|
|
|
|
|
|
|
|
import (
|
2023-08-03 12:13:09 +03:00
|
|
|
|
"fmt"
|
2023-08-03 13:00:42 +03:00
|
|
|
|
"strconv"
|
2023-08-03 12:13:09 +03:00
|
|
|
|
"strings"
|
2023-08-05 12:40:24 +03:00
|
|
|
|
"time"
|
2023-08-03 12:13:09 +03:00
|
|
|
|
|
2023-02-22 16:23:38 +03:00
|
|
|
|
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
|
2023-08-03 12:13:09 +03:00
|
|
|
|
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/ssau_parser"
|
2023-02-22 16:23:38 +03:00
|
|
|
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
2023-08-03 12:13:09 +03:00
|
|
|
|
"xorm.io/builder"
|
2023-02-22 16:23:38 +03:00
|
|
|
|
)
|
|
|
|
|
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Приветственное сообщение
|
2023-08-03 10:27:36 +03:00
|
|
|
|
func (bot *Bot) Start(user *database.TgUser) error {
|
2023-08-03 12:13:09 +03:00
|
|
|
|
user.PosTag = database.Ready
|
2023-08-07 21:22:56 +03:00
|
|
|
|
_, err := bot.DB.ID(user.L9Id).Update(user)
|
2023-02-22 16:23:38 +03:00
|
|
|
|
if err != nil {
|
2023-03-08 13:03:27 +03:00
|
|
|
|
return err
|
2023-03-26 09:34:20 +03:00
|
|
|
|
}
|
2023-04-01 07:53:30 +03:00
|
|
|
|
msg := tgbotapi.NewMessage(
|
2023-08-03 10:27:36 +03:00
|
|
|
|
user.TgId,
|
|
|
|
|
`Привет! У меня можно посмотреть в удобном формате <b>ближайшие пары</b>, расписание <b>по дням</b> и даже <b>по неделям</b>!
|
2023-08-30 08:42:27 +03:00
|
|
|
|
Просто напиши мне <b>номер группы</b> или <b>фамилию преподавателя</b>
|
|
|
|
|
|
|
|
|
|
Также можно получать уведомления о своих занятиях по кнопке <b>Моё расписание</b>👇
|
|
|
|
|
|
|
|
|
|
‼ Внимание! Бот ещё находится на стадии испытаний, поэтому могут возникать ошибки в его работе.
|
|
|
|
|
Рекомендуется сверять настоящее расписание и обо всех ошибках сообщать по контакам в /help`)
|
2023-03-13 09:51:48 +03:00
|
|
|
|
msg.ParseMode = tgbotapi.ModeHTML
|
2023-08-11 21:20:09 +03:00
|
|
|
|
msg.ReplyMarkup = GeneralKeyboard(false)
|
2023-03-26 09:34:20 +03:00
|
|
|
|
_, err = bot.TG.Send(msg)
|
2023-03-08 13:03:27 +03:00
|
|
|
|
return err
|
2023-02-22 16:23:38 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Поиск расписания по запросу
|
2023-08-05 12:40:24 +03:00
|
|
|
|
func (bot *Bot) Find(now time.Time, user *database.TgUser, query string) (tgbotapi.Message, error) {
|
2023-08-06 11:26:48 +03:00
|
|
|
|
nilMsg := tgbotapi.Message{}
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Поиск в БД
|
|
|
|
|
var groups []database.Group
|
2023-08-06 11:26:48 +03:00
|
|
|
|
if err := bot.DB.Where(builder.Like{"GroupName", query}).Find(&groups); err != nil {
|
|
|
|
|
return nilMsg, err
|
|
|
|
|
}
|
2023-03-08 09:43:04 +03:00
|
|
|
|
|
2023-08-03 12:13:09 +03:00
|
|
|
|
var teachers []database.Teacher
|
2023-08-06 11:26:48 +03:00
|
|
|
|
if err := bot.DB.Where(builder.Like{"FirstName", query}).Find(&teachers); err != nil {
|
|
|
|
|
return nilMsg, err
|
|
|
|
|
}
|
2023-03-08 09:43:04 +03:00
|
|
|
|
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Поиск на сайте
|
|
|
|
|
list, siteErr := ssau_parser.SearchInRasp(query)
|
2023-03-08 09:43:04 +03:00
|
|
|
|
|
2023-08-03 12:13:09 +03:00
|
|
|
|
allGroups := groups
|
|
|
|
|
allTeachers := teachers
|
2023-03-08 09:43:04 +03:00
|
|
|
|
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Добавляем результаты поиска на сайте к результатам из БД
|
|
|
|
|
for _, elem := range list {
|
|
|
|
|
if strings.Contains(elem.Url, "group") {
|
|
|
|
|
exists := false
|
|
|
|
|
for _, group := range groups {
|
|
|
|
|
if elem.Id == group.GroupId {
|
|
|
|
|
exists = true
|
|
|
|
|
break
|
2023-03-08 09:43:04 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-08-03 12:13:09 +03:00
|
|
|
|
if !exists {
|
|
|
|
|
allGroups = append(allGroups, database.Group{GroupId: elem.Id, GroupName: elem.Text})
|
2023-03-08 09:43:04 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-08-03 12:13:09 +03:00
|
|
|
|
if strings.Contains(elem.Url, "staff") {
|
|
|
|
|
exists := false
|
|
|
|
|
for _, teacher := range teachers {
|
|
|
|
|
if elem.Id == teacher.TeacherId {
|
|
|
|
|
exists = true
|
|
|
|
|
break
|
2023-08-03 10:27:36 +03:00
|
|
|
|
}
|
2023-03-24 16:15:02 +03:00
|
|
|
|
}
|
2023-08-03 12:13:09 +03:00
|
|
|
|
if !exists {
|
|
|
|
|
teacher := ssau_parser.ParseTeacherName(elem.Text)
|
|
|
|
|
teacher.TeacherId = elem.Id
|
|
|
|
|
allTeachers = append(allTeachers, teacher)
|
2023-03-24 16:15:02 +03:00
|
|
|
|
}
|
2023-08-03 12:13:09 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Если получен единственный результат, сразу выдать (подключить) расписание
|
|
|
|
|
if len(allGroups) == 1 || len(allTeachers) == 1 {
|
2023-08-07 21:18:44 +03:00
|
|
|
|
var sheduleId int64
|
|
|
|
|
var isGroup bool
|
|
|
|
|
if len(allGroups) == 1 {
|
|
|
|
|
sheduleId = allGroups[0].GroupId
|
|
|
|
|
isGroup = true
|
|
|
|
|
} else {
|
|
|
|
|
sheduleId = allTeachers[0].TeacherId
|
|
|
|
|
isGroup = false
|
|
|
|
|
}
|
|
|
|
|
shedule := ssau_parser.WeekShedule{
|
|
|
|
|
IsGroup: isGroup,
|
|
|
|
|
SheduleId: sheduleId,
|
|
|
|
|
}
|
|
|
|
|
not_exists, _ := ssau_parser.CheckGroupOrTeacher(bot.DB, shedule)
|
|
|
|
|
if not_exists {
|
|
|
|
|
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
|
2023-08-09 16:53:50 +03:00
|
|
|
|
Smsg, _ := bot.TG.Send(msg)
|
2023-08-13 14:00:51 +03:00
|
|
|
|
_, _, err := bot.LoadShedule(shedule, now)
|
2023-08-07 21:18:44 +03:00
|
|
|
|
if err != nil {
|
2023-08-09 16:53:50 +03:00
|
|
|
|
return nilMsg, err
|
|
|
|
|
}
|
|
|
|
|
del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID)
|
|
|
|
|
if _, err := bot.TG.Request(del); err != nil {
|
|
|
|
|
return nilMsg, err
|
2023-08-07 21:18:44 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-08-07 21:35:11 +03:00
|
|
|
|
// TODO: проверять подключенные ранее расписания
|
2023-08-03 12:13:09 +03:00
|
|
|
|
if user.PosTag == database.Add {
|
2023-08-13 14:26:04 +03:00
|
|
|
|
if !shedule.IsGroup {
|
|
|
|
|
msg := tgbotapi.NewMessage(
|
|
|
|
|
user.TgId,
|
|
|
|
|
"Личное расписание пока не работает с преподавателями :(\n"+
|
|
|
|
|
"Приносим извинения за временные неудобства",
|
|
|
|
|
)
|
2023-08-13 15:13:58 +03:00
|
|
|
|
msg.ReplyMarkup = GeneralKeyboard(false)
|
2023-08-13 14:26:04 +03:00
|
|
|
|
return bot.TG.Send(msg)
|
|
|
|
|
}
|
2023-08-07 21:18:44 +03:00
|
|
|
|
sh := Swap(shedule)
|
|
|
|
|
sh.L9Id = user.L9Id
|
2023-08-12 12:32:34 +03:00
|
|
|
|
sh.FirstTime = 45
|
|
|
|
|
sh.First = true
|
|
|
|
|
sh.NextNote = true
|
|
|
|
|
sh.NextDay = true
|
|
|
|
|
sh.NextWeek = true
|
2023-08-07 21:18:44 +03:00
|
|
|
|
if _, err := bot.DB.InsertOne(&sh); err != nil {
|
|
|
|
|
return nilMsg, err
|
|
|
|
|
}
|
2023-08-03 14:49:51 +03:00
|
|
|
|
user.PosTag = database.Ready
|
2023-08-07 21:35:11 +03:00
|
|
|
|
if _, err := bot.DB.ID(user.L9Id).Update(user); err != nil {
|
2023-08-06 11:26:48 +03:00
|
|
|
|
return nilMsg, err
|
|
|
|
|
}
|
2023-08-07 21:18:44 +03:00
|
|
|
|
msg := tgbotapi.NewMessage(
|
|
|
|
|
user.TgId,
|
|
|
|
|
"Расписание успешно подключено!\n"+
|
2023-08-30 08:42:27 +03:00
|
|
|
|
"Теперь можно смотреть свои занятия по кнопке <b>Моё расписание</b>👇\n\n"+
|
|
|
|
|
"Также ты будешь получать уведомления о занятиях, "+
|
|
|
|
|
"которыми можно управлять в панели <b>Настройки</b>\n",
|
2023-08-07 21:18:44 +03:00
|
|
|
|
)
|
|
|
|
|
msg.ParseMode = tgbotapi.ModeHTML
|
2023-08-11 21:20:09 +03:00
|
|
|
|
msg.ReplyMarkup = GeneralKeyboard(true)
|
2023-08-03 14:49:51 +03:00
|
|
|
|
return bot.TG.Send(msg)
|
2023-08-03 12:13:09 +03:00
|
|
|
|
} else {
|
2023-08-06 11:26:48 +03:00
|
|
|
|
return bot.GetSummary(now, user, []database.ShedulesInUser{Swap(shedule)}, false)
|
2023-08-03 12:13:09 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Если получено несколько групп
|
|
|
|
|
} else if len(allGroups) != 0 {
|
|
|
|
|
msg := tgbotapi.NewMessage(user.TgId, "Вот что я нашёл\nВыбери нужную группу")
|
2023-08-03 12:39:59 +03:00
|
|
|
|
msg.ReplyMarkup = GenerateKeyboard(GenerateGroupsArray(allGroups, user.PosTag == database.Add))
|
2023-08-03 14:49:51 +03:00
|
|
|
|
return bot.TG.Send(msg)
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Если получено несколько преподавателей
|
|
|
|
|
} else if len(allTeachers) != 0 {
|
|
|
|
|
msg := tgbotapi.NewMessage(user.TgId, "Вот что я нашёл\nВыбери нужного преподавателя")
|
2023-08-03 12:39:59 +03:00
|
|
|
|
msg.ReplyMarkup = GenerateKeyboard(GenerateTeachersArray(allTeachers, user.PosTag == database.Add))
|
2023-08-03 14:49:51 +03:00
|
|
|
|
return bot.TG.Send(msg)
|
2023-08-03 12:13:09 +03:00
|
|
|
|
// Если ничего не получено
|
|
|
|
|
} else {
|
|
|
|
|
var msg tgbotapi.MessageConfig
|
|
|
|
|
if siteErr != nil {
|
|
|
|
|
msg = tgbotapi.NewMessage(
|
|
|
|
|
user.TgId,
|
|
|
|
|
"К сожалению, у меня ничего не нашлось, а на сайте ssau.ru/rasp произошла какая-то ошибка :(\n"+
|
|
|
|
|
"Повтори попытку позже",
|
|
|
|
|
)
|
|
|
|
|
bot.Debug.Printf("sasau error: %s", siteErr)
|
|
|
|
|
} else {
|
|
|
|
|
msg = tgbotapi.NewMessage(
|
|
|
|
|
user.TgId,
|
|
|
|
|
"К сожалению, я ничего не нашёл ):\nПроверь свой запрос",
|
|
|
|
|
)
|
2023-03-08 13:03:27 +03:00
|
|
|
|
}
|
2023-03-08 09:43:04 +03:00
|
|
|
|
|
2023-08-03 14:49:51 +03:00
|
|
|
|
return bot.TG.Send(msg)
|
2023-03-15 15:26:52 +03:00
|
|
|
|
}
|
2023-08-03 12:13:09 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-03 13:00:42 +03:00
|
|
|
|
// Получить расписание из кнопки
|
2023-08-06 11:26:48 +03:00
|
|
|
|
func (bot *Bot) GetShedule(user *database.TgUser, query *tgbotapi.CallbackQuery, now ...time.Time) error {
|
2023-08-13 14:00:51 +03:00
|
|
|
|
if len(now) == 0 {
|
|
|
|
|
now = append(now, time.Now())
|
|
|
|
|
}
|
2023-08-03 13:00:42 +03:00
|
|
|
|
data := strings.Split(query.Data, "_")
|
2023-08-03 14:49:51 +03:00
|
|
|
|
if len(data) != 3 {
|
|
|
|
|
return fmt.Errorf("wrong button format: %s", query.Data)
|
|
|
|
|
}
|
2023-08-03 13:00:42 +03:00
|
|
|
|
isGroup := data[1] == "group"
|
|
|
|
|
isAdd := data[0] == "true"
|
|
|
|
|
groupId, err := strconv.ParseInt(data[2], 0, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-09 16:53:50 +03:00
|
|
|
|
shedule := ssau_parser.WeekShedule{
|
2023-08-07 21:18:44 +03:00
|
|
|
|
IsGroup: isGroup,
|
|
|
|
|
SheduleId: groupId,
|
|
|
|
|
}
|
2023-08-09 16:53:50 +03:00
|
|
|
|
not_exists, _ := ssau_parser.CheckGroupOrTeacher(bot.DB, shedule)
|
|
|
|
|
if not_exists {
|
|
|
|
|
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
|
|
|
|
|
Smsg, _ := bot.TG.Send(msg)
|
2023-08-13 14:00:51 +03:00
|
|
|
|
if _, _, err := bot.LoadShedule(shedule, now[0]); err != nil {
|
2023-08-09 16:53:50 +03:00
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID)
|
|
|
|
|
if _, err := bot.TG.Request(del); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2023-08-03 13:00:42 +03:00
|
|
|
|
if !isAdd {
|
2023-08-09 16:53:50 +03:00
|
|
|
|
_, err = bot.GetSummary(now[0], user, []database.ShedulesInUser{Swap(shedule)}, false, *query.Message)
|
2023-08-07 21:18:44 +03:00
|
|
|
|
} else {
|
2023-08-13 14:26:04 +03:00
|
|
|
|
if !shedule.IsGroup {
|
|
|
|
|
msg := tgbotapi.NewMessage(
|
|
|
|
|
user.TgId,
|
|
|
|
|
"Личное расписание пока не работает с преподавателями :(\n"+
|
|
|
|
|
"Приносим извинения за временные неудобства",
|
|
|
|
|
)
|
2023-08-13 15:13:58 +03:00
|
|
|
|
msg.ReplyMarkup = GeneralKeyboard(false)
|
2023-08-13 14:26:04 +03:00
|
|
|
|
_, err := bot.TG.Send(msg)
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-09 16:53:50 +03:00
|
|
|
|
sh := Swap(shedule)
|
|
|
|
|
sh.L9Id = user.L9Id
|
2023-08-12 12:32:34 +03:00
|
|
|
|
sh.FirstTime = 45
|
|
|
|
|
sh.First = true
|
|
|
|
|
sh.NextNote = true
|
|
|
|
|
sh.NextDay = true
|
|
|
|
|
sh.NextWeek = true
|
2023-08-09 16:53:50 +03:00
|
|
|
|
if _, err = bot.DB.InsertOne(&sh); err != nil {
|
2023-08-07 21:18:44 +03:00
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
user.PosTag = database.Ready
|
2023-08-07 21:35:11 +03:00
|
|
|
|
if _, err = bot.DB.ID(user.L9Id).Update(user); err != nil {
|
2023-08-07 21:18:44 +03:00
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-30 08:42:27 +03:00
|
|
|
|
_, err = bot.GetPersonal(now[0], user, *query.Message)
|
2023-08-03 13:00:42 +03:00
|
|
|
|
}
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-03 10:27:36 +03:00
|
|
|
|
|
2023-08-06 11:26:48 +03:00
|
|
|
|
func (bot *Bot) HandleSummary(user *database.TgUser, query *tgbotapi.CallbackQuery, now ...time.Time) error {
|
|
|
|
|
data := strings.Split(query.Data, "_")
|
2023-08-06 14:38:33 +03:00
|
|
|
|
shedule, dt, err := ParseQuery(data)
|
2023-08-06 11:26:48 +03:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-07 21:18:44 +03:00
|
|
|
|
if len(now) == 0 {
|
|
|
|
|
now = append(now, time.Now())
|
|
|
|
|
}
|
2023-08-06 11:26:48 +03:00
|
|
|
|
if data[2] == "personal" {
|
2023-08-07 21:18:44 +03:00
|
|
|
|
switch data[1] {
|
|
|
|
|
case "day":
|
|
|
|
|
var shedules []database.ShedulesInUser
|
|
|
|
|
bot.DB.ID(user.L9Id).Find(&shedules)
|
|
|
|
|
_, err = bot.GetDaySummary(now[0], user, shedules, dt, true, *query.Message)
|
2023-08-09 14:05:51 +03:00
|
|
|
|
case "week":
|
2023-08-11 19:39:46 +03:00
|
|
|
|
err = bot.GetWeekSummary(now[0], user, shedule[0], dt, true, "", *query.Message)
|
2023-08-07 21:18:44 +03:00
|
|
|
|
default:
|
|
|
|
|
_, err = bot.GetPersonal(now[0], user, *query.Message)
|
2023-08-06 14:38:33 +03:00
|
|
|
|
}
|
2023-08-07 21:18:44 +03:00
|
|
|
|
} else {
|
2023-08-06 11:26:48 +03:00
|
|
|
|
switch data[1] {
|
2023-08-06 14:38:33 +03:00
|
|
|
|
case "day":
|
|
|
|
|
_, err = bot.GetDaySummary(now[0], user, shedule, dt, false, *query.Message)
|
2023-08-08 18:36:33 +03:00
|
|
|
|
case "week":
|
2023-08-11 19:39:46 +03:00
|
|
|
|
err = bot.GetWeekSummary(now[0], user, shedule[0], dt, false, "", *query.Message)
|
2023-08-08 18:36:33 +03:00
|
|
|
|
|
2023-08-06 11:26:48 +03:00
|
|
|
|
default:
|
|
|
|
|
_, err = bot.GetSummary(now[0], user, shedule, false, *query.Message)
|
2023-03-13 09:51:48 +03:00
|
|
|
|
}
|
2023-03-08 13:03:27 +03:00
|
|
|
|
}
|
2023-08-06 11:26:48 +03:00
|
|
|
|
return err
|
|
|
|
|
}
|
2023-03-08 09:43:04 +03:00
|
|
|
|
|
2023-08-06 11:26:48 +03:00
|
|
|
|
func (bot *Bot) Etc(user *database.TgUser) (tgbotapi.Message, error) {
|
2023-08-03 10:27:36 +03:00
|
|
|
|
msg := tgbotapi.NewMessage(user.TgId, "Oй!")
|
2023-08-06 11:26:48 +03:00
|
|
|
|
return bot.TG.Send(msg)
|
2023-02-22 16:23:38 +03:00
|
|
|
|
}
|
2023-08-03 15:57:27 +03:00
|
|
|
|
|
|
|
|
|
func (bot *Bot) Cancel(user *database.TgUser, query *tgbotapi.CallbackQuery) error {
|
|
|
|
|
user.PosTag = database.Ready
|
2023-08-07 21:22:56 +03:00
|
|
|
|
_, err := bot.DB.ID(user.L9Id).Update(user)
|
2023-08-03 15:57:27 +03:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-06 11:26:48 +03:00
|
|
|
|
if query.ID != "" {
|
|
|
|
|
callback := tgbotapi.NewCallback(query.ID, "Действие отменено")
|
|
|
|
|
_, err = bot.TG.Request(callback)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-08-03 15:57:27 +03:00
|
|
|
|
}
|
|
|
|
|
delete := tgbotapi.NewDeleteMessage(query.From.ID, query.Message.MessageID)
|
|
|
|
|
_, err = bot.TG.Request(delete)
|
|
|
|
|
return err
|
|
|
|
|
}
|