Compare commits

..

No commits in common. "master" and "add_server" have entirely different histories.

13 changed files with 203 additions and 199 deletions

View File

@ -12,15 +12,15 @@ steps:
image: appleboy/drone-scp image: appleboy/drone-scp
settings: settings:
host: host:
from_secret: server_ip from_secret: ssh_ip
username: username:
from_secret: ssh_user from_secret: ssh_login
key: password:
from_secret: ssh_key from_secret: ssh_pass
port: port:
from_secret: ssh_port from_secret: ssh_port
target: target:
- deploys/verochka_tg_bot - bots/verochka_tg_bot
source: source:
- verochka_tg_bot - verochka_tg_bot
- config - config
@ -39,21 +39,21 @@ steps:
from_secret: ssh_pass from_secret: ssh_pass
settings: settings:
host: host:
from_secret: server_ip from_secret: ssh_ip
username: username:
from_secret: ssh_user from_secret: ssh_login
key: password:
from_secret: ssh_key from_secret: ssh_pass
port: port:
from_secret: ssh_port from_secret: ssh_port
envs: [ TOKEN,TOKEN_WEATHER,CHAT_ID,PASSWORD ] envs: [ TOKEN,TOKEN_WEATHER,CHAT_ID,PASSWORD ]
command_timeout: 10s command_timeout: 10s
script: script:
- cd deploys/verochka_tg_bot - cd bots/verochka_tg_bot
- echo $${TOKEN} > token.txt - echo $${TOKEN} > token.txt
- echo $${TOKEN_WEATHER} > token_weather.txt - echo $${TOKEN_WEATHER} > token_weather.txt
- echo $${CHAT_ID} > chat_id.txt - echo $${CHAT_ID} > token_weather.txt
- echo $${PASSWORD} | sudo -S systemctl restart verochka - echo $${PASSWORD} | sudo -S systemctl restart verochka_tg_bot
trigger: trigger:
event: event:

View File

@ -3,6 +3,13 @@
## develop ## develop
git clone https://git.3crabs.ru/VLADIMIR/verochka verochka git clone https://github.com/3crabs/student-verochka-bot student_bot
cd verochka cd student_bot
go run main.go --token=<TELEGRAM_API_TOKEN> --key=<YANDEX_WEATHER_API_KEY> go run main.go --token=<TELEGRAM_API_TOKEN> --key=<YANDEX_WEATHER_API_KEY>
## deploy
git clone https://github.com/3crabs/student-verochka-bot student_bot
cd student_bot
go build -v -o bin/bot
./bin/bot --token=<TELEGRAM_API_TOKEN> --key=<YANDEX_WEATHER_API_KEY> &

View File

@ -4,7 +4,6 @@ type Command string
//today_lessons - пары сегодня //today_lessons - пары сегодня
//tomorrow_lessons - пары завтра //tomorrow_lessons - пары завтра
//all_lessons - пары на несколько дней
//weather - погода у универа //weather - погода у универа
//new_year - дней до нового года //new_year - дней до нового года
//ping - проверка связи //ping - проверка связи
@ -15,7 +14,6 @@ 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

