Добавлено: проверка замен и уведомление о них

This commit is contained in:
far-galaxy 2023-08-12 18:15:19 +04:00
parent 557f3db75e
commit 458c1f93f9
6 changed files with 157 additions and 51 deletions

22
main.go
View File

@ -38,9 +38,16 @@ func main() {
log.Fatal(err)
}
bot.WkPath = os.Getenv("WK_PATH")
now, _ := time.Parse("2006-01-02 15:04 -07", "2023-02-06 09:30 +04")
checkTicker := time.NewTicker(5 * time.Second)
defer checkTicker.Stop()
//now, _ := time.Parse("2006-01-02 15:04 -07", "2023-02-07 07:00 +04")
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), (now.Minute() + 1), 0, 0, now.Location())
log.Println("Waiting...")
time.Sleep(next.Sub(now))
mailTicker := time.NewTicker(1 * time.Minute)
sheduleTicker := time.NewTicker(1 * time.Minute)
log.Println("Started")
defer mailTicker.Stop()
defer sheduleTicker.Stop()
for {
select {
case update := <-*bot.Updates:
@ -48,8 +55,9 @@ func main() {
if err != nil {
log.Println(err)
}
case <-checkTicker.C:
now = now.Add(5 * time.Minute)
case <-mailTicker.C:
now = time.Now()
//now = now.Add(5 * time.Minute)
log.Println(now)
notes, err := notify.CheckNext(bot.DB, now)
if err != nil {
@ -59,6 +67,10 @@ func main() {
notify.Mailing(bot, notes, now)
notify.ClearTemp(bot, now)
//return
case <-sheduleTicker.C:
// TODO: установить рабочее окно, чтобы не проверять ночью
log.Println("check changes")
notify.CheckShedules(bot)
}
}
}

View File

@ -0,0 +1,100 @@
package notify
import (
"fmt"
"log"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/ssau_parser"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/tg"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
func CheckShedules(bot *tg.Bot) {
var groups []database.Group
if err := bot.DB.Where("groupid >= 0").Find(&groups); err != nil {
log.Println(err)
}
for _, group := range groups {
sh := ssau_parser.WeekShedule{
IsGroup: true,
SheduleId: group.GroupId,
}
add, del, err := bot.LoadShedule(sh)
if err != nil {
log.Println(err)
}
// Очищаем от лишних пар
var n_a, n_d []database.Lesson
for _, a := range add {
if a.GroupId == group.GroupId {
n_a = append(n_a, a)
}
}
for _, d := range del {
if d.GroupId == group.GroupId {
n_d = append(n_d, d)
}
}
if len(n_a) > 0 || len(n_d) > 0 {
str := "‼ Обнаружены изменения в расписании\n"
str = strChanges(n_a, str, true, group.GroupId)
str = strChanges(n_d, str, false, group.GroupId)
var users []database.TgUser
if err := bot.DB.
UseBool("isgroup").
Table("ShedulesInUser").
Cols("tgid").
Join("INNER", "tguser", "tguser.l9id = ShedulesInUser.l9id").
Find(&users, tg.Swap(sh)); err != nil {
log.Println(err)
}
for _, user := range users {
msg := tgbotapi.NewMessage(user.TgId, str)
if _, err := bot.TG.Send(msg); nil != err {
log.Println(err)
}
}
}
}
}
func strChanges(add []database.Lesson, str string, isAdd bool, group int64) string {
add_len := len(add)
if add_len > 0 {
if add_len > 10 {
add = add[:10]
}
if isAdd {
str += " Добавлено:\n"
} else {
str += " Удалено:\n"
}
for _, a := range add {
str += ShortPairStr(a)
}
/*
if add_len > 0 {
str += fmt.Sprintf("\nВсего замен: %d\n\n", add_len)
}
*/
}
return str
}
func ShortPairStr(lesson database.Lesson) string {
beginStr := fmt.Sprintf(lesson.Begin.Format("02 %s 15:04"), tg.Month[lesson.Begin.Month()-1])
var endStr string
if lesson.Type == "mil" {
endStr = "∞"
} else {
endStr = lesson.End.Format("15:04")
}
return fmt.Sprintf(
"📆 %s - %s\n%s%s\n-----------------\n",
beginStr,
endStr,
tg.Icons[lesson.Type],
lesson.Name,
)
}

View File

@ -64,23 +64,25 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab
}
}
// Обновляем время обновления
if sh.IsGroup {
gr := database.Group{GroupId: sh.SheduleId}
if _, err := db.Get(&gr); err != nil {
return nil, nil, err
}
gr.LastUpd = time.Now()
if _, err := db.ID(gr.GroupId).Update(gr); err != nil {
return nil, nil, err
}
} else {
t := database.Teacher{TeacherId: sh.SheduleId}
if _, err := db.Get(&t); err != nil {
return nil, nil, err
}
t.LastUpd = time.Now()
if _, err := db.ID(t.TeacherId).Update(t); err != nil {
return nil, nil, err
if len(add) > 0 || len(del) > 0 {
if sh.IsGroup {
gr := database.Group{GroupId: sh.SheduleId}
if _, err := db.Get(&gr); err != nil {
return nil, nil, err
}
gr.LastUpd = time.Now()
if _, err := db.ID(gr.GroupId).Update(gr); err != nil {
return nil, nil, err
}
} else {
t := database.Teacher{TeacherId: sh.SheduleId}
if _, err := db.Get(&t); err != nil {
return nil, nil, err
}
t.LastUpd = time.Now()
if _, err := db.ID(t.TeacherId).Update(t); err != nil {
return nil, nil, err
}
}
}
return add, del, nil

View File

@ -98,7 +98,7 @@ func (bot *Bot) Find(now time.Time, user *database.TgUser, query string) (tgbota
if not_exists {
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
Smsg, _ := bot.TG.Send(msg)
err := bot.LoadShedule(shedule)
_, _, err := bot.LoadShedule(shedule)
if err != nil {
return nilMsg, err
}
@ -186,7 +186,7 @@ func (bot *Bot) GetShedule(user *database.TgUser, query *tgbotapi.CallbackQuery,
if not_exists {
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
Smsg, _ := bot.TG.Send(msg)
if err := bot.LoadShedule(shedule); err != nil {
if _, _, err := bot.LoadShedule(shedule); err != nil {
return err
}
del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID)

View File

@ -87,7 +87,7 @@ func (bot *Bot) GetSummary(
str += fmt.Sprintf(
", <b>%d %s</b>",
firstPair[0].Begin.Day(),
month[firstPair[0].Begin.Month()-1],
Month[firstPair[0].Begin.Month()-1],
)
}
str += "\n\n"
@ -216,7 +216,7 @@ func DayStr(day time.Time) string {
"%s, <b>%d %s</b>",
weekdays[int(day.Weekday())],
day.Day(),
month[day.Month()-1],
Month[day.Month()-1],
)
return dayStr
}
@ -238,27 +238,33 @@ func (bot *Bot) GetLessons(shedules []database.ShedulesInUser, now time.Time) ([
}
// Загрузка расписания из ssau.ru/rasp
func (bot *Bot) LoadShedule(shedule ssau_parser.WeekShedule) error {
func (bot *Bot) LoadShedule(shedule ssau_parser.WeekShedule) (
[]database.Lesson,
[]database.Lesson,
error,
) {
sh := ssau_parser.WeekShedule{
SheduleId: shedule.SheduleId,
IsGroup: shedule.IsGroup,
}
var add, del []database.Lesson
for week := 1; week < 21; week++ {
sh.Week = week
err := sh.DownloadById(true)
if err != nil {
if err := sh.DownloadById(true); err != nil {
if strings.Contains(err.Error(), "404") {
break
}
return err
return nil, nil, err
}
_, _, err = ssau_parser.UpdateSchedule(bot.DB, sh)
a, d, err := ssau_parser.UpdateSchedule(bot.DB, sh)
if err != nil {
return err
return nil, nil, err
}
add = append(add, a...)
del = append(del, d...)
}
return nil
return add, del, nil
}
// Создать условие поиска группы/преподавателя
@ -308,6 +314,8 @@ func GroupPairs(lessons []database.Lesson) [][]database.Lesson {
return shedule
}
var Icons = map[string]string{"lect": "📗", "pract": "📕", "lab": "📘", "other": "📙", "mil": "🫡", "window": "🏝"}
// Конвертация занятий с текст
func PairToStr(pair []database.Lesson, db *xorm.Engine, isGroup bool) (string, error) {
var str string
@ -327,23 +335,7 @@ func PairToStr(pair []database.Lesson, db *xorm.Engine, isGroup bool) (string, e
}
for i, sublesson := range pair {
var type_emoji string
switch sublesson.Type {
case "lect":
type_emoji = "📗"
case "pract":
type_emoji = "📕"
case "lab":
type_emoji = "📘"
case "other":
type_emoji = "📙"
case "mil":
type_emoji = "🫡"
case "window":
type_emoji = "🏝"
default:
type_emoji = "📙"
}
type_emoji := Icons[sublesson.Type]
str += fmt.Sprintf("%s%s\n", type_emoji, sublesson.Name)
if sublesson.Place != "" {
str += fmt.Sprintf("🧭 %s\n", sublesson.Place)

View File

@ -278,7 +278,7 @@ func Swap(sh ssau_parser.WeekShedule) database.ShedulesInUser {
}
}
var month = []string{
var Month = []string{
"января",
"февраля",
"марта",