Исправлено: корявое согласование с БД из-за лишних пар
This commit is contained in:
parent
458c1f93f9
commit
e5494fb5f3
11
main.go
11
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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Reference in New Issue