@ -38,84 +38,84 @@
], ],
"messages": [ "messages": [
{ {
"header": "", "header": "Мокрый Новый год в Таиланде",
"text": "Пусть новогодние огни\nПоднимут настроение.\nПусть в дом уверенно войдут\nДостаток и везение!\n\nЗдоровья крепкого семье\nИ всяческих свершений.\nИ в ночь волшебную достичь\nЖеланий исполнения!\n\nЛюбви, добра и красоты,\nУспехов и подарков!\nИ пусть счастливым будет год —\nБогатым, добрым, ярким!" "text": "Тайцы очень любят праздники и не отказываются от лишнего повода повеселиться. Возможно, поэтому они отмечают Новый год трижды: европейский новый год, китайский и свой собственный праздник смены года — Сонгкран. Сонгкран празднуется в апреле несколько дней подряд. В это время тайцы выходят на улицы, чтобы пожелать друг другу счастья и... облить водой с головы до ног. Считается, что чем быстрее и сильнее ты промокнешь, тем больше счастья придет в новом году."
}, },
{ {
"header": "", "header": "Рождественское полено в странах Европы",
"text": "С Новым годом поздравляю!\nИ желаю волшебства,\nЧтобы жизнь веселой сказкой\nНепременно ожила!\n\nЧтобы радости мгновений\nБыло больше с каждым днем,\nИ удача без сомнений\nПоселилась прямо в дом!\n\nПусть гремят кругом салюты,\nНовый год уж наступил,\nПробежавшие минуты\nПусть добавят в жизни сил!" "text": "Во многих европейских странах существовал обычай в рождественский сочельник зажигать в очаге полено. По традиции, полено должно было тлеть в камине на протяжении нескольких дней. В течение этого времени дерево поливали вином и медом, посыпали зерном и клали на него кусочки еды, чтобы год был плодородным и счастливым. Пепел от полена хранили весь год, добавляя его в еду и напитки от всех болезней. С течением времени эта трудоемкая традиция ушла в прошлое, но в память о ней в некоторых европейских странах едят рождественский торт под названием «Полено»."
}, },
{ {
"header": "", "header": "В Новый год с новым именем в Микронезии",
"text": "С Новым годом поздравляю!\nИ желаю перемен,\nЧтобы не было печалей,\nЧтобы не было проблем!\n\nЧтобы жили не тужили,\nИ мечтать всегда могли,\nСвой доход приумножали,\nСвое счастье берегли!\n\nЧтобы радостных мгновений\nБыло больше с каждым днем,\nЧтобы праздничным салютом\nОсвещен был Новый год!" "text": "На некоторых островах Микронезии каждый год люди берут себе новое имя. 1 января они нашептывают свое новое имя родственникам и друзьям, при этом бьют в барабан или шумят, чтобы их не подслушали злые духи. Из-за этой традиции часто происходят казусы: однажды половина жителей одного из островов весь год носила имя Майкл Джексон."
}, },
{ {
"header": "", "header": "Мусорный дождь в новогоднюю ночь в Италии",
"text": "Вот растаял старый год,\nКак снежинка на ладошке.\nНовый год спешит рассыпать\nСчастье в каждое окошко.\n\nПусть он радость принесет\nОптимизма и веселья!\nБудто жемчуг соберет\nВсе желанья в ожерелье.\n\nИ исполнит всё-всё-всё,\nЧто задумывалось вами.\nЖизнь наполнит добротой,\nВолшебством и чудесами!" "text": "В Италии считают, что, вступая в новый год, нужно непременно избавиться от всего старого и ненужного. В канун Нового года темпераментные итальянцы выбрасывают старые вещи прямо из окон своих домов. В былые времена на улицы летела даже сломанная мебель. Сейчас же можно попасть под «обстрел» старыми бумагами и мелким мусором."
}, },
{ {
"header": "", "header": "С чемоданом вокруг дома в Эквадоре",
"text": "Пусть этот славный Новый год\nПодарит счастье и удачу,\nЗдоровья много принесет\nИ денег океан в придачу!\n\nПусть все исполнятся мечты,\nУлыбка пусть сияет ярко!\nЖелаю мира, доброты\nИ замечательных подарков!" "text": "Чтобы год был наполнен множеством путешествий, эквадорцы рекомендуют совершить первое из них прямо в новогоднюю ночь. Для этого нужно обежать вокруг дома с чемоданом в руках, пока часы бьют двенадцать раз."
}, },
{ {
"header": "", "header": "Виноградины успеха в Испании",
"text": "Какая сказка за окном!\nКружат снежинки, будто в вальсе,\nВесь мир пропитан волшебством,\nИ воздух переполнен счастьем.\n\nПусть в этот чудный Новый год\nУдача в двери постучится,\nИ счастье вместе с ней войдет,\nИ все, что хочешь ты, случится!" "text": "В винных столицах мира ни одно торжество не обходится без винограда. В Испании для всех участников новогоднего застолья заранее подготавливают по двенадцать виноградин (число ударов новогоднего колокола). Испанцы верят, что если все ягоды будут съедены за двенадцать ударов, год обязательно будет успешным."
}, },
{ {
"header": "", "header": "Гном и битье посуды в Швеции",
"text": "Желаю в новом вам году\nПоймать удачу на ходу.\nВсех удивлять, все успевать,\nСмеяться и не унывать.\n\nЛюбить, надеяться и верить\nИ счастье на себя примерить,\nИ никогда вам не тужить,\nИ просто интересно жить!" "text": "В Швеции, в отличие от большинства европейских стран, подарки детям приносит не высокий бородатый старик, а гном Юль Томтен. А помогают ему разные зверюшки, тролли, феи, принц с принцессой и даже Снежная Королева. Шведы очень любят разные гадания. В новогоднюю ночь они разбивают тарелки о двери соседей. Чем мельче осколки, тем больше счастья придет в новом году."
}, },
{ {
"header": "", "header": "Во Вьетнаме Новый год встречают со стариками",
"text": "Счастье, радость и веселье\nПусть подарит Новый год!\nИ удачи пусть под елку\nВам побольше принесет.\n\nПусть положит под подушку\nПуд тепла и доброты,\nА в ладошке тихо спрячет\nИсполнение мечты.\n\nИз любви и вдохновенья\nПусть сплетет простой венок\nИ завяжет тихо-тихо\nВам на счастье узелок." "text": "Вьетнамцы считают, что если за новогодним столом сидит человек старше семидесяти лет, его мудрость распространится на всех присутствующих. И чем старше гость, тем больше почета ему оказывают."
}, },
{ {
"header": "", "header": "Ожившие сказки Англии и поцелуи под омелой",
"text": "Пусть этот праздник принесет\nВсё то, что в жизни много значит!\nЖелаю в светлый Новый год\nДобра, здоровья и удачи!\n\nПускай веселый смех звучит,\nА сердце — счастье заполняет,\nВедь дед Мороз осуществит\nВсё, что душа твоя желает!" "text": "Новый год в Англии отмечается традиционным карнавальным шествием, которое возглавляет Лорд Беспорядок. В толпе сказочных героев можно увидеть Мартовского зайца, Шалтая-Болтая и прочих любимцев детей. Дома и улицы Англии украшаются венками из омелы, которая, по поверьям, обладает магической силой. Во время звона новогоднего колокола влюбленные целуются под таким венком, чтобы жить в согласии."
}, },
{ {
"header": "", "header": "В Голландии идут в гости со спичками",
"text": "Пожелаю в Новый год,\nЧтобы шел год без хлопот,\nПодарил Вам много счастья\nИ укрыл от всех ненастий.\n\nПусть случится волшебство,\nДарит радость торжество.\nПусть все сбудутся мечты.\nСчастья, мира, доброты!" "text": "Голландцы идут на новогодний ужин, захватив с собой спичку. Спичка впоследствии сжигается в камине. Если она сгорает полностью, год будет очень счастливым."
}, },
{ {
"header": "", "header": "Бочка дегтя в Шотландии",
"text": "С Новым годом поздравляю\nИ от всей души желаю\nВеселиться и смеяться,\nНи на что не обижаться,\nЖить легко и без забот\nВесь грядущий новый год.\n\nНаслаждаться каждым мигом\nИ дарить свое тепло,\nБыть всегда на позитиве,\nЧтоб всегда во всём везло!\n\nС Новым годом! С новым счастьем!\nСмеха, мира и добра!\nПусть обходят все ненастья,\nЖизнь одарит вас сполна!" "text": "В некоторых городах Шотландии в новогоднюю ночь поджигают бочки с дегтем и катят их по улицам города. Так сжигают старый год и очищают дорогу новому. Если вам предстоит новогодний ужин у шотландца, не забудьте захватить с собой уголек, чтобы бросить его в очаг хозяина. Таким образом в Шотландии желают удачи в новом году."
}, },
{ {
"header": "", "header": "Японцы загребают счастье граблями",
"text": "С Новым годом, с Новым годом!\nПусть здоровье входит в дом,\nПусть Мороз рукою легкой\nРазбросает счастье в нем!\n\nБудет пусть он полон смеха,\nИ любви, и доброты,\nЧтоб заботы — не помеха,\nДостатка, мира, красоты!" "text": "В Японии к Новому году принято украшать дома бамбуковыми граблями. Считается, что если в доме нет граблей, то нечем будет загребать счастье. В первые секунды нового года японцы громко смеются, чтобы год был веселым и радостным."
}, },
{ {
"header": "", "header": "Во Франции у кого боб, тот и король",
"text": "С Новым годом! С Новым счастьем!\nПусть исполнятся мечты,\nВ миг чудесный, в миг прекрасный,\nВ новогодний дивный миг!\n\nЧтобы было чудо в доме,\nРадость, счастье, волшебство,\nПозитив, тепло, веселье,\nИ здоровье, и добро!\n\nПусть умножатся доходы,\nКлассных, выгодных идей,\nЧтобы были только лучше,\nЧтобы жили веселей!" "text": "В католической Франции зимние праздники заканчиваются 6 января на Богоявление. Этот праздник посвящен библейскому сюжету о трех волхвах, которые принесли дары младенцу Христу. В современной Франции в этот день едят знаменитый слоеный пирог с начинкой из миндаля — Пирог Волхвов. Пирог разрезается на части, один из гостей забирается под стол и оттуда выкрикивает, кому какой кусок следует отдать. В прежние времена в пироге запекался боб, и человек, которому он попадался, становился королем вечера. Сейчас в пирог кладут керамическую фигурку и корону из картона."
}, },
{ {
"header": "", "header": "В Бразилии «море пламенем горит»",
"text": "Пусть в Новом году всё плохое сотрется,\nКак ластик стирает ненужный нам штрих!\nПусть самое лучшее вам улыбнется,\nИ ярким пусть будет в году каждый миг!\n\nЗдоровья, успехов и много везенья,\nДостатка и благ в наступившем году!\nОтличных идей и всегда вдохновенья!\nВсего лишь хорошего в вашу судьбу!" "text": "В жаркой Бразилии в новогоднюю ночь океан сверкает огнями. По традиции, люди загадывают желания и пускают по воде плоты со свечами и дарами богине моря. В прибрежные волны бросают лепестки белых цветов в надежде, что океан примет желания и не выбросит лепестки на берег. Приход Нового года сопровождает выстрел из пушки, после которого бразильцы обнимают всех вокруг, чтобы год был полон любви."
}, },
{ {
"header": "", "header": "В Венгрии освистывают злых духов",
"text": "Пусть год уходящий с собой заберет\nПроблемы, недуги, ненастье,\nА новый здоровье и радость несет,\nЛюбовь доброту и участье!\n\nЧудес новогодних, добра, волшебства,\nУюта, семейного счастья,\nУлыбок, веселья, достатка, тепла,\nНе знать ни забот, ни напастей." "text": "Венгры уверены в том, что злые духи очень боятся звука свистков и дудочек. Чтобы наступающий год был счастливым, перед его приходом обязательно нужно очистить города от духов-вредителей. И в новогоднюю ночь Венгрия наполняется громкими трелями и свистом."
}, },
{ {
"header": "", "header": "Чтобы год был сладким, в Израиле едят сладости",
"text": "Желаю в этот Новый год\nПоменьше грусти и забот,\nПобольше счастья и добра,\nУлыбок, нежности, тепла!\n\nЧтоб были верными друзья\nИ очень дружною семья,\nЧтоб каждый день удачным был,\nИ чтоб на всё хватало сил!\n\nНу а ещё пусть Новый год\nПобольше денег принесёт,\nЗдоровья, мира и любви,\nЧтоб в сердце не было зимы!" "text": "В Израиле отмечают Новый год в сентябре. Во время праздника едят сладкую пищу. Даже рыбу поливают медом. От горькой еды стараются отказаться, чтобы не привлечь «горькую» жизнь в новом году."
}, },
{ {
"header": "", "header": "Кубинцы смывают грехи в новогоднюю ночь",
"text": "С Новым годом поздравляю\nИ от всей души желаю,\nЧтоб сбывались все мечты,\nВ праздник зимней красоты!\n\nЧтобы счастье приходило,\nВам везение дарило,\nА еще успех и радость,\nЧудеса, удачи сладость!" "text": "В день перед Новым годом на Кубе наливают воду в кружки, тазы и кастрюли. Каждый набирает столько воды, сколько, по его мнению, грехов он совершил за год. После полуночи вода выливается за порог, что символизирует очищение от пороков."
}, },
{ {
"header": "", "header": "Пауза для поцелуев в Болгарии и кизиловые палочки",
"text": "С Новым годом! С новым счастьем!\nНикогда не знать ненастья,\nВерить в чудо и добро,\nЧтоб плохое всё ушло!\n\nЖить и жизнью наслаждаться,\nНикогда не огорчаться,\nБыть любимыми, любить\nИ тепло души дарить.\n\nДобрых лишь людей встречать,\nО заботах не ворчать,\nВерных, преданных друзей,\nСамых лучших, светлых дней!" "text": "Во время празднования Нового года в Болгарии во всех домах на три минуты выключают свет. В это время можно поцеловаться с тем, с кем не решался сделать это при свете. А 1 января болгарские дети идут поздравлять взрослых с кизиловыми палочками в руках. Дети стучат палочками друг о друга, после чего получают подарки."
}, },
{ {
"header": "", "header": "Санта Клаус — серфингист в Австралии",
"text": "Новый Год — прекрасный праздник,\nПусть в нем крупно повезет,\nНастроенье будет ясным,\nА удача — круглый год!\n\nВ чудеса поверить нужно,\nИ они придут к тебе\nИ помогут вместе, дружно\nК небесам взлететь мечте.\n\nВаша жизнь пусть станет сказкой,\nБудет в ней всегда добро,\nЖизнь наполнит счастьем, лаской,\nПусть все будет хорошо!" "text": "Новый год отмечается в Австралии летом. Жара вынуждает Санту избавиться от теплой шубы, и из всего праздничного костюма на нем часто остаются лишь красные плавки, борода и колпак. Оленям жары тоже не вынести, и на санях без снега не проехать, поэтому Санта Клаус доставляет подарки на серфе. Толпа встречает его на пляже радостными криками и фейерверками."
}, },
{ {
"header": "", "header": "Камень за пазухой в Греции",
"text": "Вот приходит Новый год\nИ с собой он пусть несет\nМного счастья, много смеха,\nВ жизни и в делах — успеха.\n\nЯрких, творческих идей,\nСамых преданных друзей.\nИ любви огромной, чистой,\nИ улыбок лишь лучистых!" "text": "Если вы идете на новогодний ужин в Греции, по дороге обязательно подберите камень побольше. Крупные камни греки кладут у порога хозяина дома с пожеланиями такого же большого богатства. Если же больших камней не нашлось, можно взять самый маленький и пожелать, чтобы возможные беды хозяев были не тяжелее этого камешка."
} }
] ]
} }

