[O] Create separate class for scheduler
This commit is contained in:
+9
-50
@@ -8,6 +8,7 @@ from telegram import Bot, Update
|
|||||||
from telegram.ext import Updater, CallbackContext, Job
|
from telegram.ext import Updater, CallbackContext, Job
|
||||||
|
|
||||||
from src.database import Database
|
from src.database import Database
|
||||||
|
from src.scheduler import Scheduler
|
||||||
from src.utils import toJson, create, dictToString, render, wrap
|
from src.utils import toJson, create, dictToString, render, wrap
|
||||||
|
|
||||||
helpMsg = """
|
helpMsg = """
|
||||||
@@ -39,9 +40,8 @@ urlValidator = re.compile(
|
|||||||
r'(?:/?|[/?]\S+)$', re.IGNORECASE)
|
r'(?:/?|[/?]\S+)$', re.IGNORECASE)
|
||||||
|
|
||||||
database = Database()
|
database = Database()
|
||||||
tasks: {str: {str: Job}} = {}
|
scheduler: Scheduler
|
||||||
cache: {str: {str: str}} = {}
|
updater: Updater
|
||||||
updater: Updater = {}
|
|
||||||
|
|
||||||
|
|
||||||
def sendRequest(req: str):
|
def sendRequest(req: str):
|
||||||
@@ -53,58 +53,17 @@ def sendRequest(req: str):
|
|||||||
return text
|
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
|
# Initialize bot
|
||||||
def init(bot: Bot, u: Updater):
|
def init(bot: Bot, u: Updater):
|
||||||
global updater
|
global updater
|
||||||
updater = u
|
updater = u
|
||||||
|
global scheduler
|
||||||
|
scheduler = Scheduler(database, updater)
|
||||||
|
|
||||||
for user in database.users:
|
for user in database.users:
|
||||||
for task in database.userStatus[user]['enabledTasks']:
|
for request in database.userRequests[user]:
|
||||||
startTask(user, task)
|
if request['enabled']:
|
||||||
|
scheduler.startTask(user, request)
|
||||||
|
|
||||||
|
|
||||||
def start(update: Update, context: CallbackContext):
|
def start(update: Update, context: CallbackContext):
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
Reference in New Issue
Block a user