Исправлено: корявое согласование с БД из-за лишних пар

This commit is contained in:
far-galaxy 2023-08-13 15:00:51 +04:00
parent 458c1f93f9
commit e5494fb5f3
7 changed files with 64 additions and 47 deletions

11
main.go
View File

@ -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")
}
}
}
}

View File

@ -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)
}

View File

@ -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
}

View File

@ -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
}

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, 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)

View File

@ -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
}

View File

@ -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)
}
}