Trabajadores de acciones

This commit is contained in:
2020-11-02 00:58:23 -03:00
parent 7fc616ab3a
commit 3c5d3d5c52
2 changed files with 156 additions and 0 deletions

44
src/action/questions.py Normal file
View File

@ -0,0 +1,44 @@
import os
from threading import Thread
import queue
import json
class QuestionWorker(Thread):
def __init__(self, params, configs):
super(QuestionWorker, self).__init__()
self.queue = params['queues']['questions']
self.logging = params['logging']
self.logger = params['queues']['log']
self.event = params['events']['stop']
self.wait = configs.get('supervisor.wait')
self.folder = params['folders']['data']
def question(self, text):
filename = os.path.join(self.folder, 'questions.json')
with open(filename, 'w+', encoding='utf8') as f:
try:
data = json.load(f)
except json.decoder.JSONDecodeError:
data = []
if text in data:
return
data.append(text)
json.dump(data, f, ensure_ascii=False, indent=4)
self.logging.log(text, type(self))
def run(self):
self.logging.log('Starting', type(self))
self.logger.put({'action': type(self)})
while not self.event.is_set():
try:
question = self.queue.get(timeout=self.wait)
if question.type == 'email':
self.question(
'¿Que hago con este correo de {0} y el texto dice {1} en la fecha {2}?'.
format(question.sender, question.text, question.datetime.strftime('%d-%m-%Y %H:%M:%S'))
)
except queue.Empty:
pass
self.logging.log('Exiting', type(self))
return

112
src/action/reminder.py Normal file
View File

@ -0,0 +1,112 @@
import datetime
import queue
from threading import Thread
import os
import json
import time
class Reminder:
def __init__(self, timezone):
self.datetime = 0
self.message = ''
self.recursive = False
self.last = 0
self.repeats = 0
self.tz = timezone
def should_remind(self):
now = datetime.datetime.now(tz=self.tz)
event = self.get_remind_time()
dif = event - now
if dif.days * 24 * 60 * 60 + dif.seconds == 0:
return True
return False
def get_remind_time(self):
if self.recursive:
event = self.last + self.datetime
return event
return self.datetime
def remind(self):
# Do remind
if self.recursive:
self.last = datetime.datetime.now(tz=self.tz)
self.repeats -= 1
class RemindRegisterWorker(Thread):
def __init__(self, params, configs):
super().__init__()
self.event = params['events']['stop']
self.queue = params['queues']['reminders']
self.lock = params['locks']['reminders']
self.folder = params['folders']['data']
self.logging = params['logging']
self.wait = configs.get('supervisor.wait')
def add_reminder(self, reminder):
self.lock.acquire()
filename = os.path.join(self.folder, 'reminders.json')
with open(filename, 'w+') as f:
reminders = json.load(f)
reminders.append(reminder)
json.dump(reminders, f)
self.lock.release()
def run(self):
self.logging.log('Starting', caller=type(self))
while not self.event.is_set():
self.logging.log('Looping status {0}'.format(not self.event.is_set()),
caller=type(self))
try:
reminder = self.queue.get(timeout=self.wait)
self.add_reminder(reminder)
except queue.Empty:
pass
self.logging.log('Exiting', caller=type(self))
return
class ReminderWorker(Thread):
def __init__(self, params, configs):
super().__init__()
self.event = params['events']['stop']
self.folder = params['folders']['data']
self.lock = params['locks']['reminders']
self.logging = params['logging']
self.wait = configs.get('supervisor.wait')
self.tz = configs.get('timezone')
def check_reminders(self):
self.lock.acquire()
filename = os.path.join(self.folder, 'reminders.json')
if not os.path.isfile(filename):
self.lock.release()
return
with open(filename, 'w+') as f:
reminders = json.load(f)
new_reminders = []
for r in reminders:
reminder = Reminder(self.tz)
for k, val in r.items():
setattr(reminder, k, val)
if reminder.should_remind():
reminder.remind()
if reminder.recursive and reminder.repeats > 0:
new_reminders.append(reminder)
else:
new_reminders.append(reminder)
json.dump(new_reminders, f)
self.lock.release()
def run(self):
self.logging.log('Starting', caller=type(self))
while not self.event.is_set():
self.logging.log('Looping status {0}'.format(not self.event.is_set()),
caller=type(self))
self.check_reminders()
time.sleep(self.wait)
self.logging.log('Exiting', caller=type(self))
return