Изменено: рефакторинг карточки с расписанием

This commit is contained in:
far-galaxy 2023-03-26 09:26:44 +04:00
parent 88e3aa346b
commit cf518e4aa7
6 changed files with 84 additions and 53 deletions

4
.gitignore vendored
View File

@ -5,4 +5,6 @@ logs
*test.py
*.exe
*.env
.vscode
.vscode
*.html
*.pdf

38
main.go
View File

@ -3,7 +3,6 @@ package main
import (
"log"
"os"
"strconv"
"strings"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
@ -24,6 +23,7 @@ func main() {
bot := new(tg.Bot)
bot.Week = 5
bot.WkPath = os.Getenv("WK_PATH")
err = bot.InitBot(os.Getenv("TELEGRAM_APITOKEN"), *engine)
if err != nil {
log.Fatal(err)
@ -69,40 +69,8 @@ func main() {
} else if strings.Contains(tg_user.PosTag, "confirm_see") {
bot.SeeShedule(query)
bot.DeleteMsg(query)
} else if strings.Contains(query.Data, "day") {
// TODO: Зарефакторить
data := strings.Split(query.Data, "_")
if data[1] == "personal" {
dt, err := strconv.ParseInt(data[2], 0, 64)
if err != nil {
log.Fatal(err)
}
bot.GetPersonalDaySummary(int(dt), *query.Message)
} else {
shedule, dt, err := tg.ParseQuery(data)
if err != nil {
log.Fatal(err)
}
bot.GetDaySummary(shedule, dt, 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)
}
} else if strings.Contains(query.Data, "week") {
data := strings.Split(query.Data, "_")
shedule, dw, err := tg.ParseQuery(data)
if err != nil {
log.Fatal(err)
}
bot.GetWeekSummary(shedule, dw, false, *query.Message)
} else if tg.KeywordContains(query.Data, tg.SumKey) {
bot.HandleSummary(query)
}
}
}

View File

@ -13,6 +13,7 @@ type Bot struct {
DB *xorm.Engine
TG_user database.TgUser
Week int
WkPath string
}
func (bot *Bot) InitBot(token string, engine xorm.Engine) error {

View File

@ -178,6 +178,34 @@ func (bot *Bot) SeeShedule(query *tgbotapi.CallbackQuery) error {
return err
}
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
}
func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery) error {
isGroup := bot.TG_user.PosTag == "confirm_add_group"
groupId, err := strconv.ParseInt(query.Data, 0, 64)

View File

@ -65,13 +65,18 @@ func SummaryKeyboard(clickedButton string, sheduleId int64, isTeacher bool, dt i
tgbotapi.NewInlineKeyboardButtonData("Неделя", "week"+tail),
}
update := GenerateButtonTail(sheduleId, dt, isTeacher)
var arrows []tgbotapi.InlineKeyboardButton
if clickedButton == "day" || clickedButton == "week" {
prev_arrow := GenerateButtonTail(sheduleId, dt-1, isTeacher)
next_arrow := GenerateButtonTail(sheduleId, dt+1, isTeacher)
arrows = []tgbotapi.InlineKeyboardButton{
tgbotapi.NewInlineKeyboardButtonData("<", clickedButton+prev_arrow),
tgbotapi.NewInlineKeyboardButtonData(">", clickedButton+next_arrow),
tgbotapi.NewInlineKeyboardButtonData("⏮", clickedButton+prev_arrow),
tgbotapi.NewInlineKeyboardButtonData("⏭", clickedButton+next_arrow),
}
} else {
arrows = []tgbotapi.InlineKeyboardButton{
tgbotapi.NewInlineKeyboardButtonData("🔄", clickedButton+update),
}
}
/*options := []tgbotapi.InlineKeyboardButton{
@ -90,7 +95,7 @@ func SummaryKeyboard(clickedButton string, sheduleId int64, isTeacher bool, dt i
}
default:
markup = [][]tgbotapi.InlineKeyboardButton{
day, week,
arrows, day, week,
}
}
/*if sheduleId == 0 {
@ -102,7 +107,7 @@ func SummaryKeyboard(clickedButton string, sheduleId int64, isTeacher bool, dt i
func GenerateButtonTail(sheduleId int64, dt int, isTeacher bool) string {
var tail string
if sheduleId == 0 {
tail = fmt.Sprintf("_personal_%d", dt)
tail = fmt.Sprintf("_personal_%d_0", dt)
} else if isTeacher {
tail = fmt.Sprintf("_teacher_%d_%d", dt, sheduleId)
} else {
@ -144,6 +149,17 @@ func ParseQuery(data []string) ([]database.ShedulesInUser, int, error) {
return []database.ShedulesInUser{shedule}, int(dt), nil
}
var SumKey = []string{"near", "day", "week"}
func KeywordContains(str string, keywords []string) bool {
for _, key := range keywords {
if strings.Contains(str, key) {
return true
}
}
return false
}
func (bot *Bot) DeleteMsg(query *tgbotapi.CallbackQuery) {
delete := tgbotapi.NewDeleteMessage(query.From.ID, query.Message.MessageID)
bot.TG.Request(delete)

View File

@ -2,7 +2,6 @@ package tg
import (
"fmt"
"io/ioutil"
"log"
"math"
"os"
@ -45,7 +44,22 @@ func (bot *Bot) GetWeekLessons(shedules []database.ShedulesInUser, week int, isR
var days = [6]string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}
func (bot *Bot) GetWeekSummary(shedules []database.ShedulesInUser, dw int, isPersonal bool, editMsg ...tgbotapi.Message) {
func (bot *Bot) GetPersonalWeekSummary(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.GetWeekSummary(shedules, dt, true, msg...)
if err != nil {
log.Fatal(err)
}
}
}
func (bot *Bot) GetWeekSummary(shedules []database.ShedulesInUser, dw int, isPersonal bool, editMsg ...tgbotapi.Message) error {
_, week := time.Now().ISOWeek()
week += dw
lessons, _ := bot.GetWeekLessons(shedules, week-bot.Week)
@ -94,15 +108,15 @@ func (bot *Bot) GetWeekSummary(shedules []database.ShedulesInUser, dw int, isPer
}
html := bot.CreateHTMLShedule(week, shedule, dates, times)
f, _ := os.Create("sh.html")
fname := fmt.Sprintf("./%d_%d.html", bot.TG_user.L9Id, week-bot.Week)
f, _ := os.Create(fname)
defer f.Close()
f.WriteString(html)
wkhtml.SetPath("C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe")
wkhtml.SetPath(bot.WkPath)
pdfg, err := wkhtml.NewPDFGenerator()
if err != nil {
log.Fatal(err)
return err
}
pdfg.Dpi.Set(300)
pdfg.MarginBottom.Set(0)
@ -115,19 +129,20 @@ func (bot *Bot) GetWeekSummary(shedules []database.ShedulesInUser, dw int, isPer
err = pdfg.Create()
if err != nil {
log.Fatal(err)
return err
}
err = pdfg.WriteFile("./sh.pdf")
fname = fmt.Sprintf("./%d_%d.pdf", bot.TG_user.L9Id, week-bot.Week)
err = pdfg.WriteFile(fname)
if err != nil {
log.Fatal(err)
return err
}
photoBytes, err := ioutil.ReadFile("./sh.pdf")
photoBytes, err := os.ReadFile(fname)
if err != nil {
panic(err)
return err
}
fname := fmt.Sprintf("Расписание %d неделя.pdf", week-bot.Week)
fname = fmt.Sprintf("Расписание %d неделя.pdf", week-bot.Week)
photoFileBytes := tgbotapi.FileBytes{
Name: fname,
Bytes: photoBytes,
@ -136,7 +151,7 @@ func (bot *Bot) GetWeekSummary(shedules []database.ShedulesInUser, dw int, isPer
msg := tgbotapi.NewDocument(bot.TG_user.TgId, photoFileBytes)
_, err = bot.TG.Send(msg)
if err != nil {
log.Println(err)
return err
}
var shId int64
if isPersonal {
@ -152,6 +167,7 @@ func (bot *Bot) GetWeekSummary(shedules []database.ShedulesInUser, dw int, isPer
)
str := fmt.Sprintf("Расписание на %d неделю сообщением ниже 👇", week-bot.Week)
bot.EditOrSend(str, markup, editMsg...)
return nil
}
const head = `<html lang="ru">