diff --git a/api/discord_bot.py b/api/discord_bot.py index 23052a3..4944009 100644 --- a/api/discord_bot.py +++ b/api/discord_bot.py @@ -163,7 +163,7 @@ def _parse_unified_response(raw: str) -> dict: m = _re.search(r"```json\s*\n(.+?)```", raw, _re.DOTALL) if m: try: - return json.loads(m.group(1)) + return json.loads(m.group(1), strict=False) except json.JSONDecodeError: pass @@ -178,7 +178,7 @@ def _parse_unified_response(raw: str) -> dict: depth -= 1 if depth == 0: try: - return json.loads(raw[start:i + 1]) + return json.loads(raw[start:i + 1], strict=False) except json.JSONDecodeError: break @@ -411,16 +411,27 @@ async def on_message(message: discord.Message): logger.info("[NC] handle 완료") elif mode == "chat": - # 즉시 응답 + # 즉시 응답 — 항상 Embed 사용 (Discord markdown 렌더링) response = parsed.get("response", "") logger.info(f"[chat] 응답 길이: {len(response)}") if response: - if len(response) <= 2000: - await message.reply(response) - else: - for i in range(0, len(response), 4000): - embed = discord.Embed(description=response[i:i + 4000], color=0x3498DB) - await message.channel.send(embed=embed) + # 응답이 JSON 구조를 포함하면 제거 (fallback 시 raw 전체가 들어옴) + if response.strip().startswith('"mode"') or response.strip().startswith('{"mode"'): + import re as _re + m = _re.search(r'"response"\s*:\s*"(.*)', response, _re.DOTALL) + if m: + cleaned = m.group(1) + # 끝의 따옴표+중괄호 제거 + if cleaned.endswith('"}'): + cleaned = cleaned[:-2] + elif cleaned.endswith('"'): + cleaned = cleaned[:-1] + response = cleaned.replace('\\n', '\n') + from handlers.renderer import safe_send_embed + for i in range(0, len(response), 4000): + chunk = response[i:i + 4000] + embed = discord.Embed(description=chunk, color=0x3498DB) + await safe_send_embed(message.channel, embed) else: await message.reply("응답을 생성하지 못했습니다.")