From b3399b07ad51b5e110cc477a04c87c84faec81d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sat, 31 Jan 2026 15:15:01 +0800 Subject: [PATCH 1/3] Silence update log; change update UI colors Comment out the noisy '[NapCat Update] No pending updates found' log in UpdateNapCat.ts. Update frontend color choices: switch the plugin store action color from 'success' to 'default', and change the NewVersion chip and spinner from 'danger' to 'primary' in system_info.tsx. These tweaks reduce alarming red styling and quiet an unnecessary backend log. --- packages/napcat-webui-backend/src/api/UpdateNapCat.ts | 2 +- .../src/components/display_card/plugin_store_card.tsx | 2 +- packages/napcat-webui-frontend/src/components/system_info.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/napcat-webui-backend/src/api/UpdateNapCat.ts b/packages/napcat-webui-backend/src/api/UpdateNapCat.ts index 43126080..274d4fc5 100644 --- a/packages/napcat-webui-backend/src/api/UpdateNapCat.ts +++ b/packages/napcat-webui-backend/src/api/UpdateNapCat.ts @@ -340,7 +340,7 @@ export async function applyPendingUpdates (webUiPathWrapper: NapCatPathWrapper, const configPath = path.join(webUiPathWrapper.configPath, 'napcat-update.json'); if (!fs.existsSync(configPath)) { - logger.log('[NapCat Update] No pending updates found'); + //logger.log('[NapCat Update] No pending updates found'); return; } diff --git a/packages/napcat-webui-frontend/src/components/display_card/plugin_store_card.tsx b/packages/napcat-webui-frontend/src/components/display_card/plugin_store_card.tsx index 1394fa2d..b758a9e5 100644 --- a/packages/napcat-webui-frontend/src/components/display_card/plugin_store_card.tsx +++ b/packages/napcat-webui-frontend/src/components/display_card/plugin_store_card.tsx @@ -41,7 +41,7 @@ const PluginStoreCard: React.FC = ({ return { text: '更新', icon: , - color: 'success' as const, + color: 'default' as const, }; default: return { diff --git a/packages/napcat-webui-frontend/src/components/system_info.tsx b/packages/napcat-webui-frontend/src/components/system_info.tsx index bfe509fc..ea79b3b6 100644 --- a/packages/napcat-webui-frontend/src/components/system_info.tsx +++ b/packages/napcat-webui-frontend/src/components/system_info.tsx @@ -260,14 +260,14 @@ const NewVersionTip = (props: NewVersionTipProps) => {
- {updateStatus === 'updating' ? : 'New'} + {updateStatus === 'updating' ? : 'New'}
From 805c1d5ea2e3c8d3cfb5c2e751fc74786c1ed3fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sat, 31 Jan 2026 15:26:56 +0800 Subject: [PATCH 2/3] Default plugins disabled; skip loading disabled Change plugin loader to treat plugins as disabled by default (unless the id/dir is 'napcat-plugin-builtin') by using nullish coalescing when reading statusConfig. Add an early-return guard in the plugin manager/adapter that logs and skips loading when entry.enable is false. This prevents disabled plugins from being loaded automatically and provides a clear log message when skipped. --- packages/napcat-onebot/network/plugin-manger.ts | 5 +++++ packages/napcat-onebot/network/plugin/loader.ts | 6 +++--- packages/napcat-onebot/network/plugin/manager.ts | 5 +++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/napcat-onebot/network/plugin-manger.ts b/packages/napcat-onebot/network/plugin-manger.ts index 42a889e9..fa5e3350 100644 --- a/packages/napcat-onebot/network/plugin-manger.ts +++ b/packages/napcat-onebot/network/plugin-manger.ts @@ -316,6 +316,11 @@ export class OB11PluginMangerAdapter extends IOB11NetworkAdapter i entry = newEntry; } + if (!entry.enable) { + this.logger.log(`[PluginManager] Skipping loading disabled plugin: ${pluginId}`); + return false; + } + return await this.loadPlugin(entry); } diff --git a/packages/napcat-onebot/network/plugin/loader.ts b/packages/napcat-onebot/network/plugin/loader.ts index 7c4b23c5..85ab8030 100644 --- a/packages/napcat-onebot/network/plugin/loader.ts +++ b/packages/napcat-onebot/network/plugin/loader.ts @@ -123,8 +123,8 @@ export class PluginLoader { const entryFile = this.findEntryFile(pluginDir, packageJson); const entryPath = entryFile ? path.join(pluginDir, entryFile) : undefined; - // 获取启用状态(默认启用) - const enable = statusConfig[pluginId] !== false; + // 获取启用状态(默认禁用,内置插件除外) + const enable = statusConfig[pluginId] ?? (pluginId === 'napcat-plugin-builtin'); // 创建插件条目 const entry: PluginEntry = { @@ -159,7 +159,7 @@ export class PluginLoader { id: dirname, // 使用目录名作为 ID fileId: dirname, pluginPath: path.join(this.pluginPath, dirname), - enable: statusConfig[dirname] !== false, + enable: statusConfig[dirname] ?? (dirname === 'napcat-plugin-builtin'), loaded: false, runtime: { status: 'error', diff --git a/packages/napcat-onebot/network/plugin/manager.ts b/packages/napcat-onebot/network/plugin/manager.ts index 9fd3ddd6..b9b38fce 100644 --- a/packages/napcat-onebot/network/plugin/manager.ts +++ b/packages/napcat-onebot/network/plugin/manager.ts @@ -285,6 +285,11 @@ export class OB11PluginManager extends IOB11NetworkAdapter impleme entry = newEntry; } + if (!entry.enable) { + this.logger.log(`[PluginManager] Skipping loading disabled plugin: ${pluginId}`); + return false; + } + return await this.loadPlugin(entry); } From c0bcced5fb981343f8f83efc3dfb36170e745021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E6=9B=A6?= <2218872014@qq.com> Date: Sat, 31 Jan 2026 15:28:18 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=AA=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E9=85=8D=E7=BD=AE=E5=AF=BC=E5=87=BA=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=20(#1567)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加个网络配置导出导入 重装容器时可以直接导出导入 * Remove unused import for useRef in network.tsx --- .../src/pages/dashboard/network.tsx | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/network.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/network.tsx index f6d93253..dc25a78c 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/network.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/network.tsx @@ -2,9 +2,10 @@ import { Button } from '@heroui/button'; import { useDisclosure } from '@heroui/modal'; import { Tab, Tabs } from '@heroui/tabs'; import clsx from 'clsx'; -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import toast from 'react-hot-toast'; import { IoMdRefresh } from 'react-icons/io'; +import { FiDownload, FiUpload } from 'react-icons/fi'; import AddButton from '@/components/button/add_button'; import HTTPClientDisplayCard from '@/components/display_card/http_client'; @@ -55,7 +56,9 @@ export default function NetworkPage () { deleteNetworkConfig, enableNetworkConfig, enableDebugNetworkConfig, + updateSingleConfig, } = useConfig(); + const fileInputRef = useRef(null); const [activeField, setActiveField] = useState('httpServers'); const [activeName, setActiveName] = useState(''); @@ -99,6 +102,45 @@ export default function NetworkPage () { onOpen(); }; + // 导出网络配置 + const handleExport = () => { + const blob = new Blob([JSON.stringify(config.network, null, 2)], { type: 'application/json' }); + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.download = `network-config-${Date.now()}.json`; + link.click(); + URL.revokeObjectURL(link.href); + toast.success('导出成功'); + }; + + // 导入网络配置 + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + e.target.value = ''; + + try { + const data = JSON.parse(await file.text()) as OneBotConfig['network']; + const keys: (keyof OneBotConfig['network'])[] = ['httpServers', 'httpClients', 'httpSseServers', 'websocketServers', 'websocketClients']; + if (keys.some(k => !Array.isArray(data[k]))) throw new Error('配置格式错误'); + + dialog.confirm({ + title: '导入配置', + content: '确定导入?这将覆盖现有网络配置。', + onConfirm: async () => { + try { + await updateSingleConfig('network', data); + toast.success('导入成功'); + } catch (err) { + toast.error(`导入失败: ${(err as Error).message}`); + } + }, + }); + } catch (err) { + toast.error(`解析失败: ${(err as Error).message}`); + } + }; + const onDelete = async ( field: keyof OneBotConfig['network'], name: string @@ -373,6 +415,21 @@ export default function NetworkPage () {
+ + +