import logging from logging.config import dictConfig from typing import Optional, Callable from Crypto.PublicKey.ECC import EccKey from SantaExchange.Message import Message from SantaExchange.MessageHandler import MessageHandler from SantaExchange.SantasBrain import Brain from SantaExchange.UserInterface import UserInterface logging_function: Optional[Callable[[str], None]] = None class ExchangeLogger(logging.Handler): def emit(self, record: logging.LogRecord): if logging_function is not None: logging_function(record.message) LOGGING_SETTINGS = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'std_formatter': {'format': '%(message)s'} }, 'handlers': { 'stdhandler': { 'class': 'logging.StreamHandler', 'formatter': 'std_formatter', 'stream': 'ext://sys.stdout' }, 'ExchangeLogger': { 'class': f'{__name__}.ExchangeLogger', 'formatter': 'std_formatter', 'level': 'INFO' } }, 'loggers': { 'root': { 'handlers': ['stdhandler', 'ExchangeLogger'], 'level': 'NOTSET', 'propagate': True } } } dictConfig(LOGGING_SETTINGS) class ExchangeClient(MessageHandler, UserInterface): def __init__(self, send_message_function, receive_user_function, announce_recipient_function): MessageHandler.__init__(self) UserInterface.__init__(self) self.send_message_function = send_message_function self.receive_user_function = receive_user_function self.announce_recipient_function = announce_recipient_function self.brain = Brain(self, self) def send_message(self, message: Message, signing_key: EccKey): message_string = message.generate_and_sign(signing_key) self.send_message_function(message_string) def receive_user(self, name: str): self.receive_user_function(name) def announce_recipient(self, name: str, other_info: str): self.announce_recipient_function(name, other_info)