Compare commits

...

29 Commits

Author SHA1 Message Date
Владимир Фёдоров e1873bddf3 Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
2023-03-11 12:32:53 +07:00
Владимир Фёдоров 80f814a105 update README.md 2023-03-11 12:32:38 +07:00
user-penguin 9aae4d2f23 ver. up
continuous-integration/drone/push Build is passing Details
2023-03-08 15:55:54 +07:00
user-penguin 3e61a8a3c2 ver. up
continuous-integration/drone/push Build is passing Details
2023-03-08 15:54:55 +07:00
user-penguin 60fbf7c214 ver. up
continuous-integration/drone/push Build is passing Details
2023-03-08 15:46:47 +07:00
user-penguin c0dae8b8a3 ver. up
continuous-integration/drone/push Build is passing Details
2023-03-08 15:43:57 +07:00
user-penguin dc2c3bfee4 fix
continuous-integration/drone/push Build is passing Details
2023-03-08 15:42:22 +07:00
user-penguin 4e2db0fafb edit bot deploy path
continuous-integration/drone/push Build is failing Details
2023-03-08 15:40:53 +07:00
user-penguin c11d7f1924 edit drone.yml
continuous-integration/drone/push Build is failing Details
2023-03-08 15:35:35 +07:00
Владимир Фёдоров 2cc6341623 add cron.txt
continuous-integration/drone/push Build is failing Details
2023-03-08 00:40:16 +07:00
Владимир Фёдоров fded974d4f add verochka.service file 2023-03-08 00:20:44 +07:00
Владимир Фёдоров 9a1a99985c fix 2023-02-10 15:51:04 +07:00
old-flex 9415ce4c37 Merge pull request 'kostyan/trash' (#1) from kostyan/trash into master
Reviewed-on: https://git.user-penguin.space/vladimir/verochka/pulls/1
2023-02-10 15:46:52 +07:00
Владимир Фёдоров d189be8e44 fix 2023-02-10 15:43:13 +07:00
k.ukolov 179c2eaf6b change help version 2023-02-10 15:20:30 +07:00
k.ukolov c50dcc5e2a style fix 2023-02-10 15:18:33 +07:00
k.ukolov 56a6ba3466 поменял местами дату и день недели 2023-02-10 15:13:59 +07:00
k.ukolov 454f544bf3 Сделал weekday для сообщения 2023-02-10 14:47:09 +07:00
k.ukolov f38fca44fb Предлагаю такой прикол с НГ сделать 2023-02-10 13:27:39 +07:00
Владимир Фёдоров d2623b44e5 fix lessons message 2023-01-11 02:48:31 +07:00
Владимир Фёдоров 7b51047e34 fix date format 2023-01-11 02:35:03 +07:00
Владимир Фёдоров c09635a5e8 update doc 2023-01-11 02:29:44 +07:00
Владимир Фёдоров d3cd2a2653 up version 2023-01-11 02:26:45 +07:00
Владимир Фёдоров 6325033fdf add all_lessons 2023-01-11 02:00:07 +07:00
Владимир Фёдоров 78705f95ea up version 2022-11-26 19:17:18 +07:00
Владимир Фёдоров cb7c313386 add /send_new_year_to_chat 2022-11-26 16:59:35 +07:00
Владимир Фёдоров 84389e11bd add /send_tomorrow_lessons_to_chat 2022-09-11 17:26:28 +07:00
Владимир Фёдоров 63d9e2f393 up version 2022-09-04 23:10:07 +07:00
Владимир Фёдоров 1182d5f93e fix file name 2022-09-04 22:52:33 +07:00
13 changed files with 197 additions and 201 deletions

View File

@ -12,15 +12,15 @@ steps:
image: appleboy/drone-scp image: appleboy/drone-scp
settings: settings:
host: host:
from_secret: ssh_ip from_secret: server_ip
username: username:
from_secret: ssh_login from_secret: ssh_user
password: key:
from_secret: ssh_pass from_secret: ssh_key
port: port:
from_secret: ssh_port from_secret: ssh_port
target: target:
- bots/verochka_tg_bot - deploys/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: ssh_ip from_secret: server_ip
username: username:
from_secret: ssh_login from_secret: ssh_user
password: key:
from_secret: ssh_pass from_secret: ssh_key
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 bots/verochka_tg_bot - cd deploys/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} > token_weather.txt - echo $${CHAT_ID} > chat_id.txt
- echo $${PASSWORD} | sudo -S systemctl restart verochka_tg_bot - echo $${PASSWORD} | sudo -S systemctl restart verochka
trigger: trigger:
event: event:

