This commit is contained in:
REDNBLACK 2016-11-12 17:53:18 +03:00
parent 4d2cbbc063
commit f6356c1895
9 changed files with 60 additions and 14 deletions

View File

@ -2,7 +2,6 @@ from orator.migrations import Migration
class CreateChatsTable(Migration):
def up(self):
"""
Run the migrations.

View File

@ -2,7 +2,6 @@ from orator.migrations import Migration
class CreateWordsTable(Migration):
def up(self):
"""
Run the migrations.

View File

@ -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):
"""

View File

@ -2,7 +2,6 @@ from orator.migrations import Migration
class CreateRepliesTable(Migration):
def up(self):
"""
Run the migrations.

View File

@ -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')

View File

@ -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()

View File

@ -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):

13
src/entity/job.py Normal file
View File

@ -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

View File

@ -12,6 +12,7 @@ from src import config
class Pair(Model):
__guarded__ = ['id']
__timestamps__ = ['created_at']
@has_many
def replies(self):