1
0
Fork 0

Notification check now in User, add kfet API

This commit is contained in:
Ethanell 2019-09-18 20:03:24 +02:00
parent 3c0ebc25d9
commit 6a46224fd6
3 changed files with 93 additions and 14 deletions

View file

@ -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

View file

@ -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",

62
bot.py
View file

@ -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:])