perf(bridge): 3 optimizations — pollResponseGroup 1500ms, renderer adaptive idle, Bot single-pass scanner
This commit is contained in:
108
bot.py
108
bot.py
@@ -611,12 +611,14 @@ class GravityBot(commands.Bot):
|
||||
self._sent_commands[req.request_id] = req.command
|
||||
await self._send_approval_request(channel, req)
|
||||
|
||||
# ── Check for auto_resolved pendings (approved directly in AG) ──
|
||||
# ── Single-pass: handle auto_resolved, expired, and MERGE in one glob ──
|
||||
for f in self.bridge.pending_dir.glob("*.json"):
|
||||
try:
|
||||
data = json.loads(f.read_text(encoding="utf-8-sig"))
|
||||
if data.get("status") == "auto_resolved":
|
||||
rid = data.get("request_id", "")
|
||||
status = data.get("status", "pending")
|
||||
rid = data.get("request_id", "")
|
||||
|
||||
if status == "auto_resolved":
|
||||
# FIX #5: Use _approval_messages as fallback when discord_message_id is 0
|
||||
msg_id = data.get("discord_message_id", 0) or self._approval_messages.get(rid, 0)
|
||||
project = data.get("project_name", Config.PROJECT_NAME)
|
||||
@@ -630,25 +632,18 @@ class GravityBot(commands.Bot):
|
||||
description=f"```\n{data.get('command', '')[:500]}\n```",
|
||||
color=discord.Color.green(),
|
||||
)
|
||||
embed.set_footer(text=f"ID: {data.get('request_id', '')}")
|
||||
embed.set_footer(text=f"ID: {rid}")
|
||||
await msg.edit(embed=embed, view=None)
|
||||
except discord.NotFound:
|
||||
pass
|
||||
f.unlink()
|
||||
self._deferred_ids.pop(data.get("request_id", ""), None)
|
||||
self._sent_commands.pop(data.get("request_id", ""), None)
|
||||
self._approval_messages.pop(data.get("request_id", ""), None)
|
||||
self._sent_approval_ids.discard(data.get("request_id", ""))
|
||||
except (json.JSONDecodeError, OSError):
|
||||
pass
|
||||
self._deferred_ids.pop(rid, None)
|
||||
self._sent_commands.pop(rid, None)
|
||||
self._approval_messages.pop(rid, None)
|
||||
self._sent_approval_ids.discard(rid)
|
||||
|
||||
# ── Check for expired pendings — update Discord card ──
|
||||
for f in self.bridge.pending_dir.glob("*.json"):
|
||||
try:
|
||||
data = json.loads(f.read_text(encoding="utf-8-sig"))
|
||||
if data.get("status") == "expired":
|
||||
elif status == "expired":
|
||||
msg_id = data.get("discord_message_id", 0)
|
||||
rid = data.get("request_id", "")
|
||||
project = data.get("project_name", Config.PROJECT_NAME)
|
||||
if msg_id:
|
||||
channel = await self._get_channel(project)
|
||||
@@ -668,52 +663,43 @@ class GravityBot(commands.Bot):
|
||||
self._deferred_ids.pop(rid, None)
|
||||
self._sent_commands.pop(rid, None)
|
||||
self._sent_approval_ids.discard(rid)
|
||||
except (json.JSONDecodeError, OSError):
|
||||
pass
|
||||
|
||||
# ── Check for MERGE updates (step_probe updated command in already-sent pending) ──
|
||||
for f in self.bridge.pending_dir.glob("*.json"):
|
||||
try:
|
||||
data = json.loads(f.read_text(encoding="utf-8-sig"))
|
||||
rid = data.get("request_id", "")
|
||||
if rid not in self._sent_approval_ids:
|
||||
continue
|
||||
if data.get("status") != "pending":
|
||||
continue
|
||||
msg_id = data.get("discord_message_id", 0)
|
||||
if not msg_id:
|
||||
continue
|
||||
# Check if command was updated via MERGE
|
||||
new_cmd = data.get("command", "")
|
||||
old_cmd = self._sent_commands.get(rid, "")
|
||||
if new_cmd and new_cmd != old_cmd and len(new_cmd) > len(old_cmd):
|
||||
# MERGE detected — edit Discord message
|
||||
self._sent_commands[rid] = new_cmd
|
||||
project = data.get("project_name", Config.PROJECT_NAME)
|
||||
channel = await self._get_channel(project)
|
||||
if channel:
|
||||
try:
|
||||
msg = await channel.fetch_message(msg_id)
|
||||
# Rebuild embed with full command
|
||||
buttons = data.get("buttons")
|
||||
desc_parts = [f"**명령어:**\n```\n{new_cmd[:1000]}\n```"]
|
||||
if buttons and len(buttons) > 1:
|
||||
btn_names = [b.get("text", "?") for b in buttons]
|
||||
desc_parts.append(f"**선택지:** {' / '.join(btn_names)}")
|
||||
desc = data.get("description", "")
|
||||
if desc:
|
||||
desc_parts.append(desc[:500])
|
||||
embed = discord.Embed(
|
||||
title="⚠️ 승인 요청",
|
||||
description="\n".join(desc_parts),
|
||||
color=discord.Color.orange(),
|
||||
timestamp=datetime.now(timezone.utc),
|
||||
)
|
||||
embed.set_footer(text=f"ID: {rid}")
|
||||
await msg.edit(embed=embed)
|
||||
logger.info(f"MERGE edit: {rid[:12]} cmd='{new_cmd[:60]}'")
|
||||
except discord.NotFound:
|
||||
pass
|
||||
elif status == "pending":
|
||||
# MERGE check: step_probe updated command in already-sent pending
|
||||
if rid not in self._sent_approval_ids:
|
||||
continue
|
||||
msg_id = data.get("discord_message_id", 0)
|
||||
if not msg_id:
|
||||
continue
|
||||
new_cmd = data.get("command", "")
|
||||
old_cmd = self._sent_commands.get(rid, "")
|
||||
if new_cmd and new_cmd != old_cmd and len(new_cmd) > len(old_cmd):
|
||||
self._sent_commands[rid] = new_cmd
|
||||
project = data.get("project_name", Config.PROJECT_NAME)
|
||||
channel = await self._get_channel(project)
|
||||
if channel:
|
||||
try:
|
||||
msg = await channel.fetch_message(msg_id)
|
||||
buttons = data.get("buttons")
|
||||
desc_parts = [f"**명령어:**\n```\n{new_cmd[:1000]}\n```"]
|
||||
if buttons and len(buttons) > 1:
|
||||
btn_names = [b.get("text", "?") for b in buttons]
|
||||
desc_parts.append(f"**선택지:** {' / '.join(btn_names)}")
|
||||
desc = data.get("description", "")
|
||||
if desc:
|
||||
desc_parts.append(desc[:500])
|
||||
embed = discord.Embed(
|
||||
title="⚠️ 승인 요청",
|
||||
description="\n".join(desc_parts),
|
||||
color=discord.Color.orange(),
|
||||
timestamp=datetime.now(timezone.utc),
|
||||
)
|
||||
embed.set_footer(text=f"ID: {rid}")
|
||||
await msg.edit(embed=embed)
|
||||
logger.info(f"MERGE edit: {rid[:12]} cmd='{new_cmd[:60]}'")
|
||||
except discord.NotFound:
|
||||
pass
|
||||
|
||||
except (json.JSONDecodeError, OSError):
|
||||
pass
|
||||
|
||||
|
||||
Reference in New Issue
Block a user