From 927ab842f97809fb9ba2b872a6035e7a5f123076 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Fri, 27 Nov 2020 09:05:24 -0500 Subject: [PATCH] [O] Create separate class for scheduler --- src/commands.py | 59 +++++++-------------------------------------- src/scheduler.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 50 deletions(-) create mode 100644 src/scheduler.py diff --git a/src/commands.py b/src/commands.py index bef87a8..88fb876 100644 --- a/src/commands.py +++ b/src/commands.py @@ -8,6 +8,7 @@ from telegram import Bot, Update from telegram.ext import Updater, CallbackContext, Job from src.database import Database +from src.scheduler import Scheduler from src.utils import toJson, create, dictToString, render, wrap helpMsg = """ @@ -39,9 +40,8 @@ urlValidator = re.compile( r'(?:/?|[/?]\S+)$', re.IGNORECASE) database = Database() -tasks: {str: {str: Job}} = {} -cache: {str: {str: str}} = {} -updater: Updater = {} +scheduler: Scheduler +updater: Updater def sendRequest(req: str): @@ -53,58 +53,17 @@ def sendRequest(req: str): return text -def createTaskCallback(user: str, taskName: str, request): - if user not in cache: - cache[user] = {} - - def task(context: CallbackContext): - # Send request - text = wrap(sendRequest(request)) - - # First time http request - if taskName not in cache[user]: - cache[user][taskName] = text - - # Compare diff - else: - # Generate diff - diffRaw = difflib.unified_diff(cache[user][taskName].splitlines(1), text.splitlines(1), fromfile='before', tofile='after') - diff = ''.join(diffRaw) - cache[user][taskName] = text - - if diff != '': - # Render diff - doc = BytesIO(render(diff)) - time = datetime.datetime.now().strftime('%b %d %Y %H-%M-%S') - fileName = 'diff %s %s.png' % (taskName, time) - caption = '*%s Changed!*' % taskName - - # Send as file - context.bot.send_document(int(user), doc, fileName, caption, parse_mode='markdown') - return task - - -def startTask(user: str, taskName: str): - request = database.userRequests[user][taskName] - if user not in tasks: - tasks[user] = {} - - tasks[user][taskName] = updater.job_queue.run_repeating(createTaskCallback(user, taskName, request), - interval=request.get('interval', 120), first=0) - - # Keep record - if taskName not in database.userStatus[user]['enabledTasks']: - database.userStatus[user]['enabledTasks'].append(taskName) - database.save() - - # Initialize bot def init(bot: Bot, u: Updater): global updater updater = u + global scheduler + scheduler = Scheduler(database, updater) + for user in database.users: - for task in database.userStatus[user]['enabledTasks']: - startTask(user, task) + for request in database.userRequests[user]: + if request['enabled']: + scheduler.startTask(user, request) def start(update: Update, context: CallbackContext): diff --git a/src/scheduler.py b/src/scheduler.py new file mode 100644 index 0000000..2a8ae9b --- /dev/null +++ b/src/scheduler.py @@ -0,0 +1,63 @@ +import difflib +from datetime import datetime +from io import BytesIO + +from telegram.ext import Job, CallbackContext, Updater + +from src.commands import sendRequest +from src.database import Database +from src.utils import wrap, render + + +class Scheduler: + tasks: {str: {str: Job}} = {} + cache: {str: {str: str}} = {} + + def __init__(self, database: Database, updater: Updater): + self.database = database + self.updater = updater + + def create(self, user: str, taskName: str, request): + if user not in self.cache: + self.cache[user] = {} + + def task(context: CallbackContext): + # Send request + text = wrap(sendRequest(request)) + + # First time http request + if taskName not in self.cache[user]: + self.cache[user][taskName] = text + + # Compare diff + else: + # Generate diff + diffRaw = difflib.unified_diff(self.cache[user][taskName].splitlines(1), text.splitlines(1), + fromfile='before', tofile='after') + diff = ''.join(diffRaw) + self.cache[user][taskName] = text + + if diff != '': + # Render diff + doc = BytesIO(render(diff)) + time = datetime.now().strftime('%b %d %Y %H-%M-%S') + fileName = 'diff %s %s.png' % (taskName, time) + caption = '*%s Changed!*' % taskName + + # Send as file + context.bot.send_document(int(user), doc, fileName, caption, parse_mode='markdown') + + return task + + def startTask(self, user: str, request): + name = request['name'] + if user not in self.tasks: + self.tasks[user] = {} + + self.tasks[user][name] = self.updater.job_queue.run_repeating(self.create(user, name, request), interval=request.get('interval', 120), first=0) + + # Keep record + if not request['enabled']: + request['enabled'] = True + self.database.save() +