View File

@ -1,3 +0,0 @@
0 3 * * 1-5 curl http://127.0.0.1:10001/send_today_lessons_to_chat
0 15 * * 1-5 curl http://127.0.0.1:10001/send_tomorrow_lessons_to_chat
0 5 20-31 12 * curl http://127.0.0.1:10001/send_new_year_to_chat

View File

@ -2,31 +2,10 @@ package date
import "time" import "time"
func Today(offset time.Duration) string { func Today() int {
location, err := time.LoadLocation("Asia/Novosibirsk") location, err := time.LoadLocation("Asia/Novosibirsk")
if err != nil { if err != nil {
panic(err) panic(err)
} }
return time.Now().In(location).Add(offset).Format("2006-01-02") return int(time.Now().In(location).Weekday())
}
func GetTranslatedWeekday(date time.Time) string {
switch date.Weekday() {
case time.Monday:
return "Понедельник"
case time.Tuesday:
return "Вторник"
case time.Wednesday:
return "Среда"
case time.Thursday:
return "Четверг"
case time.Friday:
return "Пятница"
case time.Saturday:
return "Суббота"
case time.Sunday:
return "Воскресенье"
default:
return ""
}
} }

8
go.mod
View File

@ -4,9 +4,13 @@ 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/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f github.com/PuerkitoBio/goquery v1.7.1
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
) )
require github.com/technoweenie/multipartstreamer v1.0.1 // indirect require (
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
)

