diff --git a/main.go b/main.go index d83b9a7..06ed85e 100644 --- a/main.go +++ b/main.go @@ -56,7 +56,7 @@ func main() { log.Println(err) } case <-mailTicker.C: - now = time.Now() + now = time.Now().Add(-6 * 30 * 24 * time.Hour) //now = now.Add(5 * time.Minute) log.Println(now) notes, err := notify.CheckNext(bot.DB, now) @@ -68,9 +68,12 @@ func main() { notify.ClearTemp(bot, now) //return case <-sheduleTicker.C: - // TODO: установить рабочее окно, чтобы не проверять ночью - log.Println("check changes") - notify.CheckShedules(bot) + now = time.Now().Add(-6 * 30 * 24 * time.Hour) + if now.Hour() > 8 && now.Hour() < 20 { + log.Println("check changes") + notify.CheckShedules(bot, now) + log.Println("check end") + } } } } diff --git a/modules/notify/shedule_checker.go b/modules/notify/shedule_checker.go index 911d67d..ea1c239 100644 --- a/modules/notify/shedule_checker.go +++ b/modules/notify/shedule_checker.go @@ -3,6 +3,7 @@ package notify import ( "fmt" "log" + "time" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/ssau_parser" @@ -10,17 +11,20 @@ import ( tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) -func CheckShedules(bot *tg.Bot) { +func CheckShedules(bot *tg.Bot, now time.Time) { var groups []database.Group if err := bot.DB.Where("groupid >= 0").Find(&groups); err != nil { log.Println(err) } for _, group := range groups { + if now.Sub(group.LastUpd) < 24*time.Hour && group.LastUpd.IsZero() { + continue + } sh := ssau_parser.WeekShedule{ IsGroup: true, SheduleId: group.GroupId, } - add, del, err := bot.LoadShedule(sh) + add, del, err := bot.LoadShedule(sh, now) if err != nil { log.Println(err) } diff --git a/modules/ssau_parser/database.go b/modules/ssau_parser/database.go index ae17861..991e25c 100644 --- a/modules/ssau_parser/database.go +++ b/modules/ssau_parser/database.go @@ -2,7 +2,6 @@ package ssau_parser import ( "strings" - "time" "git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database" "xorm.io/xorm" @@ -39,6 +38,14 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab first_new := sh.Uncovered[0] _, week := first_new.Begin.ISOWeek() var old []database.Lesson + var new []database.Lesson + // Удаляем всё, что не относится к данной группе + for _, l := range sh.Uncovered { + if (sh.IsGroup && l.GroupId == sh.SheduleId) || + (!sh.IsGroup && l.TeacherId == sh.SheduleId) { + new = append(new, l) + } + } var condition string if sh.IsGroup { condition = "groupid = ?" @@ -48,7 +55,7 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab if err := db.Where("WEEK(`Begin`) = ? AND "+condition, week, sh.SheduleId).Asc("Begin").Find(&old); err != nil { return nil, nil, err } - add, del := Compare(sh.Uncovered, old) + add, del := Compare(new, old) if len(add) > 0 { if _, err := db.Insert(add); err != nil { return nil, nil, err @@ -63,28 +70,6 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab 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 } diff --git a/modules/ssau_parser/shedule.go b/modules/ssau_parser/shedule.go index 4d18a5f..8a348b6 100644 --- a/modules/ssau_parser/shedule.go +++ b/modules/ssau_parser/shedule.go @@ -86,18 +86,22 @@ func Compare(new []database.Lesson, old []database.Lesson) ([]database.Lesson, [ // Проверка занятий, которые появились в eden и отсутствуют в dzwa func Diff(jeden []database.Lesson, dzwa []database.Lesson) []database.Lesson { + hashes := make(map[string]bool) + + // Создаем карту хешей из второго списка + for _, lesson := range dzwa { + hashes[lesson.Hash] = true + } + var diff []database.Lesson - for _, n := range jeden { - exists := false - for _, o := range dzwa { - if n.Hash == o.Hash { - exists = true - } - } - if !exists { - diff = append(diff, n) + + // Проверяем каждый элемент из первого списка + for _, lesson := range jeden { + if _, found := hashes[lesson.Hash]; !found { + diff = append(diff, lesson) } } + return diff } diff --git a/modules/tg/handlers.go b/modules/tg/handlers.go index 7b7e5c5..68b5c65 100644 --- a/modules/tg/handlers.go +++ b/modules/tg/handlers.go @@ -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, now) if err != nil { return nilMsg, err } @@ -168,6 +168,9 @@ func (bot *Bot) Find(now time.Time, user *database.TgUser, query string) (tgbota // Получить расписание из кнопки func (bot *Bot) GetShedule(user *database.TgUser, query *tgbotapi.CallbackQuery, now ...time.Time) error { + if len(now) == 0 { + now = append(now, time.Now()) + } data := strings.Split(query.Data, "_") if len(data) != 3 { return fmt.Errorf("wrong button format: %s", query.Data) @@ -186,7 +189,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, now[0]); err != nil { return err } del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID) @@ -196,9 +199,6 @@ func (bot *Bot) GetShedule(user *database.TgUser, query *tgbotapi.CallbackQuery, } if !isAdd { - if len(now) == 0 { - now = append(now, time.Now()) - } _, err = bot.GetSummary(now[0], user, []database.ShedulesInUser{Swap(shedule)}, false, *query.Message) } else { sh := Swap(shedule) diff --git a/modules/tg/shedule.go b/modules/tg/shedule.go index 0707fc7..048e223 100644 --- a/modules/tg/shedule.go +++ b/modules/tg/shedule.go @@ -238,7 +238,7 @@ func (bot *Bot) GetLessons(shedules []database.ShedulesInUser, now time.Time) ([ } // Загрузка расписания из ssau.ru/rasp -func (bot *Bot) LoadShedule(shedule ssau_parser.WeekShedule) ( +func (bot *Bot) LoadShedule(shedule ssau_parser.WeekShedule, now time.Time) ( []database.Lesson, []database.Lesson, error, @@ -263,7 +263,28 @@ func (bot *Bot) LoadShedule(shedule ssau_parser.WeekShedule) ( add = append(add, a...) del = append(del, d...) } - + // Обновляем время обновления + if len(add) > 0 || len(del) > 0 { + if sh.IsGroup { + gr := database.Group{GroupId: sh.SheduleId} + if _, err := bot.DB.Get(&gr); err != nil { + return nil, nil, err + } + gr.LastUpd = now + if _, err := bot.DB.ID(gr.GroupId).Update(gr); err != nil { + return nil, nil, err + } + } else { + t := database.Teacher{TeacherId: sh.SheduleId} + if _, err := bot.DB.Get(&t); err != nil { + return nil, nil, err + } + t.LastUpd = now + if _, err := bot.DB.ID(t.TeacherId).Update(t); err != nil { + return nil, nil, err + } + } + } return add, del, nil } diff --git a/modules/tg/week_shedule.go b/modules/tg/week_shedule.go index ccfdb58..e1f2939 100644 --- a/modules/tg/week_shedule.go +++ b/modules/tg/week_shedule.go @@ -137,7 +137,7 @@ func (bot *Bot) CreateWeekImg( lessons = next week += 1 } else { - return fmt.Errorf("no lessons: %d, week %d", shedules[0].SheduleId, week) + return fmt.Errorf("no lessons: %d, week %d", shedules[0].SheduleId, week-bot.Week) } }