71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
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)
|