fix(bot): ApprovalView Hub WS 응답 라우팅 — Discord 승인이 Extension에 전달 안 되는 근본 원인

This commit is contained in:
Variet Worker
2026-03-17 14:53:22 +09:00
parent 50efd52f41
commit 442221e6a3

58
bot.py
View File

@@ -48,9 +48,10 @@ class ApprovalView(discord.ui.View):
"""
def __init__(self, bridge: BridgeProtocol, request: ApprovalRequest,
buttons: list[dict] | None = None):
buttons: list[dict] | None = None, hub=None):
super().__init__(timeout=1800) # 30 minutes
self.bridge = bridge
self.hub = hub # WSHub instance for WS response routing
self.request = request
self.responded = False
self.buttons_data = buttons
@@ -89,13 +90,20 @@ class ApprovalView(discord.ui.View):
ephemeral=True)
return
self.responded = True
self.bridge.write_response(UserResponse(
request_id=self.request.request_id,
approved=not is_reject,
button_index=btn_index,
step_type=getattr(self.request, 'step_type', ''),
project_name=getattr(self.request, 'project_name', ''),
))
response_data = {
"request_id": self.request.request_id,
"approved": not is_reject,
"button_index": btn_index,
"step_type": getattr(self.request, 'step_type', ''),
"project_name": getattr(self.request, 'project_name', ''),
}
# Hub WS route (primary — reaches remote Extensions)
if self.hub:
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))
embed = interaction.message.embeds[0] if interaction.message.embeds else None
if embed:
color = discord.Color.red() if is_reject else discord.Color.green()
@@ -116,11 +124,16 @@ class ApprovalView(discord.ui.View):
await interaction.response.send_message("이미 응답됨", ephemeral=True)
return
self.responded = True
self.bridge.write_response(UserResponse(
request_id=self.request.request_id, approved=True,
step_type=getattr(self.request, 'step_type', ''),
project_name=getattr(self.request, 'project_name', ''),
))
response_data = {
"request_id": self.request.request_id, "approved": True,
"step_type": getattr(self.request, 'step_type', ''),
"project_name": getattr(self.request, 'project_name', ''),
}
if self.hub:
await self.hub.send_response_to_pending_owner(self.request.request_id, {
"type": "response", "data": response_data,
})
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()
@@ -136,11 +149,16 @@ class ApprovalView(discord.ui.View):
await interaction.response.send_message("이미 응답됨", ephemeral=True)
return
self.responded = True
self.bridge.write_response(UserResponse(
request_id=self.request.request_id, approved=False,
step_type=getattr(self.request, 'step_type', ''),
project_name=getattr(self.request, 'project_name', ''),
))
response_data = {
"request_id": self.request.request_id, "approved": False,
"step_type": getattr(self.request, 'step_type', ''),
"project_name": getattr(self.request, 'project_name', ''),
}
if self.hub:
await self.hub.send_response_to_pending_owner(self.request.request_id, {
"type": "response", "data": response_data,
})
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()
@@ -843,7 +861,7 @@ class GravityBot(commands.Bot):
)
embed.set_footer(text=f"ID: {request.request_id}")
view = ApprovalView(self.bridge, request, buttons=buttons)
view = ApprovalView(self.bridge, request, buttons=buttons, hub=self.hub)
msg = await channel.send(embed=embed, view=view)
if pending_file.exists():
@@ -1042,7 +1060,7 @@ class GravityBot(commands.Bot):
)
embed.set_footer(text=f"ID: {request_id}")
view = ApprovalView(self.bridge, request, buttons=buttons)
view = ApprovalView(self.bridge, request, buttons=buttons, hub=self.hub)
msg = await channel.send(embed=embed, view=view)
self._sent_approval_ids.add(request_id)