17
go.sum
View File

@ -1,10 +1,23 @@
github.com/3crabs/go-yandex-weather-api v0.6.0 h1:EpqAfaStJNVRNRyYsvUmiNFQYGrQ+eXVP2e+vMWIh08= github.com/3crabs/go-yandex-weather-api v0.6.0 h1:EpqAfaStJNVRNRyYsvUmiNFQYGrQ+eXVP2e+vMWIh08=
github.com/3crabs/go-yandex-weather-api v0.6.0/go.mod h1:MZLPelQjylEK4nPL9g2cpnAPtqzOpF/SrtRGWXK7QHs= github.com/3crabs/go-yandex-weather-api v0.6.0/go.mod h1:MZLPelQjylEK4nPL9g2cpnAPtqzOpF/SrtRGWXK7QHs=
github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f h1:IUdUh6y8VDhn5iO/ggBCVb9H0vOI3MDlhDSDCrrSC8Q= github.com/PuerkitoBio/goquery v1.7.1 h1:oE+T06D+1T7LNrn91B4aERsRIeCLJ/oPSa6xB9FPnz4=
github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f/go.mod h1:VFnDugGvBJREsor/aiVcXhvAbyjatl0AKXEaGV9u63I= github.com/PuerkitoBio/goquery v1.7.1/go.mod h1:XY0pP4kfraEmmV1O7Uf6XyjoslwsneBbgeDjLYuN8xY=
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/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
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=
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
github.com/umputun/go-flags v1.5.1 h1:vRauoXV3Ultt1HrxivSxowbintgZLJE+EcBy5ta3/mY= github.com/umputun/go-flags v1.5.1 h1:vRauoXV3Ultt1HrxivSxowbintgZLJE+EcBy5ta3/mY=
github.com/umputun/go-flags v1.5.1/go.mod h1:nTbvsO/hKqe7Utri/NoyN18GR3+EWf+9RrmsdwdhrEc= github.com/umputun/go-flags v1.5.1/go.mod h1:nTbvsO/hKqe7Utri/NoyN18GR3+EWf+9RrmsdwdhrEc=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

