Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 29 additions & 96 deletions lib/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ class Scheduler:
def __init__(self, sdk):
"""
Initialize apscheduler and start

:param sdk:
"""
self.sdk = sdk
Expand All @@ -21,126 +20,60 @@ def restore(self, processor):
- Get all jobs
- Get callback, returned by processor function by payload
- Run scheduler job

Example:
self.sdk.scheduler.restore(say_hello)

:param processor: function, which returns appropriate callback to call for the job (by payload)
"""
# Get jobs from db
jobs = self.sdk.db.find(Scheduler.COLLECTION_NAME, {})

# Run jobs
for job in jobs:
self.scheduler.add_job(
processor,
id=job['id'],
args=job['args'],
trigger='cron',
replace_existing=True,
**job['trigger_params']
)

def add(self, callback, payload, args, trigger_params=None):
self.scheduler.add_job(processor(job.get('payload', None)),
id=job['chat_id'],
hour=job['hour'],
args=job['args'],
trigger='cron',
replace_existing=True)

def add(self, callback, chat_id, args, hour, payload=None):
"""
Add new scheduling job.
- Append params to DB
- Add Apscheduler job

Example:
def say_hello(payload, data):
print(data['message'])

self.sdk.scheduler.add(
say_hello, # Callback function
payload, # Job identify by chat and bot
args=[payload, data], # Callback params
trigger_params={'minute': '0', 'hour': '*/6'} # Cron params
)

Available trigger_params:
year (int|str) – 4-digit year
month (int|str) – month (1-12)
day (int|str) – day of the (1-31)
week (int|str) – ISO week (1-53)
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)
hour (int|str) – hour (0-23)
minute (int|str) – minute (0-59)
second (int|str) – second (0-59)

:param callback: function to execute at the time
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

нужно добавить в доки пример использования методы

:param payload: chat and bot
:param chat_id: chat ID
:param args: arguments for callback function
:param trigger_params: {'minute': '*', 'hour': '*/2'}
:param hour: time to run in HH:mm format
:param payload: data to keep in DB for the further restore function usage
"""
job_id = self.__create_id(payload)

try:
# Save job to db
self.sdk.db.insert(
Scheduler.COLLECTION_NAME,
{
'id': job_id,
'trigger_params': trigger_params,
'args': args
}
)

# Run job
self.scheduler.add_job(
callback,
id=job_id,
args=args,
trigger='cron',
replace_existing=True,
**trigger_params
)
self.sdk.db.insert(Scheduler.COLLECTION_NAME, {'chat_id': chat_id,
'hour': hour,
'args': args,
'payload': payload,
})
self.scheduler.add_job(callback,
id=chat_id,
hour=hour,
args=args,
trigger='cron',
replace_existing=True)
except Exception as e:
if self.sdk.hawk:
self.sdk.hawk.catch()
self.sdk.logging.debug("Error: {}".format(e))

def find(self, payload):
def find(self, chat_id):
"""
Return saved scheduler data from DB by chat_id
:param payload: chat and bot
:param chat_id: chat ID
:return: data from db
"""
job_id = self.__create_id(payload)

result = self.sdk.db.find_one(Scheduler.COLLECTION_NAME, {'id': job_id})

result = self.sdk.db.find_one(Scheduler.COLLECTION_NAME, {'chat_id': chat_id})
return result

def remove(self, payload):
def remove(self, chat_id):
"""
Remove saved scheduler data from DB and stop job by chat_id

Example:
self.sdk.scheduler.remove(
payload # Job identifier by chat and bot
)

:param payload: chat and bot
:param chat_id: chat ID
:return: remove result
"""
job_id = self.__create_id(payload)

try:
self.scheduler.remove_job(job_id)
self.scheduler.remove_job(chat_id)
except Exception as e:
if self.sdk.hawk:
self.sdk.hawk.catch()
self.sdk.logging.debug("Error during remove job: {}".format(e))

return self.sdk.db.remove(Scheduler.COLLECTION_NAME, {'id': job_id})

def __create_id(self, payload):
job_id = payload.get('chat')

bot_hash = payload.get('bot', None)

if bot_hash:
job_id = "{}:{}".format(bot_hash, job_id)

return job_id
return self.sdk.db.remove(Scheduler.COLLECTION_NAME, {'chat_id': chat_id})