diff --git a/bot.py b/bot.py index d983f66..107d3c3 100644 --- a/bot.py +++ b/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)