68
main.go
View File

@ -132,18 +132,6 @@ func run() {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintf(w, `{"result":"ok"}`) _, _ = fmt.Fprintf(w, `{"result":"ok"}`)
}) })
http.HandleFunc("/send_tomorrow_lessons_to_chat", func(w http.ResponseWriter, r *http.Request) {
sendTomorrowLessonsToChat(bot, opts.ChatID, "Завтра эти пары:")
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintf(w, `{"result":"ok"}`)
})
http.HandleFunc("/send_new_year_to_chat", func(w http.ResponseWriter, r *http.Request) {
sendNewYearToChat(bot, opts.ChatID, imageService)
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintf(w, `{"result":"ok"}`)
})
port := ":10001" port := ":10001"
log.Println("Server is start up! port", port) log.Println("Server is start up! port", port)
@ -187,10 +175,11 @@ func run() {
sendTodayLessonsToChat(bot, chatID, "Сегодня, "+update.Message.From.FirstName+", эти пары:") sendTodayLessonsToChat(bot, chatID, "Сегодня, "+update.Message.From.FirstName+", эти пары:")
case commands.TomorrowLessons: case commands.TomorrowLessons:
sendTomorrowLessonsToChat(bot, chatID, "Завтра, "+update.Message.From.FirstName+", эти пары:") send(bot, tgbot.NewMessage(chatID, messages.LessonsMessage(
parser.ParseByDay(date.Today()+1),
case commands.AllLessons: "Завтра, "+update.Message.From.FirstName+", эти пары:",
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)
@ -200,7 +189,11 @@ func run() {
send(bot, tgbot.NewMessage(chatID, messages.WeatherMessage(w))) send(bot, tgbot.NewMessage(chatID, messages.WeatherMessage(w)))
case commands.NewYear: case commands.NewYear:
sendNewYearToChat(bot, chatID, imageService) url := imageService.GetRandomImageURL()
message := imageService.GetRandomMessage()
msg := tgbot.NewPhotoShare(chatID, url)
msg.Caption = messages.NewYearMessage(message)
send(bot, msg)
default: default:
} }
@ -215,49 +208,12 @@ func send(bot *tgbot.BotAPI, msg tgbot.Chattable) {
func sendTodayLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) { func sendTodayLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) {
send( send(
bot, bot,
tgbot.NewMessage( tgbot.NewMessage(chatID,
chatID,
messages.LessonsMessage( messages.LessonsMessage(
parser.ParseByDay(date.Today(0)), parser.ParseByDay(date.Today()),
prefix, prefix,
"Сегодня пар нет", "Сегодня пар нет",
), ),
), ),
) )
} }
func sendTomorrowLessonsToChat(bot *tgbot.BotAPI, chatID int64, prefix string) {
send(
bot,
tgbot.NewMessage(
chatID,
messages.LessonsMessage(
parser.ParseByDay(date.Today(24*time.Hour)),
prefix,
"Завтра пар нет",
),
),
)
}
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) {
url := imageService.GetRandomImageURL()
message := imageService.GetRandomMessage()
msg := tgbot.NewPhotoShare(chatID, url)
msg.Caption = messages.NewYearMessage(message)
send(bot, msg)
}

