Add files via upload

This commit is contained in:
2025-11-30 23:07:04 +08:00
committed by GitHub
parent d269924531
commit b8aad886bc
3 changed files with 4697 additions and 2547 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,242 +1,248 @@
import { getSlideToggleOptions } from '/script.js'; import { getSlideToggleOptions } from '/script.js';
import { slideToggle } from '/lib.js'; import { slideToggle } from '/lib.js';
import { extension_settings, renderExtensionTemplateAsync } from "/scripts/extensions.js"; import { extension_settings, renderExtensionTemplateAsync } from "/scripts/extensions.js";
import { extensionName, defaultSettings } from "../utils/settings.js"; import { extensionName, defaultSettings } from "../utils/settings.js";
import { import {
checkAuthorization, checkAuthorization,
displayExpiryInfo, displayExpiryInfo,
pluginAuthStatus, pluginAuthStatus,
} from "../utils/auth.js"; } from "../utils/auth.js";
import { import {
updateUI, updateUI,
setAvailableModels, setAvailableModels,
populateModelDropdown, populateModelDropdown,
applyUpdateIndicator, applyUpdateIndicator,
} from "./state.js"; } from "./state.js";
import { bindModalEvents } from "./bindings.js"; import { bindModalEvents } from "./bindings.js";
import { fetchModels } from "../core/api.js"; import { fetchModels } from "../core/api.js";
import { bindHistoriographyEvents } from "./historiography-bindings.js"; import { bindHistoriographyEvents } from "./historiography-bindings.js";
import { bindHanlinyuanEvents } from "./hanlinyuan-bindings.js"; import { bindHanlinyuanEvents } from "./hanlinyuan-bindings.js";
import { bindTableEvents } from './table-bindings.js'; import { bindTableEvents } from './table-bindings.js';
import { showContentModal } from "./page-window.js"; import { showContentModal } from "./page-window.js";
import { initializeRendererBindings } from "../core/tavern-helper/renderer-bindings.js"; import { initializeRendererBindings } from "../core/tavern-helper/renderer-bindings.js";
const extensionFolderPath = `scripts/extensions/third-party/${extensionName}`; import { bindSuperMemoryEvents } from "../core/super-memory/bindings.js";
const extensionFolderPath = `scripts/extensions/third-party/${extensionName}`;
async function loadSettings() {
extension_settings[extensionName] = { async function loadSettings() {
...defaultSettings, extension_settings[extensionName] = {
...(extension_settings[extensionName] || {}), ...defaultSettings,
}; ...(extension_settings[extensionName] || {}),
};
checkAuthorization();
checkAuthorization();
const autoLogin = localStorage.getItem("plugin_auto_login") === "true";
console.log( const autoLogin = localStorage.getItem("plugin_auto_login") === "true";
`[Amily2-调试] 授权状态: ${pluginAuthStatus.authorized}, 自动登录标志: ${autoLogin}`, console.log(
); `[Amily2-调试] 授权状态: ${pluginAuthStatus.authorized}, 自动登录标志: ${autoLogin}`,
if (autoLogin && pluginAuthStatus.authorized) { );
console.log("[Amily2号] 检测到有效授权将执行自动UI更新。"); if (autoLogin && pluginAuthStatus.authorized) {
} console.log("[Amily2号] 检测到有效授权将执行自动UI更新。");
}
$("#expiry_info").html(displayExpiryInfo());
updateUI(); $("#expiry_info").html(displayExpiryInfo());
updateUI();
if (pluginAuthStatus.authorized && extension_settings[extensionName].apiUrl) {
const cachedModels = localStorage.getItem("cached_models_amily2"); if (pluginAuthStatus.authorized && extension_settings[extensionName].apiUrl) {
if (cachedModels) { const cachedModels = localStorage.getItem("cached_models_amily2");
const models = JSON.parse(cachedModels); if (cachedModels) {
console.log(`[Amily2号] 从缓存加载模型列表 (${models.length}个)`); const models = JSON.parse(cachedModels);
setAvailableModels(models); console.log(`[Amily2号] 从缓存加载模型列表 (${models.length}个)`);
populateModelDropdown(); setAvailableModels(models);
} else { populateModelDropdown();
toastr.info("正在自动加载模型列表...", "Amily2号"); } else {
setTimeout(async () => { toastr.info("正在自动加载模型列表...", "Amily2号");
const models = await fetchModels(); setTimeout(async () => {
if (models.length > 0) { const models = await fetchModels();
setAvailableModels(models); if (models.length > 0) {
localStorage.setItem("cached_models_amily2", JSON.stringify(models)); setAvailableModels(models);
populateModelDropdown(); localStorage.setItem("cached_models_amily2", JSON.stringify(models));
} populateModelDropdown();
}, 500); }
} }, 500);
} }
} }
}
async function initializePanel(contentPanel, errorContainer) {
if (contentPanel.data("initialized")) return; async function initializePanel(contentPanel, errorContainer) {
if (contentPanel.data("initialized")) return;
try {
const modalContent = await $.get(`${extensionFolderPath}/assets/amily2-modal.html`); try {
contentPanel.html(modalContent); const modalContent = await $.get(`${extensionFolderPath}/assets/amily2-modal.html`);
const mainContainer = contentPanel.find('#amily2_chat_optimiser'); contentPanel.html(modalContent);
const mainContainer = contentPanel.find('#amily2_chat_optimiser');
if (mainContainer.length) {
const additionalFeaturesContent = await $.get(`${extensionFolderPath}/assets/Amily2-AdditionalFeatures.html`); if (mainContainer.length) {
const additionalPanelHtml = `<div id="amily2_additional_features_panel" style="display: none;">${additionalFeaturesContent}</div>`; const additionalFeaturesContent = await $.get(`${extensionFolderPath}/assets/Amily2-AdditionalFeatures.html`);
mainContainer.append(additionalPanelHtml); const additionalPanelHtml = `<div id="amily2_additional_features_panel" style="display: none;">${additionalFeaturesContent}</div>`;
mainContainer.append(additionalPanelHtml);
const hanlinyuanContent = await $.get(`${extensionFolderPath}/assets/hanlinyuan.html`);
const hanlinyuanPanelHtml = `<div id="amily2_hanlinyuan_panel" style="display: none;">${hanlinyuanContent}</div>`; const hanlinyuanContent = await $.get(`${extensionFolderPath}/assets/hanlinyuan.html`);
mainContainer.append(hanlinyuanPanelHtml); const hanlinyuanPanelHtml = `<div id="amily2_hanlinyuan_panel" style="display: none;">${hanlinyuanContent}</div>`;
mainContainer.append(hanlinyuanPanelHtml);
const memorisationFormsContent = await $.get(`${extensionFolderPath}/assets/Memorisation-forms.html`);
const memorisationFormsPanelHtml = `<div id="amily2_memorisation_forms_panel" style="display: none;">${memorisationFormsContent}</div>`; const memorisationFormsContent = await $.get(`${extensionFolderPath}/assets/Memorisation-forms.html`);
mainContainer.append(memorisationFormsPanelHtml); const memorisationFormsPanelHtml = `<div id="amily2_memorisation_forms_panel" style="display: none;">${memorisationFormsContent}</div>`;
mainContainer.append(memorisationFormsPanelHtml);
const plotOptimizationContent = await $.get(`${extensionFolderPath}/assets/Amily2-optimization.html`);
const plotOptimizationPanelHtml = `<div id="amily2_plot_optimization_panel" style="display: none;">${plotOptimizationContent}</div>`; const plotOptimizationContent = await $.get(`${extensionFolderPath}/assets/Amily2-optimization.html`);
mainContainer.append(plotOptimizationPanelHtml); const plotOptimizationPanelHtml = `<div id="amily2_plot_optimization_panel" style="display: none;">${plotOptimizationContent}</div>`;
mainContainer.append(plotOptimizationPanelHtml);
const cwbContent = await $.get(`${extensionFolderPath}/CharacterWorldBook/cwb_settings.html`);
const cwbPanelHtml = `<div id="amily2_character_world_book_panel" style="display: none;">${cwbContent}</div>`; const cwbContent = await $.get(`${extensionFolderPath}/CharacterWorldBook/cwb_settings.html`);
mainContainer.append(cwbPanelHtml); const cwbPanelHtml = `<div id="amily2_character_world_book_panel" style="display: none;">${cwbContent}</div>`;
mainContainer.append(cwbPanelHtml);
const worldEditorContent = await $.get(`${extensionFolderPath}/WorldEditor.html`);
const worldEditorPanelHtml = `<div id="amily2_world_editor_panel" style="display: none;">${worldEditorContent}</div>`; const worldEditorContent = await $.get(`${extensionFolderPath}/WorldEditor.html`);
mainContainer.append(worldEditorPanelHtml); const worldEditorPanelHtml = `<div id="amily2_world_editor_panel" style="display: none;">${worldEditorContent}</div>`;
mainContainer.append(worldEditorPanelHtml);
const glossaryContent = await $.get(`${extensionFolderPath}/assets/amily2-glossary.html`);
const glossaryPanelHtml = `<div id="amily2_glossary_panel" style="display: none;">${glossaryContent}</div>`; const glossaryContent = await $.get(`${extensionFolderPath}/assets/amily2-glossary.html`);
mainContainer.append(glossaryPanelHtml); const glossaryPanelHtml = `<div id="amily2_glossary_panel" style="display: none;">${glossaryContent}</div>`;
mainContainer.append(glossaryPanelHtml);
const rendererContent = await $.get(`${extensionFolderPath}/core/tavern-helper/renderer.html`);
const rendererPanelHtml = `<div id="amily2_renderer_panel" style="display: none;">${rendererContent}</div>`; const rendererContent = await $.get(`${extensionFolderPath}/core/tavern-helper/renderer.html`);
mainContainer.append(rendererPanelHtml); const rendererPanelHtml = `<div id="amily2_renderer_panel" style="display: none;">${rendererContent}</div>`;
mainContainer.append(rendererPanelHtml);
// 在面板创建后,加载世界书编辑器脚本
const worldEditorScriptId = 'world-editor-script'; const superMemoryContent = await $.get(`${extensionFolderPath}/core/super-memory/index.html`);
if (!document.getElementById(worldEditorScriptId)) { const superMemoryPanelHtml = `<div id="amily2_super_memory_panel" style="display: none;">${superMemoryContent}</div>`;
const worldEditorScript = document.createElement("script"); mainContainer.append(superMemoryPanelHtml);
worldEditorScript.id = worldEditorScriptId;
worldEditorScript.type = "module"; // 必须作为模块加载 // 在面板创建后,加载世界书编辑器脚本
worldEditorScript.src = `${extensionFolderPath}/WorldEditor/WorldEditor.js?v=${Date.now()}`; const worldEditorScriptId = 'world-editor-script';
document.head.appendChild(worldEditorScript); if (!document.getElementById(worldEditorScriptId)) {
} const worldEditorScript = document.createElement("script");
} worldEditorScript.id = worldEditorScriptId;
worldEditorScript.type = "module"; // 必须作为模块加载
bindModalEvents(); worldEditorScript.src = `${extensionFolderPath}/WorldEditor/WorldEditor.js?v=${Date.now()}`;
bindHistoriographyEvents(); document.head.appendChild(worldEditorScript);
await loadSettings(); }
bindHanlinyuanEvents(); }
bindTableEvents();
initializeRendererBindings(); bindModalEvents();
contentPanel.data("initialized", true); bindHistoriographyEvents();
console.log("[Amily-重构] 宫殿模块已按蓝图竣工。"); await loadSettings();
applyUpdateIndicator(); bindHanlinyuanEvents();
} catch (error) { bindTableEvents();
console.error("[Amily-建设部] 紧急报告:加载模块化蓝图时发生意外:", error); initializeRendererBindings();
const errorMessage = errorContainer bindSuperMemoryEvents();
? '<p style="color:red; padding:10px; border:1px solid red; border-radius:5px;">紧急报告在扩展区域建造Amily2号府邸时发生意外。</p>' contentPanel.data("initialized", true);
: '<p style="color:red; padding: 20px;">紧急报告无法加载Amily2号府邸内饰。</p>'; console.log("[Amily-重构] 宫殿模块已按蓝图竣工。");
applyUpdateIndicator();
if (errorContainer) { } catch (error) {
errorContainer.append(errorMessage); console.error("[Amily-建设部] 紧急报告:加载模块化蓝图时发生意外:", error);
} else { const errorMessage = errorContainer
contentPanel.html(errorMessage); ? '<p style="color:red; padding:10px; border:1px solid red; border-radius:5px;">紧急报告在扩展区域建造Amily2号府邸时发生意外。</p>'
} : '<p style="color:red; padding: 20px;">紧急报告无法加载Amily2号府邸内饰。</p>';
}
} if (errorContainer) {
errorContainer.append(errorMessage);
function toggleDrawerFallback() { } else {
const drawerIcon = $('#amily2_drawer_icon'); contentPanel.html(errorMessage);
const contentPanel = $('#amily2_drawer_content'); }
if (drawerIcon.hasClass('openIcon') && !contentPanel.is(':visible')) { }
drawerIcon.removeClass('openIcon').addClass('closedIcon'); }
}
if (drawerIcon.hasClass('closedIcon')) { function toggleDrawerFallback() {
$('.openDrawer').not(contentPanel).not('.pinnedOpen').addClass('resizing').each((_, el) => { const drawerIcon = $('#amily2_drawer_icon');
slideToggle(el, { const contentPanel = $('#amily2_drawer_content');
...getSlideToggleOptions(), if (drawerIcon.hasClass('openIcon') && !contentPanel.is(':visible')) {
onAnimationEnd: function (el) { drawerIcon.removeClass('openIcon').addClass('closedIcon');
el.closest('.drawer-content').classList.remove('resizing'); }
}, if (drawerIcon.hasClass('closedIcon')) {
}); $('.openDrawer').not(contentPanel).not('.pinnedOpen').addClass('resizing').each((_, el) => {
}); slideToggle(el, {
$('.openIcon').not(drawerIcon).not('.drawerPinnedOpen').toggleClass('closedIcon openIcon'); ...getSlideToggleOptions(),
$('.openDrawer').not(contentPanel).not('.pinnedOpen').toggleClass('closedDrawer openDrawer'); onAnimationEnd: function (el) {
el.closest('.drawer-content').classList.remove('resizing');
drawerIcon.toggleClass('closedIcon openIcon'); },
contentPanel.toggleClass('closedDrawer openDrawer'); });
});
contentPanel.addClass('resizing').each((_, el) => { $('.openIcon').not(drawerIcon).not('.drawerPinnedOpen').toggleClass('closedIcon openIcon');
slideToggle(el, { $('.openDrawer').not(contentPanel).not('.pinnedOpen').toggleClass('closedDrawer openDrawer');
...getSlideToggleOptions(),
onAnimationEnd: function (el) { drawerIcon.toggleClass('closedIcon openIcon');
el.closest('.drawer-content').classList.remove('resizing'); contentPanel.toggleClass('closedDrawer openDrawer');
},
}); contentPanel.addClass('resizing').each((_, el) => {
}); slideToggle(el, {
} else { ...getSlideToggleOptions(),
drawerIcon.toggleClass('openIcon closedIcon'); onAnimationEnd: function (el) {
contentPanel.toggleClass('openDrawer closedDrawer'); el.closest('.drawer-content').classList.remove('resizing');
},
contentPanel.addClass('resizing').each((_, el) => { });
slideToggle(el, { });
...getSlideToggleOptions(), } else {
onAnimationEnd: function (el) { drawerIcon.toggleClass('openIcon closedIcon');
el.closest('.drawer-content').classList.remove('resizing'); contentPanel.toggleClass('openDrawer closedDrawer');
},
}); contentPanel.addClass('resizing').each((_, el) => {
}); slideToggle(el, {
} ...getSlideToggleOptions(),
} onAnimationEnd: function (el) {
el.closest('.drawer-content').classList.remove('resizing');
},
export async function createDrawer() { });
const settings = extension_settings[extensionName]; });
const location = settings.iconLocation || 'topbar'; }
}
if (location === 'topbar') {
if ($("#amily2_main_drawer").length > 0) return;
export async function createDrawer() {
const amily2DrawerHtml = ` const settings = extension_settings[extensionName];
<div id="amily2_main_drawer" class="drawer"> const location = settings.iconLocation || 'topbar';
<div class="drawer-toggle" data-drawer="amily2_drawer_content">
<div id="amily2_drawer_icon" class="drawer-icon fa-solid fa-magic fa-fw closedIcon interactable" title="Amily2号优化助手" tabindex="0"></div> if (location === 'topbar') {
</div> if ($("#amily2_main_drawer").length > 0) return;
<div id="amily2_drawer_content" class="drawer-content closedDrawer">
</div> const amily2DrawerHtml = `
</div> <div id="amily2_main_drawer" class="drawer">
`; <div class="drawer-toggle" data-drawer="amily2_drawer_content">
$("#sys-settings-button").after(amily2DrawerHtml); <div id="amily2_drawer_icon" class="drawer-icon fa-solid fa-magic fa-fw closedIcon interactable" title="Amily2号优化助手" tabindex="0"></div>
</div>
const contentPanel = $("#amily2_drawer_content"); <div id="amily2_drawer_content" class="drawer-content closedDrawer">
await initializePanel(contentPanel); </div>
</div>
try { `;
const { doNavbarIconClick } = await import('/script.js'); $("#sys-settings-button").after(amily2DrawerHtml);
if (typeof doNavbarIconClick === 'function') {
$('#amily2_main_drawer .drawer-toggle').on('click', doNavbarIconClick); const contentPanel = $("#amily2_drawer_content");
console.log('[Amily2-兼容性] 检测到新版环境,已绑定官方点击事件。'); await initializePanel(contentPanel);
} else {
throw new Error('doNavbarIconClick is not a function'); try {
} const { doNavbarIconClick } = await import('/script.js');
} catch (error) { if (typeof doNavbarIconClick === 'function') {
$('#amily2_main_drawer .drawer-toggle').on('click', toggleDrawerFallback); $('#amily2_main_drawer .drawer-toggle').on('click', doNavbarIconClick);
console.log('[Amily2-兼容性] 检测到版环境 (无法导入 doNavbarIconClick),已绑定后备点击事件。'); console.log('[Amily2-兼容性] 检测到版环境,已绑定官方点击事件。');
} } else {
throw new Error('doNavbarIconClick is not a function');
} else if (location === 'extensions') { }
if ($("#extensions_settings2 #amily2_chat_optimiser").length > 0) return; } catch (error) {
const amilyFrameHtml = ` $('#amily2_main_drawer .drawer-toggle').on('click', toggleDrawerFallback);
<div id="amily2_extension_frame"> console.log('[Amily2-兼容性] 检测到旧版环境 (无法导入 doNavbarIconClick),已绑定后备点击事件。');
<div class="inline-drawer"> }
<div class="inline-drawer-toggle inline-drawer-header">
<b><i class="fas fa-crown" style="color: #ffc107;"></i> Amily2号 优化中枢</b> } else if (location === 'extensions') {
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> if ($("#extensions_settings2 #amily2_chat_optimiser").length > 0) return;
</div> const amilyFrameHtml = `
<div class="inline-drawer-content" style="display: none;"> <div id="amily2_extension_frame">
</div> <div class="inline-drawer">
</div> <div class="inline-drawer-toggle inline-drawer-header">
</div> <b><i class="fas fa-crown" style="color: #ffc107;"></i> Amily2号 优化中枢</b>
`; <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
const frame = $(amilyFrameHtml); <div class="inline-drawer-content" style="display: none;">
$('#extensions_settings2').append(frame); </div>
const contentPanel = frame.find('.inline-drawer-content'); </div>
initializePanel(contentPanel, frame); </div>
} `;
}
const frame = $(amilyFrameHtml);
$('#extensions_settings2').append(frame);
const contentPanel = frame.find('.inline-drawer-content');
initializePanel(contentPanel, frame);
}
}

File diff suppressed because one or more lines are too long