Исправлено: корявое согласование с БД из-за лишних пар
This commit is contained in:
parent
458c1f93f9
commit
e5494fb5f3
11
main.go
11
main.go
|
@ -56,7 +56,7 @@ func main() {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
case <-mailTicker.C:
|
case <-mailTicker.C:
|
||||||
now = time.Now()
|
now = time.Now().Add(-6 * 30 * 24 * time.Hour)
|
||||||
//now = now.Add(5 * time.Minute)
|
//now = now.Add(5 * time.Minute)
|
||||||
log.Println(now)
|
log.Println(now)
|
||||||
notes, err := notify.CheckNext(bot.DB, now)
|
notes, err := notify.CheckNext(bot.DB, now)
|
||||||
|
@ -68,9 +68,12 @@ func main() {
|
||||||
notify.ClearTemp(bot, now)
|
notify.ClearTemp(bot, now)
|
||||||
//return
|
//return
|
||||||
case <-sheduleTicker.C:
|
case <-sheduleTicker.C:
|
||||||
// TODO: установить рабочее окно, чтобы не проверять ночью
|
now = time.Now().Add(-6 * 30 * 24 * time.Hour)
|
||||||
log.Println("check changes")
|
if now.Hour() > 8 && now.Hour() < 20 {
|
||||||
notify.CheckShedules(bot)
|
log.Println("check changes")
|
||||||
|
notify.CheckShedules(bot, now)
|
||||||
|
log.Println("check end")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package notify
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
|
"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/ssau_parser"
|
||||||
|
@ -10,17 +11,20 @@ import (
|
||||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
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
|
var groups []database.Group
|
||||||
if err := bot.DB.Where("groupid >= 0").Find(&groups); err != nil {
|
if err := bot.DB.Where("groupid >= 0").Find(&groups); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
for _, group := range groups {
|
for _, group := range groups {
|
||||||
|
if now.Sub(group.LastUpd) < 24*time.Hour && group.LastUpd.IsZero() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
sh := ssau_parser.WeekShedule{
|
sh := ssau_parser.WeekShedule{
|
||||||
IsGroup: true,
|
IsGroup: true,
|
||||||
SheduleId: group.GroupId,
|
SheduleId: group.GroupId,
|
||||||
}
|
}
|
||||||
add, del, err := bot.LoadShedule(sh)
|
add, del, err := bot.LoadShedule(sh, now)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package ssau_parser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
|
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
|
@ -39,6 +38,14 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab
|
||||||
first_new := sh.Uncovered[0]
|
first_new := sh.Uncovered[0]
|
||||||
_, week := first_new.Begin.ISOWeek()
|
_, week := first_new.Begin.ISOWeek()
|
||||||
var old []database.Lesson
|
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
|
var condition string
|
||||||
if sh.IsGroup {
|
if sh.IsGroup {
|
||||||
condition = "groupid = ?"
|
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 {
|
if err := db.Where("WEEK(`Begin`) = ? AND "+condition, week, sh.SheduleId).Asc("Begin").Find(&old); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
add, del := Compare(sh.Uncovered, old)
|
add, del := Compare(new, old)
|
||||||
if len(add) > 0 {
|
if len(add) > 0 {
|
||||||
if _, err := db.Insert(add); err != nil {
|
if _, err := db.Insert(add); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
@ -63,28 +70,6 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab
|
||||||
return nil, nil, err
|
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
|
return add, del, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,18 +86,22 @@ func Compare(new []database.Lesson, old []database.Lesson) ([]database.Lesson, [
|
||||||
|
|
||||||
// Проверка занятий, которые появились в eden и отсутствуют в dzwa
|
// Проверка занятий, которые появились в eden и отсутствуют в dzwa
|
||||||
func Diff(jeden []database.Lesson, dzwa []database.Lesson) []database.Lesson {
|
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
|
var diff []database.Lesson
|
||||||
for _, n := range jeden {
|
|
||||||
exists := false
|
// Проверяем каждый элемент из первого списка
|
||||||
for _, o := range dzwa {
|
for _, lesson := range jeden {
|
||||||
if n.Hash == o.Hash {
|
if _, found := hashes[lesson.Hash]; !found {
|
||||||
exists = true
|
diff = append(diff, lesson)
|
||||||
}
|
|
||||||
}
|
|
||||||
if !exists {
|
|
||||||
diff = append(diff, n)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return diff
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ func (bot *Bot) Find(now time.Time, user *database.TgUser, query string) (tgbota
|
||||||
if not_exists {
|
if not_exists {
|
||||||
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
|
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
|
||||||
Smsg, _ := bot.TG.Send(msg)
|
Smsg, _ := bot.TG.Send(msg)
|
||||||
_, _, err := bot.LoadShedule(shedule)
|
_, _, err := bot.LoadShedule(shedule, now)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nilMsg, err
|
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 {
|
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, "_")
|
data := strings.Split(query.Data, "_")
|
||||||
if len(data) != 3 {
|
if len(data) != 3 {
|
||||||
return fmt.Errorf("wrong button format: %s", query.Data)
|
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 {
|
if not_exists {
|
||||||
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
|
msg := tgbotapi.NewMessage(user.TgId, "Загружаю расписание...\nЭто займёт некоторое время")
|
||||||
Smsg, _ := bot.TG.Send(msg)
|
Smsg, _ := bot.TG.Send(msg)
|
||||||
if _, _, err := bot.LoadShedule(shedule); err != nil {
|
if _, _, err := bot.LoadShedule(shedule, now[0]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID)
|
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 !isAdd {
|
||||||
if len(now) == 0 {
|
|
||||||
now = append(now, time.Now())
|
|
||||||
}
|
|
||||||
_, err = bot.GetSummary(now[0], user, []database.ShedulesInUser{Swap(shedule)}, false, *query.Message)
|
_, err = bot.GetSummary(now[0], user, []database.ShedulesInUser{Swap(shedule)}, false, *query.Message)
|
||||||
} else {
|
} else {
|
||||||
sh := Swap(shedule)
|
sh := Swap(shedule)
|
||||||
|
|
|
@ -238,7 +238,7 @@ func (bot *Bot) GetLessons(shedules []database.ShedulesInUser, now time.Time) ([
|
||||||
}
|
}
|
||||||
|
|
||||||
// Загрузка расписания из ssau.ru/rasp
|
// Загрузка расписания из 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,
|
||||||
[]database.Lesson,
|
[]database.Lesson,
|
||||||
error,
|
error,
|
||||||
|
@ -263,7 +263,28 @@ func (bot *Bot) LoadShedule(shedule ssau_parser.WeekShedule) (
|
||||||
add = append(add, a...)
|
add = append(add, a...)
|
||||||
del = append(del, d...)
|
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
|
return add, del, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@ func (bot *Bot) CreateWeekImg(
|
||||||
lessons = next
|
lessons = next
|
||||||
week += 1
|
week += 1
|
||||||
} else {
|
} 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