From 3c5d3d5c526d99b742dca6943cc0f89e987abffb Mon Sep 17 00:00:00 2001 From: Aldarien Date: Mon, 2 Nov 2020 00:58:23 -0300 Subject: [PATCH] Trabajadores de acciones --- src/action/questions.py | 44 ++++++++++++++++ src/action/reminder.py | 112 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 src/action/questions.py create mode 100644 src/action/reminder.py diff --git a/src/action/questions.py b/src/action/questions.py new file mode 100644 index 0000000..c03f9e4 --- /dev/null +++ b/src/action/questions.py @@ -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 diff --git a/src/action/reminder.py b/src/action/reminder.py new file mode 100644 index 0000000..4775c12 --- /dev/null +++ b/src/action/reminder.py @@ -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