Добавлено: проверка замен и уведомление о них
This commit is contained in:
parent
557f3db75e
commit
458c1f93f9
22
main.go
22
main.go
|
@ -38,9 +38,16 @@ func main() {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
bot.WkPath = os.Getenv("WK_PATH")
|
bot.WkPath = os.Getenv("WK_PATH")
|
||||||
now, _ := time.Parse("2006-01-02 15:04 -07", "2023-02-06 09:30 +04")
|
//now, _ := time.Parse("2006-01-02 15:04 -07", "2023-02-07 07:00 +04")
|
||||||
checkTicker := time.NewTicker(5 * time.Second)
|
now := time.Now()
|
||||||
defer checkTicker.Stop()
|
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 {
|
for {
|
||||||
select {
|
select {
|
||||||
case update := <-*bot.Updates:
|
case update := <-*bot.Updates:
|
||||||
|
@ -48,8 +55,9 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
case <-checkTicker.C:
|
case <-mailTicker.C:
|
||||||
now = now.Add(5 * time.Minute)
|
now = time.Now()
|
||||||
|
//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)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -59,6 +67,10 @@ func main() {
|
||||||
notify.Mailing(bot, notes, now)
|
notify.Mailing(bot, notes, now)
|
||||||
notify.ClearTemp(bot, now)
|
notify.ClearTemp(bot, now)
|
||||||
//return
|
//return
|
||||||
|
case <-sheduleTicker.C:
|
||||||
|
// TODO: установить рабочее окно, чтобы не проверять ночью
|
||||||
|
log.Println("check changes")
|
||||||
|
notify.CheckShedules(bot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
|
}
|
|
@ -64,6 +64,7 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Обновляем время обновления
|
// Обновляем время обновления
|
||||||
|
if len(add) > 0 || len(del) > 0 {
|
||||||
if sh.IsGroup {
|
if sh.IsGroup {
|
||||||
gr := database.Group{GroupId: sh.SheduleId}
|
gr := database.Group{GroupId: sh.SheduleId}
|
||||||
if _, err := db.Get(&gr); err != nil {
|
if _, err := db.Get(&gr); err != nil {
|
||||||
|
@ -83,6 +84,7 @@ func UpdateSchedule(db *xorm.Engine, sh WeekShedule) ([]database.Lesson, []datab
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return add, del, nil
|
return add, del, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nilMsg, err
|
return nilMsg, err
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,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); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID)
|
del := tgbotapi.NewDeleteMessage(Smsg.Chat.ID, Smsg.MessageID)
|
||||||
|
|
|
@ -87,7 +87,7 @@ func (bot *Bot) GetSummary(
|
||||||
str += fmt.Sprintf(
|
str += fmt.Sprintf(
|
||||||
", <b>%d %s</b>",
|
", <b>%d %s</b>",
|
||||||
firstPair[0].Begin.Day(),
|
firstPair[0].Begin.Day(),
|
||||||
month[firstPair[0].Begin.Month()-1],
|
Month[firstPair[0].Begin.Month()-1],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
str += "\n\n"
|
str += "\n\n"
|
||||||
|
@ -216,7 +216,7 @@ func DayStr(day time.Time) string {
|
||||||
"%s, <b>%d %s</b>",
|
"%s, <b>%d %s</b>",
|
||||||
weekdays[int(day.Weekday())],
|
weekdays[int(day.Weekday())],
|
||||||
day.Day(),
|
day.Day(),
|
||||||
month[day.Month()-1],
|
Month[day.Month()-1],
|
||||||
)
|
)
|
||||||
return dayStr
|
return dayStr
|
||||||
}
|
}
|
||||||
|
@ -238,27 +238,33 @@ func (bot *Bot) GetLessons(shedules []database.ShedulesInUser, now time.Time) ([
|
||||||
}
|
}
|
||||||
|
|
||||||
// Загрузка расписания из ssau.ru/rasp
|
// Загрузка расписания из 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{
|
sh := ssau_parser.WeekShedule{
|
||||||
SheduleId: shedule.SheduleId,
|
SheduleId: shedule.SheduleId,
|
||||||
IsGroup: shedule.IsGroup,
|
IsGroup: shedule.IsGroup,
|
||||||
}
|
}
|
||||||
|
var add, del []database.Lesson
|
||||||
for week := 1; week < 21; week++ {
|
for week := 1; week < 21; week++ {
|
||||||
sh.Week = week
|
sh.Week = week
|
||||||
err := sh.DownloadById(true)
|
if err := sh.DownloadById(true); err != nil {
|
||||||
if err != nil {
|
|
||||||
if strings.Contains(err.Error(), "404") {
|
if strings.Contains(err.Error(), "404") {
|
||||||
break
|
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 {
|
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
|
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) {
|
func PairToStr(pair []database.Lesson, db *xorm.Engine, isGroup bool) (string, error) {
|
||||||
var str string
|
var str string
|
||||||
|
@ -327,23 +335,7 @@ func PairToStr(pair []database.Lesson, db *xorm.Engine, isGroup bool) (string, e
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, sublesson := range pair {
|
for i, sublesson := range pair {
|
||||||
var type_emoji string
|
type_emoji := Icons[sublesson.Type]
|
||||||
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 = "📙"
|
|
||||||
}
|
|
||||||
str += fmt.Sprintf("%s%s\n", type_emoji, sublesson.Name)
|
str += fmt.Sprintf("%s%s\n", type_emoji, sublesson.Name)
|
||||||
if sublesson.Place != "" {
|
if sublesson.Place != "" {
|
||||||
str += fmt.Sprintf("🧭 %s\n", sublesson.Place)
|
str += fmt.Sprintf("🧭 %s\n", sublesson.Place)
|
||||||
|
|
|
@ -278,7 +278,7 @@ func Swap(sh ssau_parser.WeekShedule) database.ShedulesInUser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var month = []string{
|
var Month = []string{
|
||||||
"января",
|
"января",
|
||||||
"февраля",
|
"февраля",
|
||||||
"марта",
|
"марта",
|
||||||
|
|
Reference in New Issue