From bd823194bd412eb6360725945b92b9493de2413b Mon Sep 17 00:00:00 2001 From: far-galaxy Date: Fri, 24 Mar 2023 12:30:47 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE:=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B8=20(=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= =?UTF-8?q?=20=D1=81=D0=B2=D0=BE=D0=B4=D0=BA=D0=B0=20=D0=B8=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 22 +++++ modules/tg/handlers.go | 2 +- modules/tg/shedule.go | 200 +++++++++++++++++++++++++++++++++-------- modules/tg/utils.go | 61 +++++++++++++ 4 files changed, 249 insertions(+), 36 deletions(-) diff --git a/main.go b/main.go index 3175d4e..1ddcd80 100644 --- a/main.go +++ b/main.go @@ -68,6 +68,28 @@ func main() { } else if strings.Contains(tg_user.PosTag, "confirm_see") { bot.SeeShedule(query) bot.DeleteMsg(query) + } else if strings.Contains(query.Data, "day") { + data := strings.Split(query.Data, "_") + if data[1] == "personal" { + bot.GetPersonalDaySummary(0, *query.Message) + } else { + shedule, err := tg.ParseQuery(data) + if err != nil { + log.Fatal(err) + } + bot.GetDaySummary(shedule, 0, false, *query.Message) + } + } else if strings.Contains(query.Data, "near") { + data := strings.Split(query.Data, "_") + if data[1] == "personal" { + bot.GetPersonalSummary(*query.Message) + } else { + shedule, err := tg.ParseQuery(data) + if err != nil { + log.Fatal(err) + } + bot.GetSummary(shedule, false, *query.Message) + } } } } diff --git a/modules/tg/handlers.go b/modules/tg/handlers.go index 93f3c1c..9002702 100644 --- a/modules/tg/handlers.go +++ b/modules/tg/handlers.go @@ -141,7 +141,7 @@ func (bot *Bot) SeeShedule(query *tgbotapi.CallbackQuery) error { IsTeacher: !isGroup, SheduleId: groupId, } - err = bot.GetSummary([]database.ShedulesInUser{shedule}) + err = bot.GetSummary([]database.ShedulesInUser{shedule}, false) if err != nil { return err } diff --git a/modules/tg/shedule.go b/modules/tg/shedule.go index 23c3e31..9475154 100644 --- a/modules/tg/shedule.go +++ b/modules/tg/shedule.go @@ -13,7 +13,7 @@ import ( "xorm.io/xorm" ) -func (bot *Bot) GetPersonalSummary() { +func (bot *Bot) GetPersonalSummary(msg ...tgbotapi.Message) { var shedules []database.ShedulesInUser bot.DB.ID(bot.TG_user.L9Id).Find(&shedules) @@ -21,15 +21,167 @@ func (bot *Bot) GetPersonalSummary() { bot.Etc() return } else { - err := bot.GetSummary(shedules) + err := bot.GetSummary(shedules, true, msg...) if err != nil { log.Fatal(err) } } } -func (bot *Bot) GetSummary(shedules []database.ShedulesInUser, isRetry ...bool) error { - now := time.Now().Add(time.Hour * time.Duration(5) * (-1)) +func (bot *Bot) GetSummary(shedules []database.ShedulesInUser, isPersonal bool, editMsg ...tgbotapi.Message) error { + now := time.Now() //.Add(time.Hour * time.Duration(5) * (-1)) + + lessons, err := bot.GetLessons(shedules, now) + if err != nil { + return err + } + if len(lessons) != 0 { + var firstPair, secondPair []database.Lesson + pairs := GroupPairs(lessons) + firstPair = pairs[0] + log.Println(firstPair, secondPair) + + var str string + if pairs[0][0].Begin.Day() != time.Now().Day() { + str = "❗️Сегодня пар нет\nБлижайшие занятия " + if time.Until(firstPair[0].Begin).Hours() < 48 { + str += "завтра\n" + } else { + str += fmt.Sprintf("%s\n\n", firstPair[0].Begin.Format("02.01")) + } + day, err := bot.GetDayShedule(pairs) + if err != nil { + return err + } + str += day + } else { + if firstPair[0].Begin.Before(now) { + str = "Сейчас:\n\n" + } else { + str = "Ближайшая пара сегодня:\n\n" + } + firstStr, err := PairToStr(firstPair, bot.DB) + if err != nil { + return err + } + str += firstStr + if len(pairs) > 1 { + secondPair = pairs[1] + if firstPair[0].Begin.Day() == secondPair[0].Begin.Day() { + str += "\nПосле неё:\n\n" + secondStr, err := PairToStr(secondPair, bot.DB) + if err != nil { + return err + } + str += secondStr + } else { + str += "\nБольше ничего сегодня нет" + } + } else { + str += "\nБольше ничего сегодня нет" + } + + } + + var shId int64 + if isPersonal { + shId = 0 + } else { + shId = shedules[0].SheduleId + } + + markup := SummaryKeyboard( + "near", + shId, + shedules[0].IsTeacher, + ) + if len(editMsg) > 0 { + msg := tgbotapi.NewEditMessageText( + editMsg[0].Chat.ID, + editMsg[0].MessageID, + str, + ) + msg.ReplyMarkup = &markup + bot.TG.Request(msg) + } else { + msg := tgbotapi.NewMessage(bot.TG_user.TgId, str) + msg.ReplyMarkup = markup + bot.TG.Send(msg) + } + + } else { + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Ой! Пар не обнаружено ):") + bot.TG.Send(msg) + } + return nil +} + +func (bot *Bot) GetPersonalDaySummary(dt int, msg ...tgbotapi.Message) { + var shedules []database.ShedulesInUser + bot.DB.ID(bot.TG_user.L9Id).Find(&shedules) + + if len(shedules) == 0 { + bot.Etc() + return + } else { + err := bot.GetDaySummary(shedules, dt, true, msg...) + if err != nil { + log.Fatal(err) + } + } +} + +func (bot *Bot) GetDaySummary(shedules []database.ShedulesInUser, dt int, isPersonal bool, editMsg ...tgbotapi.Message) error { + now := time.Now() + day := time.Date(now.Year(), now.Month(), now.Day()+dt, 0, 0, 0, 0, now.Location()) + lessons, err := bot.GetLessons(shedules, day) + if err != nil { + return err + } + if len(lessons) != 0 { + pairs := GroupPairs(lessons) + var str string + + str = fmt.Sprintf("Расписание на %s\n\n", pairs[0][0].Begin.Format("02.01")) + day, err := bot.GetDayShedule(pairs) + if err != nil { + return err + } + str += day + + var shId int64 + if isPersonal { + shId = 0 + } else { + shId = shedules[0].SheduleId + } + markup := SummaryKeyboard( + "day", + shId, + shedules[0].IsTeacher, + ) + if len(editMsg) > 0 { + msg := tgbotapi.NewEditMessageText( + editMsg[0].Chat.ID, + editMsg[0].MessageID, + str, + ) + msg.ReplyMarkup = &markup + bot.TG.Request(msg) + } else { + msg := tgbotapi.NewMessage(bot.TG_user.TgId, str) + msg.ReplyMarkup = markup + bot.TG.Send(msg) + } + } else { + msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Ой! Пар не обнаружено ):") + bot.TG.Send(msg) + } + + return nil +} + +func (bot *Bot) GetLessons(shedules []database.ShedulesInUser, now time.Time, isRetry ...bool) ([]database.Lesson, error) { log.Println(now.Format("01-02-2006 15:04:05 -07"), now.Format("01-02-2006 15:04:05")) var groups []string @@ -65,54 +217,32 @@ func (bot *Bot) GetSummary(shedules []database.ShedulesInUser, isRetry ...bool) Find(&lessons) if err != nil { - return err + return nil, err } - if len(lessons) != 0 { - var firstPair, secondPair []database.Lesson - pairs := GroupPairs(lessons) - firstPair = pairs[0] - secondPair = pairs[1] - log.Println(firstPair, secondPair) - - var str string - if pairs[0][0].Begin.Day() != time.Now().Day() { - str = "❗️Сегодня пар нет\nБлижайшие занятия " - if time.Until(firstPair[0].Begin).Hours() < 48 { - str += "завтра\n" - } else { - str += fmt.Sprintf("%s\n\n", firstPair[0].Begin.Format("02.01")) - } - day, _ := bot.GetDayShedule(pairs) - str += day - } else { - str = "Сводка на сегодня\n\n" - day, _ := bot.GetDayShedule(pairs) - str += day - } - - msg := tgbotapi.NewMessage(bot.TG_user.TgId, str) - bot.TG.Send(msg) + if len(lessons) > 0 { + return lessons, nil } else if len(isRetry) == 0 { _, week := time.Now().ISOWeek() week -= bot.Week for _, sh := range shedules { doc, err := ssau_parser.ConnectById(sh.SheduleId, sh.IsTeacher, week) if err != nil { - return err + return nil, err } shedule, err := ssau_parser.Parse(doc, !sh.IsTeacher, sh.SheduleId, week) if err != nil { - return err + return nil, err } err = ssau_parser.UploadShedule(bot.DB, *shedule) if err != nil { - return err + return nil, err } } - bot.GetSummary(shedules, true) + return bot.GetLessons(shedules, now, true) + } else { + return nil, nil } - return nil } func (bot *Bot) GetDayShedule(lessons [][]database.Lesson) (string, error) { diff --git a/modules/tg/utils.go b/modules/tg/utils.go index c754dc2..856614f 100644 --- a/modules/tg/utils.go +++ b/modules/tg/utils.go @@ -52,6 +52,67 @@ func GenerateKeyboard(array []tgbotapi.InlineKeyboardButton, query string) tgbot return tgbotapi.InlineKeyboardMarkup{InlineKeyboard: markup} } +func SummaryKeyboard(clickedButton string, sheduleId int64, isTeacher bool) tgbotapi.InlineKeyboardMarkup { + var tail string + if sheduleId == 0 { + tail = "_personal" + } else if isTeacher { + tail = fmt.Sprintf("_teacher_%d", sheduleId) + } else { + tail = fmt.Sprintf("_group_%d", sheduleId) + } + + near := []tgbotapi.InlineKeyboardButton{ + tgbotapi.NewInlineKeyboardButtonData("Краткая сводка", "near"+tail), + } + day := []tgbotapi.InlineKeyboardButton{ + tgbotapi.NewInlineKeyboardButtonData("День", "day"+tail), + } + week := []tgbotapi.InlineKeyboardButton{ + tgbotapi.NewInlineKeyboardButtonData("Неделя", "week"+tail), + } + arrows := []tgbotapi.InlineKeyboardButton{ + tgbotapi.NewInlineKeyboardButtonData("<", "prev_"+clickedButton+tail), + tgbotapi.NewInlineKeyboardButtonData(">", "next_"+clickedButton+tail), + } + options := []tgbotapi.InlineKeyboardButton{ + tgbotapi.NewInlineKeyboardButtonData("Настройки", "options"), + } + + var markup [][]tgbotapi.InlineKeyboardButton + switch clickedButton { + case "day": + markup = [][]tgbotapi.InlineKeyboardButton{ + arrows, near, week, + } + case "week": + markup = [][]tgbotapi.InlineKeyboardButton{ + arrows, near, day, + } + default: + markup = [][]tgbotapi.InlineKeyboardButton{ + day, week, + } + } + if sheduleId == 0 { + markup = append(markup, options) + } + return tgbotapi.InlineKeyboardMarkup{InlineKeyboard: markup} +} + +func ParseQuery(data []string) ([]database.ShedulesInUser, error) { + isGroup := data[1] == "group" + sheduleId, err := strconv.ParseInt(data[2], 0, 64) + if err != nil { + return nil, err + } + shedule := database.ShedulesInUser{ + IsTeacher: !isGroup, + SheduleId: sheduleId, + } + return []database.ShedulesInUser{shedule}, nil +} + func (bot *Bot) DeleteMsg(query *tgbotapi.CallbackQuery) { delete := tgbotapi.NewDeleteMessage(query.From.ID, query.Message.MessageID) bot.TG.Request(delete)