fix(bot): ApprovalView Hub WS 응답 라우팅 — Discord 승인이 Extension에 전달 안 되는 근본 원인
This commit is contained in:
58
bot.py
58
bot.py
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user