add all_lessons

This commit is contained in:
Владимир Фёдоров 2023-01-11 02:00:07 +07:00
parent 78705f95ea
commit 6325033fdf
8 changed files with 66 additions and 104 deletions

View File

@ -4,6 +4,7 @@ type Command string
//today_lessons - пары сегодня //today_lessons - пары сегодня
//tomorrow_lessons - пары завтра //tomorrow_lessons - пары завтра
//all_lessons - пары на несколько дней
//weather - погода у универа //weather - погода у универа
//new_year - дней до нового года //new_year - дней до нового года
//ping - проверка связи //ping - проверка связи
@ -14,6 +15,7 @@ const (
Ping = Command("/ping") Ping = Command("/ping")
TodayLessons = Command("/today_lessons") TodayLessons = Command("/today_lessons")
TomorrowLessons = Command("/tomorrow_lessons") TomorrowLessons = Command("/tomorrow_lessons")
AllLessons = Command("/all_lessons")
Weather = Command("/weather") Weather = Command("/weather")
NewYear = Command("/new_year") NewYear = Command("/new_year")
) )

View File

@ -2,10 +2,10 @@ package date
import "time" import "time"
func Today() int { func Today(offset time.Duration) string {
location, err := time.LoadLocation("Asia/Novosibirsk") location, err := time.LoadLocation("Asia/Novosibirsk")
if err != nil { if err != nil {
panic(err) panic(err)
} }
return int(time.Now().In(location).Weekday()) return time.Now().In(location).Add(offset).Format("2006-01-02")
} }

1
go.mod
View File

@ -5,6 +5,7 @@ go 1.17
require ( require (
github.com/3crabs/go-yandex-weather-api v0.6.0 github.com/3crabs/go-yandex-weather-api v0.6.0
github.com/PuerkitoBio/goquery v1.7.1 github.com/PuerkitoBio/goquery v1.7.1
github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
github.com/umputun/go-flags v1.5.1 github.com/umputun/go-flags v1.5.1
) )

2
go.sum
View File

@ -5,6 +5,8 @@ github.com/PuerkitoBio/goquery v1.7.1/go.mod h1:XY0pP4kfraEmmV1O7Uf6XyjoslwsneBb
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f h1:IUdUh6y8VDhn5iO/ggBCVb9H0vOI3MDlhDSDCrrSC8Q=
github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f/go.mod h1:VFnDugGvBJREsor/aiVcXhvAbyjatl0AKXEaGV9u63I=
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU= github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM= github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=

21
main.go
View File

