[O] Create separate class for scheduler

This commit is contained in:
Hykilpikonna
2020-11-27 09:05:24 -05:00
parent c776ae3ca6
commit 927ab842f9
2 changed files with 72 additions and 50 deletions
+9 -50
View File
@@ -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):
+63
View File
@@ -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()