from time import sleep from queue import Queue from threading import Thread class MessageQueueHandler: keys = ['message.queue'] type_id = 'ControlEventHandler' def __init__(self, wpm): self.connector = None self.wpm = wpm self._queue = Queue() self._thread = Thread(target=self._dispatch_messages) def _dispatch_messages(self): for message in iter(self._queue.get, None): wpm = message['wpm'] if 'wpm' in message else self.wpm cps = 5 * wpm / 60 message['typing'] = not self._queue.empty() self.connector.send_message(message) sleep(len(message['message']) / cps) def handle_event(self, message, _): for unpacked in self._generate_messages_from_queue(message): self._queue.put(unpacked) @staticmethod def _generate_messages_from_queue(queue_message): for message in queue_message['messages']: yield { 'key': 'message.send', **message } def start(self): self._thread.start() def cleanup(self): self._queue.queue.clear() self._queue.put(None) self._thread.join()