View File

@ -5,7 +5,6 @@ import (
"math/rand" "math/rand"
"strconv" "strconv"
"strings" "strings"
"student_bot/date"
"student_bot/new_year_service" "student_bot/new_year_service"
"student_bot/parser" "student_bot/parser"
"time" "time"
@ -30,11 +29,10 @@ func ThanksMessage() string {
} }
func HelpMessage(chatID int64) string { func HelpMessage(chatID int64) string {
return "Вот чем я могу вам помочь (v1.4.6), отправь:\n\n" + return "Вот чем я могу вам помочь (v1.0.4), отправь:\n\n" +
"- /ping отобью pong\n" + "- /ping отобью pong\n" +
"- /today_lessons покажу расписание на сегодня\n" + "- /today_lessons покажу расписание на сегодня\n" +
"- /tomorrow_lessons покажу расписание на завтра\n" + "- /tomorrow_lessons покажу расписание на завтра\n" +
"- /all_lessons - пары на несколько дней\n" +
"- /weather покажу погоду у универа\n" + "- /weather покажу погоду у универа\n" +
"- /new_year - посчитаю количество дней до нового года\n" + "- /new_year - посчитаю количество дней до нового года\n" +
"\nНу а больше я пока ничего не умею" + "\nНу а больше я пока ничего не умею" +
@ -54,30 +52,18 @@ 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("02.01") {
if endDate != "" {
s += "\n"
}
endDate = l.TimeStart.Format("02.01")
s += date.GetTranslatedWeekday(l.TimeStart) + " " + endDate + "\n"
}
if strings.Contains(l.User, "Ярных В.В.") { if strings.Contains(l.User, "Ярных В.В.") {
s += "⭐️ " s += "⭐️ "
} }
l.Name = strings.ReplaceAll(l.Name, l.Place, "") s += fmt.Sprintf("%s %s (%s)\n", l.Time, l.Name, l.Place)
l.Name = strings.ReplaceAll(l.Name, "()", "")
l.Name = strings.ReplaceAll(l.Name, l.TimeStart.Format("15:04"), "")
l.Name = strings.TrimSpace(l.Name)
s += fmt.Sprintf("%s %s (%s)\n%s\n", l.TimeMsg, l.Name, l.Place, l.User)
} }
if prefix != "" { if prefix != "" {
s += "\n" + s += "\n" +
"Д — Димитрова 66\n" + // (Филологический, социологический) "Д — Димитрова 66 (Филологический, социологический)\n" +
"Л — Ленина 61\n" + // (Математический, биологический) "Л — Ленина 61 (Математический и биологический)\n" +
"М — Ленина 61а\n" + // (Исторический и географический) "М — Ленина 61а (Исторический и географический)\n" +
"С — Социалистический 68" // (Экономический и юридический) "С — Социалистический 68 (Экономический и юридический)"
} }
return s return s
} }
@ -106,13 +92,10 @@ 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(time.Now().Year()+1, 1, 1, 0, 0, 0, 0, loc) ny := time.Date(2023, 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 != "" { return fmt.Sprintf("❄ %s ❄ \n\n%s\n\n%s", toStrDays(int(days)), message.Header, message.Text)
return fmt.Sprintf("❄ %s ❄ \n\n%s\n\n%s", toStrDays(int(days)), message.Header, message.Text)
}
return fmt.Sprintf("❄ %s ❄ \n\n%s", toStrDays(int(days)), message.Text)
} }
func toStrDays(days int) string { func toStrDays(days int) string {

View File

@ -4,10 +4,9 @@ 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(-48 * time.Hour)) lessons := parser.ParseByDay(date.Today())
fmt.Println(lessons) fmt.Println(lessons)
} }

