Fix ack issue and changed events to capitals

This commit is contained in:
Kyler Eastridge
2025-08-28 23:30:59 -04:00
parent 7182859344
commit 3a7d8cbfa3
6 changed files with 42 additions and 25 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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:

View File

@@ -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:

View File

@@ -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)

View File

@@ -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.