1
0
Fork 0

Add of Markdown, keyboard and some fix

This commit is contained in:
Ethanell 2019-09-14 12:22:22 +02:00
parent ea29352b29
commit 87e138562f

68
bot.py
View file

@ -1,6 +1,7 @@
import logging, shelve, datetime, hashlib import logging, shelve, datetime, hashlib
from aiogram import Bot, Dispatcher, executor, types from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineQuery, InputTextMessageContent, InlineQueryResultArticle from aiogram.types import InlineQuery, InputTextMessageContent, InlineQueryResultArticle, ParseMode, reply_keyboard
from aiogram.utils import markdown
from ics import Calendar from ics import Calendar
from ics.parse import ParseError from ics.parse import ParseError
from requests import get from requests import get
@ -18,52 +19,67 @@ def edt(text, user_id):
with dbL: with dbL:
with shelve.open("edt") as db: with shelve.open("edt") as db:
if not str(user_id) in db: if not str(user_id) in db:
return "Your EDT is not set !" return markdown.bold("Your EDT is not set !")
now = datetime.datetime.now() now = datetime.datetime.now()
if text == "week": if text.lower() == "week":
firstdate = now.date() - datetime.timedelta(days=now.isoweekday()-1) firstdate = now.date() - datetime.timedelta(days=now.isoweekday()-1)
lastdate = now.date() + datetime.timedelta(days=(7 - now.isoweekday())) lastdate = now.date() + datetime.timedelta(days=(7 - now.isoweekday()))
elif text == "next": elif text.lower() == "next":
now += datetime.timedelta(days=7) now += datetime.timedelta(days=7)
firstdate = now.date() - datetime.timedelta(days=now.isoweekday()) firstdate = now.date() - datetime.timedelta(days=now.isoweekday())
lastdate = now.date() + datetime.timedelta(days=(7 - now.isoweekday())) lastdate = now.date() + datetime.timedelta(days=(7 - now.isoweekday()))
elif text == "": elif text == "" or text.lower() == "day":
firstdate, lastdate = now, now firstdate, lastdate = now.date(), now.date()
else: else:
return "Invalid choice !" return markdown.bold("Invalid choice !")
url = f"{db[str(user_id)]}&firstDate={firstdate}&lastDate={lastdate}" url = f"{db[str(user_id)]}&firstDate={firstdate}&lastDate={lastdate}"
c = Calendar(get(url).text) c = Calendar(get(url).text)
msg = str() msg = list()
days = list()
for e in list(c.timeline): for e in list(c.timeline):
begin = e.begin.datetime begin = e.begin.datetime
end = e.end.datetime end = e.end.datetime
if str(begin.date())[5:] not in msg: if begin.date() not in days:
msg += f"<{str(begin.date())[5:]}>" + "\n" days.append(begin.date())
msg.append(markdown.bold(f"<{str(begin.date())[5:]}>"))
msg += f"[{e.name}]:" + "\n" msg.append(markdown.code(f"📓[{e.name}]:"))
msg += f"{str(begin.time())[:-3]} -> {str(end.time())[:-3]}" + "\n" msg.append(markdown.text(f"⌚️ {str(begin.time())[:-3]} -> {str(end.time())[:-3]}"))
prof = e.description.split('\n')[3] prof = markdown.text(e.description.split('\n')[3])
msg += f"{e.location} {prof}" + "\n\n" msg.append(markdown.italic(f"📍 {e.location} 👨‍🏫 {prof}" + "\n"))
if msg == "": if len(msg) == 0:
msg = "but nobody came..." msg.append(markdown.italic("but nobody came..."))
return msg return markdown.text(*msg, sep="\n")
@dp.message_handler(commands=["start", "help"]) @dp.message_handler(commands=["start", "help"])
async def send_welcome(message: types.Message): async def send_welcome(message: types.Message):
await message.reply("""Welcome to the TelegramEDT, a calendar bot for the Lyon 1 University ! msg = markdown.text(
/edt [week | next], for show your next course markdown.text("💠 Welcome to the TelegramEDT, a calendar bot for the Lyon 1 University ! 💠\n"),
/setedt <url>, to setup your calendar markdown.text(markdown.code("/edt [day | week | next]"), markdown.text(", for show your next course")),
/getedt, to get your calendar url markdown.text(markdown.code("/setedt <url>"), markdown.text(", to setup your calendar")),
/help, to show this command""") markdown.text(markdown.code("/getedt"), markdown.text(", to get your calendar url")),
markdown.text(markdown.code("/help"), markdown.text(", to show this command")),
sep="\n"
)
await message.reply(msg, parse_mode=ParseMode.MARKDOWN)
@dp.message_handler(commands=["edt"]) @dp.message_handler(commands=["edt"])
@dp.message_handler(lambda msg: msg.text.lower() in ["day", "week", "next"])
async def edt_cmd(message: types.Message): async def edt_cmd(message: types.Message):
await message.reply(edt(message.text[5:], message.from_user.id)) text = message.text
if message.text[:4] == "/edt":
text = message.text[5:]
resp = edt(text, message.from_user.id)
key = reply_keyboard.ReplyKeyboardMarkup()
key.add(reply_keyboard.KeyboardButton("Day"))
key.add(reply_keyboard.KeyboardButton("Week"))
key.add(reply_keyboard.KeyboardButton("Next"))
await message.reply(resp, parse_mode=ParseMode.MARKDOWN, reply_markup=key)
@dp.inline_handler() @dp.inline_handler()
@ -79,7 +95,6 @@ async def inline_echo(inline_query: InlineQuery):
title=f"Your {text} course", title=f"Your {text} course",
input_message_content=input_content input_message_content=input_content
) )
# don't forget to set cache_time=1 for testing (default is 300s or 5m)
await bot.answer_inline_query(inline_query.id, results=[item], cache_time=1) await bot.answer_inline_query(inline_query.id, results=[item], cache_time=1)
@ -87,6 +102,8 @@ async def inline_echo(inline_query: InlineQuery):
async def edt_set(message: types.Message): async def edt_set(message: types.Message):
url_http = message.text.find("http") url_http = message.text.find("http")
url_end = message.text.find(" ", url_http) url_end = message.text.find(" ", url_http)
if url_end == -1:
url_end = None
url = message.text[url_http:url_end] url = message.text[url_http:url_end]
try: try:
@ -106,7 +123,7 @@ async def edt_set(message: types.Message):
await message.reply("EDT set !") await message.reply("EDT set !")
@dp.message_handler(commands=["getedturl"]) @dp.message_handler(commands=["getedt"])
async def edt_geturl(message: types.Message): async def edt_geturl(message: types.Message):
with dbL: with dbL:
with shelve.open("edt") as db: with shelve.open("edt") as db:
@ -115,5 +132,6 @@ async def edt_geturl(message: types.Message):
else: else:
await message.reply("No EDT set !") await message.reply("No EDT set !")
if __name__ == '__main__': if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True) executor.start_polling(dp, skip_updates=True)