// 聊天室 AI 小班长交互模块,提供 sendToChatBot/clearChatBotContext 兼容入口。 import { escapeHtml } from "./html.js"; let chatBotSending = false; /** * 读取页面 CSRF Token。 * * @returns {string} */ function getCsrfToken() { return document.querySelector('meta[name="csrf-token"]')?.getAttribute("content") || ""; } /** * 判断包厢窗口是否需要自动滚动到底部。 * * @returns {boolean} */ function shouldAutoScroll() { return window.isChatAutoScrollEnabled?.() ?? true; } /** * 将系统提示追加到包厢窗口。 * * @param {string} html * @returns {void} */ function appendPrivateSystemLine(html) { const messageBox = document.getElementById("chat-messages-container2"); if (!messageBox) { return; } const line = document.createElement("div"); line.className = "msg-line"; line.innerHTML = html; messageBox.appendChild(line); if (shouldAutoScroll()) { messageBox.scrollTop = messageBox.scrollHeight; } } /** * 将 AI 错误提示追加到包厢窗口。 * * @param {string} text * @returns {void} */ function appendBotError(text) { appendPrivateSystemLine(`🤖【AI小班长】${escapeHtml(text)}`); } /** * 发送消息给 AI 机器人。 * * @param {string} content * @param {boolean} [isSecret] * @returns {Promise} */ export async function sendToChatBot(content, isSecret = false) { if (chatBotSending) { window.chatDialog?.alert?.("AI 正在思考中,请稍候...", "提示", "#336699"); return; } chatBotSending = true; try { const response = await fetch(window.chatContext.chatBotUrl, { method: "POST", headers: { "X-CSRF-TOKEN": getCsrfToken(), "Content-Type": "application/json", "Accept": "application/json", }, body: JSON.stringify({ message: content, room_id: window.chatContext.roomId, is_secret: isSecret ? 1 : 0, }), }); const data = await response.json(); if (!response.ok || data.status !== "success") { // AI 接口错误只写入包厢窗口,避免失败提示刷到公屏。 appendBotError(data.message || "回复失败,请稍后重试"); } } catch (error) { appendBotError("网络连接错误,请稍后重试"); } finally { chatBotSending = false; } } /** * 清除与 AI 小助手的对话上下文。 * * @returns {Promise} */ export async function clearChatBotContext() { try { const response = await fetch(window.chatContext.chatBotClearUrl, { method: "POST", headers: { "X-CSRF-TOKEN": getCsrfToken(), "Accept": "application/json", }, }); const data = await response.json(); appendPrivateSystemLine(`🤖【系统】${escapeHtml(data.message || "对话已重置")}`); } catch (error) { window.chatDialog?.alert?.(`清除失败:${error.message}`, "操作失败", "#cc4444"); } } /** * 暴露 AI 小班长操作给存量发送消息逻辑。 * * @returns {void} */ export function bindChatBotControls() { if (typeof window === "undefined") { return; } window.sendToChatBot = sendToChatBot; window.clearChatBotContext = clearChatBotContext; }