View File

@ -3,13 +3,6 @@
## develop ## develop
git clone https://github.com/3crabs/student-verochka-bot student_bot git clone https://git.3crabs.ru/VLADIMIR/verochka verochka
cd student_bot cd verochka
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,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

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

3
cron.txt Normal file
View File

@ -0,0 +1,3 @@
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,10 +2,31 @@ 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")
}
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,13 +4,9 @@ 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/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
) )
require ( require github.com/technoweenie/multipartstreamer v1.0.1 // indirect
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,23 +1,10 @@
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/PuerkitoBio/goquery v1.7.1 h1:oE+T06D+1T7LNrn91B4aERsRIeCLJ/oPSa6xB9FPnz4= github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f h1:IUdUh6y8VDhn5iO/ggBCVb9H0vOI3MDlhDSDCrrSC8Q=
github.com/PuerkitoBio/goquery v1.7.1/go.mod h1:XY0pP4kfraEmmV1O7Uf6XyjoslwsneBbgeDjLYuN8xY= github.com/erizocosmico/go-ics v0.0.0-20180527181030-697b9000b86f/go.mod h1:VFnDugGvBJREsor/aiVcXhvAbyjatl0AKXEaGV9u63I=
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,6 +132,18 @@ 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)
@ -175,11 +187,10 @@ func run() {
sendTodayLessonsToChat(bot, chatID, "Сегодня, "+update.Message.From.FirstName+", эти пары:") sendTodayLessonsToChat(bot, chatID, "Сегодня, "+update.Message.From.FirstName+", эти пары:")
case commands.TomorrowLessons: case commands.TomorrowLessons:
send(bot, tgbot.NewMessage(chatID, messages.LessonsMessage( sendTomorrowLessonsToChat(bot, chatID, "Завтра, "+update.Message.From.FirstName+", эти пары:")
parser.ParseByDay(date.Today()+1),
"Завтра, "+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)
@ -189,11 +200,7 @@ func run() {
send(bot, tgbot.NewMessage(chatID, messages.WeatherMessage(w))) send(bot, tgbot.NewMessage(chatID, messages.WeatherMessage(w)))
case commands.NewYear: case commands.NewYear:
url := imageService.GetRandomImageURL() sendNewYearToChat(bot, chatID, imageService)
message := imageService.GetRandomMessage()
msg := tgbot.NewPhotoShare(chatID, url)
msg.Caption = messages.NewYearMessage(message)
send(bot, msg)
default: default:
} }
@ -208,12 +215,49 @@ 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(chatID, tgbot.NewMessage(
chatID,
messages.LessonsMessage( messages.LessonsMessage(
parser.ParseByDay(date.Today()), parser.ParseByDay(date.Today(0)),
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,6 +5,7 @@ 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"
@ -29,10 +30,11 @@ func ThanksMessage() string {
} }
func HelpMessage(chatID int64) string { func HelpMessage(chatID int64) string {
return "Вот чем я могу вам помочь (v1.0.4), отправь:\n\n" + return "Вот чем я могу вам помочь (v1.4.6), отправь:\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Ну а больше я пока ничего не умею" +
@ -52,18 +54,30 @@ 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 += "⭐️ "
} }
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.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
} }
@ -92,10 +106,13 @@ 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(time.Now().Year()+1, 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
return fmt.Sprintf("❄ %s ❄ \n\n%s\n\n%s", toStrDays(int(days)), message.Header, message.Text) 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", toStrDays(int(days)), message.Text)
} }
func toStrDays(days int) string { func toStrDays(days int) string {

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 TimeStart time.Time
Time string 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 l.Place == "" {
if n == 0 { l.Place = "не приходи"
l.Number = trim(text)
} }
if n == 1 { lessons = append(lessons, l)
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 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)
} }
} }

4
verochka.service Normal file
View File

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