2023-02-22 17:23:38 +04:00
package tg
import (
"log"
2023-03-08 14:03:27 +04:00
"strconv"
2023-03-08 10:43:04 +04:00
"strings"
2023-02-22 17:23:38 +04:00
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
2023-03-08 10:43:04 +04:00
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/ssau_parser"
2023-02-22 17:23:38 +04:00
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
2023-03-08 10:43:04 +04:00
"xorm.io/builder"
2023-02-22 17:23:38 +04:00
)
2023-03-08 14:03:27 +04:00
func ( bot * Bot ) InitUser ( id int64 , name string ) ( * database . TgUser , error ) {
2023-03-14 21:10:17 +04:00
db := bot . DB
2023-02-22 17:23:38 +04:00
var users [ ] database . TgUser
2023-03-08 14:03:27 +04:00
err := db . Find ( & users , & database . TgUser { TgId : id } )
2023-02-22 17:23:38 +04:00
if err != nil {
log . Fatal ( err )
}
var tg_user database . TgUser
if len ( users ) == 0 {
2023-03-07 13:38:50 +04:00
l9id , err := database . GenerateID ( db )
if err != nil {
return nil , err
}
2023-02-22 17:23:38 +04:00
user := database . User {
L9Id : l9id ,
}
tg_user = database . TgUser {
L9Id : l9id ,
2023-03-08 14:03:27 +04:00
Name : name ,
TgId : id ,
2023-03-26 10:34:20 +04:00
PosTag : "not_started" ,
2023-02-22 17:23:38 +04:00
}
2023-03-07 13:38:50 +04:00
_ , err = db . Insert ( user , tg_user )
2023-02-22 17:23:38 +04:00
if err != nil {
2023-03-07 13:38:50 +04:00
return nil , err
2023-02-22 17:23:38 +04:00
}
} else {
tg_user = users [ 0 ]
}
bot . TG_user = tg_user
2023-03-07 13:38:50 +04:00
return & tg_user , nil
2023-02-22 17:23:38 +04:00
}
2023-03-08 14:03:27 +04:00
func ( bot * Bot ) Start ( ) error {
2023-03-26 10:34:20 +04:00
bot . TG_user . PosTag = "ready"
2023-02-22 17:23:38 +04:00
_ , err := bot . DB . Update ( bot . TG_user )
if err != nil {
2023-03-08 14:03:27 +04:00
return err
2023-03-26 10:34:20 +04:00
}
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "Привет! У меня можно посмотреть расписание занятий\nПр о с то введи <b>номер группы</b> или <b>фамилию преподавателя</b>" )
2023-03-13 10:51:48 +04:00
msg . ParseMode = tgbotapi . ModeHTML
2023-03-26 10:34:20 +04:00
_ , err = bot . TG . Send ( msg )
2023-03-08 14:03:27 +04:00
return err
2023-02-22 17:23:38 +04:00
}
2023-03-08 14:03:27 +04:00
func ( bot * Bot ) Find ( query string ) error {
2023-03-08 10:43:04 +04:00
var groups [ ] database . Group
bot . DB . Where ( builder . Like { "GroupName" , query } ) . Find ( & groups )
var teachers [ ] database . Teacher
bot . DB . Where ( builder . Like { "LastName" , query } ) . Find ( & teachers )
list , _ := ssau_parser . FindInRasp ( query )
allGroups := groups
allTeachers := teachers
for _ , elem := range list {
if strings . Contains ( elem . Url , "group" ) {
exists := false
for _ , group := range groups {
if elem . Id == group . GroupId {
exists = true
break
}
}
if ! exists {
allGroups = append ( allGroups , database . Group { GroupId : elem . Id , GroupName : elem . Text } )
}
}
if strings . Contains ( elem . Url , "staff" ) {
exists := false
for _ , teacher := range teachers {
if elem . Id == teacher . TeacherId {
exists = true
break
}
}
if ! exists {
name := strings . Split ( elem . Text , " " )
allTeachers = append ( allTeachers , database . Teacher {
TeacherId : elem . Id ,
LastName : name [ 0 ] ,
FirstName : name [ 1 ] ,
MidName : name [ 2 ] ,
} )
}
}
}
2023-03-24 17:15:02 +04:00
if len ( allGroups ) == 1 || len ( allTeachers ) == 1 {
if bot . TG_user . PosTag == "add" {
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "Подключено!" )
keyboard := tgbotapi . NewReplyKeyboard ( [ ] tgbotapi . KeyboardButton { tgbotapi . NewKeyboardButton ( "Главное меню" ) } )
msg . ReplyMarkup = keyboard
bot . TG . Send ( msg )
} else {
var sheduleId int64
var isGroup bool
if len ( allGroups ) == 1 {
sheduleId = allGroups [ 0 ] . GroupId
isGroup = true
} else {
sheduleId = allTeachers [ 0 ] . TeacherId
isGroup = false
}
shedule := database . ShedulesInUser {
IsTeacher : ! isGroup ,
SheduleId : sheduleId ,
}
err := bot . GetSummary ( [ ] database . ShedulesInUser { shedule } , false )
if err != nil {
return err
}
}
bot . TG_user . PosTag = "ready"
err := bot . UpdateUserDB ( )
return err
} else if len ( allGroups ) != 0 {
2023-03-08 14:03:27 +04:00
if bot . TG_user . PosTag == "add" {
2023-03-15 16:26:52 +04:00
bot . TG_user . PosTag = "confirm_add_group"
} else {
bot . TG_user . PosTag = "confirm_see_group"
2023-03-08 14:03:27 +04:00
}
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "Вот что я нашёл.\nВ ыб е р и свою группу" )
2023-03-08 10:43:04 +04:00
msg . ReplyMarkup = GenerateKeyboard ( GenerateGroupsArray ( allGroups ) , query )
bot . TG . Send ( msg )
} else if len ( allTeachers ) != 0 {
2023-03-08 14:03:27 +04:00
if bot . TG_user . PosTag == "add" {
2023-03-15 16:26:52 +04:00
bot . TG_user . PosTag = "confirm_add_teacher"
} else {
bot . TG_user . PosTag = "confirm_see_teacher"
2023-03-08 14:03:27 +04:00
}
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "Вот что я нашёл.\nВ ыб е р и нужного преподавателя" )
2023-03-08 10:43:04 +04:00
msg . ReplyMarkup = GenerateKeyboard ( GenerateTeachersArray ( allTeachers ) , query )
bot . TG . Send ( msg )
} else {
2023-03-08 14:03:27 +04:00
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "К сожалению, я ничего не нашёл ):\nПр о ве р ь свой запрос" )
2023-03-08 10:43:04 +04:00
bot . TG . Send ( msg )
}
2023-03-08 14:03:27 +04:00
_ , err := bot . DB . Update ( bot . TG_user )
return err
}
2023-03-15 16:26:52 +04:00
func ( bot * Bot ) SeeShedule ( query * tgbotapi . CallbackQuery ) error {
isGroup := bot . TG_user . PosTag == "confirm_see_group"
groupId , err := strconv . ParseInt ( query . Data , 0 , 64 )
if err != nil {
return err
}
shedule := database . ShedulesInUser {
IsTeacher : ! isGroup ,
SheduleId : groupId ,
}
2023-03-24 12:30:47 +04:00
err = bot . GetSummary ( [ ] database . ShedulesInUser { shedule } , false )
2023-03-15 16:26:52 +04:00
if err != nil {
return err
}
bot . TG_user . PosTag = "ready"
err = bot . UpdateUserDB ( )
return err
}
2023-03-26 09:26:44 +04:00
func ( bot * Bot ) HandleSummary ( query * tgbotapi . CallbackQuery ) error {
data := strings . Split ( query . Data , "_" )
shedule , dt , err := ParseQuery ( data )
if err != nil {
return err
}
if data [ 1 ] == "personal" {
switch data [ 0 ] {
case "day" :
bot . GetPersonalDaySummary ( int ( dt ) , * query . Message )
case "week" :
bot . GetPersonalWeekSummary ( int ( dt ) , * query . Message )
default :
bot . GetPersonalSummary ( * query . Message )
}
} else {
switch data [ 0 ] {
case "day" :
bot . GetDaySummary ( shedule , dt , false , * query . Message )
case "week" :
bot . GetWeekSummary ( shedule , dt , false , * query . Message )
default :
bot . GetSummary ( shedule , false , * query . Message )
}
}
return nil
}
2023-03-13 19:23:30 +04:00
func ( bot * Bot ) Confirm ( query * tgbotapi . CallbackQuery ) error {
2023-03-15 16:26:52 +04:00
isGroup := bot . TG_user . PosTag == "confirm_add_group"
2023-03-08 14:03:27 +04:00
groupId , err := strconv . ParseInt ( query . Data , 0 , 64 )
if err != nil {
2023-03-13 19:23:30 +04:00
return err
2023-03-08 14:03:27 +04:00
}
var groups [ ] database . ShedulesInUser
err = bot . DB . Find ( & groups , & database . ShedulesInUser {
2023-03-13 10:51:48 +04:00
L9Id : bot . TG_user . L9Id ,
2023-03-08 14:03:27 +04:00
SheduleId : groupId ,
IsTeacher : ! isGroup ,
} )
if err != nil {
2023-03-13 19:23:30 +04:00
return err
2023-03-08 14:03:27 +04:00
}
if len ( groups ) == 0 {
shInUser := database . ShedulesInUser {
2023-03-13 10:51:48 +04:00
L9Id : bot . TG_user . L9Id ,
2023-03-08 14:03:27 +04:00
IsTeacher : ! isGroup ,
SheduleId : groupId ,
}
bot . DB . InsertOne ( shInUser )
2023-03-13 10:51:48 +04:00
bot . DeleteMsg ( query )
2023-03-08 14:03:27 +04:00
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "Подключено!" )
2023-03-13 19:23:30 +04:00
keyboard := tgbotapi . NewReplyKeyboard ( [ ] tgbotapi . KeyboardButton { tgbotapi . NewKeyboardButton ( "Главное меню" ) } )
msg . ReplyMarkup = keyboard
2023-03-08 14:03:27 +04:00
bot . TG . Send ( msg )
2023-03-13 10:51:48 +04:00
bot . TG_user . PosTag = "ready"
2023-03-13 19:23:30 +04:00
err = bot . UpdateUserDB ( )
if err != nil {
return err
}
2023-03-08 14:03:27 +04:00
} else {
2023-03-13 10:51:48 +04:00
var msg string
if isGroup {
msg = "Эта группа уже подключена!"
} else {
msg = "Этот преподаватель уже подключен!"
}
callback := tgbotapi . NewCallback ( query . ID , msg )
2023-03-08 14:03:27 +04:00
bot . TG . Request ( callback )
}
2023-03-13 19:23:30 +04:00
return nil
2023-03-08 10:43:04 +04:00
}
2023-03-13 19:23:30 +04:00
func ( bot * Bot ) Cancel ( query * tgbotapi . CallbackQuery ) error {
2023-03-24 17:15:02 +04:00
bot . TG_user . PosTag = "ready"
err := bot . UpdateUserDB ( )
2023-03-13 10:51:48 +04:00
if err != nil {
2023-03-24 17:15:02 +04:00
return err
2023-03-13 10:51:48 +04:00
}
2023-03-24 17:15:02 +04:00
bot . DeleteMsg ( query )
2023-03-13 19:23:30 +04:00
return nil
2023-03-13 10:51:48 +04:00
}
2023-02-22 17:23:38 +04:00
func ( bot * Bot ) Etc ( ) {
2023-03-08 14:03:27 +04:00
msg := tgbotapi . NewMessage ( bot . TG_user . TgId , "Oй!" )
2023-02-22 17:23:38 +04:00
bot . TG . Send ( msg )
}