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