Verified Commit 56da4172 authored by Jakob Moser's avatar Jakob Moser
Browse files

Implement receiving and handling message in director

parent 198e4c82
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -5,6 +5,10 @@ from time import monotonic, sleep
from poolpay import db
from poolpay.display.Display import Display
from poolpay.model.Card import Card
from poolpay.model.MessageReceipt import MessageReceipt
from poolpay.model.messages.Message import Message
from poolpay.model.messages.UpdateBalanceMessage import UpdateBalanceMessage
from poolpay.model.Person import Person
from poolpay.price.constants import DRINK
from poolpay.ui.Play import Play
from poolpay.ui.scenes.Scene import Scene
@@ -172,3 +176,36 @@ class Director:
            person_name=card.owner.name,
        ).present()
        logging.debug("Presented Balance scene")

    def message_received(self, message: Message) -> None:
        if (receipt := MessageReceipt.get_only(message.uuid)) and receipt.successful:
            logging.info(
                f"Successfully previously received message {message.uuid}, doing nothing."
            )
            return

        successful = False
        try:
            successful = self._handle_message(message)
        finally:
            db.session.add(MessageReceipt(uuid=message.uuid, successful=successful))
            db.session.commit()

    def _handle_message(self, message: Message) -> bool:
        """
        Act upon the given message, and return if that was successful.
        """
        match message:
            case UpdateBalanceMessage(_, by_amount_cents, person_full_name):
                person = Person.get_by_full_name(person_full_name)

                if not person:
                    # Could not reliably guess a person given the full name
                    return False

                person.deposit(by_amount_cents)
                return True
            case _:
                logging.info(f"Did not handle unknown message of f{type(message)}")

        return False