fix: переработка методов NetworkController
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
import logging
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
import paho.mqtt.client as mqtt
|
import paho.mqtt.client as mqtt
|
||||||
from paho.mqtt.enums import CallbackAPIVersion
|
from paho.mqtt.enums import CallbackAPIVersion
|
||||||
|
|
||||||
@@ -5,6 +8,8 @@ from ..state_machines.session.events import SessionEvent
|
|||||||
from ..state_machines.session.machine import SessionStateMachine
|
from ..state_machines.session.machine import SessionStateMachine
|
||||||
from .message import EventMapper, NetworkMessage, SessionMessageKind
|
from .message import EventMapper, NetworkMessage, SessionMessageKind
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class NetworkController:
|
class NetworkController:
|
||||||
def __init__(
|
def __init__(
|
||||||
@@ -26,10 +31,6 @@ class NetworkController:
|
|||||||
|
|
||||||
self._client = mqtt.Client(CallbackAPIVersion.VERSION2)
|
self._client = mqtt.Client(CallbackAPIVersion.VERSION2)
|
||||||
self._client.username_pw_set(username, password)
|
self._client.username_pw_set(username, password)
|
||||||
self._client.connect(host, port)
|
|
||||||
|
|
||||||
self._client.subscribe(self._lobby_topic)
|
|
||||||
self._client.subscribe(self._session_topic)
|
|
||||||
|
|
||||||
self._client.message_callback_add(
|
self._client.message_callback_add(
|
||||||
self._lobby_topic, self._on_lobby_message
|
self._lobby_topic, self._on_lobby_message
|
||||||
@@ -38,6 +39,11 @@ class NetworkController:
|
|||||||
self._session_topic, self._on_session_message
|
self._session_topic, self._on_session_message
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._client.connect(host, port)
|
||||||
|
|
||||||
|
self._client.subscribe(self._lobby_topic)
|
||||||
|
self._client.subscribe(self._session_topic)
|
||||||
|
|
||||||
def start(self) -> None:
|
def start(self) -> None:
|
||||||
self._client.loop_start()
|
self._client.loop_start()
|
||||||
|
|
||||||
@@ -47,12 +53,12 @@ class NetworkController:
|
|||||||
|
|
||||||
def send(self, network_message: NetworkMessage) -> None:
|
def send(self, network_message: NetworkMessage) -> None:
|
||||||
match network_message.kind:
|
match network_message.kind:
|
||||||
case SessionMessageKind:
|
case SessionMessageKind():
|
||||||
self._client.publish(
|
self._client.publish(
|
||||||
self._session_topic, network_message.to_json()
|
self._session_topic, network_message.to_json()
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_with_looback(
|
def send_with_loopback(
|
||||||
self,
|
self,
|
||||||
local_message: NetworkMessage,
|
local_message: NetworkMessage,
|
||||||
network_message: NetworkMessage,
|
network_message: NetworkMessage,
|
||||||
@@ -60,39 +66,45 @@ class NetworkController:
|
|||||||
if local_message.id != network_message.id:
|
if local_message.id != network_message.id:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Mismatched message IDs in send_with_loopback: "
|
f"Mismatched message IDs in send_with_loopback: "
|
||||||
f"local_message.id='{local_message.id}' vs network_message.id='{network_message.id}'"
|
f"local_message.id='{local_message.id}'"
|
||||||
|
f"vs network_message.id='{network_message.id}'"
|
||||||
)
|
)
|
||||||
|
|
||||||
self._pending_loopbacks[local_message.id] = local_message
|
self._pending_loopbacks[local_message.id] = local_message
|
||||||
self.send(network_message)
|
self.send(network_message)
|
||||||
|
|
||||||
def _check_loopbacks(self, id: str) -> NetworkMessage | None:
|
def _pop_loopback(self, message_id: str) -> Optional[NetworkMessage]:
|
||||||
if id in self._pending_loopbacks:
|
return self._pending_loopbacks.pop(message_id, None)
|
||||||
return self._pending_loopbacks.pop(id)
|
|
||||||
|
def _parse_incoming_message(
|
||||||
|
self, message: mqtt.MQTTMessage
|
||||||
|
) -> Optional[NetworkMessage]:
|
||||||
|
try:
|
||||||
|
json_str = message.payload.decode()
|
||||||
|
network_message = NetworkMessage.from_json(json_str)
|
||||||
|
except Exception as err:
|
||||||
|
logger.error("Failed to parse incoming MQTT message: %s", err)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
loopback_message = self._pop_loopback(network_message.id)
|
||||||
|
return loopback_message or network_message
|
||||||
|
|
||||||
def _on_lobby_message(
|
def _on_lobby_message(
|
||||||
self, client: mqtt.Client, userdata: None, message: mqtt.MQTTMessage
|
self, client: mqtt.Client, userdata: None, message: mqtt.MQTTMessage
|
||||||
) -> None:
|
) -> None:
|
||||||
json_str = message.payload.decode()
|
network_message = self._parse_incoming_message(message)
|
||||||
network_message = NetworkMessage.from_json(json_str)
|
if network_message is None:
|
||||||
|
return
|
||||||
loopback_message = self._check_loopbacks(network_message.id)
|
|
||||||
if loopback_message:
|
|
||||||
network_message = loopback_message
|
|
||||||
|
|
||||||
event = EventMapper.from_message(network_message)
|
event = EventMapper.from_message(network_message)
|
||||||
|
# if isinstance(event, LobbyEvent):
|
||||||
|
# self._lobby.process(event)
|
||||||
|
|
||||||
def _on_session_message(
|
def _on_session_message(
|
||||||
self, client: mqtt.Client, userdata: None, message: mqtt.MQTTMessage
|
self, client: mqtt.Client, userdata: None, message: mqtt.MQTTMessage
|
||||||
) -> None:
|
) -> None:
|
||||||
json_str = message.payload.decode()
|
network_message = self._parse_incoming_message(message)
|
||||||
network_message = NetworkMessage.from_json(json_str)
|
if network_message is None:
|
||||||
|
return
|
||||||
loopback_message = self._check_loopbacks(network_message.id)
|
|
||||||
if loopback_message:
|
|
||||||
network_message = loopback_message
|
|
||||||
|
|
||||||
event = EventMapper.from_message(network_message)
|
event = EventMapper.from_message(network_message)
|
||||||
if isinstance(event, SessionEvent):
|
if isinstance(event, SessionEvent):
|
||||||
self._session.process(event)
|
self._session.process(event)
|
||||||
|
|||||||
Reference in New Issue
Block a user