View File

@ -1,54 +1,126 @@
package parser package parser
import ( import (
"fmt"
"io"
"log"
"net/http"
"strings" "strings"
"time" "time"
"github.com/erizocosmico/go-ics" "github.com/PuerkitoBio/goquery"
) )
const scheduleURLTemplate = "https://www.asu.ru/timetable/students/12/2129440415/?date=%s-%s"
type Lesson struct { type Lesson struct {
Number string Day int
TimeStart time.Time Number string
TimeMsg string Time string
Name string Name string
User string User string
Place string Place string
} }
func ParseByDay(day string) []Lesson { func ParseByDay(day int) []Lesson {
return selectLessonsByDay(parse(), day) return selectLessonsByDay(parse(), day)
} }
func parse() []Lesson { func parse() []Lesson {
link := "https://www.asu.ru/timetable/students/12/2129440415/?file=2129440415.ics" location, err := time.LoadLocation("Asia/Novosibirsk")
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"))
var lessons []Lesson // Get html
for _, event := range calendar.Events { res, err := http.Get(url)
l := Lesson{ if err != nil {
Number: "", log.Fatal(err)
TimeStart: event.Start,
TimeMsg: event.Start.Format("15:04") + " - " + event.End.Format("15:04"),
Name: event.Summary,
User: event.Description,
Place: event.Location,
}
if l.Place == "" {
l.Place = "не приходи"
}
lessons = append(lessons, l)
} }
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 l Lesson
doc.Find(".schedule_table tr td").Each(func(i int, s *goquery.Selection) {
text := strings.TrimSpace(s.Text())
if strings.Contains(text, "Понедельник") ||
strings.Contains(text, "Вторник") ||
strings.Contains(text, "Среда") ||
strings.Contains(text, "Четверг") ||
strings.Contains(text, "Пятница") ||
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 == "" {
l.Place = "не приходи"
}
lessons = append(lessons, l)
}
k++
})
return lessons return lessons
} }
func selectLessonsByDay(schedule []Lesson, day string) []Lesson { func trim(s string) string {
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 day == "" || strings.Contains(l.TimeStart.String(), day) { if l.Day == day {
todayLessons = append(todayLessons, l) todayLessons = append(todayLessons, l)
} }
} }

View File

@ -1,4 +0,0 @@
[Service]
WorkingDirectory=/home/crab/deploys/verochka_tg_bot
ExecStart=/home/crab/deploys/verochka_tg_bot/verochka_tg_bot
Restart=always