from aiogram import F, Router
from aiogram.types import Message, CallbackQuery, ContentType, InlineKeyboardMarkup, InlineKeyboardButton, FSInputFile
from aiogram.filters import Command
import wget, os
from init import *
from script import *
router = Router()
# ПРИВЕТСТВЕННОЕ СООБЩЕНИЕ
@router.message(Command('start', 'help'))
async def helps(msg: Message) -> None:
tg_id = int(msg.chat.id)
if not du.user_exists(tg_id):
du.add_user(tg_id)
buttons = [[InlineKeyboardButton(text="КОМАНДЫ", callback_data="com"),
InlineKeyboardButton(text="АВТОР", callback_data="auth")]]
keyboard = InlineKeyboardMarkup(inline_keyboard=buttons, row_width=2)
await msg.answer(text="Я.Календаркин - бот для оповещения о событиях из Яндекс.Календаря. "
"Для начала работы вам нужно всего лишь прислать в чат ссылку экспорта календаря в "
"формате ICal. После получения ссылки, бот начнёт оповещать о всех новых событиях "
"и появится возможность настройки оповещений. О том, какие команды есть для настройки, "
"вы можете ознакомиться по кнопке КОМАНДЫ", reply_markup=keyboard)
@router.callback_query(F.data == "auth")
async def author(call: CallbackQuery) -> None:
await call.message.answer(text='| АВТОР |\n\n>> Этот бот не коммерческий проект, для упрощенного '
'получения уведомлений о событиях в Яндекс.Календаре. Не многим этот бот будет '
'полезен, но людям, чья работа подразумевает его использование, он станет лишь '
'удобным инструментом. Я же пишу подобные небольшие проекты, о которых вы можете '
'узнать больше на моём GitHub.')
@router.callback_query(F.data == "com")
async def commands(call: CallbackQuery) -> None:
await call.message.answer(text='| КОМАНДЫ |\n\n'
'/help - вспомогательная функция для уточнения работы команд\n'
'/list - список событий календаря, запланированных на сегодняшний день\n'
'/notif - команда, отключающая рассылку уведомлений, даже при наличии событий в календаре\n'
'/daily - оповещение в 8 утра по вашему часовому поясу со списком событий на день\n'
'/moment - напоминание, приходящее в момент начала события\n\n'
'/get_alarm - информация о времени на которое настроены оповещения\n'
'/edit_alarm - изменение времени оповещений\n'
'/stop_alarm - команда, отключающая второе оповещение о событии')
# КОМАНДЫ
@router.message(Command('list'))
async def check_list(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if du.url_exists(user_id):
txt = "Имеющиеся события на сегодня\n\n"
lst_events = sorted(text_ical(user_id, du.get_tz(user_id)))
today = dt_now(du.get_tz(user_id)).date()
counter = 0
for event in lst_events:
if event[0] == today:
counter += 1
txt += message_form(counter, event[3])
if counter: await msg.answer(text=txt, disable_web_page_preview=True)
else: await msg.answer("В данный момент событий на сегодня найдено не было!")
else: await msg.answer("Для отображения событий вы должны прислать ical-ссылку на календарь!")
@router.message(Command('notif'))
async def notif_up(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if du.url_exists(user_id):
if du.get_status(user_id): await msg.answer("Уведомления о событиях выключены!")
else: await msg.answer("Уведомления о событиях включены!")
du.update_status(user_id)
else: await msg.answer("Для взаимодействия с событиями вы должны прислать ical-ссылку на календарь!")
@router.message(Command('daily'))
async def daily_up(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if dc.clock_exists(user_id):
if dc.get_daily(user_id): await msg.answer("Ежедневные утренние уведомления выключены!")
else: await msg.answer("Ежедневные утренние уведомления включены!")
dc.update_daily(user_id)
else: await msg.answer("Для взаимодействия с событиями вы должны прислать ical-ссылку на календарь!")
@router.message(Command('moment'))
async def moment_up(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if dc.clock_exists(user_id):
if dc.get_start(user_id): await msg.answer("Уведомления в момент события выключены!")
else: await msg.answer("Уведомления в момент события включены!")
dc.update_start(user_id)
else: await msg.answer("Для взаимодействия с событиями вы должны прислать ical-ссылку на календарь!")
@router.message(Command('get_alarm'))
async def alarm_get(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if dc.clock_exists(user_id):
alarms = dc.get_alarm(user_id)
start = dc.get_start(user_id)
status2 = dc.get_status2(user_id)
txt = ""
if status2: txt += "У вас работает два оповещения"
else: txt += "У вас работает лишь первое оповещение"
if start: txt += " и сообщение в момент начала события!"
else: txt += "!"
await msg.answer(txt + f"\n\nПервое оповещение приходит за {alarms[0]} минут\n"
f"Второе оповещение приходит за {alarms[1]} минут")
else:
await msg.answer("Для того, чтобы получить таймеры, вы должны прислать ical-ссылку на свой календарь!")
@router.message(Command('edit_alarm'))
async def alarm_edit(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if dc.clock_exists(user_id):
await msg.answer_photo(photo=FSInputFile(path="../data/photo_edit_alarm.jpg"),
caption="Для изменения времени вам надо в ответ на это сообщение прислать два "
"числа через пробел: разница времени первого и второго таймера по ходу "
"времени соответственно")
else:
await msg.answer("Для того, чтобы изменить таймеры, вы должны прислать ical-ссылку на свой календарь!")
@router.message(Command('stop_alarm'))
async def alarm_stop(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if dc.clock_exists(user_id):
if dc.get_status2(user_id): await msg.answer("Второе уведомление выключено!")
else: await msg.answer("Второе уведомление включено!")
dc.update_status2(user_id)
else: await msg.answer("Для взаимодействия с событиями вы должны прислать ical-ссылку на календарь!")
# ЗАГРУЗКА ССЫЛКИ
@router.message(F.content_type == ContentType.TEXT)
async def downloading_file_ics(msg: Message) -> None:
user_id = du.get_user_id(int(msg.chat.id))
if msg.text[:5] == "https":
try:
wget.download(msg.text, f'../data/icals/{str(user_id)}_new.ics')
try: os.remove(f'../data/icals/{str(user_id)}.ics')
except FileNotFoundError: pass
os.rename(f'../data/icals/{str(user_id)}_new.ics', f'../data/icals/{str(user_id)}.ics')
time_zone = msg.text.split("=")[-1]
if not du.url_exists(user_id):
du.add_url(user_id, msg.text, time_zone)
dc.add_clock(user_id)
else:
du.update_url(user_id, msg.text, time_zone)
await msg.answer("Ссылка успешно добавлена! Уведомления уже включены!")
except Exception:
await msg.answer("Ошибка скачивания! Проверьте правильность ссылки и пришлите ещё раз")
if (msg.reply_to_message is not None) and dc.clock_exists(user_id):
text = "Для изменения времени вам надо в ответ на это сообщение прислать два числа через " \
"пробел: разница времени первого и второго таймера по ходу времени соответственно"
if msg.reply_to_message.caption == text:
alarm_new = msg.text.split()
if int(alarm_new[0]) < 60 and int(alarm_new[1]) < 60:
dc.update_alarm1(user_id, int(alarm_new[0]))
dc.update_alarm2(user_id, int(alarm_new[1]))
await msg.answer("Время отправки уведомлений успешно обновлено!")
else:
await msg.answer("Время отправки уведомлений должно быть меньше 60 минут!")