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