fix(bot,extension): prevent dual delivery of commands and responses via WS+file

This commit is contained in:
Variet Worker
2026-03-17 20:30:37 +09:00
parent 6640d42449
commit 302d21d35c
2 changed files with 19 additions and 47 deletions

21
bot.py
View File

@@ -102,8 +102,9 @@ class ApprovalView(discord.ui.View):
await self.hub.send_response_to_pending_owner(self.request.request_id, {
"type": "response", "data": response_data,
})
# File bridge (fallback — local Extensions)
self.bridge.write_response(UserResponse(**response_data))
else:
# File bridge (fallback — only when Hub is unavailable)
self.bridge.write_response(UserResponse(**response_data))
embed = interaction.message.embeds[0] if interaction.message.embeds else None
if embed:
color = discord.Color.red() if is_reject else discord.Color.green()
@@ -133,7 +134,8 @@ class ApprovalView(discord.ui.View):
await self.hub.send_response_to_pending_owner(self.request.request_id, {
"type": "response", "data": response_data,
})
self.bridge.write_response(UserResponse(**response_data))
else:
self.bridge.write_response(UserResponse(**response_data))
embed = interaction.message.embeds[0] if interaction.message.embeds else None
if embed:
embed.color = discord.Color.green()
@@ -158,7 +160,8 @@ class ApprovalView(discord.ui.View):
await self.hub.send_response_to_pending_owner(self.request.request_id, {
"type": "response", "data": response_data,
})
self.bridge.write_response(UserResponse(**response_data))
else:
self.bridge.write_response(UserResponse(**response_data))
embed = interaction.message.embeds[0] if interaction.message.embeds else None
if embed:
embed.color = discord.Color.red()
@@ -213,7 +216,10 @@ class GravityBot(commands.Bot):
def _write_command(self, project: str, text: str, *,
target_instance: int | None = None, **kwargs):
"""Write command to bridge AND push to gateway/hub.
"""Write command to Extension via Hub WS (primary) or file bridge (fallback).
When Hub is connected, ONLY use WS to prevent duplicate delivery.
File bridge + Gateway are legacy fallbacks for when Hub is unavailable.
Args:
target_instance: If set, send only to this instance number (via Hub).
@@ -224,7 +230,7 @@ class GravityBot(commands.Bot):
"project_name": kwargs.get('project_name', project),
}
# Hub route (preferred if available)
# Hub route (primary — skip file bridge to prevent double delivery)
if self.hub:
import time as _time
cmd_data["id"] = str(int(_time.time() * 1000))
@@ -237,8 +243,9 @@ class GravityBot(commands.Bot):
asyncio.create_task(
self.hub.broadcast_to_project(project, msg)
)
return # ← WS sent, skip file bridge
# Legacy routes (file bridge + gateway HTTP)
# Legacy fallback (file bridge + gateway HTTP) — only when Hub is unavailable
self.bridge.write_command(project, text, **kwargs)
if self.gateway:
import time as _time