mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-11-04 10:22:56 +00:00 
			
		
		
		
	Simplify package structure
This commit is contained in:
		
							
								
								
									
										2
									
								
								tfw/components/frontend/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tfw/components/frontend/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
from .frontend_handler import FrontendHandler
 | 
			
		||||
from .message_sender import MessageSender
 | 
			
		||||
							
								
								
									
										25
									
								
								tfw/components/frontend/frontend_handler.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tfw/components/frontend/frontend_handler.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
from tfw.internals.networking import Scope
 | 
			
		||||
 | 
			
		||||
from .message_storage import FrontendMessageStorage
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FrontendHandler:
 | 
			
		||||
    keys = ['message', 'queueMessages', 'dashboard', 'console']
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.server_connector = None
 | 
			
		||||
        self.keys = [*type(self).keys, 'recover']
 | 
			
		||||
        self._frontend_message_storage = FrontendMessageStorage(type(self).keys)
 | 
			
		||||
 | 
			
		||||
    def send_message(self, message):
 | 
			
		||||
        self.server_connector.send_message(message, scope=Scope.WEBSOCKET)
 | 
			
		||||
 | 
			
		||||
    def handle_event(self, message, _):
 | 
			
		||||
        self._frontend_message_storage.save_message(message)
 | 
			
		||||
        if message['key'] == 'recover':
 | 
			
		||||
            self.recover_frontend()
 | 
			
		||||
        self.send_message(message)
 | 
			
		||||
 | 
			
		||||
    def recover_frontend(self):
 | 
			
		||||
        for message in self._frontend_message_storage.messages:
 | 
			
		||||
            self.send_message(message)
 | 
			
		||||
							
								
								
									
										48
									
								
								tfw/components/frontend/message_sender.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								tfw/components/frontend/message_sender.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
class MessageSender:
 | 
			
		||||
    """
 | 
			
		||||
    Provides mechanisms to send messages to our frontend messaging component.
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, uplink):
 | 
			
		||||
        self.uplink = uplink
 | 
			
		||||
        self.key = 'message'
 | 
			
		||||
        self.queue_key = 'queueMessages'
 | 
			
		||||
 | 
			
		||||
    def send(self, originator, message):
 | 
			
		||||
        """
 | 
			
		||||
        Sends a message.
 | 
			
		||||
        :param originator: name of sender to be displayed on the frontend
 | 
			
		||||
        :param message: message to send
 | 
			
		||||
        """
 | 
			
		||||
        message = {
 | 
			
		||||
            'key': self.key,
 | 
			
		||||
            'data': {
 | 
			
		||||
                'originator': originator,
 | 
			
		||||
                'message': message
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        self.uplink.send_message(message)
 | 
			
		||||
 | 
			
		||||
    def queue_messages(self, originator, messages):
 | 
			
		||||
        """
 | 
			
		||||
        Queues a list of messages to be displayed in a chatbot-like manner.
 | 
			
		||||
        :param originator: name of sender to be displayed on the frontend
 | 
			
		||||
        :param messages: list of messages to queue
 | 
			
		||||
        """
 | 
			
		||||
        message = {
 | 
			
		||||
            'key': self.queue_key,
 | 
			
		||||
            'data': {
 | 
			
		||||
                'messages': [
 | 
			
		||||
                    {'message': message, 'originator': originator}
 | 
			
		||||
                    for message in messages
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        self.uplink.send_message(message)
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def generate_messages_from_queue(queue_message):
 | 
			
		||||
        for message in queue_message['data']['messages']:
 | 
			
		||||
            yield {
 | 
			
		||||
                'key': 'message',
 | 
			
		||||
                'data': message
 | 
			
		||||
            }
 | 
			
		||||
							
								
								
									
										44
									
								
								tfw/components/frontend/message_storage.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tfw/components/frontend/message_storage.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
from abc import ABC, abstractmethod
 | 
			
		||||
from contextlib import suppress
 | 
			
		||||
 | 
			
		||||
from .message_sender import MessageSender
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MessageStorage(ABC):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self._messages = []
 | 
			
		||||
 | 
			
		||||
    def save_message(self, message):
 | 
			
		||||
        with suppress(KeyError, AttributeError):
 | 
			
		||||
            if self._filter_message(message):
 | 
			
		||||
                self._messages.extend(self._transform_message(message))
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def _filter_message(self, message):
 | 
			
		||||
        raise NotImplementedError
 | 
			
		||||
 | 
			
		||||
    def _transform_message(self, message):   # pylint: disable=no-self-use
 | 
			
		||||
        yield message
 | 
			
		||||
 | 
			
		||||
    def clear(self):
 | 
			
		||||
        self._messages.clear()
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def messages(self):
 | 
			
		||||
        yield from self._messages
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FrontendMessageStorage(MessageStorage):
 | 
			
		||||
    def __init__(self, keys):
 | 
			
		||||
        self._keys = keys
 | 
			
		||||
        super().__init__()
 | 
			
		||||
 | 
			
		||||
    def _filter_message(self, message):
 | 
			
		||||
        key = message['key']
 | 
			
		||||
        return key in self._keys
 | 
			
		||||
 | 
			
		||||
    def _transform_message(self, message):
 | 
			
		||||
        if message['key'] == 'queueMessages':
 | 
			
		||||
            yield from MessageSender.generate_messages_from_queue(message)
 | 
			
		||||
        else:
 | 
			
		||||
            yield message
 | 
			
		||||
		Reference in New Issue
	
	Block a user