From 6a46224fd6c27744e3e502ff4a1ae0bf2bf1e399 Mon Sep 17 00:00:00 2001 From: flifloo Date: Wed, 18 Sep 2019 20:03:24 +0200 Subject: [PATCH] Notification check now in User, add kfet API --- EDTuser.py | 34 ++++++++++++++++++++++++-- Languages/en.json | 11 +++++++-- bot.py | 62 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 93 insertions(+), 14 deletions(-) diff --git a/EDTuser.py b/EDTuser.py index 6d69ae9..f37d873 100644 --- a/EDTuser.py +++ b/EDTuser.py @@ -1,5 +1,12 @@ -from EDTcalendar import Calendar import datetime +import requests +from EDTcalendar import Calendar + +KFET_URL = "https://kfet.bdeinfo.org/?page=api_commandes" + + +def get_now(): + return datetime.datetime.now(datetime.timezone.utc).astimezone(tz=None) class User: @@ -10,7 +17,30 @@ class User: self.nt = False self.nt_time = 20 self.nt_cooldown = 20 - self.nt_last = datetime.datetime.now(datetime.timezone.utc).astimezone(tz=None) + self.nt_last = get_now() + self.kfet = None def calendar(self, time: str = "", pass_week: bool = False): return Calendar(time, self.resources, pass_week=pass_week) + + def get_notif(self): + if self.resources and self.nt: + now = get_now() + c = self.calendar(pass_week=False) + for e in c.timeline: + if 0 <= (e.begin - now).total_seconds().__abs__() // 60 <= self.nt_time and \ + 0 <= (now - self.nt_last).total_seconds() // 60 >= self.nt_cooldown: + self.nt_last = get_now() + return e + return None + + def get_kfet(self): + res = None + if self.kfet: + cmds = requests.get(KFET_URL).json() + if str(self.kfet) in cmds: + res = 1 if cmds[str(self.kfet)]["statut"] == "T" else 2 + elif get_now().hour >= 14: + res = 3 + self.kfet = None if res else self.kfet + return res diff --git a/Languages/en.json b/Languages/en.json index a4ddc95..d1b5a03 100644 --- a/Languages/en.json +++ b/Languages/en.json @@ -3,11 +3,18 @@ "help": "\u2139 *Commands help* \u2139\n\uD83D\uDCC5/edt, show your next events\n\uD83D\uDD14/notif, set your events notifications\n\u2699/setedt, set your calendar\n\uD83D\uDCE4\t/getedt to show your ressource", "edt_err_set": "Your EDT is not set ! \u274C\n\u2139Use /setedt to fix that", "edt_err_choice": "Invalid choice ! \u274C\n\u2139You can choose between: `day`, `next`, `week`, `next week`", - "setedt_err_res": "Invalid resources ! \u274C", + "setedt_err_res": "Invalid resources ! \u274C\n\u2139Put your resources number from a export url of your calendar", "setedt": "EDT set \u2705", "getedt_err": "No EDT set ! \u274C", + "notif_event": "\uD83D\uDD14A event is coming !\n", + "kfet": "\uD83D\uDD14Your command is ready !", + "kfet_prb": "\u26A0Your command got a problem, go check whats happening", + "kfet_err": "\u274CYour order is not out", + "kfet_list": "\uD83D\uDDD2Kfet commands ready:\n", + "kfet_close": "\uD83D\uDEABKfet close, sorry", + "kfet_set": "Your command is set ! \u2705", "notif_set": "Notifications set on `{}` ! \u2705", - "notif_err_num": "Invalid number ! \u274C", + "err_num": "Invalid number ! \u274C", "notif_time_cooldown": "Notification `{}` set to `{}` ! \u2705", "notif_info": "_Notification_\n*State:* {}\n*Time:* {}\n*Cooldown:* {}", "notif_help": "\u2139 *Notif help* \u2139\n\uD83D\uDD39`toggle` to switch on/off notifications\n\uD83D\uDD39`time` to set time in minutes between notification and event\n\uD83D\uDD39`cooldown` set time in minutes between notification", diff --git a/bot.py b/bot.py index ce753f1..fd705a5 100644 --- a/bot.py +++ b/bot.py @@ -3,6 +3,7 @@ import datetime import hashlib import logging import shelve +import requests from asyncio import sleep from os import mkdir from os.path import isdir, isfile @@ -13,7 +14,7 @@ from aiogram.types import InlineQuery, InputTextMessageContent, InlineQueryResul from aiogram.utils import markdown from aiogram.utils.exceptions import MessageIsTooLong from EDTcalendar import Calendar -from EDTuser import User +from EDTuser import User, KFET_URL from lang import lang from ics.parse import ParseError from requests.exceptions import ConnectionError, InvalidSchema, MissingSchema @@ -62,14 +63,18 @@ async def notif(): with dbL: with shelve.open("edt", writeback=True) as db: for u in db: - if db[u].resources and db[u].nt: - now = get_now() - c = db[u].calendar(pass_week=True) - for e in c.timeline: - if 0 <= (e.begin - now).total_seconds().__abs__()//60 <= db[u].nt_time and \ - 0 <= (now - db[u].nt_last).total_seconds()//60 >= db[u].nt_cooldown: - db[u].nt_last = get_now() - await bot.send_message(int(u), e, parse_mode=ParseMode.MARKDOWN) + nt = db[u].get_notif() + kf = db[u].get_kfet() + if nt: + await bot.send_message(int(u), lang(db[u], "notif_event")+nt, parse_mode=ParseMode.MARKDOWN) + if kf is not None: + if kf == 1: + kf = lang(db[u], "kfet") + elif kf == 2: + kf = lang(db[u], "kfet_prb") + else: + kf = lang(db[u], "kfet_err") + await bot.send_message(int(u), kf, parse_mode=ParseMode.MARKDOWN) await sleep(60) @@ -127,6 +132,43 @@ async def edt_cmd(message: types.Message): await message.reply(resp, parse_mode=ParseMode.MARKDOWN, reply_markup=key) +@dp.message_handler(commands="kfet") +async def edt_cmd(message: types.Message): + user_id = str(message.from_user.id) + await message.chat.do(types.ChatActions.TYPING) + logger.info(f"{message.from_user.username} do kfet command: {message.text}") + with dbL: + with shelve.open("edt", writeback=True) as db: + if not 9 < get_now().hour < 14 or not get_now().isoweekday() < 5: + msg = lang(db[user_id], "kfet_close") + else: + msg = lang(db[user_id], "kfet_list") + cmds = requests.get(KFET_URL).json() + for c in cmds: + msg += markdown.code(c) + " " if cmds[c]["statut"] == "T" else "" + await message.reply(msg, parse_mode=ParseMode.MARKDOWN) + + +@dp.message_handler(commands="setkfet") +async def edt_cmd(message: types.Message): + user_id = str(message.from_user.id) + await message.chat.do(types.ChatActions.TYPING) + logger.info(f"{message.from_user.username} do setkfet command: {message.text}") + with dbL: + with shelve.open("edt", writeback=True) as db: + if not 9 < get_now().hour < 14 or not get_now().isoweekday() < 5: + msg = lang(db[user_id], "kfet_close") + else: + try: + int(message.text[9:]) + except ValueError: + msg = lang(db[user_id], "err_num") + else: + db[user_id].kfet = int(message.text[9:]) + msg = lang(db[user_id], "kfet_set") + await message.reply(msg, parse_mode=ParseMode.MARKDOWN) + + @dp.message_handler(commands="setedt") async def edt_set(message: types.Message): user_id = str(message.from_user.id) @@ -181,7 +223,7 @@ async def notif_cmd(message: types.Message): try: int(message.text[cut+1:]) except ValueError: - msg = lang(db[user_id], "notif_err_num") + msg = lang(db[user_id], "err_num") else: if cut == 11: db[user_id].nt_time = int(message.text[cut+1:])