@ -189,6 +189,9 @@ func run() {
case commands.TomorrowLessons: case commands.TomorrowLessons:
sendTomorrowLessonsToChat(bot, chatID, "Завтра, "+update.Message.From.FirstName+", эти пары:") sendTomorrowLessonsToChat(bot, chatID, "Завтра, "+update.Message.From.FirstName+", эти пары:")
case commands.AllLessons:
sendAllLessonsToChat(bot, chatID, "Пока знаю про эти пары:")
case commands.Weather: case commands.Weather:
w, err := weather.GetWeatherWithCache(opts.Key, 53.346853, 83.777012, time.Hour) w, err := weather.GetWeatherWithCache(opts.Key, 53.346853, 83.777012, time.Hour)
if err != nil { if err != nil {
@ -215,7 +218,7 @@ func sendTodayLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) {
tgbot.NewMessage( tgbot.NewMessage(
chatID, chatID,
messages.LessonsMessage( messages.LessonsMessage(
parser.ParseByDay(date.Today()), parser.ParseByDay(date.Today(0)),
prefix, prefix,
"Сегодня пар нет", "Сегодня пар нет",
), ),
@ -229,7 +232,7 @@ func sendTomorrowLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) {
tgbot.NewMessage( tgbot.NewMessage(
chatID, chatID,
messages.LessonsMessage( messages.LessonsMessage(
parser.ParseByDay(date.Today()+1), parser.ParseByDay(date.Today(24*time.Hour)),
prefix, prefix,
"Завтра пар нет", "Завтра пар нет",
), ),
@ -237,6 +240,20 @@ func sendTomorrowLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) {
) )
} }
func sendAllLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) {
send(
bot,
tgbot.NewMessage(
chatID,
messages.LessonsMessage(
parser.ParseByDay(""),
prefix,
"Пусто",
),
),
)
}
func sendNewYearToChat(bot *tgbot.BotAPI, chatID int64, imageService new_year_service.NewYearService) { func sendNewYearToChat(bot *tgbot.BotAPI, chatID int64, imageService new_year_service.NewYearService) {
url := imageService.GetRandomImageURL() url := imageService.GetRandomImageURL()
message := imageService.GetRandomMessage() message := imageService.GetRandomMessage()

View File

@ -29,7 +29,7 @@ func ThanksMessage() string {
} }
func HelpMessage(chatID int64) string { func HelpMessage(chatID int64) string {
return "Вот чем я могу вам помочь (v1.3.0), отправь:\n\n" + return "Вот чем я могу вам помочь (v1.4.0), отправь:\n\n" +
"- /ping отобью pong\n" + "- /ping отобью pong\n" +
"- /today_lessons покажу расписание на сегодня\n" + "- /today_lessons покажу расписание на сегодня\n" +
"- /tomorrow_lessons покажу расписание на завтра\n" + "- /tomorrow_lessons покажу расписание на завтра\n" +
@ -52,11 +52,22 @@ func LessonsMessage(schedule []parser.Lesson, prefix, emptyText string) string {
if prefix != "" { if prefix != "" {
s += prefix + "\n\n" s += prefix + "\n\n"
} }
endDate := ""
for _, l := range schedule { for _, l := range schedule {
if endDate != l.TimeStart.Format("01.02") {
if endDate != "" {
s += "\n"
}
endDate = l.TimeStart.Format("01.02")
s += endDate + "\n"
}
if strings.Contains(l.User, "Ярных В.В.") { if strings.Contains(l.User, "Ярных В.В.") {
s += "⭐️ " s += "⭐️ "
} }
s += fmt.Sprintf("%s %s (%s)\n", l.Time, l.Name, l.Place) l.Name = strings.ReplaceAll(l.Name, l.Place, "")
l.Name = strings.ReplaceAll(l.Name, "()", "")
l.Name = strings.TrimSpace(l.Name)
s += fmt.Sprintf("%s %s (%s)\n", l.TimeMsg, l.Name, l.Place)
} }
if prefix != "" { if prefix != "" {
s += "\n" + s += "\n" +
@ -92,7 +103,7 @@ func WeatherMessage(w weather.Weather) string {
func NewYearMessage(message new_year_service.NewYearMessage) string { func NewYearMessage(message new_year_service.NewYearMessage) string {
loc := time.FixedZone("UTC+7", +7*60*60) loc := time.FixedZone("UTC+7", +7*60*60)
ny := time.Date(2023, 1, 1, 0, 0, 0, 0, loc) ny := time.Date(2024, 1, 1, 0, 0, 0, 0, loc)
now := time.Now().In(loc) now := time.Now().In(loc)
days := ny.Sub(now).Hours() / 24 days := ny.Sub(now).Hours() / 24
if message.Header != "" { if message.Header != "" {

View File

@ -4,9 +4,10 @@ import (
"fmt" "fmt"
"student_bot/date" "student_bot/date"
"student_bot/parser" "student_bot/parser"
"time"
) )
func main() { func main() {
lessons := parser.ParseByDay(date.Today()) lessons := parser.ParseByDay(date.Today(-48*time.Hour))
fmt.Println(lessons) fmt.Println(lessons)
} }

View File

@ -1,126 +1,54 @@
package parser package parser
import ( import (
"fmt"
"io"
"log"
"net/http"
"strings" "strings"
"time" "time"
"github.com/PuerkitoBio/goquery" "github.com/erizocosmico/go-ics"
) )
const scheduleURLTemplate = "https://www.asu.ru/timetable/students/12/2129440415/?date=%s-%s"
type Lesson struct { type Lesson struct {
Day int
Number string Number string
Time string TimeStart time.Time
TimeMsg string
Name string Name string
User string User string
Place string Place string
} }
func ParseByDay(day int) []Lesson { func ParseByDay(day string) []Lesson {
return selectLessonsByDay(parse(), day) return selectLessonsByDay(parse(), day)
} }
func parse() []Lesson { func parse() []Lesson {
location, err := time.LoadLocation("Asia/Novosibirsk") link := "https://www.asu.ru/timetable/students/12/2129440415/?file=2129440415.ics"
calendar, err := ics.ParseCalendar(link, 0, nil)
if err != nil { if err != nil {
panic(err) panic(err)
} }
now := time.Now().In(location)
url := fmt.Sprintf(scheduleURLTemplate, now.Format("20060102"), now.Add(24*time.Hour).Format("20060102"))
// Get html
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer func(Body io.ReadCloser) {
_ = Body.Close()
}(res.Body)
if res.StatusCode != 200 {
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
}
// Load the HTML document
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
// Find the review items
k := 0
var lessons []Lesson var lessons []Lesson
var l Lesson for _, event := range calendar.Events {
doc.Find(".schedule_table tr td").Each(func(i int, s *goquery.Selection) { l := Lesson{
text := strings.TrimSpace(s.Text()) Number: "",
if strings.Contains(text, "Понедельник") || TimeStart: event.Start,
strings.Contains(text, "Вторник") || TimeMsg: event.Start.Format("15:04") + " - " + event.End.Format("15:04"),
strings.Contains(text, "Среда") || Name: event.Summary,
strings.Contains(text, "Четверг") || User: event.Description,
strings.Contains(text, "Пятница") || Place: event.Location,
strings.Contains(text, "Суббота") {
k = 0
l = Lesson{}
if strings.Contains(text, "Понедельник") {
l.Day = 1
} }
if strings.Contains(text, "Вторник") {
l.Day = 2
}
if strings.Contains(text, "Среда") {
l.Day = 3
}
if strings.Contains(text, "Четверг") {
l.Day = 4
}
if strings.Contains(text, "Пятница") {
l.Day = 5
}
if strings.Contains(text, "Суббота") {
l.Day = 6
}
}
n := (k - 1) % 6
if n == 0 {
l.Number = trim(text)
}
if n == 1 {
l.Time = trim(text)
}
if n == 2 {
l.Name = trim(text)
}
if n == 3 {
l.User = trim(text)
}
if n == 4 {
l.Place = trim(text)
if l.Place == "" { if l.Place == "" {
l.Place = "не приходи" l.Place = "не приходи"
} }
lessons = append(lessons, l) lessons = append(lessons, l)
} }
k++
})
return lessons return lessons
} }
func trim(s string) string { func selectLessonsByDay(schedule []Lesson, day string) []Lesson {
s = strings.Replace(s, "пр.з.", "пр.", -1)
s = strings.Replace(s, " ", "", -1)
s = strings.Replace(s, "\n", " ", -1)
return s
}
func selectLessonsByDay(schedule []Lesson, day int) []Lesson {
var todayLessons []Lesson var todayLessons []Lesson
for _, l := range schedule { for _, l := range schedule {
if l.Day == day { if day == "" || strings.Contains(l.TimeStart.String(), day) {
todayLessons = append(todayLessons, l) todayLessons = append(todayLessons, l)
} }
} }