From 3a7d8cbfa3a72b6abbf3c861a2991d7e120a2b1a Mon Sep 17 00:00:00 2001 From: Kyler Eastridge Date: Thu, 28 Aug 2025 23:30:59 -0400 Subject: [PATCH] Fix ack issue and changed events to capitals --- metaverse/bot.py | 12 ++++++------ metaverse/viewer/agent.py | 18 ++++++++++-------- metaverse/viewer/circuit.py | 8 ++++---- metaverse/viewer/eventqueue.py | 2 +- metaverse/viewer/messages.py | 4 ++-- metaverse/viewer/simulator.py | 23 +++++++++++++++++++---- 6 files changed, 42 insertions(+), 25 deletions(-) diff --git a/metaverse/bot.py b/metaverse/bot.py index 6ac2c63..dfe07bd 100644 --- a/metaverse/bot.py +++ b/metaverse/bot.py @@ -15,8 +15,8 @@ class SimpleBot(EventTarget): def __init__(self): super().__init__() self.agent = Viewer.Agent() - self.agent.on("message", self.handleMessage) - self.agent.on("event", self.handleEvent) + self.agent.on("Message", self.handleMessage) + self.agent.on("Event", self.handleEvent) async def handleSystemMessages(self, simulator, message): # We only really care about the parent simulator here @@ -62,7 +62,7 @@ class SimpleBot(EventTarget): self.agentUpdate() elif message.name == "ImprovedInstantMessage": - await self.fire("instantmessage", + await self.fire("InstantMessage", message.MessageBlock.ID, message.AgentData.AgentID, message.MessageBlock.FromAgentName.decode(), @@ -79,7 +79,7 @@ class SimpleBot(EventTarget): im = body["instantmessage"]["message_params"] print("Accepting ChatterBoxInvitation from payload", body) await sim.capabilities["ChatSessionRequest"].acceptInvitation(im["id"]) - await self.fire("instantmessage", + await self.fire("InstantMessage", im["id"], im["from_id"], im["from_name"], @@ -100,11 +100,11 @@ class SimpleBot(EventTarget): async def handleEvent(self, sim, name, body): await self.handleSystemEvent(sim, name, body) - await self.fire("event", sim, name, body, name=name) + await self.fire("Event", sim, name, body, name=name) async def handleMessage(self, simulator, message): await self.handleSystemMessages(simulator, message) - await self.fire("message", simulator, message, name=message.name) + await self.fire("Message", simulator, message, name=message.name) def send(self, message, reliable = False): self.agent.send(message, reliable) diff --git a/metaverse/viewer/agent.py b/metaverse/viewer/agent.py index 6d0ea9c..58e1734 100644 --- a/metaverse/viewer/agent.py +++ b/metaverse/viewer/agent.py @@ -36,8 +36,8 @@ class Agent(EventTarget): logger.debug(f"Setting parent simulator to {sim}") self.simulator = sim - sim.on("message", self.handleMessage) - sim.on("event", self.handleEvent) + sim.on("Message", self.handleMessage) + sim.on("Event", self.handleEvent) return sim def removeSimulator(self, simulator): @@ -63,15 +63,15 @@ class Agent(EventTarget): elif msg.name == "LogoutReply": logger.debug(f"LogoutReply from {sim}") self.removeSimulator(sim) - await self.fire("logout") + await self.fire("Logout") elif msg.name == "KickUser": logger.debug(f"KickUser from {sim}") self.removeSimulator(sim) - await self.fire("kicked") - await self.fire("logout") + await self.fire("Kicked") + await self.fire("Logout") - await self.fire("message", sim, msg) + await self.fire("Message", sim, msg) async def handleEvent(self, sim, name, body): logger.debug(f"EventQueue \"{name}\" from {sim}") @@ -131,7 +131,7 @@ class Agent(EventTarget): else: logger.warning(f"Received EstablishAgentCommunication for unknown host {host}") - await self.fire("event", sim, name, body) + await self.fire("Event", sim, name, body) async def login(self, login): if login["login"] == "false": @@ -171,11 +171,13 @@ class Agent(EventTarget): for simulator in self.simulators: if not await simulator.ping(): self.removeSimulator(simulator) + else: + await simulator.sendAcks() if not self.simulator: break - await asyncio.sleep(0.1) + await asyncio.sleep(1) except asyncio.exceptions.CancelledError as e: # Attempt to gracefully logout diff --git a/metaverse/viewer/circuit.py b/metaverse/viewer/circuit.py index 821eb2e..8923f93 100644 --- a/metaverse/viewer/circuit.py +++ b/metaverse/viewer/circuit.py @@ -32,17 +32,17 @@ class Circuit(asyncio.Protocol, EventTarget): if pkt.flags & pkt.FLAGS.ACK: self.acknowledge(pkt.acks) - asyncio.create_task(self.fire("message", addr, pkt.body)) + asyncio.create_task(self.fire("Message", addr, pkt.body)) def error_received(self, exc): - asyncio.create_task(self.fire("error", exc)) + asyncio.create_task(self.fire("Error", exc)) def connection_lost(self, exc): if not self.transport: return self.transport = None - asyncio.create_task(self.fire("close", exc)) + asyncio.create_task(self.fire("Close", exc)) def close(self): if not self.transport: @@ -50,7 +50,7 @@ class Circuit(asyncio.Protocol, EventTarget): self.transport.close() self.transport = None - asyncio.create_task(self.fire("close", None)) + asyncio.create_task(self.fire("Close", None)) def send(self, message, reliable = False): if not self.transport: diff --git a/metaverse/viewer/eventqueue.py b/metaverse/viewer/eventqueue.py index ad6e19a..6138d72 100644 --- a/metaverse/viewer/eventqueue.py +++ b/metaverse/viewer/eventqueue.py @@ -9,7 +9,7 @@ class EventQueue(EventTarget): self.task = None async def handleEvent(self, event): - await self.fire("event", event["message"], event["body"]) + await self.fire("Event", event["message"], event["body"]) async def run(self): while True: diff --git a/metaverse/viewer/messages.py b/metaverse/viewer/messages.py index 811f543..257c63f 100644 --- a/metaverse/viewer/messages.py +++ b/metaverse/viewer/messages.py @@ -335,8 +335,8 @@ class BlockArray(Block): yield self[i] def toStream(self, handle): - if self.count != None: - handle.write(sUInt8.pack(self.count)) + if self.count == None: + handle.write(sUInt8.pack(len(self))) for i in range(self.count or len(self.blocks)): self[i].toStream(handle) diff --git a/metaverse/viewer/simulator.py b/metaverse/viewer/simulator.py index 8fc9752..9477363 100644 --- a/metaverse/viewer/simulator.py +++ b/metaverse/viewer/simulator.py @@ -28,7 +28,7 @@ class Simulator(EventTarget): self.pingSequence = 0 self.pendingPings = {} self.eventQueue = eventqueue.EventQueue(self) - self.eventQueue.on("event", self.handleEvent) + self.eventQueue.on("Event", self.handleEvent) self.messageTemplate = messages.getDefaultTemplate() def __del__(self): @@ -43,7 +43,7 @@ class Simulator(EventTarget): async def connect(self, host, circuitCode): self.host = host self.circuit = await Circuit.create(host) - self.circuit.on("message", self.handleMessage) + self.circuit.on("Message", self.handleMessage) msg = self.messageTemplate.getMessage("UseCircuitCode") msg.CircuitCode.Code = circuitCode @@ -97,13 +97,13 @@ class Simulator(EventTarget): # Don't break the whole script! try: - await self.fire("message", self, msg, name=msg.name) + await self.fire("Message", self, msg, name=msg.name) except Exception as e: traceback.print_exc() async def handleEvent(self, name, body): try: - await self.fire("event", self, name, body) + await self.fire("Event", self, name, body) except Exception as e: traceback.print_exc() @@ -115,6 +115,21 @@ class Simulator(EventTarget): self.capabilities = await seed.getCapabilities(Capabilities) self.eventQueue.start() + async def sendAcks(self): + if len(self.circuit.acks) == 0: + return False + + msg = self.messageTemplate.getMessage("PacketAck") + for i in range(255): + if len(self.circuit.acks) > 0: + msg.Packets[i].ID = self.circuit.acks.pop(0) + else: + break + + self.send(msg) + return len(self.circuit.acks) > 0 + + async def ping(self, timeout = 5.0, forceUsePingCheck = False): # If we already have a message within the timeout range, # just use that instead. Unless specified otherwise.