mirror of
https://github.com/Wx-2025/ST-Amily2-Chat-Optimisation.git
synced 2026-06-07 07:25:51 +00:00
Update index.js
This commit is contained in:
34
index.js
34
index.js
@@ -31,7 +31,7 @@ import { initializeApiListener, registerApiHandler, amilyHelper, initializeAmily
|
|||||||
import { registerContextOptimizerMacros, resetContextBuffer } from './core/context-optimizer.js';
|
import { registerContextOptimizerMacros, resetContextBuffer } from './core/context-optimizer.js';
|
||||||
import { initializeSuperMemory } from './core/super-memory/manager.js';
|
import { initializeSuperMemory } from './core/super-memory/manager.js';
|
||||||
|
|
||||||
const DOMPURIFY_CDN = "https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.8/purify.min.js";
|
const DOMPURIFY_CDN = "https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.2.7/purify.min.js";
|
||||||
|
|
||||||
function loadExternalScript(url, globalName) {
|
function loadExternalScript(url, globalName) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@@ -250,16 +250,18 @@ function sanitizeHTML(html) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 移除所有属性,只保留允许的
|
||||||
const attrs = Array.from(el.attributes);
|
const attrs = Array.from(el.attributes);
|
||||||
for (const attr of attrs) {
|
for (const attr of attrs) {
|
||||||
const attrName = attr.name.toLowerCase();
|
const attrName = attr.name.toLowerCase();
|
||||||
if (!allowedAttrs.includes(attrName)) {
|
if (!allowedAttrs.includes(attrName)) {
|
||||||
el.removeAttribute(attr.name);
|
el.removeAttribute(attr.name);
|
||||||
} else if (attrName === 'href') {
|
} else if (attrName === 'href') {
|
||||||
|
// 检查 href 是否包含 javascript:
|
||||||
if (attr.value.toLowerCase().trim().startsWith('javascript:')) {
|
if (attr.value.toLowerCase().trim().startsWith('javascript:')) {
|
||||||
el.removeAttribute('href');
|
el.removeAttribute('href');
|
||||||
}
|
}
|
||||||
} else if (attrName.startsWith('on')) {
|
} else if (attrName.startsWith('on')) { // 双重保险,移除所有事件处理器
|
||||||
el.removeAttribute(attr.name);
|
el.removeAttribute(attr.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -274,6 +276,7 @@ async function handleMessageBoard() {
|
|||||||
if (messageData && messageData.message) {
|
if (messageData && messageData.message) {
|
||||||
const messageBoard = $('#amily2_message_board');
|
const messageBoard = $('#amily2_message_board');
|
||||||
const messageContent = $('#amily2_message_content');
|
const messageContent = $('#amily2_message_content');
|
||||||
|
// 使用净化后的 HTML,防止 XSS 攻击
|
||||||
const safeContent = sanitizeHTML(messageData.message);
|
const safeContent = sanitizeHTML(messageData.message);
|
||||||
messageContent.html(safeContent);
|
messageContent.html(safeContent);
|
||||||
messageBoard.show();
|
messageBoard.show();
|
||||||
@@ -284,7 +287,7 @@ async function handleMessageBoard() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
await updateMessage();
|
await updateMessage();
|
||||||
setInterval(updateMessage, 300000);
|
setInterval(updateMessage, 300000); // 5分钟刷新一次(从60秒改为300秒)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -344,7 +347,9 @@ function loadPluginStyles() {
|
|||||||
|
|
||||||
|
|
||||||
window.addEventListener('message', function (event) {
|
window.addEventListener('message', function (event) {
|
||||||
|
// 处理头像获取请求
|
||||||
if (event.data && event.data.type === 'getAvatars') {
|
if (event.data && event.data.type === 'getAvatars') {
|
||||||
|
// 【兼容性修复】如果 LittleWhiteBox 激活,则不处理此消息,避免冲突
|
||||||
if (window.isXiaobaixEnabled) {
|
if (window.isXiaobaixEnabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -358,6 +363,7 @@ window.addEventListener('message', function (event) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理来自 iframe 的交互事件
|
||||||
if (event.data && event.data.source === 'amily2-iframe') {
|
if (event.data && event.data.source === 'amily2-iframe') {
|
||||||
const { action, detail } = event.data;
|
const { action, detail } = event.data;
|
||||||
console.log(`[Amily2-主窗口] 收到来自iframe的动作: ${action}`, detail);
|
console.log(`[Amily2-主窗口] 收到来自iframe的动作: ${action}`, detail);
|
||||||
@@ -405,8 +411,10 @@ window.addEventListener("error", (event) => {
|
|||||||
jQuery(async () => {
|
jQuery(async () => {
|
||||||
console.log("[Amily2号-帝国枢密院] 开始执行开国大典...");
|
console.log("[Amily2号-帝国枢密院] 开始执行开国大典...");
|
||||||
|
|
||||||
|
// 启动外部库加载 (DOMPurify)
|
||||||
loadExternalScript(DOMPURIFY_CDN, 'DOMPurify').catch(e => console.warn("[Amily2] DOMPurify 加载失败,将使用内置净化器:", e));
|
loadExternalScript(DOMPURIFY_CDN, 'DOMPurify').catch(e => console.warn("[Amily2] DOMPurify 加载失败,将使用内置净化器:", e));
|
||||||
|
|
||||||
|
// 【V146.2 紧急优化】优先注册上下文优化器,确保它在密折司之前拦截并处理 Prompt
|
||||||
try {
|
try {
|
||||||
console.log("[Amily2号-开国大典] 步骤0:优先注册上下文优化器...");
|
console.log("[Amily2号-开国大典] 步骤0:优先注册上下文优化器...");
|
||||||
registerContextOptimizerMacros();
|
registerContextOptimizerMacros();
|
||||||
@@ -414,6 +422,7 @@ jQuery(async () => {
|
|||||||
console.error("[Amily2号-开国大典] 上下文优化器注册失败:", e);
|
console.error("[Amily2号-开国大典] 上下文优化器注册失败:", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 【密折司】延迟加载,确保它排在优化器之后
|
||||||
try {
|
try {
|
||||||
await import("./MiZheSi/index.js");
|
await import("./MiZheSi/index.js");
|
||||||
console.log("[Amily2号-开国大典] 密折司模块已就位。");
|
console.log("[Amily2号-开国大典] 密折司模块已就位。");
|
||||||
@@ -667,6 +676,7 @@ jQuery(async () => {
|
|||||||
const context = getContext();
|
const context = getContext();
|
||||||
|
|
||||||
if (!userMessage) {
|
if (!userMessage) {
|
||||||
|
// 尝试从聊天记录中获取最后一条用户消息(针对 /send 指令场景)
|
||||||
if (context.chat && context.chat.length > 0) {
|
if (context.chat && context.chat.length > 0) {
|
||||||
const lastMsg = context.chat[context.chat.length - 1];
|
const lastMsg = context.chat[context.chat.length - 1];
|
||||||
if (lastMsg.is_user) {
|
if (lastMsg.is_user) {
|
||||||
@@ -719,6 +729,7 @@ jQuery(async () => {
|
|||||||
const contextTurnCount = globalSettings.plotOpt_contextLimit || 10;
|
const contextTurnCount = globalSettings.plotOpt_contextLimit || 10;
|
||||||
let slicedContext = [];
|
let slicedContext = [];
|
||||||
|
|
||||||
|
// 如果是从聊天记录中获取的消息,上下文需要排除最后一条
|
||||||
const contextSource = isFromTextarea ? context.chat : context.chat.slice(0, -1);
|
const contextSource = isFromTextarea ? context.chat : context.chat.slice(0, -1);
|
||||||
|
|
||||||
if (contextTurnCount > 0) {
|
if (contextTurnCount > 0) {
|
||||||
@@ -882,8 +893,11 @@ jQuery(async () => {
|
|||||||
if (checkAuthorization()) {
|
if (checkAuthorization()) {
|
||||||
const userType = localStorage.getItem("plugin_user_type") || "未知";
|
const userType = localStorage.getItem("plugin_user_type") || "未知";
|
||||||
const userNote = localStorage.getItem("plugin_user_note");
|
const userNote = localStorage.getItem("plugin_user_note");
|
||||||
|
|
||||||
|
// 1. 先显示本地缓存的状态,保证启动速度和体验
|
||||||
const displayNote = userNote || userType;
|
const displayNote = userNote || userType;
|
||||||
toastr.success(`欢迎回来!授权状态有效 (用户: ${displayNote})`, "Amily2 插件已就绪");
|
toastr.success(`欢迎回来!授权状态有效 (用户: ${displayNote})`, "Amily2 插件已就绪");
|
||||||
|
|
||||||
refreshUserInfo().then(data => {
|
refreshUserInfo().then(data => {
|
||||||
if (data && data.note && data.note !== userNote) {
|
if (data && data.note && data.note !== userNote) {
|
||||||
console.log("[Amily2] 用户信息已更新:", data.note);
|
console.log("[Amily2] 用户信息已更新:", data.note);
|
||||||
@@ -908,9 +922,10 @@ jQuery(async () => {
|
|||||||
initializeOnlineTracker(); // 【Amily2号-在线统计】启动在线人数统计
|
initializeOnlineTracker(); // 【Amily2号-在线统计】启动在线人数统计
|
||||||
initializeLocalLinkage(); // 【Amily2号-本地联动】启动本地联动服务
|
initializeLocalLinkage(); // 【Amily2号-本地联动】启动本地联动服务
|
||||||
|
|
||||||
|
// 【V146.4】自动初始化超级记忆系统
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
initializeSuperMemory();
|
initializeSuperMemory();
|
||||||
}, 3000);
|
}, 3000); // 延迟3秒以确保 ST 环境完全就绪
|
||||||
|
|
||||||
initializeRenderer();
|
initializeRenderer();
|
||||||
|
|
||||||
@@ -1007,9 +1022,11 @@ function initializeOnlineTracker() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 防止短时间内重复调用
|
||||||
if (isConnecting) return;
|
if (isConnecting) return;
|
||||||
isConnecting = true;
|
isConnecting = true;
|
||||||
|
|
||||||
|
// 清理旧连接
|
||||||
if (ws) {
|
if (ws) {
|
||||||
try {
|
try {
|
||||||
ws.close();
|
ws.close();
|
||||||
@@ -1046,6 +1063,8 @@ function initializeOnlineTracker() {
|
|||||||
$('#amily2-online-count').text('离线');
|
$('#amily2-online-count').text('离线');
|
||||||
isConnecting = false;
|
isConnecting = false;
|
||||||
ws = null;
|
ws = null;
|
||||||
|
|
||||||
|
// 延迟重连,而不是立即循环
|
||||||
if (!reconnectTimer) {
|
if (!reconnectTimer) {
|
||||||
reconnectTimer = setTimeout(() => {
|
reconnectTimer = setTimeout(() => {
|
||||||
reconnectTimer = null;
|
reconnectTimer = null;
|
||||||
@@ -1068,6 +1087,8 @@ function initializeOnlineTracker() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 启动挂载流程
|
||||||
mountTracker();
|
mountTracker();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1089,7 +1110,7 @@ function initializeLocalLinkage() {
|
|||||||
ws.onopen = () => {
|
ws.onopen = () => {
|
||||||
console.log('[Amily2-本地联动] 已连接到启动器服务');
|
console.log('[Amily2-本地联动] 已连接到启动器服务');
|
||||||
if (window.toastr) toastr.success('已连接到 Amily 启动器', '本地联动');
|
if (window.toastr) toastr.success('已连接到 Amily 启动器', '本地联动');
|
||||||
retryCount = 0;
|
retryCount = 0; // 连接成功,重置计数
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onmessage = async (event) => {
|
ws.onmessage = async (event) => {
|
||||||
@@ -1107,6 +1128,7 @@ function initializeLocalLinkage() {
|
|||||||
const total = window.AmilyHelper.getLastMessageId() + 1;
|
const total = window.AmilyHelper.getLastMessageId() + 1;
|
||||||
if (total > keep) {
|
if (total > keep) {
|
||||||
const deleteCount = total - keep;
|
const deleteCount = total - keep;
|
||||||
|
// 生成要删除的 ID 列表 (0 到 deleteCount - 1)
|
||||||
const idsToDelete = Array.from({length: deleteCount}, (_, i) => i);
|
const idsToDelete = Array.from({length: deleteCount}, (_, i) => i);
|
||||||
await window.AmilyHelper.deleteChatMessages(idsToDelete, { refresh: 'all' });
|
await window.AmilyHelper.deleteChatMessages(idsToDelete, { refresh: 'all' });
|
||||||
if (window.toastr) window.toastr.success(`已清理 ${deleteCount} 条旧消息,保留最近 ${keep} 条`, '清理完成');
|
if (window.toastr) window.toastr.success(`已清理 ${deleteCount} 条旧消息,保留最近 ${keep} 条`, '清理完成');
|
||||||
|
|||||||
Reference in New Issue
Block a user