Trabajadores de acciones
This commit is contained in:
44
src/action/questions.py
Normal file
44
src/action/questions.py
Normal 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
112
src/action/reminder.py
Normal 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
|
Reference in New Issue
Block a user