Finished #5
This commit is contained in:
parent
4d2cbbc063
commit
f6356c1895
|
@ -2,7 +2,6 @@ from orator.migrations import Migration
|
|||
|
||||
|
||||
class CreateChatsTable(Migration):
|
||||
|
||||
def up(self):
|
||||
"""
|
||||
Run the migrations.
|
||||
|
|
|
@ -2,7 +2,6 @@ from orator.migrations import Migration
|
|||
|
||||
|
||||
class CreateWordsTable(Migration):
|
||||
|
||||
def up(self):
|
||||
"""
|
||||
Run the migrations.
|
||||
|
|
|
@ -2,7 +2,6 @@ from orator.migrations import Migration
|
|||
|
||||
|
||||
class CreatePairsTable(Migration):
|
||||
|
||||
def up(self):
|
||||
"""
|
||||
Run the migrations.
|
||||
|
@ -16,7 +15,7 @@ class CreatePairsTable(Migration):
|
|||
# ['chat_id', 'first_id', 'second_id'],
|
||||
# name='unique_pairs_idx'
|
||||
# )
|
||||
table.timestamps()
|
||||
table.timestamp('created_at').default('CURRENT_TIMESTAMP')
|
||||
|
||||
def down(self):
|
||||
"""
|
||||
|
|
|
@ -2,7 +2,6 @@ from orator.migrations import Migration
|
|||
|
||||
|
||||
class CreateRepliesTable(Migration):
|
||||
|
||||
def up(self):
|
||||
"""
|
||||
Run the migrations.
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
from orator.migrations import Migration
|
||||
|
||||
|
||||
class CreateJobsTable(Migration):
|
||||
def up(self):
|
||||
"""
|
||||
Run the migrations.
|
||||
"""
|
||||
with self.schema.create('jobs') as table:
|
||||
table.increments('id')
|
||||
table.integer('chat_id')
|
||||
table.string('type')
|
||||
table.boolean('repeat')
|
||||
table.timestamp('execute_at')
|
||||
|
||||
def down(self):
|
||||
"""
|
||||
Revert the migrations.
|
||||
"""
|
||||
self.schema.drop('jobs')
|
|
@ -1,7 +1,9 @@
|
|||
import logging
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from telegram.ext import Job
|
||||
from src.entity.chat import Chat
|
||||
from src.entity.job import Job as JobEntity
|
||||
from src import config
|
||||
|
||||
|
||||
|
@ -9,27 +11,38 @@ class ChatPurgeQueue:
|
|||
queue = None
|
||||
jobs = {}
|
||||
default_interval = float(config['bot']['default_interval'])
|
||||
job_type = 'purge'
|
||||
|
||||
# TODO. Должно взять все задачи из таблицы и проинициализировать их
|
||||
def __init__(self, queue):
|
||||
self.queue = queue
|
||||
existing_jobs = JobEntity.where('type', self.job_type).get().all()
|
||||
|
||||
for job in existing_jobs:
|
||||
current_datetime = datetime.now()
|
||||
if current_datetime >= job.execute_at:
|
||||
interval = 60
|
||||
else:
|
||||
interval = (job.execute_at - current_datetime).total_seconds()
|
||||
|
||||
self.add(chat_id=job.chat_id, interval=interval)
|
||||
|
||||
def add(self, chat_id, interval=default_interval):
|
||||
if self.queue is None:
|
||||
logging.error("Queue is not set!")
|
||||
return
|
||||
scheduled_at = datetime.now() + timedelta(seconds=interval)
|
||||
|
||||
logging.info("Added chat #%d to purge queue, with interval %d" %
|
||||
(chat_id, interval))
|
||||
logging.info("Added chat #%d to purge queue, scheduled to run at %s" %
|
||||
(chat_id, scheduled_at))
|
||||
|
||||
job = self.__make_purge_job(chat_id, interval)
|
||||
self.jobs[chat_id] = job
|
||||
self.queue.put(job)
|
||||
|
||||
JobEntity.create(chat_id=chat_id,
|
||||
type=self.job_type,
|
||||
repeat=False,
|
||||
execute_at=scheduled_at)
|
||||
|
||||
def remove(self, chat_id):
|
||||
if self.queue is None:
|
||||
logging.error("Queue is not set!")
|
||||
return
|
||||
if chat_id not in self.jobs:
|
||||
return
|
||||
|
||||
|
@ -37,6 +50,7 @@ class ChatPurgeQueue:
|
|||
|
||||
job = self.jobs.pop(chat_id)
|
||||
job.schedule_removal()
|
||||
JobEntity.where('chat_id', chat_id).where('type', self.job_type).delete()
|
||||
|
||||
def __make_purge_job(self, chat_id, interval=default_interval):
|
||||
return Job(self.__purge_callback, interval, repeat=False, context=chat_id)
|
||||
|
@ -49,3 +63,5 @@ class ChatPurgeQueue:
|
|||
if chat is not None:
|
||||
chat.pairs().delete()
|
||||
chat.delete()
|
||||
|
||||
JobEntity.where('chat_id', chat_id).where('type', self.job_type).delete()
|
||||
|
|
|
@ -7,7 +7,7 @@ import src.entity.pair
|
|||
|
||||
|
||||
class Chat(Model):
|
||||
__guarded__ = ['id']
|
||||
__fillable__ = ['telegram_id', 'chat_type', 'random_chance']
|
||||
|
||||
@has_many
|
||||
def pairs(self):
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
from orator.orm import Model
|
||||
from orator.orm import belongs_to
|
||||
|
||||
import src.entity.chat
|
||||
|
||||
|
||||
class Job(Model):
|
||||
__fillable__ = ['chat_id', 'type', 'repeat', 'execute_at']
|
||||
__timestamps__ = False
|
||||
|
||||
@belongs_to
|
||||
def chat(self):
|
||||
return src.entity.chat.Chat
|
|
@ -12,6 +12,7 @@ from src import config
|
|||
|
||||
class Pair(Model):
|
||||
__guarded__ = ['id']
|
||||
__timestamps__ = ['created_at']
|
||||
|
||||
@has_many
|
||||
def replies(self):
|
||||
|
|
Loading…
Reference in New Issue