Compare commits

...

48 Commits

Author SHA1 Message Date
手瓜一十雪
5fec649425 Load napcat.json, use o3HookMode & bypass
Add loadNapcatConfig helper that reads napcat.json (json5), validates with Ajv and fills defaults for early pre-login use. Change NativePacketHandler.init signature to accept an o3HookMode flag and forward it to native initHook. Update framework and shell to use loadNapcatConfig (remove duplicated file-reading logic) and pass configured o3HookMode and bypass options into Napi2NativeLoader/native packet initialization. Clean up imports (Ajv, path, fs, json5) and remove the old loadBypassConfig helper.
2026-02-20 21:49:19 +08:00
手瓜一十雪
052e7fa2b3 Init nativePacketHandler after loading wrapper && fix #1633
Delay initialization of nativePacketHandler until after loadQQWrapper so that wrapper.node is loaded before initializing hooks. Moved the await nativePacketHandler.init(...) call below loadQQWrapper and added an explanatory comment to ensure native hooks are set up only after the native module is available.
2026-02-20 21:39:50 +08:00
叫我饼干ちゃん
04e425d17a update:汉化 (#1641) 2026-02-20 20:31:36 +08:00
Rinne
cbe0506577 fix(webui): properly center plus icon in add button row (#1642)
Add `flex items-center justify-center` to the plus icon wrapper in `AddButton` so the icon is vertically and horizontally centered. This improves visual alignment and keeps the “新建网络配置” button content consistent.
2026-02-20 20:31:22 +08:00
手瓜一十雪
32ec097f51 Update native binaries for napi2native
Rebuild native artifacts: updated ffmpeg.dll and napi2native Node addons for linux (arm64, x64) and win32 x64. These are binary-only updates (no source changes), likely to refresh builds for compatibility or toolchain/dependency updates.
2026-02-20 19:56:24 +08:00
手瓜一十雪
53f27ea9e2 Refactor Bypass layout and UI text
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Wrap Bypass SwitchCard controls in a responsive grid for better layout and spacing. Rename the Config tab title from 'Bypass配置' to '反检测'. Clean up WebUI button/label text by removing emoji prefixes (removed 📥, 🔐, ) for a cleaner UI. Files changed: bypass.tsx (layout), index.tsx (tab title), webui.tsx (text cleanup).
2026-02-20 17:11:58 +08:00
手瓜一十雪
41d94cd5e2 Refactor bypass defaults and crash handling
Set bypass defaults to disabled and simplify loading: napcat.json default bypass flags changed to false and code now reads bypass options without merging a prior "all enabled" default. Removed the progressive bypass-disable logic and related environment variable usage, and added a log when Napi2NativeLoader enables bypasses. Web UI/backend adjustments: default NapCat config is now generated from the AJV schema; the bypass settings UI defaults to false, adds an o3HookMode toggle, and submits o3HookMode as 0/1. UX fixes: extension tabs made horizontally scrollable with fixed tab sizing, and plugin uninstall flow updated to a single confirmation dialog with an optional checkbox to remove plugin config. Overall changes aim to use safer defaults, simplify crash/restart behavior, and improve configuration and UI clarity.
2026-02-20 16:36:16 +08:00
手瓜一十雪
285d352bc8 Downgrade json5 in napcat-framework
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Update packages/napcat-framework/package.json to use json5@^2.2.3 (was ^3.2.2). This change pins json5 to the v2 line, likely for compatibility with other workspace packages or tooling that require the older major version.
2026-02-18 22:21:55 +08:00
手瓜一十雪
a3b3836b8a Add process bypass option and update bypass fields
Introduce a new 'process' bypass option and remove the old 'maps' key, updating all related schemas, types, defaults and validation. Adjusted napcat.json ordering and NapcatConfig defaults, updated BypassOptions schema and TypeScript interfaces, backend validation keys, loader/default parsing logic, and the web UI form mappings/labels to reflect the new field set and ordering.
2026-02-18 22:14:31 +08:00
手瓜一十雪
b9f61cc0ee Add configurable bypass options and UI
Introduce granular "bypass" configuration to control Napi2Native bypass features and expose it in the WebUI.

Key changes:
- Add bypass defaults to packages/napcat-core/external/napcat.json and BypassOptionsSchema in napcat-core helper config.
- Extend Napi2NativeLoader types: enableAllBypasses now accepts BypassOptions.
- Framework & Shell: load napcat.json (via json5), pass parsed bypass options to native loader, and log the applied config. Add json5 dependency.
- Shell: implement loadBypassConfig with a crash-recovery override (NAPCAT_BYPASS_DISABLE_LEVEL) and add master<->worker IPC (login-success) plus progressive bypass-disable strategy to mitigate repeated crashes before login.
- WebUI backend: add GET/Set endpoints for NapCat config (NapCatConfigRouter) with validation and JSON5-aware defaults.
- WebUI frontend: add BypassConfig page, types, and controller methods to get/set bypass config.
- Update package.json to include json5 and update pnpm lockfile; native binaries (.node / ffmpeg.dll) also updated.

This enables operators to tune bypass behavior per-installation and to have an in-UI control for toggling anti-detection features; it also adds progressive fallback behavior to help recover from crashes caused by bypasses.
2026-02-18 22:09:27 +08:00
手瓜一十雪
9998207346 Move plugin data to config path; improve uninstall UI
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Change plugin data storage to use core.context.pathWrapper.configPath/plugins/<id> instead of pluginPath/data across OB11 plugin managers. Ensure plugin config directory is created when building the plugin context, use the central path for cleanup/uninstall, and update getPluginDataPath accordingly. Update web UI uninstall flow to prompt for cleaning configuration files using dialog.confirm (showing the config path) and performUninstall helper instead of window.confirm. Also include rebuilt native binaries (napi2native) for Linux x64 and arm64.
2026-02-18 16:49:43 +08:00
手瓜一十雪
4f47af233f Update napi2native Linux native binaries
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Replace prebuilt napi2native native modules for Linux (arm64 and x64) with updated binaries. These updated artifacts ensure the native addon is rebuilt and compatible with current Node/N-API/ABI or dependency changes, restoring compatibility and performance on Linux platforms.
2026-02-16 15:39:44 +08:00
手瓜一十雪
6aadc2402d Enable o3HookMode and update Win32 native binary
Set o3HookMode to 1 in packages/napcat-core/external/napcat.json to enable O3 hook mode. Replace the prebuilt napi2native.win32.x64.node binary in packages/napcat-native/napi2native to include corresponding native changes for Win32 x64.
2026-02-16 14:58:06 +08:00
手瓜一十雪
eb937b29e4 Enable native verbose logging via env var
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Read NAPCAT_ENABLE_VERBOSE_LOG at startup and call napi2nativeLoader.nativeExports.setVerbose(true) (if available) right after loading the wrapper so native verbose logging can be enabled via environment. Also includes an updated native .node binary.
2026-02-13 19:33:48 +08:00
手瓜一十雪
f44aca9a2f Update napi2native Windows x64 binary
Replace the compiled napi2native.win32.x64.node binary for the Windows x64 build. This updates the native addon artifact (likely rebuilt due to code or build environment changes) so consumers get the latest native implementation.
2026-02-13 19:06:12 +08:00
手瓜一十雪
c34812bc9c Update napi2native Windows x64 binary
Replace the compiled napi2native.win32.x64.node binary in packages/napcat-native/napi2native. This updates the Windows x64 native addon (rebuild/bugfix or dependency-linked binary update); no JS/source changes are included in this diff.
2026-02-13 19:01:37 +08:00
手瓜一十雪
d93b430034 Revert "Enable native verbose logging"
This reverts commit cad567dc3f.
2026-02-13 18:12:11 +08:00
手瓜一十雪
c91e1378cf Increase OpenRouter max_tokens to 5000
Update .github/workflows/release.yml to raise the OpenRouter request max_tokens from 1500 to 5000. This allows the model to generate longer responses during the release workflow; be aware this may increase token usage and cost.
2026-02-13 18:01:36 +08:00
手瓜一十雪
cad567dc3f Enable native verbose logging
Invoke nativeExports.setVerbose(true) immediately after loading the QQ wrapper so the native module emits verbose logs (uses optional chaining so it’s safe if the symbol is absent). Also includes an updated napi2native.win32.x64.node binary. This helps with debugging native bypass behavior.
2026-02-13 17:54:45 +08:00
手瓜一十雪
82c8de00d0 Add env var to disable Napi bypass
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Introduce NAPCAT_DISABLE_BYPASS to conditionally skip calling napi2nativeLoader.nativeExports.enableAllBypasses. Updates in napcat-framework/napcat.ts and napcat-shell/base.ts: bypass is enabled by default, but if NAPCAT_DISABLE_BYPASS is set to '1' the bypass call is skipped and a log message indicates it was disabled via environment variable. Keeps existing log when bypass is successfully enabled.
2026-02-13 15:46:30 +08:00
手瓜一十雪
f17abccfdc Cleanup orphaned Electron child processes
Add cleanupOrphanedProcesses to terminate leftover child processes when running in Electron. The function imports Electron at runtime, uses app.getAppMetrics() to enumerate processes, excludes the main and provided worker PIDs, and sends SIGTERM to stray PIDs while ignoring already-dead processes and API errors. Also invoke this cleanup in restartWorker after starting the new worker to avoid lingering processes after restarts. Includes @ts-ignore for the dynamic Electron import and debug logging on failure.
2026-02-13 15:45:05 +08:00
手瓜一十雪
35af50bb73 Add ffmpeg.dll and update Windows native module
Add ffmpeg.dll to the napi2native package and update the prebuilt Windows x64 native addon (napi2native.win32.x64.node). This bundles the FFmpeg runtime with the native package and includes a rebuilt/updated native binary for Windows x64 to ensure compatibility with the new dependency or recent native changes.
2026-02-13 15:34:49 +08:00
手瓜一十雪
5c72f771c3 Add enableAllBypasses and call on startup
Expose an optional enableAllBypasses export in the Napi2Native loader and invoke it during initialization in both napcat-framework and napcat-shell to enable bypasses (logs when enabled). Pre-initialize native modules earlier in the shell startup flow and await nativePacketHandler.init. Also update config o3HookMode from 1 to 0, apply a small signature whitespace fix in clientContext.sendOidbPacket, and include an updated native binary.
2026-02-13 14:56:18 +08:00
手瓜一十雪
62c9246368 feat: 为反检测做准备 2026-02-13 14:28:25 +08:00
手瓜一十雪
d622178b25 Refine NodeIKernel service interfaces (#1619)
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Add multiple NodeIKernel service interface files and tighten up method signatures and types across napcat-core. New interfaces added (e.g. NodeIKernelAVSDKService, NodeIKernelAddBuddyService, NodeIKernelBdhUploadService, NodeIKernelConfigMgrService, NodeIKernelDirectSessionService, NodeIKernelEmojiService, NodeIKernelFeedService, NodeIKernelFileBridgeClientService, NodeIKernelFileBridgeHostService, etc.). Updated existing interfaces with clearer parameter and return types, consistent spacing/semicolons, improved complex return shapes (AlbumService, CollectionService), listener methods, isNull checks, and many other method signature refinements (Avatar, Buddy, DbTools, ECDH, FileAssistant, FlashTransfer, GroupService, and more) to improve type safety and readability.
2026-02-12 21:47:43 +08:00
手瓜一十雪
9887eb8565 Add Linux machine-info GUID management
Add end-to-end support for reading/writing Linux machine-info and computing GUIDs.

Backend: - Introduce MachineInfoUtils (TS) for machine-info path lookup, ROT13 serialization, read/write/delete, backups, and MD5-based GUID computation. - Add a Python utility (guid.py) for CLI inspection, encode/decode, dump, and GUID computation. - Extend QQLogin API with new handlers: GetPlatformInfo, GetLinuxMAC, SetLinuxMAC, GetLinuxMachineId, ComputeLinuxGUID, GetLinuxMachineInfoBackups, CreateLinuxMachineInfoBackup, RestoreLinuxMachineInfoBackup, ResetLinuxDeviceID. Handlers include automatic backup behavior and error handling.

Router: Register new QQLogin routes for platform info and Linux machine-info operations.

Frontend: - Enhance guid_manager UI to detect platform and provide Linux-specific workflow (display machine-id, show/edit MAC, preview computed GUID via MD5, backup/restore/delete machine-info, and restart actions). - Add client-side MD5 (crypto-js) usage and new QQManager API methods to call the new backend endpoints.

This change enables cross-platform GUID management (Windows and Linux), includes CLI tooling for low-level inspection, and adds frontend workflows for Linux device-id management.
2026-02-12 19:00:36 +08:00
手瓜一十雪
2f8569f30c Add Registry20 GUID management and DPAPI support
Introduce tools and UI to read, write, backup and restore QQ Registry20 GUIDs using Windows DPAPI. Adds a Python CLI (guid_tool.py) for local Registry20 operations and a new TypeScript package napcat-dpapi with native bindings for DPAPI. Implements Registry20Utils in the webui-backend to protect/unprotect Registry20, plus backup/restore/delete helpers. Exposes new backend API handlers and routes (get/set GUID, backups, restore, reset, restart) and integrates frontend GUIDManager component and qq_manager controller methods. Propagates QQ data path via WebUiDataRuntime (setter/getter) and wires it up in framework/shell; updates Vite alias and package.json to include the new dpapi workspace. Includes native addon binaries for win32 x64/arm64 and basic tsconfig/readme/license for the new package.
2026-02-12 17:08:24 +08:00
林小槐
82d0c51716 feat(webui): 插件商店增加插件详情弹窗并支持通过 url 传递 id 直接打开 (#1615)
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
* feat(webui): 插件商店增加插件详情弹窗并支持通过 url 传递 id 直接打开

* fix(webui):type check
2026-02-11 12:12:06 +08:00
手瓜一十雪
37fb2d68d7 Prefer QQAppId/ marker when parsing AppID
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
Add parseAppidFromMajorV2 to napcat-common to scan a Major file for the "QQAppId/" marker and extract a null-terminated numeric AppID. Update qq-basic-info to import and prefer this new parser (falling back to the existing parseAppidFromMajor). Also correct the getMajorPath argument order when obtaining the major file path. This enables detection of AppID from a newer Major format while preserving legacy fallback behavior.
2026-02-08 09:55:31 +08:00
手瓜一十雪
a240f93784 Add appid entry for 9.9.27-45758
Add a new mapping to packages/napcat-core/external/appid.json for version 9.9.27-45758 (Windows). The entry sets appid to 537340213 and qua to "V1_WIN_NQ_9.9.27_45758_GW_B".
2026-02-08 09:41:14 +08:00
时瑾
172a75b514 fix(webui-backend): sanitize plugin ID to prevent path injection (CodeQL js/path-injection)
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
2026-02-07 13:52:15 +08:00
时瑾
beef1233fa fix(ci): 修复 Update apifox 步骤中因 OpenAPI 文件过大导致的参数列表过长错误 2026-02-07 13:44:25 +08:00
时瑾
8f69e2424a fix(backend): 修复插件列表接口新增字段导致的类型错误 2026-02-07 13:38:53 +08:00
时瑾
f3156b1843 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2026-02-07 13:32:58 +08:00
时瑾
61a16b44a4 style(webui): 优化插件商店与插件管理界面 UI/UX
- 重构插件卡片样式,采用毛玻璃效果与主题色交互
- 优化插件商店搜索栏布局,增加对顶部搜索及 Ctrl+F 快捷键的支持
- 实现智能头像提取逻辑,支持从 GitHub、自定义域名(Favicon)及 Vercel 自动生成
- 增加插件描述溢出预览(悬停提示及点击展开功能)
- 修复标签溢出处理,支持 Tooltip 完整显示
- 增强后端插件列表 API,支持返回主页及仓库信息
- 修复部分类型错误与代码规范问题
2026-02-07 13:30:50 +08:00
Nepenthe
7b17ef44dd Merge pull request #1598 from faithleysath/feat/schema-enhancement-refactor
refactor(schema): 重构 schema 组件引用与 OpenAPI 生成流程,并补齐消息 union 类型
2026-02-07 13:27:58 +08:00
吴天一
2c166299a3 fix(schema): 添加 data 字段描述到 BaseResponseSchema 2026-02-07 13:21:06 +08:00
吴天一
75d2611eda fix(schema): 将响应 data 字段标记为必填 2026-02-07 09:27:47 +08:00
吴天一
e2d2e65620 fix(schema): 修复 properties 容器误判导致错误注入 type 2026-02-06 21:37:50 +08:00
吴天一
f479fccf3e refactor(schema): 提取并复用 OpenAPI 响应示例,减少重复定义
在 napcat-schema 中引入 ActionExamples,统一复用公共错误示例定义。

新增默认成功示例 Success_Default,并注册到 components.examples。

将公共错误示例(1400/1401/1404)集中注册到 components.examples,统一响应示例来源。

优化 buildResponseExamples:当 returnExample 为 null、空对象或空数组时,自动引用默认成功示例;当错误示例命中公共定义时,优先使用  引用组件示例,未命中时保持内联示例。

未提供 errorExamples 时,默认引用 #/components/examples/Error_1400,减少重复定义并提升文档一致性。

本次变更不改变接口响应结构,主要改进 OpenAPI 示例复用策略与文档可维护性。
2026-02-06 17:07:24 +08:00
吴天一
45652612b4 refactor(schema): 重构消息 schema 与 OpenAPI 生成流程
- 为 OneBot action 相关对象补充稳定 $id,提升 schema 复用与组件引用能力
- 补齐消息联合类型,纳入 location/xml/miniapp 等消息段定义
- 重构 napcat-schema 中 OpenAPI 生成逻辑,优化组件注册与缺失项报告
- openapi schema 文件行数从 36433 缩减到 23137(减少 13296 行,约 36.5%)
- 统一 schema 结构与描述,降低后续扩展与文档生成维护成本
2026-02-06 16:12:34 +08:00
pohgxz
54266f97f8 fix: 尝试修复 Update apifox 错误
Some checks failed
Build NapCat Artifacts / Build-Framework (push) Has been cancelled
Build NapCat Artifacts / Build-Shell (push) Has been cancelled
2026-02-05 22:47:02 +08:00
手瓜一十雪
687a5f5708 Update ffmpeg native addon binaries
feat: ogg opus格式支持 fix #1593
2026-02-05 22:00:12 +08:00
手瓜一十雪
3dab2b4361 Update appid for 3.2.25-45758
Correct the appid entry in packages/napcat-core/external/appid.json for version 3.2.25-45758, changing it from 537314197 to 537340249 to ensure the build is identified correctly. (File now lacks a trailing newline.)
2026-02-05 20:28:11 +08:00
006lp
74be268dbe Update appid and qua for version 3.2.25-45758 (#1596)
Signed-off-by: 006lp <144674902+006lp@users.noreply.github.com>
2026-02-05 20:27:53 +08:00
手瓜一十雪
8b3f60628e Bump appid entry to 3.2.25-45758
Rename the object key in packages/napcat-core/external/appid.json from "3.2.25-45627" to "3.2.25-45758" to register the new build. The appid (537340249) and qua string were not modified in this change; please verify whether the qua should also be updated to match the new build identifier.
2026-02-05 20:13:48 +08:00
手瓜一十雪
f0eb6379c1 Add Linux appid 3.2.25-45627
Add a new entry to packages/napcat-core/external/appid.json for version 3.2.25-45627 with appid 537340249 and qua "V1_LNX_NQ_3.2.25_45627_GW_B". This registers the Linux build identifier in the appid mapping.
2026-02-05 20:05:35 +08:00
手瓜一十雪
f3e24811ad Simplify QQ/Node download in release workflow
Merge and simplify the QQ and Node.js download steps in .github/workflows/release.yml: remove the actions/cache step and related QQ cache logic, always download the QQ x64 installer directly, and assemble/extract using a single temporary directory (TMPDIR). Also rename the step to "Download and Assemble NapCat.Shell.Windows.Node.zip" and switch NODE_EXTRACT to use TMPDIR instead of WORK_TMPDIR. This reduces workflow complexity and avoids maintaining a local cache for the QQ installer.
2026-02-05 18:40:47 +08:00
131 changed files with 6426 additions and 1530 deletions

View File

@@ -10,7 +10,7 @@ permissions: write-all
env:
OPENROUTER_API_URL: https://91vip.futureppo.top/v1/chat/completions
OPENROUTER_MODEL: "copilot/gemini-3-flash-preview"
OPENROUTER_MODEL: "deepseek-v3.2-chat"
RELEASE_NAME: "NapCat"
jobs:
@@ -118,61 +118,23 @@ jobs:
sudo apt update
sudo apt install -y aria2 unzip zip p7zip-full curl jq
- name: Download QQ x64, Node.js and Assemble NapCat.Shell.Windows.Node.zip
- name: Download and Assemble NapCat.Shell.Windows.Node.zip
run: |
set -euo pipefail
TMPDIR=$(mktemp -d)
cd "$TMPDIR"
# -----------------------------
# 1) 下载 QQ x64 (使用缓存)
# 1) 下载 QQ x64
# -----------------------------
# JS_URL="https://cdn-go.cn/qq-web/im.qq.com_new/latest/rainbow/windowsConfig.js"
# JS_URL="https://slave.docadan488.workers.dev/proxy?url=https://cdn-go.cn/qq-web/im.qq.com_new/latest/rainbow/windowsConfig.js"
# NT_URL=$(curl -fsSL "$JS_URL" | grep -oP '"ntDownloadX64Url"\s*:\s*"\K[^"]+')
NT_URL="https://dldir1v6.qq.com/qqfile/qq/QQNT/32876254/QQ9.9.27.45627_x64.exe"
QQ_ZIP="$(basename "$NT_URL")"
# 根据 URL 生成缓存键
QQ_CACHE_KEY="qq-x64-$(echo "$NT_URL" | md5sum | cut -d' ' -f1)"
echo "QQ_CACHE_KEY=$QQ_CACHE_KEY" >> $GITHUB_ENV
echo "QQ_ZIP=$QQ_ZIP" >> $GITHUB_ENV
echo "NT_URL=$NT_URL" >> $GITHUB_ENV
- name: Cache QQ x64 Installer
id: cache-qq
uses: actions/cache@v4
with:
path: ~/qq-cache
key: ${{ env.QQ_CACHE_KEY }}
- name: Download and Extract QQ x64
run: |
set -euo pipefail
TMPDIR=$(mktemp -d)
cd "$TMPDIR"
QQ_CACHE_DIR="$HOME/qq-cache"
mkdir -p "$QQ_CACHE_DIR"
echo "Downloading QQ installer: $QQ_ZIP"
aria2c -x16 -s16 -k1M -o "$QQ_ZIP" "$NT_URL"
if [ -f "$QQ_CACHE_DIR/$QQ_ZIP" ]; then
echo "Using cached QQ installer: $QQ_ZIP"
cp "$QQ_CACHE_DIR/$QQ_ZIP" "$QQ_ZIP"
else
echo "Downloading QQ installer: $QQ_ZIP"
aria2c -x16 -s16 -k1M -o "$QQ_ZIP" "$NT_URL"
cp "$QQ_ZIP" "$QQ_CACHE_DIR/$QQ_ZIP"
fi
QQ_EXTRACT="$TMPDIR/qq_extracted"
mkdir -p "$QQ_EXTRACT"
7z x -y -o"$QQ_EXTRACT" "$QQ_ZIP" >/dev/null
echo "QQ_EXTRACT=$QQ_EXTRACT" >> $GITHUB_ENV
echo "WORK_TMPDIR=$TMPDIR" >> $GITHUB_ENV
- name: Download Node.js and Assemble NapCat.Shell.Windows.Node.zip
run: |
set -euo pipefail
cd "$WORK_TMPDIR"
# -----------------------------
# 2) 下载 Node.js Windows x64 zip 22.11.0
@@ -182,7 +144,7 @@ jobs:
NODE_ZIP="node-v$NODE_VER-win-x64.zip"
aria2c -x1 -s1 -k1M -o "$NODE_ZIP" "$NODE_URL"
NODE_EXTRACT="$WORK_TMPDIR/node_extracted"
NODE_EXTRACT="$TMPDIR/node_extracted"
mkdir -p "$NODE_EXTRACT"
unzip -q "$NODE_ZIP" -d "$NODE_EXTRACT"
@@ -434,7 +396,7 @@ jobs:
--arg system "$SYSTEM_PROMPT" \
--arg user "$USER_CONTENT" \
--arg model "$OPENROUTER_MODEL" \
'{model: $model, messages:[{role:"system", content:$system},{role:"user", content:$user}], temperature:0.2, max_tokens:1500}')
'{model: $model, messages:[{role:"system", content:$system},{role:"user", content:$user}], temperature:0.2, max_tokens:5000}')
echo "=== OpenRouter request body ==="
echo "$BODY" | jq .
@@ -496,24 +458,23 @@ jobs:
pnpm i
pnpm run build:openapi
# 读取并压缩 openapi.json 内容
OPENAPI_CONTENT=$(cat packages/napcat-schema/openapi.json | tr -d '\n\r\t' | sed 's/ */ /g' | sed 's/"/\\"/g')
# 构建 JSON 数据
JSON_DATA=$(printf '{
"input": "%s",
"options": {
# 使用 jq 安全地构建大型 JSON 数据并保存到文件
jq -n --rawfile input packages/napcat-schema/dist/openapi.json \
'{
input: $input,
options: {
"endpointOverwriteBehavior": "OVERWRITE_EXISTING",
"schemaOverwriteBehavior": "OVERWRITE_EXISTING",
"updateFolderOfChangedEndpoint": true,
"moduleId": 1140714,
"deleteUnmatchedResources": true
}
}' "$OPENAPI_CONTENT")
}' > apifox_payload.json
# 通过文件形式发送数据,避免命令行长度限制
curl --location -g --request POST 'https://api.apifox.com/v1/projects/5348325/import-openapi?locale=zh-CN' \
--header 'X-Apifox-Api-Version: 2024-03-28' \
--header 'Authorization: Bearer $APIFOX_TOKEN' \
--header "Authorization: Bearer $APIFOX_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw "$JSON_DATA"
--data-binary @apifox_payload.json

3
.gitignore vendored
View File

@@ -10,6 +10,9 @@ devconfig/*
!.vscode/extensions.json
.idea/*
# macOS
.DS_Store
# Build
*.db
checkVersion.sh

View File

@@ -184,6 +184,35 @@ export function stringifyWithBigInt (obj: any) {
);
}
export function parseAppidFromMajorV2 (nodeMajor: string): string | undefined {
const marker = Buffer.from('QQAppId/', 'utf-8');
const filePath = path.resolve(nodeMajor);
const fileContent = fs.readFileSync(filePath);
let searchPosition = 0;
while (true) {
const index = fileContent.indexOf(marker, searchPosition);
if (index === -1) {
break;
}
const start = index + marker.length;
const end = fileContent.indexOf(0x00, start);
if (end === -1) {
break;
}
const content = fileContent.subarray(start, end);
const str = content.toString('utf-8');
if (/^\d+$/.test(str)) {
return str;
}
searchPosition = end + 1;
}
return undefined;
}
export function parseAppidFromMajor (nodeMajor: string): string | undefined {
const hexSequence = 'A4 09 00 00 00 35';
const sequenceBytes = Buffer.from(hexSequence.replace(/ /g, ''), 'hex');

View File

@@ -526,5 +526,13 @@
"6.9.88-44725": {
"appid": 537337594,
"qua": "V1_MAC_NQ_6.9.88_44725_GW_B"
},
"3.2.25-45758": {
"appid": 537340249,
"qua": "V1_LNX_NQ_3.2.25_45758_GW_B"
},
"9.9.27-45758": {
"appid": 537340213,
"qua": "V1_WIN_NQ_9.9.27_45758_GW_B"
}
}

View File

@@ -1,9 +1,17 @@
{
"fileLog": false,
"consoleLog": true,
"fileLogLevel": "debug",
"consoleLogLevel": "info",
"packetBackend": "auto",
"packetServer": "",
"o3HookMode": 1
}
"fileLog": false,
"consoleLog": true,
"fileLogLevel": "debug",
"consoleLogLevel": "info",
"packetBackend": "auto",
"packetServer": "",
"o3HookMode": 1,
"bypass": {
"hook": false,
"window": false,
"module": false,
"process": false,
"container": false,
"js": false
}
}

View File

@@ -1,7 +1,19 @@
import { ConfigBase } from '@/napcat-core/helper/config-base';
import { NapCatCore } from '@/napcat-core/index';
import { Type, Static } from '@sinclair/typebox';
import { AnySchema } from 'ajv';
import Ajv, { AnySchema } from 'ajv';
import path from 'node:path';
import fs from 'node:fs';
import json5 from 'json5';
export const BypassOptionsSchema = Type.Object({
hook: Type.Boolean({ default: true }),
window: Type.Boolean({ default: true }),
module: Type.Boolean({ default: true }),
process: Type.Boolean({ default: true }),
container: Type.Boolean({ default: true }),
js: Type.Boolean({ default: true }),
});
export const NapcatConfigSchema = Type.Object({
fileLog: Type.Boolean({ default: false }),
@@ -11,10 +23,31 @@ export const NapcatConfigSchema = Type.Object({
packetBackend: Type.String({ default: 'auto' }),
packetServer: Type.String({ default: '' }),
o3HookMode: Type.Number({ default: 0 }),
bypass: Type.Optional(BypassOptionsSchema),
});
export type NapcatConfig = Static<typeof NapcatConfigSchema>;
/**
* 从指定配置目录读取 napcat.json按 NapcatConfigSchema 校验并填充默认值
* 用于登录前(无 NapCatCore 实例时)的早期配置读取
*/
export function loadNapcatConfig (configPath: string): NapcatConfig {
const ajv = new Ajv({ useDefaults: true, coerceTypes: true });
const validate = ajv.compile<NapcatConfig>(NapcatConfigSchema);
let data: Record<string, unknown> = {};
try {
const configFile = path.join(configPath, 'napcat.json');
if (fs.existsSync(configFile)) {
data = json5.parse(fs.readFileSync(configFile, 'utf-8'));
}
} catch {
// 读取失败时使用 schema 默认值
}
validate(data);
return data as NapcatConfig;
}
export class NapCatConfigLoader extends ConfigBase<NapcatConfig> {
constructor (core: NapCatCore, configPath: string, schema: AnySchema) {
super('napcat', core, configPath, schema);

View File

@@ -1,6 +1,6 @@
import fs from 'node:fs';
import { systemPlatform } from 'napcat-common/src/system';
import { getDefaultQQVersionConfigInfo, getQQPackageInfoPath, getQQVersionConfigPath, parseAppidFromMajor } from 'napcat-common/src/helper';
import { getDefaultQQVersionConfigInfo, getQQPackageInfoPath, getQQVersionConfigPath, parseAppidFromMajor, parseAppidFromMajorV2 } from 'napcat-common/src/helper';
import AppidTable from '@/napcat-core/external/appid.json';
import { LogWrapper } from './log';
import { getMajorPath } from '@/napcat-core/index';
@@ -107,7 +107,13 @@ export class QQBasicInfoWrapper {
if (!this.QQMainPath) {
throw new Error('QQMainPath未定义 无法通过Major获取Appid');
}
const majorPath = getMajorPath(QQVersion, this.QQMainPath);
const majorPath = getMajorPath(this.QQMainPath, QQVersion);
// 优先通过 QQAppId/ 标记搜索
const appidV2 = parseAppidFromMajorV2(majorPath);
if (appidV2) {
return appidV2;
}
// 回落到旧方式
const appid = parseAppidFromMajor(majorPath);
return appid;
}

View File

@@ -33,6 +33,7 @@ import { NodeIKernelMsgListener, NodeIKernelProfileListener } from '@/napcat-cor
import { proxiedListenerOf } from '@/napcat-core/helper/proxy-handler';
import { NTQQPacketApi } from './apis/packet';
import { NativePacketHandler } from './packet/handler/client';
import { Napi2NativeLoader } from './packet/handler/napi2nativeLoader';
import { container, ReceiverServiceRegistry } from './packet/handler/serviceRegister';
import { appEvent } from './packet/handler/eventList';
import { TypedEventEmitter } from './packet/handler/typeEvent';
@@ -314,6 +315,7 @@ export interface InstanceContext {
readonly basicInfoWrapper: QQBasicInfoWrapper;
readonly pathWrapper: NapCatPathWrapper;
readonly packetHandler: NativePacketHandler;
readonly napi2nativeLoader: Napi2NativeLoader;
}
export interface StableNTApiWrapper {

View File

@@ -1,11 +1,8 @@
import path, { dirname } from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
import { constants } from 'node:os';
import { LogStack } from '@/napcat-core/packet/context/clientContext';
import { NapCoreContext } from '@/napcat-core/packet/context/napCoreContext';
import { PacketLogger } from '@/napcat-core/packet/context/loggerContext';
import { OidbPacket, PacketBuf } from '@/napcat-core/packet/transformer/base';
import { Napi2NativeLoader } from '@/napcat-core/packet/handler/napi2nativeLoader';
export interface RecvPacket {
type: string, // 仅recv
data: RecvPacketData;
@@ -17,48 +14,36 @@ export interface RecvPacketData {
data: Buffer;
}
// 0 send 1 recv
export interface NativePacketExportType {
initHook?: (send: string, recv: string) => boolean;
}
export class NativePacketClient {
protected readonly napcore: NapCoreContext;
protected readonly logger: PacketLogger;
protected readonly cb = new Map<string, (json: RecvPacketData) => Promise<any> | any>(); // hash-type callback
protected readonly napi2nativeLoader: Napi2NativeLoader;
logStack: LogStack;
available: boolean = false;
private readonly supportedPlatforms = ['win32.x64', 'linux.x64', 'linux.arm64', 'darwin.x64', 'darwin.arm64'];
private readonly MoeHooExport: { exports: NativePacketExportType; } = { exports: {} };
constructor (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) {
constructor (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack, napi2nativeLoader: Napi2NativeLoader) {
this.napcore = napCore;
this.logger = logger;
this.logStack = logStack;
this.napi2nativeLoader = napi2nativeLoader;
}
check (): boolean {
const platform = process.platform + '.' + process.arch;
if (!this.supportedPlatforms.includes(platform)) {
this.logStack.pushLogWarn(`NativePacketClient: 不支持的平台: ${platform}`);
return false;
}
const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './native/napi2native/napi2native.' + platform + '.node');
if (!fs.existsSync(moehoo_path)) {
this.logStack.pushLogWarn(`NativePacketClient: 缺失运行时文件: ${moehoo_path}`);
if (!this.napi2nativeLoader.loaded) {
this.logStack.pushLogWarn('NativePacketClient: Napi2NativeLoader 未成功加载');
return false;
}
return true;
}
async init (_pid: number, recv: string, send: string): Promise<void> {
const platform = process.platform + '.' + process.arch;
const isNewQQ = this.napcore.basicInfo.requireMinNTQQBuild('40824');
if (isNewQQ) {
const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './native/napi2native/napi2native.' + platform + '.node');
process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY);
this.MoeHooExport?.exports.initHook?.(send, recv);
this.available = true;
const success = this.napi2nativeLoader.initHook(send, recv);
if (success) {
this.available = true;
}
}
}

View File

@@ -2,6 +2,7 @@ import { NativePacketClient } from '@/napcat-core/packet/client/nativeClient';
import { OidbPacket } from '@/napcat-core/packet/transformer/base';
import { PacketLogger } from '@/napcat-core/packet/context/loggerContext';
import { NapCoreContext } from '@/napcat-core/packet/context/napCoreContext';
import { Napi2NativeLoader } from '@/napcat-core/packet/handler/napi2nativeLoader';
export class LogStack {
private stack: string[] = [];
@@ -43,12 +44,14 @@ export class PacketClientContext {
private readonly napCore: NapCoreContext;
private readonly logger: PacketLogger;
private readonly logStack: LogStack;
private readonly napi2nativeLoader: Napi2NativeLoader;
private readonly _client: NativePacketClient;
constructor (napCore: NapCoreContext, logger: PacketLogger) {
constructor (napCore: NapCoreContext, logger: PacketLogger, napi2nativeLoader: Napi2NativeLoader) {
this.napCore = napCore;
this.logger = logger;
this.logStack = new LogStack(logger);
this.napi2nativeLoader = napi2nativeLoader;
this._client = this.newClient();
}
@@ -64,14 +67,14 @@ export class PacketClientContext {
await this._client.init(pid, recv, send);
}
async sendOidbPacket<T extends boolean = false>(pkt: OidbPacket, rsp?: T, timeout?: number): Promise<T extends true ? Buffer : void> {
async sendOidbPacket<T extends boolean = false> (pkt: OidbPacket, rsp?: T, timeout?: number): Promise<T extends true ? Buffer : void> {
const raw = await this._client.sendOidbPacket(pkt, rsp, timeout);
return raw.data as T extends true ? Buffer : void;
}
private newClient (): NativePacketClient {
this.logger.info('使用 NativePacketClient 作为后端');
const client = new NativePacketClient(this.napCore, this.logger, this.logStack);
const client = new NativePacketClient(this.napCore, this.logger, this.logStack, this.napi2nativeLoader);
if (!client.check()) {
throw new Error('[Core] [Packet] NativePacketClient 不可用NapCat.Packet将不会加载');
}

View File

@@ -34,5 +34,9 @@ export class NapCoreContext {
return this.core.configLoader.configData;
}
get napi2nativeLoader () {
return this.core.context.napi2nativeLoader;
}
sendSsoCmdReqByContend = (cmd: string, data: Buffer) => this.core.context.session.getMsgService().sendSsoCmdReqByContend(cmd, data);
}

View File

@@ -18,7 +18,7 @@ export class PacketContext {
this.msgConverter = new PacketMsgConverter();
this.napcore = new NapCoreContext(core);
this.logger = new PacketLogger(this.napcore);
this.client = new PacketClientContext(this.napcore, this.logger);
this.client = new PacketClientContext(this.napcore, this.logger, this.napcore.napi2nativeLoader);
this.highway = new PacketHighwayContext(this.napcore, this.logger, this.client);
this.operation = new PacketOperationContext(this);
}

View File

@@ -194,7 +194,7 @@ export class NativePacketHandler {
}
}
async init (version: string): Promise<boolean> {
async init (version: string, o3HookMode: boolean = false): Promise<boolean> {
const version_arch = version + '-' + process.arch;
try {
if (!this.loaded) {
@@ -215,7 +215,7 @@ export class NativePacketHandler {
this.MoeHooExport.exports.initHook?.(send, recv, (type: PacketType, uin: string, cmd: string, seq: number, hex_data: string) => {
this.emitPacket(type, uin, cmd, seq, hex_data);
}, true);
}, o3HookMode);
this.logger.log('[PacketHandler] 初始化成功');
return true;
} catch (error) {

View File

@@ -0,0 +1,90 @@
import path, { dirname } from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
import { constants } from 'node:os';
import { LogWrapper } from '../../helper/log';
export interface BypassOptions {
hook?: boolean;
window?: boolean;
module?: boolean;
process?: boolean;
container?: boolean;
js?: boolean;
}
export interface Napi2NativeExportType {
initHook?: (send: string, recv: string) => boolean;
setVerbose?: (verbose: boolean) => void; // 默认关闭日志
enableAllBypasses?: (options?: BypassOptions) => boolean;
}
export class Napi2NativeLoader {
private readonly supportedPlatforms = ['win32.x64', 'linux.x64', 'linux.arm64', 'darwin.x64', 'darwin.arm64'];
private readonly exports: { exports: Napi2NativeExportType; } = { exports: {} };
protected readonly logger: LogWrapper;
private _loaded: boolean = false;
constructor ({ logger }: { logger: LogWrapper; }) {
this.logger = logger;
this.load();
}
private load (): void {
const platform = process.platform + '.' + process.arch;
if (!this.supportedPlatforms.includes(platform)) {
this.logger.logWarn(`Napi2NativeLoader: 不支持的平台: ${platform}`);
this._loaded = false;
return;
}
const nativeModulePath = path.join(
dirname(fileURLToPath(import.meta.url)),
'./native/napi2native/napi2native.' + platform + '.node'
);
if (!fs.existsSync(nativeModulePath)) {
this.logger.logWarn(`Napi2NativeLoader: 缺失运行时文件: ${nativeModulePath}`);
this._loaded = false;
return;
}
try {
process.dlopen(this.exports, nativeModulePath, constants.dlopen.RTLD_LAZY);
this._loaded = true;
this.logger.log('[Napi2NativeLoader] 加载成功');
} catch (error) {
this.logger.logError('Napi2NativeLoader 加载出错:', error);
this._loaded = false;
}
}
get loaded (): boolean {
return this._loaded;
}
get nativeExports (): Napi2NativeExportType {
return this.exports.exports;
}
/**
* 初始化 Hook
* @param send send 偏移地址
* @param recv recv 偏移地址
* @returns 是否初始化成功
*/
initHook (send: string, recv: string): boolean {
if (!this._loaded) {
this.logger.logWarn('Napi2NativeLoader 未成功加载,无法初始化 Hook');
return false;
}
try {
return this.nativeExports.initHook?.(send, recv) ?? false;
} catch (error) {
this.logger.logError('Napi2NativeLoader initHook 出错:', error);
return false;
}
}
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelAVSDKService {
addKernelAVSDKListener (listener: unknown): number;
removeKernelAVSDKListener (listenerId: number): void;
isNull (): boolean;
}

View File

@@ -0,0 +1,15 @@
export interface NodeIKernelAddBuddyService {
addBuddy (arg1: string, arg2: unknown, arg3: unknown): unknown;
getAddBuddyRequestTag (arg1: string, arg2: unknown, arg3: unknown): unknown;
getBuddySetting (arg1: string, arg2: unknown, arg3: unknown): unknown;
getSmartInfo (arg1: string, arg2: unknown, arg3: unknown): unknown;
queryUinSafetyFlag (arg1: string, arg2: unknown, arg3: unknown): unknown;
requestInfoByAccount (arg1: string, arg2: unknown, arg3: unknown): unknown;
isNull (): boolean;
}

View File

@@ -2,17 +2,17 @@ import { AlbumCommentReplyContent, AlbumFeedLikePublish, AlbumListRequest, Album
export interface NodeIKernelAlbumService {
setAlbumServiceInfo(...args: unknown[]): unknown;// needs 3 arguments
setAlbumServiceInfo (arg1: string, arg2: string, arg3: string): unknown;// needs 3 arguments
getMainPage(...args: unknown[]): unknown;// needs 2 arguments
getMainPage (arg1: unknown, arg2: unknown): unknown;// needs 2 arguments
getAlbumList(params: {
getAlbumList (params: {
qun_id: string,
attach_info: string,
seq: number,
request_time_line: {
request_invoke_time: string
}
request_invoke_time: string;
};
}): Promise<{
response: {
seq: number,
@@ -21,57 +21,57 @@ export interface NodeIKernelAlbumService {
trace_id: string,
is_from_cache: boolean,
request_time_line: unknown,
album_list: Array<{ name: string, album_id: string }>,
album_list: Array<{ name: string, album_id: string; }>,
attach_info: string,
has_more: boolean,
right: unknown,
banner: unknown
}
}>
getAlbumInfo(...args: unknown[]): unknown;// needs 1 arguments
banner: unknown;
};
}>;
getAlbumInfo (arg: unknown): unknown;// needs 1 arguments
deleteAlbum(...args: unknown[]): unknown;// needs 3 arguments
deleteAlbum (arg1: number, arg2: string, arg3: string): unknown;// needs 3 arguments
addAlbum(...args: unknown[]): unknown;// needs 2 arguments
addAlbum (arg1: unknown, arg2: unknown): unknown;// needs 2 arguments
deleteMedias(seq: number, group_code: string, album_id: string, media_ids: string[], ban_ids: unknown[]): Promise<unknown>;// needs 4 arguments
deleteMedias (seq: number, group_code: string, album_id: string, media_ids: string[], ban_ids: unknown[]): Promise<unknown>;// needs 4 arguments
modifyAlbum(...args: unknown[]): unknown;// needs 3 arguments
modifyAlbum (arg1: number, arg2: unknown, arg3: Array<unknown>[]): unknown;// needs 3 arguments
getMediaList(param: AlbumListRequest): Promise<{
getMediaList (param: AlbumListRequest): Promise<{
response: {
seq: number,
result: number,
errMs: string, // 没错就是errMs不是errMsg
trace_id: string,
request_time_line: unknown,
}
};
}>;// needs 1 arguments
quoteToQzone(...args: unknown[]): unknown;// needs 1 arguments
quoteToQzone (arg: unknown): unknown;// needs 1 arguments
quoteToQunAlbum(...args: unknown[]): unknown;// needs 1 arguments
quoteToQunAlbum (arg: unknown): unknown;// needs 1 arguments
queryQuoteToQunAlbumStatus(...args: unknown[]): unknown;// needs 1 arguments
queryQuoteToQunAlbumStatus (arg: unknown): unknown;// needs 1 arguments
getQunFeeds(...args: unknown[]): unknown;// needs 1 arguments
getQunFeeds (arg: unknown): unknown;// needs 1 arguments
getQunFeedDetail(...args: unknown[]): unknown;// needs 1 arguments
getQunFeedDetail (arg: unknown): unknown;// needs 1 arguments
getQunNoticeList(...args: unknown[]): unknown;// needs 4 arguments
getQunNoticeList (arg1: number, arg2: unknown, arg3: string, arg4: string): unknown;// needs 4 arguments
getQunComment(...args: unknown[]): unknown;// needs 1 arguments
getQunComment (arg: unknown): unknown;// needs 1 arguments
getQunLikes(...args: unknown[]): unknown;// needs 4 arguments
getQunLikes (arg1: number, arg2: unknown, arg3: string, arg4: string): unknown;// needs 4 arguments
deleteQunFeed(...args: unknown[]): unknown;// needs 1 arguments
deleteQunFeed (arg: unknown): unknown;// needs 1 arguments
// seq random
// stCommonExt {"map_info":[],"map_bytes_info":[],"map_user_account":[]}
// qunId string
doQunComment(seq: number, ext: {
doQunComment (seq: number, ext: {
map_info: unknown[],
map_bytes_info: unknown[],
map_user_account: unknown[]
map_user_account: unknown[];
},
qunId: string,
commentType: number,
@@ -79,23 +79,23 @@ export interface NodeIKernelAlbumService {
content: AlbumCommentReplyContent,
): Promise<unknown>;// needs 6 arguments
doQunReply(...args: unknown[]): unknown;// needs 7 arguments
doQunReply (arg1: number, arg2: unknown, arg3: string, arg4: number, arg5: unknown, arg6: unknown, arg7: unknown): unknown;// needs 7 arguments
doQunLike(
doQunLike (
seq: number,
ext: {
map_info: unknown[],
map_bytes_info: unknown[],
map_user_account: unknown[]
map_user_account: unknown[];
},
param: {
// {"id":"421_1_0_1012959257|V61Yiali4PELg90bThrH4Bo2iI1M5Kab|V5bCgAxMDEyOTU5MjU3e*KqaLVYdic!^||^421_1_0_1012959257|V61Yiali4PELg90bThrH4Bo2iI1M5Kab|17560336594^||^1","status":1}
id: string,
status: number
status: number;
},
like: AlbumFeedLikePublish
): Promise<unknown>;// needs 5 arguments
getRedPoints(...args: unknown[]): unknown;// needs 3 arguments
getRedPoints (arg1: string, arg2: number, arg3: string): unknown;// needs 3 arguments
}

View File

@@ -13,13 +13,13 @@ export interface NodeIKernelAvatarService {
forceDownloadGroupAvatar(arg1: unknown, arg2: unknown): unknown;
getGroupPortraitPath(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
getGroupPortraitPath(arg1: string, arg2: number, arg3: number): unknown;
forceDownloadGroupPortrait(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
forceDownloadGroupPortrait(arg1: string, arg2: number, arg3: number): unknown;
getAvatarPaths(arg1: unknown, arg2: unknown): unknown;
getAvatarPaths(arg1: Array<unknown>[], arg2: number): unknown;
getGroupAvatarPaths(arg1: unknown, arg2: unknown): unknown;
getGroupAvatarPaths(arg1: Array<unknown>[], arg2: string): unknown;
getConfGroupAvatarPaths(arg: unknown): unknown;

View File

@@ -0,0 +1,9 @@
export interface NodeIKernelBdhUploadService {
addKernelBdhUploadListener (listener: unknown): number;
removeKernelBdhUploadListener (listenerId: number): void;
setBdhTestEnv (arg1: string, arg2: number): unknown;
isNull (): boolean;
}

View File

@@ -130,5 +130,21 @@ export interface NodeIKernelBuddyService {
getBuddyRecommendContactArkJson (uid: string, phoneNumber: string): Promise<GeneralCallResult & { arkMsg: string; }>;
checkIsBuddyAsync (uid: string): Promise<unknown>;
areBuddies (callFrom: string, uids: string[]): unknown;
getCategoryById (id: number): unknown;
addCategoryV2 (name: string, buddyUids?: unknown): Promise<unknown>;
isNull (): boolean;
getAddFriendBlockedList (): unknown;
getAddFriendBlockedRedPoint (): unknown;
reportAddFriendBlocked (): unknown;
setWXMsgNotify (arg: unknown): unknown;
}

View File

@@ -1,91 +1,91 @@
import { GeneralCallResult } from './common';
export interface NodeIKernelCollectionService {
addKernelCollectionListener(...args: unknown[]): void;// needs 1 arguments
addKernelCollectionListener (listener: unknown): void;// needs 1 arguments
removeKernelCollectionListener(listenerId: number): void;
removeKernelCollectionListener (listenerId: number): void;
getCollectionItemList(param: {
getCollectionItemList (param: {
category: number,
groupId: number,
forceSync: boolean,
forceFromDb: boolean,
timeStamp: string,
count: number,
searchDown: boolean
searchDown: boolean;
}): Promise<GeneralCallResult &
{
collectionSearchList: {
collectionItemList: Array<
{
cid: string,
type: number,
status: number,
author: {
type: number,
numId: string,
strId: string,
groupId: string,
groupName: string,
uid: string
},
bid: number,
category: number,
createTime: string,
collectTime: string,
modifyTime: string,
sequence: string,
shareUrl: string,
customGroupId: number,
securityBeat: boolean,
summary: {
textSummary: unknown,
linkSummary: unknown,
gallerySummary: unknown,
audioSummary: unknown,
videoSummary: unknown,
fileSummary: unknown,
locationSummary: unknown,
richMediaSummary: unknown,
}
}>,
hasMore: boolean,
bottomTimeStamp: string
}
}
>;
{
collectionSearchList: {
collectionItemList: Array<
{
cid: string,
type: number,
status: number,
author: {
type: number,
numId: string,
strId: string,
groupId: string,
groupName: string,
uid: string;
},
bid: number,
category: number,
createTime: string,
collectTime: string,
modifyTime: string,
sequence: string,
shareUrl: string,
customGroupId: number,
securityBeat: boolean,
summary: {
textSummary: unknown,
linkSummary: unknown,
gallerySummary: unknown,
audioSummary: unknown,
videoSummary: unknown,
fileSummary: unknown,
locationSummary: unknown,
richMediaSummary: unknown,
};
}>,
hasMore: boolean,
bottomTimeStamp: string;
};
}
>;
getCollectionContent(...args: unknown[]): unknown;// needs 5 arguments
getCollectionContent (arg1: string, arg2: number, arg3: string, arg4: string, arg5: boolean): unknown;// needs 5 arguments
getCollectionCustomGroupList(...args: unknown[]): unknown;// needs 0 arguments
getCollectionCustomGroupList (): unknown;// needs 0 arguments
getCollectionUserInfo(...args: unknown[]): unknown;// needs 0 arguments
getCollectionUserInfo (): unknown;// needs 0 arguments
searchCollectionItemList(...args: unknown[]): unknown;// needs 2 arguments
searchCollectionItemList (arg1: string, arg2: unknown): unknown;// needs 2 arguments
addMsgToCollection(...args: unknown[]): unknown;// needs 2 arguments
addMsgToCollection (arg1: unknown, arg2: unknown): unknown;// needs 2 arguments
collectionArkShare(...args: unknown[]): unknown;// needs 1 arguments
collectionArkShare (arg: unknown): unknown;// needs 1 arguments
collectionFileForward(...args: unknown[]): unknown;// needs 3 arguments
collectionFileForward (arg1: number, arg2: string, arg3: unknown): unknown;// needs 3 arguments
downloadCollectionFile(...args: unknown[]): unknown;// needs 4 arguments
downloadCollectionFile (arg1: string, arg2: string, arg3: unknown, arg4: string): unknown;// needs 4 arguments
downloadCollectionFileThumbPic(...args: unknown[]): unknown;// needs 4 arguments
downloadCollectionFileThumbPic (arg1: string, arg2: string, arg3: unknown, arg4: number): unknown;// needs 4 arguments
downloadCollectionPic(...args: unknown[]): unknown;// needs 3 arguments
downloadCollectionPic (arg1: string, arg2: string, arg3: unknown): unknown;// needs 3 arguments
cancelDownloadCollectionFile(...args: unknown[]): unknown;// needs 1 arguments
cancelDownloadCollectionFile (arg: unknown): unknown;// needs 1 arguments
deleteCollectionItemList(...args: unknown[]): unknown;// needs 1 arguments
deleteCollectionItemList (arg: unknown): unknown;// needs 1 arguments
editCollectionItem(...args: unknown[]): unknown;// needs 2 arguments
editCollectionItem (arg1: unknown, arg2: unknown): unknown;// needs 2 arguments
getEditPicInfoByPath(...args: unknown[]): unknown;// needs 1 arguments
getEditPicInfoByPath (arg: unknown): unknown;// needs 1 arguments
collectionFastUpload(...args: unknown[]): unknown;// needs 1 arguments
collectionFastUpload (arg: unknown): unknown;// needs 1 arguments
editCollectionItemAfterFastUpload(...args: unknown[]): unknown;// needs 2 arguments
editCollectionItemAfterFastUpload (arg1: unknown, arg2: unknown): unknown;// needs 2 arguments
createNewCollectionItem(...args: unknown[]): unknown;// needs 1 arguments
createNewCollectionItem (arg: unknown): unknown;// needs 1 arguments
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelConfigMgrService {
addKernelConfigMgrListener (listener: unknown): number;
removeKernelConfigMgrListener (listenerId: number): void;
isNull (): boolean;
}

View File

@@ -1,9 +1,9 @@
export interface NodeIKernelDbToolsService {
depositDatabase(...args: unknown[]): unknown;
depositDatabase (arg: unknown): unknown;
backupDatabase(...args: unknown[]): unknown;
backupDatabase (arg: unknown): unknown;
retrieveDatabase(...args: unknown[]): unknown;
retrieveDatabase (arg: unknown): unknown;
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelDirectSessionService {
addKernelDirectSessionListener (listener: unknown): number;
removeKernelDirectSessionListener (listenerId: number): void;
isNull (): boolean;
}

View File

@@ -1,3 +1,13 @@
export interface NodeIKernelECDHService {
sendOIDBECRequest: (data: Uint8Array) => Promise<Uint8Array>;
init (): unknown;
setIsDebug (isDebug: boolean): unknown;
setGuid (guid: string): unknown;
sendOIDBRequest (cmd: number, serviceType: number, subCmd: number, data: string, extraData: unknown): Promise<unknown>;
sendSSORequest (cmd: string, serviceType: number, data: string, extraData: unknown): Promise<unknown>;
}

View File

@@ -0,0 +1,5 @@
export interface NodeIKernelEmojiService {
getAIGCEmojiList (arg1: unknown, arg2: boolean): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,19 @@
export interface NodeIKernelFeedService {
addKernelFeedListener (listener: unknown): number;
removeKernelFeedListener (listenerId: number): void;
getChannelDraft (arg1: string, arg2: number): unknown;
getFeedCount (arg: unknown): unknown;
getFeedLikeUserList (arg1: unknown, arg2: number): unknown;
getFeedRichMediaFilePath (arg1: number, arg2: string, arg3: string, arg4: number, arg5: boolean): unknown;
getJoinedRecommendItems (arg1: unknown, arg2: boolean): unknown;
setChannelDraft (arg1: string, arg2: string, arg3: number): unknown;
isNull (): boolean;
}

View File

@@ -1,37 +1,41 @@
import { NodeIKernelFileAssistantListener } from '@/napcat-core/index';
export interface NodeIKernelFileAssistantService {
addKernelFileAssistantListener(listener: NodeIKernelFileAssistantListener): unknown;
addKernelFileAssistantListener (listener: NodeIKernelFileAssistantListener): unknown;
removeKernelFileAssistantListener(arg1: unknown[]): unknown;
removeKernelFileAssistantListener (arg1: unknown[]): unknown;
getFileAssistantList(arg1: unknown[]): unknown;
getFileAssistantList (arg1: unknown[]): unknown;
getMoreFileAssistantList(arg1: unknown[]): unknown;
getMoreFileAssistantList (arg1: unknown[]): unknown;
getFileSessionList(): unknown;
getFileSessionList (): unknown;
searchFile(keywords: string[], params: { resultType: number, pageLimit: number }, resultId: number): number;
searchFile (keywords: string[], params: { resultType: number, pageLimit: number; }, resultId: number): number;
resetSearchFileSortType(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
resetSearchFileSortType (arg1: number, arg2: number, arg3: number): unknown;
searchMoreFile(arg1: unknown[]): unknown;
searchMoreFile (arg1: unknown[]): unknown;
cancelSearchFile(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
cancelSearchFile (arg1: number, arg2: number, arg3: string): unknown;
downloadFile(fileIds: string[]): { result: number, errMsg: string };
downloadFile (fileIds: string[]): { result: number, errMsg: string; };
forwardFile(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
forwardFile (arg1: unknown, arg2: unknown, arg3: unknown): unknown;
cancelFileAction(arg1: unknown[]): unknown;
cancelFileAction (arg1: unknown[]): unknown;
retryFileAction(arg1: unknown[]): unknown;
retryFileAction (arg1: unknown[]): unknown;
deleteFile(arg1: unknown[]): unknown;
deleteFile (arg1: unknown[]): unknown;
saveAs(arg1: unknown, arg2: unknown): unknown;
saveAs (arg1: unknown, arg2: unknown): unknown;
saveAsWithRename(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
saveAsWithRename (arg1: string, arg2: string, arg3: string): unknown;
isNull(): boolean;
getFilePathCount (arg: unknown): unknown;
updateRecentOperateForMsg (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,13 @@
export interface NodeIKernelFileBridgeClientService {
addKernelFileBridgeClientListener (listener: unknown): number;
removeKernelFileBridgeClientListener (listenerId: number): void;
getPageContent (arg1: boolean, arg2: string): unknown;
getThumbnail (arg1: boolean, arg2: string, arg3: unknown): unknown;
searchFolderForFiles (arg1: string, arg2: string, arg3: string): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelFileBridgeHostService {
addKernelFileBridgeHostListener (listener: unknown): number;
removeKernelFileBridgeHostListener (listenerId: number): void;
isNull (): boolean;
}

View File

@@ -24,13 +24,13 @@ export interface NodeIKernelFlashTransferService {
seq: number;
}>; // 2 arg 重点 // 自动上传
createMergeShareTask (...args: unknown[]): unknown; // 2 arg
createMergeShareTask (arg1: unknown, arg2: unknown): unknown; // 2 arg
updateFlashTransfer (...args: unknown[]): unknown; // 2 arg
updateFlashTransfer (arg1: unknown, arg2: unknown): unknown; // 2 arg
getFileSetList (...args: unknown[]): unknown; // 1 arg
getFileSetList (arg: unknown): unknown; // 1 arg
getFileSetListCount (...args: unknown[]): unknown; // 1 arg
getFileSetListCount (arg: unknown): unknown; // 1 arg
/**
* 获取file set 的信息
@@ -50,11 +50,11 @@ export interface NodeIKernelFlashTransferService {
rsp: FileListResponse;
}>; // 1 arg 这个方法QQ有bug 并没有,是我参数有问题
getDownloadedFileCount (...args: unknown[]): unknown; // 1 arg
getDownloadedFileCount (arg: unknown): unknown; // 1 arg
getLocalFileList (...args: unknown[]): unknown; // 3 arg
getLocalFileList (arg1: number, arg2: string, arg3: Array<unknown>[]): unknown; // 3 arg
batchRemoveUserFileSetHistory (...args: unknown[]): unknown; // 1 arg
batchRemoveUserFileSetHistory (arg: unknown): unknown; // 1 arg
/**
* 获取分享链接
@@ -73,26 +73,26 @@ export interface NodeIKernelFlashTransferService {
fileSetId: string;
}>; // 1 arg code == share code
batchRemoveFile (...args: unknown[]): unknown; // 1 arg
batchRemoveFile (arg: unknown): unknown; // 1 arg
checkUploadPathValid (...args: unknown[]): unknown; // 1 arg
checkUploadPathValid (arg: unknown): unknown; // 1 arg
cleanFailedFiles (...args: unknown[]): unknown; // 2 arg
cleanFailedFiles (arg1: number, arg2: Array<unknown>[]): unknown; // 2 arg
/**
* 暂停所有的任务
*/
resumeAllUnfinishedTasks (): unknown; // 0 arg !!
addFileSetUploadListener (...args: unknown[]): unknown; // 1 arg
addFileSetUploadListener (listener: unknown): unknown; // 1 arg
removeFileSetUploadListener (...args: unknown[]): unknown; // 1 arg
removeFileSetUploadListener (listenerId: unknown): unknown; // 1 arg
/**
* 开始上传任务 适用于已暂停的
* @param fileSetId
*/
startFileSetUpload (fileSetId: string): void; // 1 arg 并不是新建任务,应该是暂停后的启动
startFileSetUpload (fileSetId: unknown): void; // 1 arg 并不是新建任务,应该是暂停后的启动
/**
* 结束,无法再次启动
@@ -110,27 +110,27 @@ export interface NodeIKernelFlashTransferService {
* 继续上传
* @param args
*/
resumeFileSetUpload (...args: unknown[]): unknown; // 1 arg 继续
resumeFileSetUpload (fileSetId: unknown): unknown; // 1 arg 继续
pauseFileUpload (...args: unknown[]): unknown; // 1 arg
pauseFileUpload (arg: unknown): unknown; // 1 arg
resumeFileUpload (...args: unknown[]): unknown; // 1 arg
resumeFileUpload (arg: unknown): unknown; // 1 arg
stopFileUpload (...args: unknown[]): unknown; // 1 arg
stopFileUpload (arg: unknown): unknown; // 1 arg
asyncGetThumbnailPath (...args: unknown[]): unknown; // 2 arg
asyncGetThumbnailPath (arg1: unknown, arg2: unknown): unknown; // 2 arg
setDownLoadDefaultFileDir (...args: unknown[]): unknown; // 1 arg
setDownLoadDefaultFileDir (dir: unknown): unknown; // 1 arg
setFileSetDownloadDir (...args: unknown[]): unknown; // 2 arg
setFileSetDownloadDir (arg1: unknown, arg2: unknown): unknown; // 2 arg
getFileSetDownloadDir (...args: unknown[]): unknown; // 1 arg
getFileSetDownloadDir (arg: unknown): unknown; // 1 arg
setFlashTransferDir (...args: unknown[]): unknown; // 2 arg
setFlashTransferDir (arg1: unknown, arg2: unknown): unknown; // 2 arg
addFileSetDownloadListener (...args: unknown[]): unknown; // 1 arg
addFileSetDownloadListener (listener: unknown): unknown; // 1 arg
removeFileSetDownloadListener (...args: unknown[]): unknown; // 1 arg
removeFileSetDownloadListener (listenerId: unknown): unknown; // 1 arg
/**
* 开始下载file set的函数 同开始上传
@@ -154,13 +154,13 @@ export interface NodeIKernelFlashTransferService {
extraInfo: 0;
}>; // 2 arg
startFileListDownLoad (...args: unknown[]): unknown; // 4 arg // 大概率是选择set里面的部分文件进行下载没必要不想写
startFileListDownLoad (arg1: string, arg2: number, arg3: Array<unknown>[], arg4: unknown): unknown; // 4 arg // 大概率是选择set里面的部分文件进行下载没必要不想写
pauseFileListDownLoad (...args: unknown[]): unknown; // 2 arg
pauseFileListDownLoad (arg1: unknown, arg2: unknown): unknown; // 2 arg
resumeFileListDownLoad (...args: unknown[]): unknown; // 2 arg
resumeFileListDownLoad (arg1: unknown, arg2: unknown): unknown; // 2 arg
stopFileListDownLoad (...args: unknown[]): unknown; // 2 arg
stopFileListDownLoad (arg1: unknown, arg2: unknown): unknown; // 2 arg
startThumbnailListDownload (fileSetId: string): Promise<GeneralCallResult>; // 1 arg // 缩略图下载
@@ -174,31 +174,31 @@ export interface NodeIKernelFlashTransferService {
expireTimestampSeconds: string;
}>; // 1 arg
startFileListDownLoadBySessionId (...args: unknown[]): unknown; // 2 arg
startFileListDownLoadBySessionId (arg1: unknown, arg2: unknown): unknown; // 2 arg
addFileSetSimpleStatusListener (...args: unknown[]): unknown; // 2 arg
addFileSetSimpleStatusListener (arg1: unknown, arg2: unknown): unknown; // 2 arg
addFileSetSimpleStatusMonitoring (...args: unknown[]): unknown; // 2 arg
addFileSetSimpleStatusMonitoring (arg1: unknown, arg2: unknown): unknown; // 2 arg
removeFileSetSimpleStatusMonitoring (...args: unknown[]): unknown; // 2 arg
removeFileSetSimpleStatusMonitoring (arg1: unknown, arg2: unknown): unknown; // 2 arg
removeFileSetSimpleStatusListener (...args: unknown[]): unknown; // 1 arg
removeFileSetSimpleStatusListener (arg: unknown): unknown; // 1 arg
addDesktopFileSetSimpleStatusListener (...args: unknown[]): unknown; // 1 arg
addDesktopFileSetSimpleStatusListener (arg: unknown): unknown; // 1 arg
addDesktopFileSetSimpleStatusMonitoring (...args: unknown[]): unknown; // 1 arg
addDesktopFileSetSimpleStatusMonitoring (arg: unknown): unknown; // 1 arg
removeDesktopFileSetSimpleStatusMonitoring (...args: unknown[]): unknown; // 1 arg
removeDesktopFileSetSimpleStatusMonitoring (arg: unknown): unknown; // 1 arg
removeDesktopFileSetSimpleStatusListener (...args: unknown[]): unknown; // 1 arg
removeDesktopFileSetSimpleStatusListener (arg: unknown): unknown; // 1 arg
addFileSetSimpleUploadInfoListener (...args: unknown[]): unknown; // 1 arg
addFileSetSimpleUploadInfoListener (arg: unknown): unknown; // 1 arg
addFileSetSimpleUploadInfoMonitoring (...args: unknown[]): unknown; // 1 arg
addFileSetSimpleUploadInfoMonitoring (arg: unknown): unknown; // 1 arg
removeFileSetSimpleUploadInfoMonitoring (...args: unknown[]): unknown; // 1 arg
removeFileSetSimpleUploadInfoMonitoring (arg: unknown): unknown; // 1 arg
removeFileSetSimpleUploadInfoListener (...args: unknown[]): unknown; // 1 arg
removeFileSetSimpleUploadInfoListener (arg: unknown): unknown; // 1 arg
/**
* 发送闪传消息
* @param sendArgs
@@ -211,9 +211,9 @@ export interface NodeIKernelFlashTransferService {
};
}>; // 1 arg 估计是file set id
addFlashTransferTaskInfoListener (...args: unknown[]): unknown; // 1 arg
addFlashTransferTaskInfoListener (listener: unknown): unknown; // 1 arg
removeFlashTransferTaskInfoListener (...args: unknown[]): unknown; // 1 arg
removeFlashTransferTaskInfoListener (listenerId: unknown): unknown; // 1 arg
retrieveLocalLastFailedSetTasksInfo (): unknown; // 0 arg
@@ -227,77 +227,77 @@ export interface NodeIKernelFlashTransferService {
};
}>; // 1 arg
getLocalFileListByStatuses (...args: unknown[]): unknown; // 1 arg
getLocalFileListByStatuses (arg: unknown): unknown; // 1 arg
addTransferStateListener (...args: unknown[]): unknown; // 1 arg
addTransferStateListener (listener: unknown): unknown; // 1 arg
removeTransferStateListener (...args: unknown[]): unknown; // 1 arg
removeTransferStateListener (listenerId: unknown): unknown; // 1 arg
getFileSetFirstClusteringList (...args: unknown[]): unknown; // 3 arg
getFileSetFirstClusteringList (arg1: number, arg2: string, arg3: number): unknown; // 3 arg
getFileSetClusteringList (...args: unknown[]): unknown; // 1 arg
getFileSetClusteringList (arg: unknown): unknown; // 1 arg
addFileSetClusteringListListener (...args: unknown[]): unknown; // 1 arg
addFileSetClusteringListListener (listener: unknown): unknown; // 1 arg
removeFileSetClusteringListListener (...args: unknown[]): unknown; // 1 arg
removeFileSetClusteringListListener (listenerId: unknown): unknown; // 1 arg
getFileSetClusteringDetail (...args: unknown[]): unknown; // 1 arg
getFileSetClusteringDetail (arg: unknown): unknown; // 1 arg
doAIOFlashTransferBubbleActionWithStatus (...args: unknown[]): unknown; // 4 arg
doAIOFlashTransferBubbleActionWithStatus (arg1: string, arg2: number, arg3: number, arg4: unknown): unknown; // 4 arg
getFilesTransferProgress (...args: unknown[]): unknown; // 1 arg
getFilesTransferProgress (arg: unknown): unknown; // 1 arg
pollFilesTransferProgress (...args: unknown[]): unknown; // 1 arg
pollFilesTransferProgress (arg: unknown): unknown; // 1 arg
cancelPollFilesTransferProgress (...args: unknown[]): unknown; // 1 arg
cancelPollFilesTransferProgress (arg: unknown): unknown; // 1 arg
checkDownloadStatusBeforeLocalFileOper (...args: unknown[]): unknown; // 3 arg
checkDownloadStatusBeforeLocalFileOper (arg1: number, arg2: string, arg3: string): unknown; // 3 arg
getCompressedFileFolder (...args: unknown[]): unknown; // 1 arg
getCompressedFileFolder (arg: unknown): unknown; // 1 arg
addFolderListener (...args: unknown[]): unknown; // 1 arg
addFolderListener (listener: unknown): unknown; // 1 arg
removeFolderListener (...args: unknown[]): unknown;
removeFolderListener (listenerId: unknown): unknown;
addCompressedFileListener (...args: unknown[]): unknown;
addCompressedFileListener (listener: unknown): unknown;
removeCompressedFileListener (...args: unknown[]): unknown;
removeCompressedFileListener (listenerId: unknown): unknown;
getFileCategoryList (...args: unknown[]): unknown;
getFileCategoryList (arg: unknown): unknown;
addDeviceStatusListener (...args: unknown[]): unknown;
addDeviceStatusListener (listener: unknown): unknown;
removeDeviceStatusListener (...args: unknown[]): unknown;
removeDeviceStatusListener (listenerId: unknown): unknown;
checkDeviceStatus (...args: unknown[]): unknown;
checkDeviceStatus (arg: unknown): unknown;
pauseAllTasks (...args: unknown[]): unknown; // 2 arg
pauseAllTasks (arg1: number, arg2: number): unknown; // 2 arg
resumePausedTasksAfterDeviceStatus (...args: unknown[]): unknown;
resumePausedTasksAfterDeviceStatus (arg: unknown): unknown;
onSystemGoingToSleep (...args: unknown[]): unknown;
onSystemGoingToSleep (arg: unknown): unknown;
onSystemWokeUp (...args: unknown[]): unknown;
onSystemWokeUp (arg: unknown): unknown;
getFileMetas (...args: unknown[]): unknown;
getFileMetas (arg: unknown): unknown;
addDownloadCntStatisticsListener (...args: unknown[]): unknown;
addDownloadCntStatisticsListener (listener: unknown): unknown;
removeDownloadCntStatisticsListener (...args: unknown[]): unknown;
removeDownloadCntStatisticsListener (listenerId: unknown): unknown;
detectPrivacyInfoInPaths (...args: unknown[]): unknown;
detectPrivacyInfoInPaths (arg: unknown): unknown;
getFileThumbnailUrl (...args: unknown[]): unknown;
getFileThumbnailUrl (arg: unknown): unknown;
handleDownloadFinishAfterSaveToAlbum (...args: unknown[]): unknown;
handleDownloadFinishAfterSaveToAlbum (arg: unknown): unknown;
checkBatchFilesDownloadStatus (...args: unknown[]): unknown;
checkBatchFilesDownloadStatus (arg: unknown): unknown;
onCheckAlbumStorageStatusResult (...args: unknown[]): unknown;
onCheckAlbumStorageStatusResult (arg: unknown): unknown;
addFileAlbumStorageListener (...args: unknown[]): unknown;
addFileAlbumStorageListener (listener: unknown): unknown;
removeFileAlbumStorageListener (...args: unknown[]): unknown;
removeFileAlbumStorageListener (listenerId: unknown): unknown;
refreshFolderStatus (...args: unknown[]): unknown;
refreshFolderStatus (arg: unknown): unknown;
}

View File

@@ -16,29 +16,29 @@ import { GeneralCallResult } from '@/napcat-core/services/common';
export interface NodeIKernelGroupService {
modifyGroupExtInfoV2(groupExtInfo: GroupExtInfo, groupExtFilter: GroupExtFilter): Promise<GeneralCallResult &
{
result: {
groupCode: string,
result: number
}
}>;
modifyGroupExtInfoV2 (groupExtInfo: GroupExtInfo, groupExtFilter: GroupExtFilter): Promise<GeneralCallResult &
{
result: {
groupCode: string,
result: number;
};
}>;
// --->
// 待启用 For Next Version 3.2.0
// isTroopMember ? 0 : 111
getGroupMemberMaxNum(groupCode: string, serviceType: number): Promise<unknown>;
getGroupMemberMaxNum (groupCode: string, serviceType: number): Promise<unknown>;
getAllGroupPrivilegeFlag(troopUinList: string[], serviceType: number): Promise<unknown>;
getAllGroupPrivilegeFlag (troopUinList: string[], serviceType: number): Promise<unknown>;
// <---
getGroupExt0xEF0Info(enableGroupCodes: string[], bannedGroupCodes: string[], filter: GroupExt0xEF0InfoFilter, forceFetch: boolean):
Promise<GeneralCallResult & { result: { groupExtInfos: Map<string, unknown> } }>;
getGroupExt0xEF0Info (enableGroupCodes: string[], bannedGroupCodes: string[], filter: GroupExt0xEF0InfoFilter, forceFetch: boolean):
Promise<GeneralCallResult & { result: { groupExtInfos: Map<string, unknown>; }; }>;
kickMemberV2(param: KickMemberV2Req): Promise<GeneralCallResult>;
kickMemberV2 (param: KickMemberV2Req): Promise<GeneralCallResult>;
quitGroupV2(param: { groupCode: string; needDeleteLocalMsg: boolean; }): Promise<GeneralCallResult>;
quitGroupV2 (param: { groupCode: string; needDeleteLocalMsg: boolean; }): Promise<GeneralCallResult>;
getMemberCommonInfo(Req: {
getMemberCommonInfo (Req: {
groupCode: string,
startUin: string,
identifyFlag: string,
@@ -54,39 +54,39 @@ export interface NodeIKernelGroupService {
memberNum: number,
filterMethod: string,
onlineFlag: string,
realSpecialTitleFlag: number
realSpecialTitleFlag: number;
}): Promise<unknown>;
getGroupMemberLevelInfo(groupCode: string): Promise<unknown>;
getGroupMemberLevelInfo (groupCode: string): Promise<unknown>;
getGroupInfoForJoinGroup(groupCode: string, needPrivilegeFlag: boolean, serviceType: number): Promise<unknown>;
getGroupInfoForJoinGroup (groupCode: string, needPrivilegeFlag: boolean, serviceType: number): Promise<unknown>;
getGroupHonorList(req: { groupCodes: Array<string> }): Promise<unknown>;
getGroupHonorList (req: { groupCodes: Array<string>; }): Promise<unknown>;
getUinByUids(uins: string[]): Promise<{
getUinByUids (uins: string[]): Promise<{
errCode: number,
errMsg: string,
uins: Map<string, string>
uins: Map<string, string>;
}>;
getUidByUins(uins: string[]): Promise<{
getUidByUins (uins: string[]): Promise<{
errCode: number,
errMsg: string,
uids: Map<string, string>
uids: Map<string, string>;
}>;
checkGroupMemberCache(arrayList: Array<string>): Promise<unknown>;
checkGroupMemberCache (arrayList: Array<string>): Promise<unknown>;
getGroupLatestEssenceList(groupCode: string): Promise<unknown>;
getGroupLatestEssenceList (groupCode: string): Promise<unknown>;
shareDigest(Req: {
shareDigest (Req: {
appId: string,
appType: number,
msgStyle: number,
recvUin: string,
sendType: number,
clientInfo: {
platform: number
platform: number;
},
richMsg: {
usingArk: boolean,
@@ -94,122 +94,122 @@ export interface NodeIKernelGroupService {
summary: string,
url: string,
pictureUrl: string,
brief: string
}
brief: string;
};
}): Promise<unknown>;
isEssenceMsg(req: { groupCode: string, msgRandom: number, msgSeq: number }): Promise<unknown>;
isEssenceMsg (req: { groupCode: string, msgRandom: number, msgSeq: number; }): Promise<unknown>;
queryCachedEssenceMsg(req: { groupCode: string, msgRandom: number, msgSeq: number }): Promise<{ items: Array<unknown> }>;
queryCachedEssenceMsg (req: { groupCode: string, msgRandom: number, msgSeq: number; }): Promise<{ items: Array<unknown>; }>;
fetchGroupEssenceList(req: {
fetchGroupEssenceList (req: {
groupCode: string,
pageStart: number,
pageLimit: number
}, Arg: unknown): Promise<unknown>;
pageLimit: number;
}, Arg: string): Promise<unknown>;
getAllMemberList(groupCode: string, forceFetch: boolean): Promise<{
getAllMemberList (groupCode: string, forceFetch: boolean): Promise<{
errCode: number,
errMsg: string,
result: {
ids: Array<{
uid: string,
index: number// 0
index: number;// 0
}>,
infos: Map<string, GroupMember>,
finish: true,
hasRobot: false
}
hasRobot: false;
};
}>;
setHeader(uid: string, path: string): Promise<GeneralCallResult>;
setHeader (uid: string, path: string): Promise<GeneralCallResult>;
addKernelGroupListener(listener: NodeIKernelGroupListener): number;
addKernelGroupListener (listener: NodeIKernelGroupListener): number;
removeKernelGroupListener(listenerId: number): void;
removeKernelGroupListener (listenerId: number): void;
createMemberListScene(groupCode: string, scene: string): string;
createMemberListScene (groupCode: string, scene: string): string;
destroyMemberListScene(SceneId: string): void;
destroyMemberListScene (SceneId: string): void;
getNextMemberList(sceneId: string, groupMemberInfoListId: { index: number, uid: string } | undefined, num: number): Promise<{
getNextMemberList (sceneId: string, groupMemberInfoListId: { index: number, uid: string; } | undefined, num: number): Promise<{
errCode: number,
errMsg: string,
result: { ids: string[], infos: Map<string, GroupMember>, finish: boolean, hasRobot: boolean }
result: { ids: string[], infos: Map<string, GroupMember>, finish: boolean, hasRobot: boolean; };
}>;
getPrevMemberList(): unknown;
getPrevMemberList (): unknown;
monitorMemberList(): unknown;
monitorMemberList (): unknown;
searchMember(sceneId: string, keywords: string[]): unknown;
searchMember (sceneId: string, keywords: string[]): unknown;
getMemberInfo(group_id: string, uids: string[], forceFetch: boolean): Promise<GeneralCallResult>;
getMemberInfo (group_id: string, uids: string[], forceFetch: boolean): Promise<GeneralCallResult>;
kickMember(groupCode: string, memberUids: string[], refuseForever: boolean, kickReason: string): Promise<void>;
kickMember (groupCode: string, memberUids: string[], refuseForever: boolean, kickReason: string): Promise<void>;
modifyMemberRole(groupCode: string, uid: string, role: NTGroupMemberRole): void;
modifyMemberRole (groupCode: string, uid: string, role: NTGroupMemberRole): void;
modifyMemberCardName(groupCode: string, uid: string, cardName: string): void;
modifyMemberCardName (groupCode: string, uid: string, cardName: string): void;
getTransferableMemberInfo(groupCode: string): unknown;// 获取整个群的
getTransferableMemberInfo (groupCode: string): unknown;// 获取整个群的
transferGroup(uid: string): void;
transferGroup (uid: string): void;
getGroupList(force: boolean): Promise<GeneralCallResult>;
getGroupList (force: boolean): Promise<GeneralCallResult>;
getGroupExtList(force: boolean): Promise<GeneralCallResult>;
getGroupExtList (force: boolean): Promise<GeneralCallResult>;
getGroupDetailInfo(groupCode: string, groupInfoSource: GroupInfoSource): Promise<GeneralCallResult>;
getGroupDetailInfo (groupCode: string, groupInfoSource: GroupInfoSource): Promise<GeneralCallResult>;
getMemberExtInfo(param: GroupExtParam): Promise<unknown>;// req
getMemberExtInfo (param: GroupExtParam): Promise<unknown>;// req
getGroupAllInfo(groupId: string, sourceId: number): Promise<unknown>;
getGroupAllInfo (groupId: string, sourceId: number): Promise<unknown>;
getDiscussExistInfo(): unknown;
getDiscussExistInfo (): unknown;
getGroupConfMember(): unknown;
getGroupConfMember (): unknown;
getGroupMsgMask(): unknown;
getGroupMsgMask (): unknown;
getGroupPortrait(): void;
getGroupPortrait (): void;
modifyGroupName(groupCode: string, groupName: string, isNormalMember: boolean): Promise<GeneralCallResult>;
modifyGroupName (groupCode: string, groupName: string, isNormalMember: boolean): Promise<GeneralCallResult>;
modifyGroupRemark(groupCode: string, remark: string): Promise<GeneralCallResult>;
modifyGroupRemark (groupCode: string, remark: string): Promise<GeneralCallResult>;
modifyGroupDetailInfo(groupCode: string, arg: unknown): void;
modifyGroupDetailInfo (groupCode: string, arg: unknown): void;
// 第二个参数在大多数情况为0 设置群成员权限 例如上传群文件权限和群成员付费/加入邀请加入时为8
modifyGroupDetailInfoV2(param: GroupDetailInfoV2Param, arg: number): Promise<GeneralCallResult>;
modifyGroupDetailInfoV2 (param: GroupDetailInfoV2Param, arg: number): Promise<GeneralCallResult>;
setGroupMsgMask(groupCode: string, arg: unknown): void;
setGroupMsgMask (groupCode: string, arg: unknown): void;
changeGroupShieldSettingTemp(groupCode: string, arg: unknown): void;
changeGroupShieldSettingTemp (groupCode: string, arg: unknown): void;
inviteToGroup(arg: unknown): void;
inviteToGroup (arg: unknown): void;
inviteMembersToGroup(args: unknown[]): void;
inviteMembersToGroup (args: unknown[]): void;
inviteMembersToGroupWithMsg(args: unknown): void;
inviteMembersToGroupWithMsg (args: unknown): void;
createGroup(arg: unknown): void;
createGroup (arg: unknown): void;
createGroupWithMembers(arg: unknown): void;
createGroupWithMembers (arg: unknown): void;
quitGroup(groupCode: string): void;
quitGroup (groupCode: string): void;
destroyGroup(groupCode: string): void;
destroyGroup (groupCode: string): void;
getSingleScreenNotifies(doubt: boolean, startSeq: string, count: number): Promise<GeneralCallResult>;
getSingleScreenNotifies (doubt: boolean, startSeq: string, count: number): Promise<GeneralCallResult>;
clearGroupNotifies(groupCode: string): void;
clearGroupNotifies (groupCode: string): void;
getGroupNotifiesUnreadCount(doubt: boolean): Promise<GeneralCallResult>;
getGroupNotifiesUnreadCount (doubt: boolean): Promise<GeneralCallResult>;
clearGroupNotifiesUnreadCount(doubt: boolean): void;
clearGroupNotifiesUnreadCount (doubt: boolean): void;
operateSysNotify(
operateSysNotify (
doubt: boolean,
operateMsg: {
operateType: NTGroupRequestOperateTypes,
@@ -217,80 +217,277 @@ export interface NodeIKernelGroupService {
seq: string,
type: GroupNotifyMsgType,
groupCode: string,
postscript: string
}
postscript: string;
};
}): Promise<void>;
setTop(groupCode: string, isTop: boolean): void;
setTop (groupCode: string, isTop: boolean): void;
getGroupBulletin(groupCode: string): unknown;
getGroupBulletin (groupCode: string): unknown;
deleteGroupBulletin(groupCode: string, seq: string, noticeId: string): void;
deleteGroupBulletin (groupCode: string, seq: string, noticeId: string): void;
publishGroupBulletin(groupCode: string, pskey: string, data: unknown): Promise<GeneralCallResult>;
publishGroupBulletin (groupCode: string, pskey: string, data: unknown): Promise<GeneralCallResult>;
publishInstructionForNewcomers(groupCode: string, arg: unknown): void;
publishInstructionForNewcomers (groupCode: string, arg: unknown): void;
uploadGroupBulletinPic(groupCode: string, pskey: string, imagePath: string): Promise<GeneralCallResult & {
uploadGroupBulletinPic (groupCode: string, pskey: string, imagePath: string): Promise<GeneralCallResult & {
errCode: number;
picInfo?: {
id: string,
width: number,
height: number
}
height: number;
};
}>;
downloadGroupBulletinRichMedia(groupCode: string): unknown;
downloadGroupBulletinRichMedia (groupCode: string): unknown;
getGroupBulletinList(groupCode: string): unknown;
getGroupBulletinList (groupCode: string): unknown;
getGroupStatisticInfo(groupCode: string): unknown;
getGroupStatisticInfo (groupCode: string): unknown;
getGroupRemainAtTimes(groupCode: string): Promise<Omit<GeneralCallResult, 'result'> & {
getGroupRemainAtTimes (groupCode: string): Promise<Omit<GeneralCallResult, 'result'> & {
errCode: number,
atInfo: {
canAtAll: boolean
RemainAtAllCountForUin: number
RemainAtAllCountForGroup: number
atTimesMsg: string
canNotAtAllMsg: ''
}
canAtAll: boolean;
RemainAtAllCountForUin: number;
RemainAtAllCountForGroup: number;
atTimesMsg: string;
canNotAtAllMsg: '';
};
}>;
getJoinGroupNoVerifyFlag(groupCode: string): unknown;
getJoinGroupNoVerifyFlag (groupCode: string): unknown;
getGroupArkInviteState(groupCode: string): unknown;
getGroupArkInviteState (groupCode: string): unknown;
reqToJoinGroup(groupCode: string, arg: unknown): void;
reqToJoinGroup (groupCode: string, arg: unknown): void;
setGroupShutUp(groupCode: string, shutUp: boolean): Promise<GeneralCallResult>;
setGroupShutUp (groupCode: string, shutUp: boolean): Promise<GeneralCallResult>;
getGroupShutUpMemberList(groupCode: string): Promise<GeneralCallResult>;
getGroupShutUpMemberList (groupCode: string): Promise<GeneralCallResult>;
setMemberShutUp(groupCode: string, memberTimes: { uid: string, timeStamp: number }[]): Promise<GeneralCallResult>;
setMemberShutUp (groupCode: string, memberTimes: { uid: string, timeStamp: number; }[]): Promise<GeneralCallResult>;
getGroupRecommendContactArkJson(groupCode: string): Promise<GeneralCallResult & { arkJson: string }>;
getGroupRecommendContactArkJson (groupCode: string): Promise<GeneralCallResult & { arkJson: string; }>;
getJoinGroupLink(param: {
getJoinGroupLink (param: {
groupCode: string,
srcId: number, // 73
needShortUrl: boolean, // true
additionalParam: string// ''
}): Promise<GeneralCallResult & { url?: string }>;
additionalParam: string;// ''
}): Promise<GeneralCallResult & { url?: string; }>;
modifyGroupExtInfo(groupCode: string, arg: unknown): void;
modifyGroupExtInfo (groupCode: string, arg: unknown): void;
addGroupEssence(param: {
groupCode: string
addGroupEssence (param: {
groupCode: string;
msgRandom: number,
msgSeq: number
msgSeq: number;
}): Promise<unknown>;
removeGroupEssence(param: {
groupCode: string
removeGroupEssence (param: {
groupCode: string;
msgRandom: number,
msgSeq: number
msgSeq: number;
}): Promise<unknown>;
isNull(): boolean;
isNull (): boolean;
// --- Methods from IDA binary analysis ---
clearGroupNotifyLocalUnreadCount (groupCode: string, arg: number): unknown;
getCardAppList (groupCode: string, arg: boolean): unknown;
getGroupBulletinDetail (arg1: string, arg2: string, arg3: string, arg4: boolean): unknown;
getGroupBulletinReadUsers (arg1: string, arg2: string, arg3: string, arg4: number, arg5: number, arg6: number): unknown;
getGroupDetailInfoByFilter (arg1: unknown, arg2: number, arg3: number, arg4: boolean): unknown;
getGroupDetailInfoForMqq (arg1: string, arg2: number, arg3: number, arg4: boolean): unknown;
getMemberInfoForMqq (arg1: string, arg2: Array<unknown>[], arg3: boolean): unknown;
getMemberInfoForMqqV2 (arg1: string, arg2: Array<unknown>[], arg3: boolean, arg4: string): unknown;
getRecGroups (arg1: string, arg2: unknown, arg3: string): unknown;
getSingleScreenNotifiesV2 (arg1: boolean, arg2: string, arg3: number, arg4: number): unknown;
modifyWxNotifyStatus (arg1: string, arg2: number): unknown;
operateSpecialFocus (arg1: string, arg2: Array<unknown>[], arg3: number): unknown;
remindGroupBulletinRead (arg1: string, arg2: string, arg3: string): unknown;
transferGroupV2 (arg1: string, arg2: string, arg3: string): unknown;
operateSysNotifyV2 (arg1: unknown, arg2: unknown): Promise<unknown>;
getAllMemberListV2 (groupCode: string, arg: unknown): unknown;
createGroupV2 (arg1: unknown, arg2: unknown): unknown;
modifyGroupExtInfoV2 (groupExtInfo: GroupExtInfo, groupExtFilter: GroupExtFilter): Promise<GeneralCallResult & {
result: { groupCode: string, result: number; };
}>;
modifyGroupDetailInfoV2 (param: GroupDetailInfoV2Param, arg: number): Promise<GeneralCallResult>;
setGroupMsgMaskV2 (arg1: unknown, arg2: unknown): unknown;
getGroupSquareRedpointInfo (arg1: unknown, arg2: unknown): unknown;
getGroupSquareHomeHead (arg1: unknown, arg2: unknown): unknown;
getCapsuleApp (arg1: unknown, arg2: unknown): unknown;
getCapsuleAppPro (arg1: unknown, arg2: unknown): unknown;
getMemberInfoCache (arg1: unknown, arg2: unknown): unknown;
getGroupSecLevelInfo (arg1: unknown, arg2: unknown): unknown;
getSubGroupInfo (arg: unknown): unknown;
getSwitchStatusForEssenceMsg (arg: unknown): unknown;
getTeamUpDetail (arg: unknown): unknown;
getTeamUpList (arg: unknown): unknown;
getTeamUpMembers (arg: unknown): unknown;
getTeamUpTemplateList (arg: unknown): unknown;
getTopicPage (arg1: string, arg2: string, arg3: string, arg4: string): unknown;
getTopicRecall (arg: unknown): unknown;
getWxNotifyStatus (arg: unknown): unknown;
getGroupPayToJoinStatus (arg: unknown): unknown;
getGroupSeqAndJoinTimeForGrayTips (arg: unknown): unknown;
getGroupTagRecords (arg: unknown): unknown;
getGroupBindGuilds (arg: unknown): unknown;
getGroupFlagForThirdApp (arg: unknown): unknown;
getGroupMsgLimitFreq (arg: unknown): unknown;
getGroupMedalList (arg: unknown): unknown;
getGroupDBVersion (arg: unknown): unknown;
getGroupInviteNoAuthLimitNum (arg: unknown): unknown;
getAIOBindGuildInfo (arg: unknown): unknown;
getAppCenter (arg: unknown): unknown;
getAICommonVoice (arg: unknown): unknown;
groupBlacklistDelApply (arg: unknown): unknown;
groupBlacklistGetAllApply (arg: unknown): unknown;
fetchGroupNotify (arg: unknown): unknown;
queryJoinGroupCanNoVerify (arg: unknown): unknown;
halfScreenPullNotice (arg: unknown): unknown;
halfScreenReportClick (arg: unknown): unknown;
joinGroup (arg: unknown): unknown;
listAllAIVoice (arg: unknown): unknown;
miniAppGetGroupInfo (arg: unknown): unknown;
postTeamUp (arg: unknown): unknown;
queryAIOBindGuild (arg: unknown): unknown;
removeGroupFromGroupList (arg: unknown): unknown;
saveAIVoice (arg: unknown): unknown;
setActiveExtGroup (arg: unknown): unknown;
setAIOBindGuild (arg: unknown): unknown;
setCapsuleSwitch (arg: unknown): unknown;
setGroupAppList (arg: unknown): unknown;
setGroupGeoInfo (arg: unknown): unknown;
setGroupRelationToGuild (arg: unknown): unknown;
setRcvJoinVerifyMsg (arg: unknown): unknown;
teamUpCreateGroup (arg: unknown): unknown;
teamUpInviteToGroup (arg: unknown): unknown;
teamUpRequestToJoin (arg: unknown): unknown;
teamUpSubmitDeadline (arg: unknown): unknown;
topicFeedback (arg: unknown): unknown;
topicReport (arg: unknown): unknown;
shareTopic (arg: unknown): unknown;
unbindAllGuilds (arg: unknown): unknown;
updateGroupInfoByMqq (arg: unknown): unknown;
updateMemberInfoByMqq (arg: unknown): unknown;
updateTeamUp (arg: unknown): unknown;
applyTeamUp (arg: unknown): unknown;
deleteTeamUp (arg: unknown): unknown;
getFindPageRecommendGroup (arg: unknown): unknown;
getTransferableMemberInfo (groupCode: string): unknown;
createGroupProfileShare (arg: unknown): unknown;
destroyMemberListScene (sceneId: string): void;
clearGroupSquareRedpointCache (arg: unknown): unknown;
checkGroupMemberCache (arrayList: Array<string>): Promise<unknown>;
cleanCapsuleCache (arg: unknown): unknown;
downloadGroupBulletinRichMedia (groupCode: string): unknown;
kickMemberV2 (param: KickMemberV2Req): Promise<GeneralCallResult>;
destroyGroupV2 (arg: unknown): unknown;
quitGroupV2 (param: { groupCode: string; needDeleteLocalMsg: boolean; }): Promise<GeneralCallResult>;
inviteToGroupV2 (arg: unknown): unknown;
getGroupMsgMask (): unknown;
batchQueryCachedGroupDetailInfo (arg: unknown): unknown;
getGroupMemberLevelInfo (groupCode: string): Promise<unknown>;
getIllegalMemberList (arg: unknown): unknown;
getGroupRecommendContactArkJsonToWechat (arg: unknown): unknown;
}

View File

@@ -0,0 +1,9 @@
export interface NodeIKernelGroupTabService {
addListener (listener: unknown): number;
removeListener (listenerId: number): void;
getGroupTab (arg1: unknown, arg2: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,15 @@
export interface NodeIKernelHandOffService {
addKernelHandOffListener (listener: unknown): number;
removeKernelHandOffListener (listenerId: number): void;
changeHandOffActivities (arg: unknown): unknown;
deleteRecentHandOffActivities (arg: unknown): unknown;
getHandOffActivities (arg: unknown): unknown;
sendCapsulePanelActivities (arg1: string, arg2: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,19 @@
export interface NodeIKernelLiteBusinessService {
addListener (listener: unknown): number;
removeListener (listenerId: number): void;
clearLiteBusiness (arg1: string, arg2: unknown): unknown;
clickLiteAction (arg1: unknown, arg2: unknown): unknown;
exposeLiteAction (arg1: unknown, arg2: unknown): unknown;
getLiteBusiness (arg1: string, arg2: unknown): unknown;
getRevealTofuAuthority (arg: unknown): unknown;
recentRevealExposure (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelLockService {
addKernelLockListener (listener: unknown): number;
removeKernelLockListener (listenerId: number): void;
isNull (): boolean;
}

View File

@@ -63,7 +63,9 @@ export interface QuickLoginResult {
export interface NodeIKernelLoginService {
getMsfStatus: () => number;
setLoginMiscData (arg0: string, value: string): unknown;
setLoginMiscData (key: string, value: string): unknown;
getLoginMiscData (key: string): Promise<GeneralCallResult & { value: string; }>;
getMachineGuid (): string;
@@ -73,14 +75,12 @@ export interface NodeIKernelLoginService {
addKernelLoginListener (listener: NodeIKernelLoginListener): number;
removeKernelLoginListener (listener: number): void;
removeKernelLoginListener (listenerId: number): void;
initConfig (config: LoginInitConfig): void;
getLoginMiscData (data: string): Promise<GeneralCallResult & { value: string; }>;
getLoginList (): Promise<{
result: number, // 0是ok
result: number,
LocalLoginInfoList: LoginListItem[];
}>;
@@ -89,4 +89,32 @@ export interface NodeIKernelLoginService {
passwordLogin (param: PasswordLoginArgType): Promise<QuickLoginResult>;
getQRCodePicture (): boolean;
destroy (): unknown;
cancel (): unknown;
abortPolling (): unknown;
startPolling (): unknown;
deleteLoginInfo (arg: unknown): unknown;
isHasLoginInfo (uin: string): boolean;
loadNoLoginUnitedConfig (arg: unknown): unknown;
loginUnusualDevice (arg: unknown): unknown;
registerUnitedConfigPushGroupList (groupList: unknown): unknown;
resetLoginInfo (arg: unknown): unknown;
setAutoLogin (arg: unknown): unknown;
setRemerberPwd (remember: boolean): unknown;
online (): unknown;
offline (): unknown;
}

View File

@@ -6,6 +6,9 @@ enum ProxyType {
}
export interface NodeIKernelMSFService {
getServerTime (): string;
getMsfStatus (): number;
online (): unknown;
offline (): unknown;
setNetworkProxy (param: {
userName: string,
userPwd: string,
@@ -50,4 +53,5 @@ export interface NodeIKernelMSFService {
accountType: number,
transInfoMap: Map<string, unknown>;
}): Promise<Buffer>;
onMsfPushForTesting (arg1: unknown, arg2: unknown): unknown;
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelMiniAppService {
addKernelMiniAppListener (listener: unknown): number;
removeKernelMiniAppListener (listenerId: number): void;
isNull (): boolean;
}

View File

@@ -1,27 +1,27 @@
export interface NodeIKernelMsgBackupService {
addKernelMsgBackupListener(listener: unknown): number;
addKernelMsgBackupListener (listener: unknown): number;
removeKernelMsgBackupListener(listenerId: number): void;
removeKernelMsgBackupListener (listenerId: number): void;
getMsgBackupLocation(...args: unknown[]): unknown;// needs 0 arguments
getMsgBackupLocation (): unknown;// needs 0 arguments
setMsgBackupLocation(...args: unknown[]): unknown;// needs 1 arguments
setMsgBackupLocation (arg: unknown): unknown;// needs 1 arguments
requestMsgBackup(...args: unknown[]): unknown;// needs 0 arguments
requestMsgBackup (): unknown;// needs 0 arguments
requestMsgRestore(...args: unknown[]): unknown;// needs 1 arguments
requestMsgRestore (arg: unknown): unknown;// needs 1 arguments
requestMsgMigrate(...args: unknown[]): unknown;// needs 1 arguments
requestMsgMigrate (arg: unknown): unknown;// needs 1 arguments
getLocalStorageBackup(...args: unknown[]): unknown;// needs 0 arguments
getLocalStorageBackup (): unknown;// needs 0 arguments
deleteLocalBackup(...args: unknown[]): unknown;// needs 1 arguments
deleteLocalBackup (arg: unknown): unknown;// needs 1 arguments
clearCache(...args: unknown[]): unknown;// needs 0 arguments
clearCache (): unknown;// needs 0 arguments
start(...args: unknown[]): unknown;// needs 1 arguments
start (arg: unknown): unknown;// needs 1 arguments
stop(...args: unknown[]): unknown;// needs 1 arguments
stop (arg: unknown): unknown;// needs 1 arguments
pause(...args: unknown[]): unknown;// needs 2 arguments
pause (arg1: unknown, arg2: unknown): unknown;// needs 2 arguments
}

View File

@@ -1,7 +1,7 @@
import { ElementType, MessageElement, Peer, RawMessage, FileElement, SendMessageElement } from '@/napcat-core/types';
import { ElementType, MessageElement, Peer, RawMessage, FileElement, SendMessageElement, AvRecordElement, TofuRecordElement } from '@/napcat-core/types';
import { NodeIKernelMsgListener } from '@/napcat-core/listeners/NodeIKernelMsgListener';
import { GeneralCallResult } from '@/napcat-core/services/common';
import { MsgReqType, QueryMsgsParams, TmpChatInfoApi } from '@/napcat-core/types/msg';
import { MsgReqType, QueryMsgsParams, TmpChatInfoApi, MsgTypeFilter, MsgIdentity, SgrpStreamParams, GrayTipJsonInfo, ForwardFileInfo, LocalGrayTipInfo, TokenInfo, BackGroundInfo } from '@/napcat-core/types/msg';
export interface NodeIKernelMsgService {
buildMultiForwardMsg (req: { srcMsgIds: Array<string>, srcContact: Peer; }): Promise<GeneralCallResult & { rspInfo: { elements: unknown; }; }>;
@@ -10,21 +10,21 @@ export interface NodeIKernelMsgService {
addKernelMsgListener (nodeIKernelMsgListener: NodeIKernelMsgListener): number;
sendMsg (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<unknown, unknown>): Promise<GeneralCallResult>;
sendMsg (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<number, unknown>): Promise<GeneralCallResult>;
recallMsg (peer: Peer, msgIds: string[]): Promise<GeneralCallResult>;
addKernelMsgImportToolListener (arg: unknown): unknown;
addKernelMsgImportToolListener (listener: unknown): string;
removeKernelMsgListener (args: unknown): unknown;
removeKernelMsgListener (listenerId: string): void;
addKernelTempChatSigListener (...args: unknown[]): unknown;
addKernelTempChatSigListener (listener: unknown): string;
removeKernelTempChatSigListener (...args: unknown[]): unknown;
removeKernelTempChatSigListener (listenerId: string): void;
setAutoReplyTextList (AutoReplyText: Array<unknown>, i2: number): unknown;
getAutoReplyTextList (...args: unknown[]): unknown;
getAutoReplyTextList (): unknown;
getOnLineDev (): void;
@@ -52,85 +52,85 @@ export interface NodeIKernelMsgService {
downloadOnlineStatusCommonByUrl (arg0: string, arg1: string): unknown;
setToken (arg: unknown): unknown;
setToken (tokenInfo: TokenInfo): Promise<GeneralCallResult>;
switchForeGround (): unknown;
switchBackGround (arg: unknown): unknown;
switchBackGround (info: BackGroundInfo): Promise<GeneralCallResult>;
setTokenForMqq (token: string): unknown;
switchForeGroundForMqq (...args: unknown[]): unknown;
switchForeGroundForMqq (data: string | Uint8Array): Promise<GeneralCallResult>;
switchBackGroundForMqq (...args: unknown[]): unknown;
switchBackGroundForMqq (data: string | Uint8Array): Promise<GeneralCallResult>;
getMsgSetting (...args: unknown[]): unknown;
getMsgSetting (): unknown;
setMsgSetting (...args: unknown[]): unknown;
setMsgSetting (setting: unknown): unknown;
addSendMsg (...args: unknown[]): unknown;
addSendMsg (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<number, unknown>): unknown;
cancelSendMsg (peer: Peer, msgId: string): Promise<void>;
switchToOfflineSendMsg (peer: Peer, MsgId: string): unknown;
reqToOfflineSendMsg (...args: unknown[]): unknown;
reqToOfflineSendMsg (peer: Peer, msgId: string): unknown;
refuseReceiveOnlineFileMsg (peer: Peer, MsgId: string): unknown;
resendMsg (peer: Peer, msgId: string): Promise<void>;
recallMsg (...args: unknown[]): unknown;
reeditRecallMsg (peer: Peer, msgId: string): unknown;
reeditRecallMsg (...args: unknown[]): unknown;
forwardMsg (msgIds: string[], peer: Peer, dstPeers: Peer[], commentElements: unknown): Promise<GeneralCallResult>;
forwardMsg (...args: unknown[]): Promise<GeneralCallResult>;
forwardMsgWithComment (msgIds: string[], srcContact: Peer, dstContacts: Peer[], commentElements: Array<unknown>, arg5: unknown): unknown;
forwardMsgWithComment (...args: unknown[]): unknown;
forwardSubMsgWithComment (msgIds: string[], subMsgIds: string[], srcContact: Peer, dstContacts: Peer[], commentElements: Array<unknown>, arg6: unknown): unknown;
forwardSubMsgWithComment (...args: unknown[]): unknown;
forwardRichMsgInVist (richMsgInfos: Array<unknown>, dstContacts: Peer[]): unknown;
forwardRichMsgInVist (...args: unknown[]): unknown;
forwardFile (fileInfo: ForwardFileInfo, peer: Peer): unknown;
forwardFile (...args: unknown[]): unknown;
multiForwardMsg (peer: Peer, srcContact: Peer, msgIds: string[]): unknown;
multiForwardMsg (...args: unknown[]): unknown;
multiForwardMsgWithComment (msgInfos: Array<unknown>, srcContact: Peer, dstContact: Peer, commentElements: Array<unknown>, arg5: unknown): unknown;
multiForwardMsgWithComment (...args: unknown[]): unknown;
deleteRecallMsg (peer: Peer, msgId: string): unknown;
deleteRecallMsg (...args: unknown[]): unknown;
deleteRecallMsgForLocal (peer: Peer, msgId: string): unknown;
deleteRecallMsgForLocal (...args: unknown[]): unknown;
addLocalGrayTipMsg (peer: Peer, grayTipInfo: LocalGrayTipInfo, isUnread: boolean): unknown;
addLocalGrayTipMsg (...args: unknown[]): unknown;
addLocalJsonGrayTipMsg (arg1: Peer, arg2: GrayTipJsonInfo, arg3: boolean, arg4: boolean): unknown;
addLocalJsonGrayTipMsg (...args: unknown[]): unknown;
addLocalJsonGrayTipMsgExt (arg1: Peer, arg2: MsgIdentity, arg3: GrayTipJsonInfo, arg4: boolean, arg5: boolean): unknown;
addLocalJsonGrayTipMsgExt (...args: unknown[]): unknown;
IsLocalJsonTipValid (tipType: number): boolean;
IsLocalJsonTipValid (...args: unknown[]): unknown;
addLocalAVRecordMsg (peer: Peer, avRecord: AvRecordElement): unknown;
addLocalAVRecordMsg (...args: unknown[]): unknown;
addLocalTofuRecordMsg (...args: unknown[]): unknown;
addLocalTofuRecordMsg (peer: Peer, tofuRecord: TofuRecordElement): unknown;
addLocalRecordMsg (Peer: Peer, msgId: string, ele: MessageElement, attr: Array<unknown> | number, front: boolean): Promise<unknown>;
addLocalRecordMsgWithExtInfos (peer: Peer, msgId: string, extInfos: unknown): unknown;
deleteMsg (Peer: Peer, msgIds: Array<string>): Promise<unknown>;
updateElementExtBufForUI (...args: unknown[]): unknown;
updateElementExtBufForUI (arg1: Peer, arg2: string, arg3: string, arg4: string | Uint8Array): unknown;
updateMsgRecordExtPbBufForUI (...args: unknown[]): unknown;
updateMsgRecordExtPbBufForUI (arg1: Peer, arg2: string, arg3: unknown): unknown;
startMsgSync (...args: unknown[]): unknown;
startMsgSync (): unknown;
startGuildMsgSync (...args: unknown[]): unknown;
startGuildMsgSync (): unknown;
isGuildChannelSync (...args: unknown[]): unknown;
isGuildChannelSync (): unknown;
getMsgUniqueId (UniqueId: string): string;
isMsgMatched (...args: unknown[]): unknown;
isMsgMatched (matchInfo: unknown): unknown;
getOnlineFileMsgs (peer: Peer): Promise<GeneralCallResult & {
msgList: {
@@ -147,7 +147,7 @@ export interface NodeIKernelMsgService {
}[]; // 一大坨,懒得写
}>;
getAllOnlineFileMsgs (...args: unknown[]): unknown;
getAllOnlineFileMsgs (): unknown;
getLatestDbMsgs (peer: Peer, cnt: number): Promise<GeneralCallResult & {
msgList: RawMessage[];
@@ -171,7 +171,7 @@ export interface NodeIKernelMsgService {
}>;
// @deprecated
getMsgsWithMsgTimeAndClientSeqForC2C (...args: unknown[]): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
getMsgsWithMsgTimeAndClientSeqForC2C (peer: Peer, arg2: string, arg3: string, arg4: number, arg5: boolean, arg6: boolean, arg7: boolean): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
getMsgsWithStatus (params: {
peer: Peer;
@@ -186,6 +186,7 @@ export interface NodeIKernelMsgService {
getMsgsBySeqRange (peer: Peer, startSeq: string, endSeq: string): Promise<GeneralCallResult & {
msgList: RawMessage[];
}>;
// @deprecated
getMsgsBySeqAndCount (peer: Peer, seq: string, count: number, desc: boolean, isReverseOrder: boolean): Promise<GeneralCallResult & {
msgList: RawMessage[];
@@ -211,19 +212,19 @@ export interface NodeIKernelMsgService {
getSourceOfReplyMsgByClientSeqAndTime (peer: Peer, clientSeq: string, time: string, replyMsgId: string): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
getMsgsByTypeFilter (peer: Peer, msgId: string, cnt: unknown, queryOrder: boolean, typeFilter: {
getMsgsByTypeFilter (peer: Peer, msgId: string, cnt: Array<unknown>, queryOrder: boolean, typeFilter: {
type: number,
subtype: Array<number>;
}): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
getMsgsByTypeFilters (peer: Peer, msgId: string, cnt: unknown, queryOrder: boolean, typeFilters: Array<{
getMsgsByTypeFilters (peer: Peer, msgId: string, cnt: number, queryOrder: boolean, typeFilters: Array<{
type: number,
subtype: Array<number>;
}>): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
getMsgWithAbstractByFilterParam (...args: unknown[]): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
getMsgWithAbstractByFilterParam (arg1: Peer, arg2: string, arg3: string, arg4: number, arg5: MsgTypeFilter): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
queryMsgsWithFilter (...args: unknown[]): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
queryMsgsWithFilter (msgId: string, msgTime: string, param: QueryMsgsParams): Promise<GeneralCallResult & { msgList: RawMessage[]; }>;
// queryMsgsWithFilterVer2(MsgId: string, MsgTime: string, param: QueryMsgsParams): Promise<unknown>;
@@ -235,11 +236,11 @@ export interface NodeIKernelMsgService {
msgList: RawMessage[];
}>;
setMsgRichInfoFlag (...args: unknown[]): unknown;
setMsgRichInfoFlag (flag: boolean): void;
queryPicOrVideoMsgs (msgId: string, msgTime: string, megSeq: string, param: QueryMsgsParams): Promise<unknown>;
queryPicOrVideoMsgsDesktop (...args: unknown[]): unknown;
queryPicOrVideoMsgsDesktop (msgId: string, msgTime: string, msgSeq: string, param: QueryMsgsParams): unknown;
queryEmoticonMsgs (msgId: string, msgTime: string, msgSeq: string, Params: QueryMsgsParams): Promise<unknown>;
@@ -247,81 +248,81 @@ export interface NodeIKernelMsgService {
queryMsgsAndAbstractsWithFilter (msgId: string, msgTime: string, megSeq: string, param: QueryMsgsParams): unknown;
setFocusOnGuild (...args: unknown[]): unknown;
setFocusOnGuild (arg: unknown): unknown;
setFocusSession (...args: unknown[]): unknown;
setFocusSession (arg: unknown): unknown;
enableFilterUnreadInfoNotify (...args: unknown[]): unknown;
enableFilterUnreadInfoNotify (arg: unknown): unknown;
enableFilterMsgAbstractNotify (...args: unknown[]): unknown;
enableFilterMsgAbstractNotify (arg: unknown): unknown;
onScenesChangeForSilenceMode (...args: unknown[]): unknown;
onScenesChangeForSilenceMode (arg: unknown): unknown;
getContactUnreadCnt (...args: unknown[]): unknown;
getContactUnreadCnt (peers: Peer[]): unknown;
getUnreadCntInfo (...args: unknown[]): unknown;
getUnreadCntInfo (arg: unknown): unknown;
getGuildUnreadCntInfo (...args: unknown[]): unknown;
getGuildUnreadCntInfo (arg: unknown): unknown;
getGuildUnreadCntTabInfo (...args: unknown[]): unknown;
getGuildUnreadCntTabInfo (arg: unknown): unknown;
getAllGuildUnreadCntInfo (...args: unknown[]): unknown;
getAllGuildUnreadCntInfo (arg: unknown): unknown;
getAllJoinGuildCnt (...args: unknown[]): unknown;
getAllJoinGuildCnt (arg: unknown): unknown;
getAllDirectSessionUnreadCntInfo (...args: unknown[]): unknown;
getAllDirectSessionUnreadCntInfo (arg: unknown): unknown;
getCategoryUnreadCntInfo (...args: unknown[]): unknown;
getCategoryUnreadCntInfo (arg: unknown): unknown;
getGuildFeedsUnreadCntInfo (...args: unknown[]): unknown;
getGuildFeedsUnreadCntInfo (arg: unknown): unknown;
setUnVisibleChannelCntInfo (...args: unknown[]): unknown;
setUnVisibleChannelCntInfo (arg: unknown): unknown;
setUnVisibleChannelTypeCntInfo (...args: unknown[]): unknown;
setUnVisibleChannelTypeCntInfo (arg: unknown): unknown;
setVisibleGuildCntInfo (...args: unknown[]): unknown;
setVisibleGuildCntInfo (arg: unknown): unknown;
setMsgRead (peer: Peer): Promise<GeneralCallResult>;
setAllC2CAndGroupMsgRead (): Promise<unknown>;
setGuildMsgRead (...args: unknown[]): unknown;
setGuildMsgRead (arg: unknown): unknown;
setAllGuildMsgRead (...args: unknown[]): unknown;
setAllGuildMsgRead (arg: unknown): unknown;
setMsgReadAndReport (...args: unknown[]): unknown;
setMsgReadAndReport (peer: Peer, msg: RawMessage): unknown;
setSpecificMsgReadAndReport (...args: unknown[]): unknown;
setSpecificMsgReadAndReport (arg1: Peer, arg2: string): unknown;
setLocalMsgRead (...args: unknown[]): unknown;
setLocalMsgRead (peer: Peer): unknown;
setGroupGuildMsgRead (...args: unknown[]): unknown;
setGroupGuildMsgRead (arg: unknown): unknown;
getGuildGroupTransData (...args: unknown[]): unknown;
getGuildGroupTransData (arg: unknown): unknown;
setGroupGuildBubbleRead (...args: unknown[]): unknown;
setGroupGuildBubbleRead (arg: unknown): unknown;
getGuildGroupBubble (...args: unknown[]): unknown;
getGuildGroupBubble (arg: unknown): unknown;
fetchGroupGuildUnread (...args: unknown[]): unknown;
fetchGroupGuildUnread (arg: unknown): unknown;
setGroupGuildFlag (...args: unknown[]): unknown;
setGroupGuildFlag (arg: unknown): unknown;
setGuildUDCFlag (...args: unknown[]): unknown;
setGuildUDCFlag (arg: unknown): unknown;
setGuildTabUserFlag (...args: unknown[]): unknown;
setGuildTabUserFlag (arg: unknown): unknown;
setBuildMode (flag: number/* 0 1 3 */): unknown;
setConfigurationServiceData (...args: unknown[]): unknown;
setConfigurationServiceData (arg: unknown): unknown;
setMarkUnreadFlag (...args: unknown[]): unknown;
setMarkUnreadFlag (peer: Peer, unread: boolean): unknown;
getChannelEventFlow (...args: unknown[]): unknown;
getChannelEventFlow (arg: unknown): unknown;
getMsgEventFlow (...args: unknown[]): unknown;
getMsgEventFlow (arg: unknown): unknown;
getRichMediaFilePathForMobileQQSend (...args: unknown[]): unknown;
getRichMediaFilePathForMobileQQSend (arg: unknown): unknown;
getRichMediaFilePathForGuild (arg: {
md5HexStr: string,
@@ -334,15 +335,15 @@ export interface NodeIKernelMsgService {
file_uuid: '';
}): string;
assembleMobileQQRichMediaFilePath (...args: unknown[]): unknown;
assembleMobileQQRichMediaFilePath (arg: unknown): unknown;
getFileThumbSavePathForSend (thumbSize: number, createNeed: boolean): string;
getFileThumbSavePath (...args: unknown[]): unknown;
getFileThumbSavePath (arg1: string, arg2: number, arg3: boolean): unknown;
translatePtt2Text (msgId: string, peer: Peer, msgElement: MessageElement): unknown;
setPttPlayedState (...args: unknown[]): unknown;
setPttPlayedState (arg1: string, arg2: Peer, arg3: string): unknown;
fetchFavEmojiList (str: string, num: number, backward: boolean, forceRefresh: boolean): Promise<GeneralCallResult & {
emojiInfoList: Array<{
@@ -368,49 +369,49 @@ export interface NodeIKernelMsgService {
}>;
}>;
addFavEmoji (...args: unknown[]): unknown;
addFavEmoji (arg: unknown): unknown;
fetchMarketEmoticonList (...args: unknown[]): unknown;
fetchMarketEmoticonList (arg1: number, arg2: number): unknown;
fetchMarketEmoticonShowImage (...args: unknown[]): unknown;
fetchMarketEmoticonShowImage (arg: unknown): unknown;
fetchMarketEmoticonAioImage (...args: unknown[]): unknown;
fetchMarketEmoticonAioImage (arg: unknown): unknown;
fetchMarketEmotionJsonFile (...args: unknown[]): unknown;
fetchMarketEmotionJsonFile (arg: unknown): unknown;
getMarketEmoticonPath (...args: unknown[]): unknown;
getMarketEmoticonPath (arg1: number, arg2: Array<unknown>[], arg3: number): unknown;
getMarketEmoticonPathBySync (...args: unknown[]): unknown;
getMarketEmoticonPathBySync (arg1: number, arg2: Array<unknown>[], arg3: number): unknown;
fetchMarketEmoticonFaceImages (...args: unknown[]): unknown;
fetchMarketEmoticonFaceImages (arg: unknown): unknown;
fetchMarketEmoticonAuthDetail (...args: unknown[]): unknown;
fetchMarketEmoticonAuthDetail (arg: unknown): unknown;
getFavMarketEmoticonInfo (...args: unknown[]): unknown;
getFavMarketEmoticonInfo (tabId: number, emojiId: string): unknown;
addRecentUsedFace (...args: unknown[]): unknown;
addRecentUsedFace (arg: unknown): unknown;
getRecentUsedFaceList (...args: unknown[]): unknown;
getRecentUsedFaceList (arg: unknown): unknown;
getMarketEmoticonEncryptKeys (...args: unknown[]): unknown;
getMarketEmoticonEncryptKeys (arg1: number, arg2: Array<unknown>[]): unknown;
downloadEmojiPic (...args: unknown[]): unknown;
downloadEmojiPic (arg1: number, arg2: Array<unknown>[], arg3: number, arg4: Map<unknown, unknown>): unknown;
deleteFavEmoji (...args: unknown[]): unknown;
deleteFavEmoji (arg: unknown): unknown;
modifyFavEmojiDesc (...args: unknown[]): unknown;
modifyFavEmojiDesc (arg: unknown): unknown;
queryFavEmojiByDesc (...args: unknown[]): unknown;
queryFavEmojiByDesc (arg: unknown): unknown;
getHotPicInfoListSearchString (...args: unknown[]): unknown;
getHotPicInfoListSearchString (arg1: string, arg2: string, arg3: number, arg4: number, arg5: boolean): unknown;
getHotPicSearchResult (...args: unknown[]): unknown;
getHotPicSearchResult (arg: unknown): unknown;
getHotPicHotWords (...args: unknown[]): unknown;
getHotPicHotWords (arg: unknown): unknown;
getHotPicJumpInfo (...args: unknown[]): unknown;
getHotPicJumpInfo (arg: unknown): unknown;
getEmojiResourcePath (...args: unknown[]): unknown;
getEmojiResourcePath (arg: unknown): unknown;
JoinDragonGroupEmoji (JoinDragonGroupEmojiReq: {
latestMsgSeq: string,
@@ -419,17 +420,17 @@ export interface NodeIKernelMsgService {
peerContact: Peer;
}): Promise<unknown>;
getMsgAbstracts (...args: unknown[]): unknown;
getMsgAbstracts (arg: unknown): unknown;
getMsgAbstract (...args: unknown[]): unknown;
getMsgAbstract (arg1: Peer, arg2: string): unknown;
getMsgAbstractList (...args: unknown[]): unknown;
getMsgAbstractList (arg: unknown): unknown;
getMsgAbstractListBySeqRange (...args: unknown[]): unknown;
getMsgAbstractListBySeqRange (arg: unknown): unknown;
refreshMsgAbstracts (...args: unknown[]): unknown;
refreshMsgAbstracts (arg: unknown): unknown;
refreshMsgAbstractsByGuildIds (...args: unknown[]): unknown;
refreshMsgAbstractsByGuildIds (arg: unknown): unknown;
getRichMediaElement (arg: {
msgId: string,
@@ -440,7 +441,7 @@ export interface NodeIKernelMsgService {
downloadType: number,
}): Promise<any>;
cancelGetRichMediaElement (...args: unknown[]): unknown;
cancelGetRichMediaElement (arg: unknown): unknown;
refuseGetRichMediaElement (args: {
msgId: string,
@@ -451,7 +452,7 @@ export interface NodeIKernelMsgService {
downSourceType: number, // 1
}): Promise<void>;
switchToOfflineGetRichMediaElement (...args: unknown[]): unknown;
switchToOfflineGetRichMediaElement (arg: unknown): unknown;
downloadRichMedia (args: {
fileModelId: string,
@@ -473,21 +474,21 @@ export interface NodeIKernelMsgService {
guildId: string;
}): Promise<unknown>;
getFirstUnreadCommonMsg (...args: unknown[]): unknown;
getFirstUnreadCommonMsg (arg: unknown): unknown;
getFirstUnreadAtmeMsg (...args: unknown[]): unknown;
getFirstUnreadAtmeMsg (peer: Peer): unknown;
getFirstUnreadAtallMsg (...args: unknown[]): unknown;
getFirstUnreadAtallMsg (peer: Peer): unknown;
getNavigateInfo (...args: unknown[]): unknown;
getNavigateInfo (arg: unknown): unknown;
getChannelFreqLimitInfo (...args: unknown[]): unknown;
getChannelFreqLimitInfo (arg: unknown): unknown;
getRecentUseEmojiList (...args: unknown[]): unknown;
getRecentUseEmojiList (): unknown;
getRecentEmojiList (...args: unknown[]): unknown;
getRecentEmojiList (arg: unknown): unknown;
setMsgEmojiLikes (...args: unknown[]): unknown;
setMsgEmojiLikes (peer: Peer, msgSeq: string, emojiId: string, emojiType: string, setOrCancel: boolean): unknown;
getMsgEmojiLikesList (peer: Peer, msgSeq: string, emojiId: string, emojiType: string, cookie: string, bForward: boolean, number: number): Promise<{
result: number,
@@ -503,7 +504,7 @@ export interface NodeIKernelMsgService {
isFirstPage: boolean;
}>;
setMsgEmojiLikesForRole (...args: unknown[]): unknown;
setMsgEmojiLikesForRole (arg1: Peer, arg2: string, arg3: string, arg4: string, arg5: string, arg6: string, arg7: boolean, arg8: boolean, arg9: SgrpStreamParams): unknown;
clickInlineKeyboardButton (params: {
guildId?: string,
@@ -516,7 +517,7 @@ export interface NodeIKernelMsgService {
chatType: number; // 1私聊 2群
}): Promise<GeneralCallResult & { status: number, promptText: string, promptType: number, promptIcon: number; }>;
setCurOnScreenMsg (...args: unknown[]): unknown;
setCurOnScreenMsg (arg: unknown): unknown;
setCurOnScreenMsgForMsgEvent (peer: Peer, msgRegList: Map<string, Uint8Array>): void;
@@ -524,91 +525,91 @@ export interface NodeIKernelMsgService {
setMiscData (key: string, value: string): unknown;
getBookmarkData (...args: unknown[]): unknown;
getBookmarkData (key: string): unknown;
setBookmarkData (...args: unknown[]): unknown;
setBookmarkData (key: string, value: string): unknown;
sendShowInputStatusReq (ChatType: number, EventType: number, toUid: string): Promise<unknown>;
queryCalendar (...args: unknown[]): unknown;
queryCalendar (peer: Peer, msgTime: number): unknown;
queryFirstMsgSeq (peer: Peer, ...args: unknown[]): unknown;
queryFirstMsgSeq (peer: Peer, msgTime: number): unknown;
queryRoamCalendar (...args: unknown[]): unknown;
queryRoamCalendar (peer: Peer, msgTime: number): unknown;
queryFirstRoamMsg (...args: unknown[]): unknown;
queryFirstRoamMsg (peer: Peer, msgTime: number): unknown;
fetchLongMsg (peer: Peer, msgId: string): unknown;
fetchLongMsgWithCb (...args: unknown[]): unknown;
fetchLongMsgWithCb (peer: Peer, msgId: number): unknown;
setIsStopKernelFetchLongMsg (...args: unknown[]): unknown;
setIsStopKernelFetchLongMsg (arg: unknown): unknown;
insertGameResultAsMsgToDb (...args: unknown[]): unknown;
insertGameResultAsMsgToDb (arg: unknown): unknown;
getMultiMsg (...args: unknown[]): Promise<GeneralCallResult & {
getMultiMsg (arg1: Peer, arg2: string, arg3: string): Promise<GeneralCallResult & {
msgList: RawMessage[];
}>;
setDraft (...args: unknown[]): unknown;
setDraft (arg1: Peer, arg2: Array<unknown>[]): unknown;
getDraft (...args: unknown[]): unknown;
getDraft (peer: Peer): unknown;
deleteDraft (...args: unknown[]): unknown;
deleteDraft (peer: Peer): unknown;
getRecentHiddenSesionList (...args: unknown[]): unknown;
getRecentHiddenSesionList (): unknown;
setRecentHiddenSession (...args: unknown[]): unknown;
setRecentHiddenSession (arg: unknown): unknown;
delRecentHiddenSession (...args: unknown[]): unknown;
delRecentHiddenSession (arg: unknown): unknown;
getCurHiddenSession (...args: unknown[]): unknown;
getCurHiddenSession (): unknown;
setCurHiddenSession (...args: unknown[]): unknown;
setCurHiddenSession (arg: unknown): unknown;
setReplyDraft (...args: unknown[]): unknown;
setReplyDraft (arg1: Peer, arg2: string, arg3: Array<unknown>[]): unknown;
getReplyDraft (...args: unknown[]): unknown;
getReplyDraft (arg1: Peer, arg2: string): unknown;
deleteReplyDraft (...args: unknown[]): unknown;
deleteReplyDraft (arg1: Peer, arg2: string): unknown;
getFirstUnreadAtMsg (peer: Peer): unknown;
clearMsgRecords (...args: unknown[]): unknown;
clearMsgRecords (peer: Peer): unknown;
IsExistOldDb (...args: unknown[]): unknown;
IsExistOldDb (): unknown;
canImportOldDbMsg (...args: unknown[]): unknown;
canImportOldDbMsg (): unknown;
setPowerStatus (isPowerOn: boolean): unknown;
canProcessDataMigration (...args: unknown[]): unknown;
canProcessDataMigration (): unknown;
importOldDbMsg (...args: unknown[]): unknown;
importOldDbMsg (): unknown;
stopImportOldDbMsgAndroid (...args: unknown[]): unknown;
stopImportOldDbMsgAndroid (): unknown;
isMqqDataImportFinished (...args: unknown[]): unknown;
isMqqDataImportFinished (): unknown;
getMqqDataImportTableNames (...args: unknown[]): unknown;
getMqqDataImportTableNames (): unknown;
getCurChatImportStatusByUin (...args: unknown[]): unknown;
getCurChatImportStatusByUin (arg1: unknown, arg2: unknown): unknown;
getDataImportUserLevel (): unknown;
getMsgQRCode (...args: unknown[]): unknown;
getMsgQRCode (): unknown;
getGuestMsgAbstracts (...args: unknown[]): unknown;
getGuestMsgAbstracts (arg: unknown): unknown;
getGuestMsgByRange (...args: unknown[]): unknown;
getGuestMsgByRange (arg: unknown): unknown;
getGuestMsgAbstractByRange (...args: unknown[]): unknown;
getGuestMsgAbstractByRange (arg: unknown): unknown;
registerSysMsgNotification (...args: unknown[]): unknown;
registerSysMsgNotification (arg1: number, arg2: string, arg3: Array<unknown>[]): unknown;
unregisterSysMsgNotification (...args: unknown[]): unknown;
unregisterSysMsgNotification (arg1: number, arg2: string, arg3: Array<unknown>[]): unknown;
enterOrExitAio (...args: unknown[]): unknown;
enterOrExitAio (arg: unknown): unknown;
prepareTempChat (args: unknown): unknown;
@@ -616,66 +617,66 @@ export interface NodeIKernelMsgService {
getTempChatInfo (ChatType: number, Uid: string): Promise<TmpChatInfoApi>;
setContactLocalTop (...args: unknown[]): unknown;
setContactLocalTop (peer: Peer, isTop: boolean): unknown;
switchAnonymousChat (...args: unknown[]): unknown;
switchAnonymousChat (arg1: string, arg2: boolean): unknown;
renameAnonyChatNick (...args: unknown[]): unknown;
renameAnonyChatNick (arg: unknown): unknown;
getAnonymousInfo (...args: unknown[]): unknown;
getAnonymousInfo (peer: Peer): unknown;
updateAnonymousInfo (...args: unknown[]): unknown;
updateAnonymousInfo (peer: Peer, arg2: unknown): unknown;
sendSummonMsg (peer: Peer, MsgElement: unknown, MsgAttributeInfo: unknown): Promise<unknown>;// 频道的东西
outputGuildUnreadInfo (...args: unknown[]): unknown;
outputGuildUnreadInfo (arg: unknown): unknown;
checkMsgWithUrl (...args: unknown[]): unknown;
checkMsgWithUrl (arg: unknown): unknown;
checkTabListStatus (...args: unknown[]): unknown;
checkTabListStatus (): unknown;
getABatchOfContactMsgBoxInfo (...args: unknown[]): unknown;
getABatchOfContactMsgBoxInfo (arg: unknown): unknown;
insertMsgToMsgBox (peer: Peer, msgId: string, arg: 2006): unknown;
isHitEmojiKeyword (...args: unknown[]): unknown;
isHitEmojiKeyword (arg: unknown): unknown;
getKeyWordRelatedEmoji (...args: unknown[]): unknown;
getKeyWordRelatedEmoji (arg: unknown): unknown;
recordEmoji (...args: unknown[]): unknown;
recordEmoji (type: number, emojiList: Array<unknown>): unknown;
fetchGetHitEmotionsByWord (args: unknown): Promise<unknown>;// 表情推荐?
deleteAllRoamMsgs (...args: unknown[]): unknown;// 漫游消息?
deleteAllRoamMsgs (arg1: number, arg2: string): unknown;// 漫游消息?
packRedBag (...args: unknown[]): unknown;
packRedBag (arg: unknown): unknown;
grabRedBag (...args: unknown[]): unknown;
grabRedBag (arg: unknown): unknown;
pullDetail (...args: unknown[]): unknown;
pullDetail (arg: unknown): unknown;
selectPasswordRedBag (...args: unknown[]): unknown;
selectPasswordRedBag (arg: unknown): unknown;
pullRedBagPasswordList (...args: unknown[]): unknown;
pullRedBagPasswordList (): unknown;
requestTianshuAdv (...args: unknown[]): unknown;
requestTianshuAdv (arg: unknown): unknown;
tianshuReport (...args: unknown[]): unknown;
tianshuReport (arg: unknown): unknown;
tianshuMultiReport (...args: unknown[]): unknown;
tianshuMultiReport (arg: unknown): unknown;
GetMsgSubType (a0: number, a1: number): unknown;
setIKernelPublicAccountAdapter (...args: unknown[]): unknown;
setIKernelPublicAccountAdapter (arg: unknown): unknown;
// tempChatGameSession有关
createUidFromTinyId (fromTinyId: string, toTinyId: string): string;
dataMigrationGetDataAvaiableContactList (...args: unknown[]): unknown;
dataMigrationGetDataAvaiableContactList (): unknown;
dataMigrationGetMsgList (...args: unknown[]): unknown;
dataMigrationGetMsgList (arg1: unknown, arg2: unknown): unknown;
dataMigrationStopOperation (...args: unknown[]): unknown;
dataMigrationStopOperation (arg: unknown): unknown;
dataMigrationImportMsgPbRecord (DataMigrationMsgInfo: Array<{
extensionData: string;// "Hex"
@@ -696,38 +697,37 @@ export interface NodeIKernelMsgService {
msgType: number;
}): unknown;
dataMigrationGetResourceLocalDestinyPath (...args: unknown[]): unknown;
dataMigrationGetResourceLocalDestinyPath (arg: unknown): unknown;
dataMigrationSetIOSPathPrefix (...args: unknown[]): unknown;
dataMigrationSetIOSPathPrefix (arg: unknown): unknown;
getServiceAssistantSwitch (...args: unknown[]): unknown;
getServiceAssistantSwitch (arg: unknown): unknown;
setServiceAssistantSwitch (...args: unknown[]): unknown;
setServiceAssistantSwitch (arg: unknown): unknown;
setSubscribeFolderUsingSmallRedPoint (...args: unknown[]): unknown;
setSubscribeFolderUsingSmallRedPoint (arg: unknown): unknown;
clearGuildNoticeRedPoint (...args: unknown[]): unknown;
clearGuildNoticeRedPoint (arg: unknown): unknown;
clearFeedNoticeRedPoint (...args: unknown[]): unknown;
clearFeedNoticeRedPoint (arg: unknown): unknown;
clearFeedSquareRead (...args: unknown[]): unknown;
clearFeedSquareRead (arg: unknown): unknown;
IsC2CStyleChatType (...args: unknown[]): unknown;
IsC2CStyleChatType (chatType: unknown): unknown;
IsTempChatType (uin: number): unknown;// 猜的
getGuildInteractiveNotification (...args: unknown[]): unknown;
getGuildInteractiveNotification (arg: unknown): unknown;
getGuildNotificationAbstract (...args: unknown[]): unknown;
getGuildNotificationAbstract (arg: unknown): unknown;
setFocusOnBase (...args: unknown[]): unknown;
setFocusOnBase (arg: unknown): unknown;
queryArkInfo (...args: unknown[]): unknown;
queryArkInfo (arg: unknown): unknown;
queryUserSecQuality (...args: unknown[]): unknown;
queryUserSecQuality (): unknown;
getGuildMsgAbFlag (...args: unknown[]): unknown;
getGuildMsgAbFlag (arg: unknown): unknown;
getGroupMsgStorageTime (): unknown;
}

View File

@@ -0,0 +1,11 @@
export interface NodeIKernelNearbyProService {
addKernelNearbyProListener (listener: unknown): number;
removeKernelNearbyProListener (listenerId: number): void;
fetchNearbyProUserInfo (arg1: unknown[], arg2: unknown, arg3: boolean): unknown;
setCommonExtInfo (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -14,4 +14,118 @@ export interface NodeIKernelNodeMiscService {
startNewMiniApp (appfile: string, params: string): unknown;
getQimei36WithNewSdk (): Promise<string>;
adaptMiniAppShareInfo (arg: unknown): unknown;
addBind (arg1: unknown, arg2: unknown): unknown;
changeSendKey (arg: unknown): unknown;
checkIfHaveAvailableSidecarDevice (arg: unknown): unknown;
clearQzoneUnreadCount (arg: unknown): unknown;
clearQzoneUnreadCountWithRedDot (arg: unknown): unknown;
closeWXMiniApp (arg: unknown): unknown;
delBind (arg: unknown): unknown;
deleteShareFile (arg: unknown): unknown;
dispatchWmpfEvent (arg: unknown): unknown;
doAction (arg1: unknown, arg2: unknown): unknown;
doPostAction (arg1: unknown, arg2: unknown): unknown;
downloadMiniApp (arg: unknown): unknown;
downloadMiniGame (arg: unknown): unknown;
encodeAES (arg1: unknown, arg2: unknown): unknown;
flashWindowInTaskbar (arg1: unknown, arg2: unknown): unknown;
getAppLaunchInfo (arg: unknown): unknown;
getCurWindowInfo (arg: unknown): unknown;
getCurWindowInfoExceptList (arg: unknown): unknown;
getMiniGameV2EngineConfig (arg: unknown): unknown;
getMyAppList (arg: unknown): unknown;
getOpenAuth (arg1: unknown, arg2: unknown): unknown;
getQQlevelInfo (arg: unknown): unknown;
getQzoneUnreadCount (arg: unknown): unknown;
installApp (arg1: unknown, arg2: unknown): unknown;
isAppInstalled (arg: unknown): unknown;
isOldQQRunning (arg: unknown): unknown;
judgeTimingRequest (arg: unknown): unknown;
listenWindowEvents (arg: unknown): unknown;
loginWXMiniApp (arg: unknown): unknown;
openFileAndDirSelectDlg (arg: unknown): unknown;
prefetch (arg: unknown): unknown;
qqConnectBatchShare (arg1: unknown, arg2: unknown): unknown;
qqConnectShare (arg: unknown): unknown;
qqConnectShareCheck (arg: unknown): unknown;
registerSchemes (arg: unknown): unknown;
registerScreenCaptureShortcutWithKeycode (arg: unknown): unknown;
registerScreenRecordShortcutWithKeycode (arg: unknown): unknown;
removeQuarantineAttribute (arg: unknown): unknown;
reportExecuteRequest (arg: unknown): unknown;
scanQBar (arg: unknown): unknown;
sendMessageResponseToWX (arg1: unknown, arg2: unknown): unknown;
sendRequestToApiGateway (arg: unknown): unknown;
sendWXCustomMenuClickedAction (arg1: unknown, arg2: unknown): unknown;
setBackgroudWindowLevel (arg1: unknown, arg2: unknown): unknown;
setMiniGameVersion (arg: unknown): unknown;
setVulkanEnable (arg: unknown): unknown;
setWindowLevelNT (arg1: unknown, arg2: unknown): unknown;
setWindowsMenuInstallStatus (arg: unknown): unknown;
setWXCustomMenuConfig (arg1: unknown, arg2: unknown): unknown;
startNewApp (arg: unknown): unknown;
startScreenCapture (arg1: unknown, arg2: unknown): unknown;
stopFlashWindow (arg: unknown): unknown;
unlistenWindowEvents (arg: unknown): unknown;
unregisterHotkey (arg: unknown): unknown;
writeBitmapToClipboard (arg: unknown): unknown;
writeClipboard (arg1: unknown, arg2: unknown): unknown;
}

View File

@@ -1,36 +1,29 @@
export interface NodeIKernelOnlineStatusService {
addKernelOnlineStatusListener(listener: unknown): number;
addKernelOnlineStatusListener (listener: unknown): number;
removeKernelOnlineStatusListener(listenerId: number): void;
removeKernelOnlineStatusListener (listenerId: number): void;
getShouldShowAIOStatusAnimation(arg: unknown): unknown;
getShouldShowAIOStatusAnimation (arg: unknown): unknown;
setReadLikeList(arg: unknown): unknown;
setReadLikeList (arg: unknown): unknown;
getLikeList(arg: unknown): unknown;
getLikeList (arg: unknown): Promise<unknown>;
setLikeStatus(arg: unknown): unknown;
setLikeStatus (arg: unknown): Promise<unknown>;
getAggregationPageEntrance(): unknown;
setOnlineStatusLiteBusinessSwitch (enabled: boolean): void;
didClickAggregationPageEntrance(): unknown;
getAggregationPageEntrance (): unknown;
getAggregationGroupModels(): unknown;
didClickAggregationPageEntrance (): unknown;
// {
// "businessType": 1,
// "uins": [
// "1627126029",
// "66600000",
// "71702575"
// ]
// }
getAggregationGroupModels (): unknown;
checkLikeStatus(param: {
checkLikeStatus (param: {
businessType: number,
uins: string[]
uins: string[];
}): Promise<unknown>;
isNull(): boolean;
isNull (): boolean;
}

View File

@@ -0,0 +1,75 @@
export interface NodeIKernelPersonalAlbumService {
addAlbumPermissions (arg: unknown): unknown;
addComment (arg: unknown): unknown;
addReply (arg: unknown): unknown;
createAlbum (arg: unknown): unknown;
delBatchPhoto (arg: unknown): unknown;
deleteAlbum (arg: unknown): unknown;
deleteComment (arg: unknown): unknown;
deleteReply (arg: unknown): unknown;
doLike (arg: unknown): unknown;
editAlbum (arg: unknown): unknown;
editTravelAlbumScence (arg: unknown): unknown;
forwardAlbumToQzone (arg: unknown): unknown;
getAlbumInviteJoinPage (arg: unknown): unknown;
getAlbumJoinApprovalPage (arg: unknown): unknown;
getAlbumList (arg: unknown): unknown;
getAlbumMemberList (arg: unknown): unknown;
getCommentList (arg: unknown): unknown;
getLayerTailpageRecommend (arg: unknown): unknown;
getPhotoList (arg: unknown): unknown;
getPhotoListByTimeLine (arg: unknown): unknown;
getPhotoTabByTimeLine (arg: unknown): unknown;
getShareInfo (arg: unknown): unknown;
getVideoTabByTimeLine (arg: unknown): unknown;
inviteCheckForLoversAlbum (arg: unknown): unknown;
joinShareAlbum (arg: unknown): unknown;
moveBatchPhoto (arg: unknown): unknown;
queryAlbum (arg: unknown): unknown;
quitSharedAlbum (arg: unknown): unknown;
removeAlbumMember (arg: unknown): unknown;
respondToJoinRequest (arg: unknown): unknown;
sendAlbumInvitation (arg: unknown): unknown;
setAlbumServiceInfo (arg1: string, arg2: string, arg3: string): unknown;
setTopAlbum (arg: unknown): unknown;
unLike (arg: unknown): unknown;
updateAlbumMember (arg: unknown): unknown;
verifyAlbumQuestion (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -1,37 +1,37 @@
import { BuddyProfileLikeReq, GeneralCallResult, NTVoteInfo } from '@/napcat-core/index';
export interface NodeIKernelProfileLikeService {
addKernelProfileLikeListener(listener: unknown): number;
addKernelProfileLikeListener (listener: unknown): number;
removeKernelProfileLikeListener(listenerId: unknown): void;
removeKernelProfileLikeListener (listenerId: number): void;
setBuddyProfileLike(...args: unknown[]): { result: number, errMsg: string, succCounts: number };
setBuddyProfileLike (arg: unknown): Promise<{ result: number, errMsg: string, succCounts: number; }>;
getBuddyProfileLike(req: BuddyProfileLikeReq): Promise<GeneralCallResult & {
getBuddyProfileLike (req: BuddyProfileLikeReq): Promise<GeneralCallResult & {
info: {
userLikeInfos: Array<{
uid: string,
time: string,
favoriteInfo: {
userInfos: Array<NTVoteInfo>, // 哪些人点我
userInfos: Array<NTVoteInfo>,
total_count: number,
last_time: number,
today_count: number
today_count: number;
},
voteInfo: {
total_count: number,
new_count: number,
new_nearby_count: number,
last_visit_time: number,
userInfos: Array<NTVoteInfo>, // 点过哪些人
}
userInfos: Array<NTVoteInfo>;
};
}>,
friendMaxVotes: number,
start: number
}
start: number;
};
}>;
getProfileLikeScidResourceInfo(...args: unknown[]): void;
getProfileLikeScidResourceInfo (arg: unknown): void;
isNull(): boolean;
isNull (): boolean;
}

View File

@@ -3,80 +3,94 @@ import { BizKey, ModifyProfileParams, NodeIKernelProfileListener, ProfileBizType
import { GeneralCallResult } from '@/napcat-core/services/common';
export interface NodeIKernelProfileService {
getOtherFlag(callfrom: string, uids: string[]): Promise<Map<string, unknown>>;
getOtherFlag (callfrom: string, uids: string[]): Promise<Map<string, unknown>>;
getVasInfo(callfrom: string, uids: string[]): Promise<Map<string, unknown>>;
getVasInfo (callfrom: string, uids: string[]): Promise<Map<string, unknown>>;
getRelationFlag(callfrom: string, uids: string[]): Promise<Map<string, unknown>>;
getRelationFlag (callfrom: string, uids: string[]): Promise<Map<string, unknown>>;
getUidByUin(callfrom: string, uin: Array<string>): Map<string, string>;
getUidByUin (callfrom: string, uin: Array<string>): Map<string, string>;
getUinByUid(callfrom: string, uid: Array<string>): Map<string, string>;
getUinByUid (callfrom: string, uid: Array<string>): Map<string, string>;
getCoreAndBaseInfo(callfrom: string, uids: string[]): Promise<Map<string, SimpleInfo>>;
getCoreAndBaseInfo (callfrom: string, uids: string[]): Promise<Map<string, SimpleInfo>>;
fetchUserDetailInfo(trace: string, uids: string[], source: UserDetailSource, bizType: ProfileBizType[]): Promise<GeneralCallResult &
{
source: UserDetailSource,
// uid -> detail
detail: Map<string, UserDetailInfoListenerArg>,
}
>;
fetchUserDetailInfo (trace: string, uids: string[], source: UserDetailSource, bizType: ProfileBizType[]): Promise<GeneralCallResult &
{
source: UserDetailSource,
// uid -> detail
detail: Map<string, UserDetailInfoListenerArg>,
}
>;
addKernelProfileListener(listener: NodeIKernelProfileListener): number;
addKernelProfileListener (listener: NodeIKernelProfileListener): number;
removeKernelProfileListener(listenerId: number): void;
removeKernelProfileListener (listenerId: number): void;
prepareRegionConfig(...args: unknown[]): unknown;
prepareRegionConfig (): unknown;
getLocalStrangerRemark(): Promise<AnyCnameRecord>;
getLocalStrangerRemark (): Promise<AnyCnameRecord>;
enumCountryOptions(): Array<string>;
enumCountryOptions (): Array<string>;
enumProvinceOptions(country: string): Array<string>;
enumProvinceOptions (country: string): Array<string>;
enumCityOptions(country: string, province: string): unknown;
enumCityOptions (country: string, province: string): unknown;
enumAreaOptions(...args: unknown[]): unknown;
enumAreaOptions (arg1: string, arg2: string, arg3: string): unknown;
modifySelfProfile(...args: unknown[]): Promise<unknown>;
modifySelfProfile (param: unknown): Promise<unknown>;
modifyDesktopMiniProfile(param: ModifyProfileParams): Promise<GeneralCallResult>;
modifyDesktopMiniProfile (param: ModifyProfileParams): Promise<GeneralCallResult>;
setNickName(nickName: string): Promise<unknown>;
setNickName (nickName: string): Promise<unknown>;
setLongNick(longNick: string): Promise<unknown>;
setLongNick (longNick: string): Promise<unknown>;
setBirthday(...args: unknown[]): Promise<unknown>;
setBirthday (year: number, month: number, day: number): Promise<unknown>;
setGander(...args: unknown[]): Promise<unknown>;
setGander (gender: unknown): Promise<unknown>;
setHeader(arg: string): Promise<GeneralCallResult>;
setHeader (arg: string): Promise<GeneralCallResult>;
setRecommendImgFlag(...args: unknown[]): Promise<unknown>;
setRecommendImgFlag (flag: unknown): Promise<unknown>;
getUserSimpleInfo(force: boolean, uids: string[]): Promise<unknown>;
getUserSimpleInfo (force: boolean, uids: string[]): Promise<unknown>;
getUserDetailInfo(uid: string): Promise<unknown>;
getUserDetailInfo (uid: string): Promise<unknown>;
getUserDetailInfoWithBizInfo(uid: string, Biz: BizKey[]): Promise<GeneralCallResult>;
getUserDetailInfoWithBizInfo (uid: string, Biz: BizKey[]): Promise<GeneralCallResult>;
getUserDetailInfoByUin(uin: string): Promise<UserDetailInfoByUin>;
getUserDetailInfoByUin (uin: string): Promise<UserDetailInfoByUin>;
getZplanAvatarInfos(args: string[]): Promise<unknown>;
getZplanAvatarInfos (args: string[]): Promise<unknown>;
getStatus(uid: string): Promise<unknown>;
getStatus (uid: string): Promise<unknown>;
startStatusPolling(isForceReset: boolean): Promise<unknown>;
startStatusPolling (isForceReset: boolean): Promise<unknown>;
getSelfStatus(): Promise<unknown>;
getSelfStatus (): Promise<unknown>;
setdisableEmojiShortCuts(...args: unknown[]): unknown;
setdisableEmojiShortCuts (arg: unknown): unknown;
getProfileQzonePicInfo(uid: string, type: number, force: boolean): Promise<unknown>;
getProfileQzonePicInfo (uid: string, type: number, force: boolean): Promise<unknown>;
// UserRemarkServiceImpl::getStrangerRemarkByUid []
getCoreInfo(sceneId: string, arg: unknown[]): unknown;
getCoreInfo (sceneId: string, arg: unknown[]): unknown;
isNull(): boolean;
isNull (): boolean;
addKernelProfileListenerForUICache (listener: unknown): number;
asyncGetCoreInfo (callfrom: string, uids: string[]): unknown;
getIntimate (uid: string, arg: unknown): unknown;
getStatusInfo (uid: string, arg: unknown): unknown;
getStockLocalData (key: string, arg: unknown): unknown;
updateProfileData (uid: string, data: unknown): unknown;
updateStockLocalData (key: string, data: unknown): unknown;
}

View File

@@ -0,0 +1,15 @@
export interface NodeIKernelPublicAccountService {
addListener (listener: unknown): number;
removeListener (listenerId: number): void;
follow (arg: unknown): unknown;
queryTemplateInfo (arg: unknown): unknown;
subscribeTemplate (arg: unknown): unknown;
unfollow (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,19 @@
export interface NodeIKernelQQPlayService {
addKernelQQPlayListener (listener: unknown): number;
removeKernelQQPlayListener (listenerId: number): void;
createLnkShortcut (arg1: string, arg2: string, arg3: string, arg4: string): unknown;
getSystemRegValue (arg1: number, arg2: string, arg3: string): unknown;
setSystemRegValue (arg1: number, arg2: string, arg3: string, arg4: string): unknown;
sendMsg2Simulator (arg1: unknown, arg2: unknown): unknown;
setForegroundWindow (arg: unknown): unknown;
startSimulator (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,21 @@
export interface NodeIKernelQiDianService {
addKernelQiDianListener (listener: unknown): number;
removeKernelQiDianListener (listenerId: number): void;
requestExtUinForRemoteControl (arg1: string, arg2: string, arg3: number): unknown;
requestMainUinForRemoteControl (arg: unknown): unknown;
requestNaviConfig (arg: unknown): unknown;
requestQidianUidFromUin (arg: unknown): unknown;
requestWpaCorpInfo (arg: unknown): unknown;
requestWpaSigT (arg1: unknown, arg2: unknown): unknown;
requestWpaUserInfo (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,13 @@
export interface NodeIKernelRDeliveryService {
addDataChangeListener (listener: unknown): number;
removeDataChangeListener (listenerId: number): void;
getRDeliveryDataByKey (arg: unknown): unknown;
requestBatchRemoteDataByScene (arg1: unknown, arg2: unknown): unknown;
requestSingleRemoteDataByKey (arg1: string, arg2: unknown): unknown;
isNull (): boolean;
}

View File

@@ -4,17 +4,19 @@ import { GeneralCallResult } from '@/napcat-core/services/common';
import { FSABRecentContactParams } from '@/napcat-core/types/contact';
export interface NodeIKernelRecentContactService {
setGuildDisplayStatus(...args: unknown[]): unknown; // 2 arguments
setGuildDisplayStatus (arg1: unknown, arg2: unknown): unknown;
setContactListTop(...args: unknown[]): unknown; // 2 arguments
setContactListTop (peer: Peer, isTop: boolean): unknown;
updateRecentContactExtBufForUI(...args: unknown[]): unknown; // 2 arguments
updateRecentContactExtBufForUI (peer: Peer, extBuf: unknown): unknown;
upsertRecentContactManually(...args: unknown[]): unknown; // 1 arguments
upsertRecentContactManually (arg: unknown): unknown;
enterOrExitMsgList(...args: unknown[]): unknown; // 1 arguments
manageContactMergeWindow (arg: unknown): unknown;
getRecentContactListSnapShot(count: number): Promise<GeneralCallResult & {
enterOrExitMsgList (arg: unknown): unknown;
getRecentContactListSnapShot (count: number): Promise<GeneralCallResult & {
info: {
errCode: number,
errMsg: string,
@@ -28,56 +30,56 @@ export interface NodeIKernelRecentContactService {
peerUin: string,
msgTime: string,
chatType: ChatType,
msgId: string
}>
}
}>; // 1 arguments
msgId: string;
}>;
};
}>;
clearMsgUnreadCount(...args: unknown[]): unknown; // 1 arguments
clearMsgUnreadCount (peer: Peer): unknown;
getRecentContactListSyncLimit(count: number): unknown;
getRecentContactListSyncLimit (count: number): unknown;
jumpToSpecifyRecentContact(...args: unknown[]): unknown; // 1 arguments
jumpToSpecifyRecentContact (arg: unknown): unknown;
fetchAndSubscribeABatchOfRecentContact(params: FSABRecentContactParams): unknown; // 1 arguments
fetchAndSubscribeABatchOfRecentContact (params: FSABRecentContactParams): unknown;
addRecentContact(peer: Peer): unknown;
addRecentContact (peer: Peer): unknown;
deleteRecentContacts(peer: Peer): unknown; // 猜测
deleteRecentContacts (peer: Peer): unknown;
getContacts(peers: Peer[]): Promise<unknown>;
getContacts (peers: Peer[]): Promise<unknown>;
setThirdPartyBusinessInfos(...args: unknown[]): unknown; // 1 arguments
setThirdPartyBusinessInfos (arg: unknown): unknown;
updateGameMsgConfigs(...args: unknown[]): unknown; // 1 arguments
updateGameMsgConfigs (arg: unknown): unknown;
removeKernelRecentContactListener(listenerid: number): unknown; // 1 arguments
removeKernelRecentContactListener (listenerId: number): unknown;
addKernelRecentContactListener(listener: NodeIKernelRecentContactListener): void;
addKernelRecentContactListener (listener: NodeIKernelRecentContactListener): void;
clearRecentContactsByChatType(...args: unknown[]): unknown; // 1 arguments
clearRecentContactsByChatType (chatType: ChatType): unknown;
upInsertModule(...args: unknown[]): unknown; // 1 arguments
upInsertModule (arg: unknown): unknown;
jumpToSpecifyRecentContactVer2(...args: unknown[]): unknown; // 1 arguments
jumpToSpecifyRecentContactVer2 (arg: unknown): unknown;
deleteRecentContactsVer2(...args: unknown[]): unknown; // 1 arguments
deleteRecentContactsVer2 (arg: unknown): unknown;
getRecentContactList(): Promise<unknown>;
getRecentContactList (): Promise<unknown>;
getMsgUnreadCount(): unknown;
getMsgUnreadCount (): unknown;
clearRecentContacts(): unknown;
clearRecentContacts (): unknown;
getServiceAssistantRecentContactInfos(): unknown;
getServiceAssistantRecentContactInfos (): unknown;
getRecentContactInfos(): unknown;
getRecentContactInfos (): unknown;
getUnreadDetailsInfos(): unknown;
getUnreadDetailsInfos (): unknown;
cleanAllModule(): unknown;
cleanAllModule (): unknown;
setAllGameMsgRead(): unknown;
setAllGameMsgRead (): unknown;
getRecentContactListSync(): unknown;
getRecentContactListSync (): unknown;
}

View File

@@ -0,0 +1,17 @@
export interface NodeIKernelRemotingService {
addKernelRemotingListener (listener: unknown): number;
removeKernelRemotingListener (listenerId: number): void;
accept (arg1: string, arg2: boolean): unknown;
setPenetrateBuffer (arg1: number, arg2: number, arg3: string): unknown;
startRemotingClient (arg: unknown): unknown;
startRemotingInvite (arg: unknown): unknown;
stopRemoting (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -62,7 +62,7 @@ export interface NodeIKernelRichMediaService {
// KHAND,
// KAUTO
// }
getVideoPlayUrl(peer: Peer, msgId: string, elemId: string, videoCodecFormat: number, VideoRequestWay: number): Promise<unknown>;
getVideoPlayUrl (peer: Peer, msgId: string, elemId: string, videoCodecFormat: number, VideoRequestWay: number): Promise<unknown>;
// exParams (RMReqExParams)
// this.downSourceType = i2;
@@ -81,9 +81,9 @@ export interface NodeIKernelRichMediaService {
// public static final int KTRIGGERTYPEAUTO = 1;
// public static final int KTRIGGERTYPEMANUAL = 0;
getVideoPlayUrlV2(peer: Peer, msgId: string, elemId: string, videoCodecFormat: number, exParams: {
getVideoPlayUrlV2 (peer: Peer, msgId: string, elemId: string, videoCodecFormat: number, exParams: {
downSourceType: number,
triggerType: number
triggerType: number;
}): Promise<GeneralCallResult & {
urlResult: {
v4IpUrl: [],
@@ -91,15 +91,15 @@ export interface NodeIKernelRichMediaService {
domainUrl: Array<{
url: string,
isHttps: boolean,
httpsDomain: string
httpsDomain: string;
}>,
videoCodecFormat: number
}
videoCodecFormat: number;
};
}>;
getRichMediaFileDir(elementType: number, downType: number, isTemp: boolean): unknown;
getRichMediaFileDir (elementType: number, downType: number, isTemp: boolean): unknown;
getVideoPlayUrlInVisit(arg: {
getVideoPlayUrlInVisit (arg: {
downloadType: number,
thumbSize: number,
msgId: string,
@@ -111,17 +111,17 @@ export interface NodeIKernelRichMediaService {
peerUid: string,
guildId: string,
ele: MessageElement,
useHttps: boolean
useHttps: boolean;
}): Promise<unknown>;
isFileExpired(arg: number): unknown;
isFileExpired (arg: number): unknown;
deleteGroupFolder(GroupCode: string, FolderId: string): Promise<GeneralCallResult & {
groupFileCommonResult: { retCode: number, retMsg: string, clientWording: string }
deleteGroupFolder (GroupCode: string, FolderId: string): Promise<GeneralCallResult & {
groupFileCommonResult: { retCode: number, retMsg: string, clientWording: string; };
}>;
// 参数与getVideoPlayUrlInVisit一样
downloadRichMediaInVisit(arg: {
downloadRichMediaInVisit (arg: {
downloadType: number,
thumbSize: number,
msgId: string,
@@ -133,10 +133,10 @@ export interface NodeIKernelRichMediaService {
peerUid: string,
guildId: string,
ele: MessageElement,
useHttps: boolean
useHttps: boolean;
}): unknown;
downloadFileForModelId(peer: Peer, ModelId: string[], unknown: string): Promise<unknown>;
downloadFileForModelId (peer: Peer, ModelId: string[], unknown: string): Promise<unknown>;
// 第三个参数 Array<Type>
// this.fileId = "";
@@ -146,83 +146,83 @@ export interface NodeIKernelRichMediaService {
// this.fileSize = j2;
// this.fileModelId = j3;
downloadFileForFileUuid(peer: Peer, uuid: string, arg3: {
downloadFileForFileUuid (peer: Peer, uuid: string, arg3: {
fileId: string,
fileName: string,
fileSize: string,
fileModelId: string
fileModelId: string;
}[]): Promise<unknown>;
downloadFileByUrlList(fileDownloadTyp: UrlFileDownloadType, urlList: Array<string>): unknown;
downloadFileByUrlList (fileDownloadTyp: UrlFileDownloadType, urlList: Array<string>): unknown;
downloadFileForFileInfo(fileInfo: CommonFileInfo[], savePath: string): unknown;
downloadFileForFileInfo (fileInfo: CommonFileInfo[], savePath: string): unknown;
createGroupFolder(GroupCode: string, FolderName: string): Promise<GeneralCallResult & {
resultWithGroupItem: { result: unknown, groupItem: Array<unknown> }
createGroupFolder (GroupCode: string, FolderName: string): Promise<GeneralCallResult & {
resultWithGroupItem: { result: unknown, groupItem: Array<unknown>; };
}>;
downloadFile(commonFile: CommonFileInfo, arg2: unknown, arg3: unknown, savePath: string): unknown;
downloadFile (arg1: unknown, arg2: number, arg3: number, arg4: string): unknown;
createGroupFolder(arg1: unknown, arg2: unknown): unknown;
createGroupFolder (arg1: unknown, arg2: unknown): unknown;
downloadGroupFolder(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
downloadGroupFolder (arg1: string, arg2: string, arg3: string): unknown;
renameGroupFolder(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
renameGroupFolder (arg1: string, arg2: string, arg3: string): unknown;
deleteGroupFolder(arg1: unknown, arg2: unknown): unknown;
deleteGroupFolder (arg1: unknown, arg2: unknown): unknown;
deleteTransferInfo(arg1: unknown, arg2: unknown): unknown;
deleteTransferInfo (arg1: unknown, arg2: unknown): unknown;
cancelTransferTask(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
cancelTransferTask (arg1: Peer, arg2: Array<unknown>[], arg3: string): unknown;
cancelUrlDownload(arg: unknown): unknown;
cancelUrlDownload (arg: unknown): unknown;
updateOnlineVideoElemStatus(arg: unknown): unknown;
updateOnlineVideoElemStatus (arg: unknown): unknown;
getGroupSpace(arg: unknown): unknown;
getGroupSpace (arg: unknown): unknown;
getGroupFileList(groupCode: string, params: GetFileListParam): Promise<GeneralCallResult & {
getGroupFileList (groupCode: string, params: GetFileListParam): Promise<GeneralCallResult & {
groupSpaceResult: {
retCode: number
retMsg: string
clientWording: string
totalSpace: number
usedSpace: number
allUpload: boolean
}
retCode: number;
retMsg: string;
clientWording: string;
totalSpace: number;
usedSpace: number;
allUpload: boolean;
};
}>;
getGroupFileInfo(arg1: unknown, arg2: unknown): unknown;
getGroupFileInfo (arg1: unknown, arg2: unknown): unknown;
getGroupTransferList(arg1: unknown, arg2: unknown): unknown;
getGroupTransferList (arg1: string, arg2: unknown): unknown;
renameGroupFile(arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): unknown;
renameGroupFile (arg1: string, arg2: number, arg3: string, arg4: string, arg5: string): unknown;
moveGroupFile(groupCode: string, busId: Array<number>, fileList: Array<string>, currentParentDirectory: string, targetParentDirectory: string): Promise<GeneralCallResult & {
moveGroupFile (groupCode: string, busId: Array<number>, fileList: Array<string>, currentParentDirectory: string, targetParentDirectory: string): Promise<GeneralCallResult & {
moveGroupFileResult: {
result: {
retCode: number,
retMsg: symbol,
clientWording: string
clientWording: string;
},
successFileIdList: Array<string>,
failFileIdList: Array<string>
}
failFileIdList: Array<string>;
};
}>;
transGroupFile(groupCode: string, fileId: string): Promise<GeneralCallResult & {
transGroupFile (groupCode: string, fileId: string): Promise<GeneralCallResult & {
transGroupFileResult: {
result: {
retCode: number
retMsg: string
clientWording: string
}
saveBusId: number
saveFilePath: string
}
retCode: number;
retMsg: string;
clientWording: string;
};
saveBusId: number;
saveFilePath: string;
};
}>;
searchGroupFile(
searchGroupFile (
keywords: Array<string>,
param: {
groupIds: Array<string>,
@@ -230,55 +230,57 @@ export interface NodeIKernelRichMediaService {
context: string,
count: number,
sortType: number,
groupNames: Array<string>
groupNames: Array<string>;
}): Promise<unknown>;
searchGroupFileByWord(arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): unknown;
searchGroupFileByWord (arg1: unknown[], arg2: unknown[], arg3: string, arg4: string, arg5: number): unknown;
deleteGroupFile(GroupCode: string, params: Array<number>, Files: Array<string>): Promise<GeneralCallResult & {
deleteGroupFile (GroupCode: string, params: Array<number>, Files: Array<string>): Promise<GeneralCallResult & {
transGroupFileResult: {
result: unknown
successFileIdList: Array<unknown>
failFileIdList: Array<unknown>
}
result: unknown;
successFileIdList: Array<unknown>;
failFileIdList: Array<unknown>;
};
}>;
translateEnWordToZn(words: string[]): Promise<GeneralCallResult & { words: string[] }>;
translateEnWordToZn (words: string[]): Promise<GeneralCallResult & { words: string[]; }>;
getScreenOCR(path: string): Promise<unknown>;
getScreenOCR (path: string): Promise<unknown>;
batchGetGroupFileCount(Gids: Array<string>): Promise<GeneralCallResult & {
batchGetGroupFileCount (Gids: Array<string>): Promise<GeneralCallResult & {
groupCodes: Array<string>,
groupFileCounts: Array<number>
groupFileCounts: Array<number>;
}>;
queryPicDownloadSize(arg: unknown): unknown;
queryPicDownloadSize (arg: unknown): unknown;
searchGroupFile(arg1: unknown, arg2: unknown): unknown;
searchGroupFile (arg1: unknown, arg2: unknown): unknown;
searchMoreGroupFile(arg: unknown): unknown;
searchMoreGroupFile (arg: unknown): unknown;
cancelSearcheGroupFile(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
cancelSearcheGroupFile (arg1: number, arg2: number, arg3: string): unknown;
onlyDownloadFile(peer: Peer, arg2: unknown, arg3: Array<{
fileId: string,
fileName: string,
fileSize: string,
fileModelId: string
}
>): unknown;
onlyDownloadFile (arg1: Peer, arg2: string, arg3: Array<unknown>[]): unknown;
onlyUploadFile(arg1: unknown, arg2: unknown): unknown;
onlyUploadFile (arg1: unknown, arg2: unknown): unknown;
isExtraLargePic(arg1: unknown, arg2: unknown, arg3: unknown): unknown;
isExtraLargePic (arg1: unknown, arg2: unknown, arg3: unknown): unknown;
uploadRMFileWithoutMsg(arg: {
uploadRMFileWithoutMsg (arg: {
bizType: RMBizTypeEnum,
filePath: string,
peerUid: string,
transferId: string
useNTV2: string
transferId: string;
useNTV2: string;
}): Promise<unknown>;
isNull(): boolean;
isNull (): boolean;
getRichMediaCodecInfo (arg: unknown): unknown;
getScreenOCRWithSourceType (arg1: unknown, arg2: unknown): unknown;
imageTranslate (arg1: string, arg2: string, arg3: number): unknown;
downloadFileByUrl (arg1: number, arg2: string, arg3: boolean): unknown;
}

View File

@@ -2,47 +2,127 @@ import { NodeIKernelRobotListener } from '@/napcat-core/listeners';
import { GeneralCallResult, Peer } from '..';
export interface NodeIKernelRobotService {
fetchGroupRobotStoreDiscovery(arg: unknown): unknown;
addKernelRobotListener (listener: NodeIKernelRobotListener): number;
sendGroupRobotStoreSearch(arg: unknown): unknown;
removeKernelRobotListener (listenerId: number): void;
fetchGroupRobotStoreCategoryList(arg: unknown): unknown;
fetchGroupRobotStoreDiscovery (arg: unknown): unknown;
FetchSubscribeMsgTemplate(arg: unknown): unknown;
fetchGroupRobotStoreCategoryList (arg: unknown): unknown;
FetchSubcribeMsgTemplateStatus(arg: unknown): unknown;
FetchSubscribeMsgTemplate (arg: unknown): unknown;
SubscribeMsgTemplateSet(arg1: unknown, arg2: unknown): unknown;
FetchSubcribeMsgTemplateStatus (arg: unknown): unknown;
fetchRecentUsedRobots(arg: unknown): unknown;
SubscribeMsgTemplateSet (arg1: unknown, arg2: unknown): unknown;
fetchShareArkInfo(arg: unknown): unknown;
fetchRecentUsedRobots (arg: unknown): unknown;
addKernelRobotListener(Listener: NodeIKernelRobotListener): number;
fetchShareArkInfo (arg: unknown): unknown;
removeKernelRobotListener(ListenerId: number): unknown;
getAllRobotFriendsFromCache (): Promise<unknown>;
getAllRobotFriendsFromCache(): Promise<unknown>;
fetchAllRobots (arg1: boolean, arg2: unknown): unknown;
fetchAllRobots(arg1: unknown, arg2: unknown): unknown;
removeAllRecommendCache (): unknown;
removeAllRecommendCache(): unknown;
setRobotPickTts (arg1: unknown, arg2: unknown): unknown;
setRobotPickTts(arg1: unknown, arg2: unknown): unknown;
getRobotUinRange (data: unknown): Promise<{ response: { robotUinRanges: Array<unknown>; }; }>;
getRobotUinRange(data: unknown): Promise<{ response: { robotUinRanges: Array<unknown> } }>;
getRobotFunctions(peer: Peer, params: {
getRobotFunctions (peer: Peer, params: {
uins: Array<string>,
num: 0,
client_info: { platform: 4, version: '', build_num: 9999 },
client_info: { platform: 4, version: '', build_num: 9999; },
tinyids: [],
page: 0,
full_fetch: false,
scene: 4,
filter: 1,
bkn: ''
}): Promise<GeneralCallResult & { response: { bot_features: Array<unknown>, next_page: number } }>;
bkn: '';
}): Promise<GeneralCallResult & { response: { bot_features: Array<unknown>, next_page: number; }; }>;
isNull(): boolean;
fetchRobotShareLimit (arg1: unknown, arg2: unknown): unknown;
updateGroupRobotProfile (arg1: unknown, arg2: unknown): unknown;
sendCommonRobotToGuild (arg1: unknown, arg2: unknown): unknown;
sendGroupRobotStoreSearch (arg: unknown): unknown;
fetchMyRobotLists (arg: unknown): unknown;
batchGetBotsMenu (arg: unknown): unknown;
fetchAddRobotGroupList (arg: unknown): unknown;
getGuildRobotList (arg: unknown): unknown;
querySessionList (arg: unknown): unknown;
fetchListRobot (arg: unknown): unknown;
subscribeGuildGlobalRobot (arg: unknown): unknown;
addGuildRobot (arg: unknown): unknown;
upMicGuildRobot (arg: unknown): unknown;
downMicGuildRobot (arg: unknown): unknown;
getRedDot (arg: unknown): unknown;
delRedDot (arg: unknown): unknown;
changeMyBot (arg: unknown): unknown;
getAudioLiveRobotStatus (arg: unknown): unknown;
backFlowRobotCoreInfos (arg: unknown): unknown;
batchFetchRobotCoreInfos (arg: unknown): unknown;
queryPicRecomQuestions (arg: unknown): unknown;
delSessionMsgs (arg: unknown): unknown;
fetchMobileRobotRecommendCards (arg: unknown): unknown;
saveSelectedAIModelOrOptIds (arg: unknown): unknown;
setRobotStoryEnter (arg: unknown): unknown;
aiGenAvatar (arg: unknown): unknown;
fetchRobotFeatureWithReq (arg: unknown): unknown;
fetchGroupRobotProfileWithReq (arg: unknown): unknown;
setAddRobotToGroup (arg: unknown): unknown;
setRemoveRobotFromGroup (arg: unknown): unknown;
FetchGroupRobotInfo (arg: unknown): unknown;
fetchGuildRobotInfo (arg: unknown): unknown;
aiGenBotInfo (arg: unknown): unknown;
fetchAiGenTemplateInfo (arg: unknown): unknown;
fetchShareInfo (arg: unknown): unknown;
updateShareInfo (arg: unknown): unknown;
queryGuildGlobalRobotSubscription (arg: unknown): unknown;
resetConversation (arg: unknown): unknown;
setGuildRobotPermission (arg: unknown): unknown;
fetchGuildRobotPermission (arg: unknown): unknown;
editSession (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -3,134 +3,146 @@ import { GeneralCallResult } from './common';
export interface NodeIKernelSearchService {
addKernelSearchListener(listener: unknown): number;
addKernelSearchListener (listener: unknown): number;
removeKernelSearchListener(listenerId: number): void;
removeKernelSearchListener (listenerId: number): void;
searchStranger(unknown: string, searchStranger: unknown, searchParams: unknown): Promise<unknown>;
searchStranger (keyword: string, searchType: unknown, searchParams: unknown): Promise<unknown>;
searchGroup(param: {
searchGroup (param: {
keyWords: string,
groupNum: number,
exactSearch: boolean,
penetrate: string
}): Promise<GeneralCallResult>;// needs 1 arguments
penetrate: string;
}): Promise<GeneralCallResult>;
searchLocalInfo(keywords: string, type: number/* 4 */): unknown;
searchLocalInfo (keywords: string, type: number): unknown;
cancelSearchLocalInfo(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchLocalInfo (arg1: number, arg2: number, arg3: string): unknown;
searchBuddyChatInfo(...args: unknown[]): unknown;// needs 2 arguments
searchBuddyChatInfo (arg1: unknown, arg2: unknown): unknown;
searchMoreBuddyChatInfo(...args: unknown[]): unknown;// needs 1 arguments
searchMoreBuddyChatInfo (arg: unknown): unknown;
cancelSearchBuddyChatInfo(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchBuddyChatInfo (arg1: number, arg2: number, arg3: string): unknown;
searchContact(...args: unknown[]): unknown;// needs 2 arguments
searchContact (arg1: Array<unknown>[], arg2: unknown): unknown;
searchMoreContact(...args: unknown[]): unknown;// needs 1 arguments
searchMoreContact (arg: unknown): unknown;
cancelSearchContact(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchContact (arg1: number, arg2: number, arg3: string): unknown;
searchGroupChatInfo(...args: unknown[]): unknown;// needs 3 arguments
searchGroupChatInfo (arg1: unknown[], arg2: unknown, arg3: number): unknown;
resetSearchGroupChatInfoSortType(...args: unknown[]): unknown;// needs 3 arguments
resetSearchGroupChatInfoSortType (arg1: number, arg2: number, arg3: number): unknown;
resetSearchGroupChatInfoFilterMembers(...args: unknown[]): unknown;// needs 3 arguments
resetSearchGroupChatInfoFilterMembers (arg1: number, arg2: Array<unknown>[], arg3: number): unknown;
searchMoreGroupChatInfo(...args: unknown[]): unknown;// needs 1 arguments
searchMoreGroupChatInfo (arg: unknown): unknown;
cancelSearchGroupChatInfo(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchGroupChatInfo (arg1: number, arg2: number, arg3: string): unknown;
searchChatsWithKeywords(...args: unknown[]): unknown;// needs 3 arguments
searchChatsWithKeywords (arg1: unknown[], arg2: number, arg3: number): unknown;
searchMoreChatsWithKeywords(...args: unknown[]): unknown;// needs 1 arguments
searchMoreChatsWithKeywords (arg: unknown): unknown;
cancelSearchChatsWithKeywords(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchChatsWithKeywords (arg1: number, arg2: number, arg3: string): unknown;
searchChatMsgs(...args: unknown[]): unknown;// needs 2 arguments
searchChatMsgs (arg1: Array<unknown>[], arg2: unknown): unknown;
searchMoreChatMsgs(...args: unknown[]): unknown;// needs 1 arguments
searchMoreChatMsgs (arg: unknown): unknown;
cancelSearchChatMsgs(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchChatMsgs (arg1: number, arg2: number, arg3: string): unknown;
searchMsgWithKeywords(keyWords: string[], param: Peer & { searchFields: number, pageLimit: number }): Promise<GeneralCallResult>;
searchMsgWithKeywords (keyWords: string[], param: Peer & { searchFields: number, pageLimit: number; }): Promise<GeneralCallResult>;
searchMoreMsgWithKeywords(...args: unknown[]): unknown;// needs 1 arguments
searchMoreMsgWithKeywords (arg: unknown): unknown;
cancelSearchMsgWithKeywords(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchMsgWithKeywords (arg1: number, arg2: number, arg3: string): unknown;
searchFileWithKeywords(keywords: string[], source: number): Promise<string>;// needs 2 arguments
searchFileWithKeywords (keywords: string[], source: number): Promise<string>;
searchMoreFileWithKeywords(...args: unknown[]): unknown;// needs 1 arguments
searchMoreFileWithKeywords (arg: unknown): unknown;
cancelSearchFileWithKeywords(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchFileWithKeywords (arg1: number, arg2: number, arg3: string): unknown;
searchAtMeChats(...args: unknown[]): unknown;// needs 3 arguments
searchFileInFileCenterForPC (arg1: unknown, arg2: unknown): unknown;
searchMoreAtMeChats(...args: unknown[]): unknown;// needs 1 arguments
searchMoreFileInFileCenter (arg: unknown): unknown;
cancelSearchAtMeChats(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchFileInFileCenter (arg1: number, arg2: number, arg3: string): unknown;
searchChatAtMeMsgs(...args: unknown[]): unknown;// needs 1 arguments
searchAtMeChats (arg1: boolean, arg2: number, arg3: number): unknown;
searchMoreChatAtMeMsgs(...args: unknown[]): unknown;// needs 1 arguments
searchMoreAtMeChats (arg: unknown): unknown;
cancelSearchChatAtMeMsgs(...args: unknown[]): unknown;// needs 3 arguments
cancelSearchAtMeChats (arg1: number, arg2: number, arg3: string): unknown;
addSearchHistory(param: {
type: number, // 4
searchChatAtMeMsgs (arg: unknown): unknown;
searchMoreChatAtMeMsgs (arg: unknown): unknown;
cancelSearchChatAtMeMsgs (arg1: number, arg2: number, arg3: string): unknown;
searchRobot (arg: unknown): unknown;
searchCache (arg1: string, arg2: string, arg3: unknown): unknown;
addSearchHistory (param: {
type: number,
contactList: [],
id: number, // -1
id: number,
groupInfos: [],
msgs: [],
fileInfos: [
{
chatType: ChatType,
buddyChatInfo: Array<{ category_name: string, peerUid: string, peerUin: string, remark: string }>,
discussChatInfo: [],
groupChatInfo: Array<
{
groupCode: string,
isConf: boolean,
hasModifyConfGroupFace: boolean,
hasModifyConfGroupName: boolean,
groupName: string,
remark: string
}>,
dataLineChatInfo: [],
tmpChatInfo: [],
msgId: string,
msgSeq: string,
msgTime: string,
senderUid: string,
senderNick: string,
senderRemark: string,
senderCard: string,
elemId: string,
elemType: string, // 3
fileSize: string,
filePath: string,
fileName: string,
hits: Array<
{
start: 12,
end: 14
}
>
}
]
fileInfos: Array<{
chatType: ChatType,
buddyChatInfo: Array<{ category_name: string, peerUid: string, peerUin: string, remark: string; }>,
discussChatInfo: [],
groupChatInfo: Array<{
groupCode: string,
isConf: boolean,
hasModifyConfGroupFace: boolean,
hasModifyConfGroupName: boolean,
groupName: string,
remark: string;
}>,
dataLineChatInfo: [],
tmpChatInfo: [],
msgId: string,
msgSeq: string,
msgTime: string,
senderUid: string,
senderNick: string,
senderRemark: string,
senderCard: string,
elemId: string,
elemType: string,
fileSize: string,
filePath: string,
fileName: string,
hits: Array<{ start: number, end: number; }>;
}>;
}): Promise<{
result: number,
errMsg: string,
id?: number
id?: number;
}>;
removeSearchHistory(...args: unknown[]): unknown;// needs 1 arguments
removeSearchHistory (arg: unknown): unknown;
searchCache(...args: unknown[]): unknown;// needs 3 arguments
addOrUpdateSearchMostUseItem (arg1: unknown, arg2: unknown): unknown;
clearSearchCache(...args: unknown[]): unknown;// needs 1 arguments
getSearchMostUseItem (arg: unknown): unknown;
deleteSearchMostUseItem (arg: unknown): unknown;
deleteGroupHistoryFile (arg: unknown): unknown;
clearSearchCache (arg: unknown): unknown;
clearSearchHistory (): unknown;
loadSearchHistory (): unknown;
initTokenizeUtil (): unknown;
}

View File

@@ -0,0 +1,53 @@
export interface NodeIKernelSettingService {
addKernelSettingListener (listener: unknown): number;
removeKernelSettingListener (listenerId: number): void;
getSettingForBuffer (key: unknown): unknown;
getSettingForNum (key: unknown): unknown;
getSettingForStr (key: unknown): unknown;
setSettingForBuffer (arg: unknown): unknown;
setSettingForNum (arg: unknown): unknown;
setSettingForStr (arg: unknown): unknown;
setAutoLoginSwitch (enabled: boolean): unknown;
setNeedConfirmSwitch (enabled: boolean): unknown;
setPrivacySetting (arg: unknown): unknown;
setSelfStartSwitch (enabled: boolean): unknown;
modifyAccount (arg: unknown): unknown;
verifyNewAccount (arg: unknown): unknown;
openUrlWithQQBrowser (url: string): unknown;
openUrlInIM (url: string): unknown;
clearCache (arg: unknown): unknown;
destroyAccount (): unknown;
isQQBrowserInstall (): boolean;
getSelfStartSwitch (): unknown;
getAutoLoginSwitch (): unknown;
getNeedConfirmSwitch (): unknown;
getPrivacySetting (): unknown;
scanCache (): unknown;
getQQBrowserSwitchFromQldQQ (): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,21 @@
export interface NodeIKernelSkinService {
addKernelSkinListener (listener: unknown): number;
removeKernelSkinListener (listenerId: number): void;
getRecommendAIOColor (arg1: unknown, arg2: unknown): unknown;
getRecommendBubbleColor (arg1: unknown, arg2: unknown): unknown;
getThemeInfoFromImage (arg: unknown): unknown;
previewTheme (arg1: number, arg2: unknown, arg3: unknown): unknown;
setTemplateCustomPrimaryColor (arg1: unknown, arg2: unknown): unknown;
setThemeInfo (arg1: number, arg2: unknown, arg3: unknown): unknown;
uploadImage (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -36,15 +36,15 @@ export interface NodeIKernelStorageCleanService {
reportData (): unknown;
getChatCacheInfo (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown): unknown;
getChatCacheInfo (tableType: number, pageSize: number, order: number, startPosition: number): Promise<unknown>;
getFileCacheInfo (arg1: unknown, arg2: unknown, arg3: unknown, arg44: unknown, args5: unknown): unknown;
getFileCacheInfo (fileType: number, restart: boolean, pageSize: number, lastRecord: number, param: unknown): Promise<unknown>;
clearChatCacheInfo (arg1: unknown, arg2: unknown): unknown;
clearChatCacheInfo (chatInfoList: unknown[], clearKeys: number[]): Promise<unknown>;
clearCacheDataByKeys (keys: Array<string>): Promise<GeneralCallResult>;
setSilentScan (is_silent: boolean): unknown;
setSilentScan (isSilent: boolean): unknown;
closeCleanWindow (): unknown;

View File

@@ -0,0 +1,17 @@
export interface NodeIKernelThirdPartySigService {
addOnSigChangeListener (listener: unknown): number;
removeSigChangeListener (listenerId: number): void;
initConfig (arg: unknown): unknown;
delThirdPartySigByUin (arg: unknown): unknown;
getOpenIDByUin (arg1: string, arg2: number, arg3: string): unknown;
getPT4tokenByUin (arg1: string, arg2: number, arg3: Array<unknown>[]): unknown;
getThirdPartySigByUin (arg1: string, arg2: number, arg3: number, arg4: number, arg5: string, arg6: string): unknown;
isNull (): boolean;
}

View File

@@ -1,8 +1,8 @@
export interface NodeIKernelTianShuService {
addKernelTianShuListener(listener:unknown): number;
addKernelTianShuListener (listener: unknown): number;
removeKernelTianShuListener(listenerId:number): void;
removeKernelTianShuListener (listenerId: number): void;
reportTianShuNumeralRed(...args: unknown[]): unknown;// needs 1 arguments
reportTianShuNumeralRed (arg: unknown): unknown;// needs 1 arguments
}

View File

@@ -2,11 +2,11 @@ import { ForceFetchClientKeyRetType } from './common';
export interface NodeIKernelTicketService {
addKernelTicketListener(listener: unknown): number;
addKernelTicketListener (listener: unknown): number;
removeKernelTicketListener(listenerId: number): void;
removeKernelTicketListener (listenerId: number): void;
forceFetchClientKey(arg: string): Promise<ForceFetchClientKeyRetType>;
forceFetchClientKey (arg: string): Promise<ForceFetchClientKeyRetType>;
isNull(): boolean;
isNull (): boolean;
}

View File

@@ -2,21 +2,19 @@ import { GeneralCallResult } from './common';
export interface NodeIKernelTipOffService {
addKernelTipOffListener(listener: unknown): number;
addKernelTipOffListener (listener: unknown): number;
removeKernelTipOffListener(listenerId: unknown): void;
removeKernelTipOffListener (listenerId: number): void;
tipOffSendJsData(args: unknown[]): Promise<unknown>;// 2
tipOffSendJsData (arg1: unknown, arg2: unknown): Promise<unknown>;
getPskey(domainList: string[], nocache: boolean): Promise<GeneralCallResult & {
domainPskeyMap: Map<string, string>
getPskey (domainList: string[], nocache: boolean): Promise<GeneralCallResult & {
domainPskeyMap: Map<string, string>;
}>;
tipOffSendJsData(args: unknown[]): Promise<unknown>;// 2
tipOffMsgs (arg: unknown): Promise<unknown>;
tipOffMsgs(args: unknown[]): Promise<unknown>;// 1
encodeUinAesInfo (arg1: unknown, arg2: unknown): Promise<unknown>;
encodeUinAesInfo(args: unknown[]): Promise<unknown>;// 2
isNull(): boolean;
isNull (): boolean;
}

View File

@@ -0,0 +1,23 @@
export interface NodeIKernelUnifySearchService {
checkAIAuth (arg: unknown): unknown;
getNetResultTabs (arg: unknown): unknown;
getNetSugWords (arg: unknown): unknown;
getSearchAppendingInfo (arg: unknown): unknown;
getSearchBoxSugWords (arg: unknown): unknown;
search (arg: unknown): unknown;
unifySearch (arg: unknown): unknown;
unifySearchDiscovery (arg: unknown): unknown;
unifySearchDiscoveryInCache (arg: unknown): unknown;
wxSearchReport (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -1,17 +1,17 @@
export interface NodeIKernelUnitedConfigService {
addKernelUnitedConfigListener(listener:unknown): number;
addKernelUnitedConfigListener (listener: unknown): number;
removeKernelUnitedConfigListener(listenerId:number): void;
removeKernelUnitedConfigListener (listenerId: number): void;
fetchUnitedSwitchConfig(...args: unknown[]): unknown;// needs 1 arguments
fetchUnitedSwitchConfig (configIds: string[]): void;
isUnitedConfigSwitchOn(...args: unknown[]): unknown;// needs 1 arguments
isUnitedConfigSwitchOn (configId: string): boolean;
registerUnitedConfigPushGroupList(...args: unknown[]): unknown;// needs 1 arguments
registerUnitedConfigPushGroupList (groupList: string[]): void;
fetchUnitedCommendConfig(ids: `${string}`[]): void
fetchUnitedCommendConfig (ids: string[]): void;
loadUnitedConfig(id: string): Promise<unknown>
loadUnitedConfig (id: string): Promise<unknown>;
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelVasSystemUpdateService {
getResPath (arg: unknown): unknown;
isExist (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,37 @@
export interface NodeIKernelWiFiPhotoClientService {
addKernelWiFiPhotoClientListener (listener: unknown): number;
removeKernelWiFiPhotoClientListener (listenerId: number): void;
cancelGetPhoto (arg1: unknown, arg2: unknown): unknown;
cancelGetPhotoThumbBatch (arg: unknown): unknown;
cancelRequest (arg: unknown): unknown;
connectToHostForTest (arg: unknown): unknown;
deletePhotoBatch (arg: unknown): unknown;
disconnect (arg: unknown): unknown;
getAlbumFileSavePath (arg: unknown): unknown;
getAllPhotoSimpleInfo (arg: unknown): unknown;
getPhotoAndSaveAs (arg1: string, arg2: string, arg3: string): unknown;
getPhotoBatch (arg1: unknown, arg2: unknown): unknown;
getPhotoInfoBatch (arg1: unknown, arg2: unknown): unknown;
getPhotoSimpleInfoForFirstView (arg1: string, arg2: number): unknown;
getPhotoThumbBatchWithConfig (arg1: unknown, arg2: unknown): unknown;
getWiFiPhotoDownFileInfos (arg1: string, arg2: Array<unknown>[]): unknown;
resumeUncompleteDownloadRecords (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,15 @@
export interface NodeIKernelWiFiPhotoHostService {
addKernelWiFiPhotoHostListener (listener: unknown): number;
removeKernelWiFiPhotoHostListener (listenerId: number): void;
acceptRequest (arg1: number, arg2: unknown): unknown;
disconnect (arg: unknown): unknown;
rejectRequest (arg1: number, arg2: number): unknown;
setAlbumAccessDelegate (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -0,0 +1,7 @@
export interface NodeIKernelYellowFaceForManagerService {
download (arg1: string, arg2: string, arg3: string, arg4: boolean): unknown;
setHistory (arg: unknown): unknown;
isNull (): boolean;
}

View File

@@ -1,11 +1,15 @@
import { NodeIO3MiscListener } from '@/napcat-core/listeners/NodeIO3MiscListener';
export interface NodeIO3MiscService {
get(): NodeIO3MiscService;
get (): NodeIO3MiscService;
addO3MiscListener(listeners: NodeIO3MiscListener): number;
addO3MiscListener (listener: NodeIO3MiscListener): number;
setAmgomDataPiece(appid: string, dataPiece: Uint8Array): void;
removeO3MiscListener (listenerId: number): void;
reportAmgomWeather(type: string, uk2: string, arg: Array<string>): void;
passthroughO3Data (arg1: unknown, arg2: unknown): unknown;
reportAmgomWeather (arg1: unknown, arg2: unknown, arg3: unknown): unknown;
setAmgomDataPiece (appid: string, dataPiece: Uint8Array): void;
}

View File

@@ -1,5 +1,11 @@
export interface NodeIYellowFaceService {
download(resourceConfigJson: string, resourceDir: string, cacheDir: string, force: boolean): void;
addListener (listener: unknown): number;
setHistory(fullMd5: string): void;
removeListener (listenerId: number): void;
download (resourceConfigJson: string, resourceDir: string, cacheDir: string, force: boolean): void;
setHistory (fullMd5: string): void;
update (arg: unknown): unknown;
}

View File

@@ -36,6 +36,36 @@ export * from './NodeIKernelDbToolsService';
export * from './NodeIKernelTipOffService';
export * from './NodeIKernelSearchService';
export * from './NodeIKernelCollectionService';
// === New service exports from IDA analysis ===
export * from './NodeIKernelSettingService';
export * from './NodeIKernelQiDianService';
export * from './NodeIKernelSkinService';
export * from './NodeIKernelQQPlayService';
export * from './NodeIKernelRDeliveryService';
export * from './NodeIKernelRemotingService';
export * from './NodeIKernelLiteBusinessService';
export * from './NodeIKernelGroupTabService';
export * from './NodeIKernelLockService';
export * from './NodeIKernelHandOffService';
export * from './NodeIKernelMiniAppService';
export * from './NodeIKernelPublicAccountService';
export * from './NodeIKernelThirdPartySigService';
export * from './NodeIKernelUnifySearchService';
export * from './NodeIKernelVasSystemUpdateService';
export * from './NodeIKernelPersonalAlbumService';
export * from './NodeIKernelConfigMgrService';
export * from './NodeIKernelFeedService';
export * from './NodeIKernelBdhUploadService';
export * from './NodeIKernelDirectSessionService';
export * from './NodeIKernelFileBridgeClientService';
export * from './NodeIKernelFileBridgeHostService';
export * from './NodeIKernelWiFiPhotoHostService';
export * from './NodeIKernelWiFiPhotoClientService';
export * from './NodeIKernelEmojiService';
export * from './NodeIKernelNearbyProService';
export * from './NodeIKernelAVSDKService';
export * from './NodeIKernelAddBuddyService';
export * from './NodeIKernelYellowFaceForManagerService';
export type ServiceNamingMapping = {
NodeIKernelAvatarService: NodeIKernelAvatarService;
@@ -53,6 +83,6 @@ export type ServiceNamingMapping = {
NodeIKernelRichMediaService: NodeIKernelRichMediaService;
NodeIKernelDbToolsService: NodeIKernelDbToolsService;
NodeIKernelTipOffService: NodeIKernelTipOffService;
NodeIKernelSearchService: NodeIKernelSearchService,
NodeIKernelSearchService: NodeIKernelSearchService;
NodeIKernelCollectionService: NodeIKernelCollectionService;
};

View File

@@ -323,7 +323,7 @@ export interface FlashTransferInfo {
id: string;
urls: FlashTransferIcon[];
localCachePath: string;
}
};
}
/**
@@ -337,7 +337,7 @@ export interface MarkdownElement {
mdExtType?: number;
mdExtInfo?: {
flashTransferInfo: FlashTransferInfo;
}
};
}
/**
@@ -550,6 +550,96 @@ export interface QueryMsgsParams {
isIncludeCurrent: boolean;
}
/**
* 消息引用标识msgId + msgSeq + msgTime
*/
export interface MsgRef {
msgId: string;
msgSeq: string;
msgTime: string;
}
/**
* 消息完整标识含cliSeq和msgRandom
*/
export interface MsgIdentity {
msgId: string;
msgSeq: string;
cliSeq: string;
msgTime: string;
msgRandom: string;
}
/**
* 灰条JSON消息信息
*/
export interface GrayTipJsonInfo {
busiId: number | string;
jsonStr: string;
recentAbstract: string;
isServer: boolean;
xmlToJsonParam?: unknown;
}
/**
* 转发文件信息
*/
export interface ForwardFileInfo {
targetMsgId: string;
targetElemId: string;
commonFileInfo: unknown;
}
/**
* 本地灰条提示信息
*/
export interface LocalGrayTipInfo {
type: number;
robot?: unknown;
direct?: unknown;
extraJson: string;
}
/**
* Token设置信息
*/
export interface TokenInfo {
tokenType: number;
apnsToken?: string | Uint8Array;
voipToken?: string | Uint8Array;
profileId?: string;
}
/**
* 后台切换时的未读计数信息
*/
export interface BackGroundInfo {
c2cUnreadCnt: number;
groupUnreadCnt: number;
guildUnreadCnt: number;
guildPsvboxUnreadCnt: number;
verifyUnreadCnt: number;
contactUnreadCnt: number;
groupUnreadCodes: string[];
}
/**
* 消息类型过滤参数
*/
export interface MsgTypeFilter {
filterMsgType: Array<{ type: number; subType: Array<number>; }>;
filterSendersUid: string[];
}
/**
* 空间流参数
*/
export interface SgrpStreamParams {
sgrpStreamPginSourceName: string;
sgrpVisitFrom: string;
sgrpSessionId: string;
}
/**
* 临时聊天信息API接口
*/

View File

@@ -29,6 +29,28 @@ import { NodeIkernelTestPerformanceService } from './services/NodeIkernelTestPer
import { NodeIKernelECDHService } from './services/NodeIKernelECDHService';
import { NodeIO3MiscService } from './services/NodeIO3MiscService';
import { NodeIKernelFlashTransferService } from './services/NodeIKernelFlashTransferService';
import { NodeIKernelOnlineStatusService } from './services/NodeIKernelOnlineStatusService';
import { NodeIKernelBaseEmojiService } from './services/NodeIKernelBaseEmojiService';
import { NodeIKernelSettingService } from './services/NodeIKernelSettingService';
import { NodeIKernelFileAssistantService } from './services/NodeIKernelFileAssistantService';
import { NodeIKernelDbToolsService } from './services/NodeIKernelDbToolsService';
import { NodeIYellowFaceService } from './services/NodeIYellowFaceService';
import { NodeIKernelQiDianService } from './services/NodeIKernelQiDianService';
import { NodeIKernelSkinService } from './services/NodeIKernelSkinService';
import { NodeIKernelQQPlayService } from './services/NodeIKernelQQPlayService';
import { NodeIKernelRDeliveryService } from './services/NodeIKernelRDeliveryService';
import { NodeIKernelRemotingService } from './services/NodeIKernelRemotingService';
import { NodeIKernelLiteBusinessService } from './services/NodeIKernelLiteBusinessService';
import { NodeIKernelGroupTabService } from './services/NodeIKernelGroupTabService';
import { NodeIKernelLockService } from './services/NodeIKernelLockService';
import { NodeIKernelHandOffService } from './services/NodeIKernelHandOffService';
import { NodeIKernelMiniAppService } from './services/NodeIKernelMiniAppService';
import { NodeIKernelPublicAccountService } from './services/NodeIKernelPublicAccountService';
import { NodeIKernelThirdPartySigService } from './services/NodeIKernelThirdPartySigService';
import { NodeIKernelUnifySearchService } from './services/NodeIKernelUnifySearchService';
import { NodeIKernelVasSystemUpdateService } from './services/NodeIKernelVasSystemUpdateService';
import { NodeIKernelPersonalAlbumService } from './services/NodeIKernelPersonalAlbumService';
import { NodeIKernelConfigMgrService } from './services/NodeIKernelConfigMgrService';
export interface NodeQQNTWrapperUtil {
get (): NodeQQNTWrapperUtil;
@@ -39,46 +61,46 @@ export interface NodeQQNTWrapperUtil {
getSsoCmdOfOidbReq (arg1: number, arg2: number): unknown;
getSsoBufferOfOidbReq (...args: unknown[]): unknown; // 有点看不懂参数定义 待补充 好像是三个参数
getSsoBufferOfOidbReq (arg1: unknown, arg2: unknown, arg3: unknown): unknown;
getOidbRspInfo (arg: string): unknown; // 可能是错的
getOidbRspInfo (arg: string): unknown;
getFileSize (path: string): Promise<number>; // 直接的猜测
getFileSize (path: string): Promise<number>;
genFileMd5Buf (arg: string): unknown; // 可能是错的
genFileMd5Buf (arg: string): unknown;
genFileMd5Hex (path: string): unknown; // 直接的猜测
genFileMd5Hex (path: string): unknown;
genFileShaBuf (path: string): unknown; // 直接的猜测
genFileShaBuf (path: string): unknown;
genFileCumulateSha1 (path: string): unknown; // 直接的猜测
genFileCumulateSha1 (path: string): unknown;
genFileShaHex (path: string): unknown; // 直接的猜测
genFileShaHex (path: string): unknown;
fileIsExist (path: string): unknown;
startTrace (path: string): unknown; // 可能是错的
startTrace (path: string): unknown;
copyFile (src: string, dst: string): unknown;
genFileShaAndMd5Hex (path: string, unknown: number): unknown; // 可能是错的
genFileShaAndMd5Hex (path: string, unknown: number): unknown;
setTraceInfo (unknown: unknown): unknown;
encodeOffLine (unknown: unknown): unknown;
decodeOffLine (arg: string): unknown; // 可能是错的 传递hex
decodeOffLine (arg: string): unknown;
DecoderRecentInfo (arg: string): unknown; // 可能是错的 传递hex
DecoderRecentInfo (arg: string): unknown;
getPinyin (arg0: string, arg1: boolean): unknown;
matchInPinyin (arg0: unknown[], arg1: string): unknown; // 参数特复杂 arg0是个复杂数据类型
getPinyinExt (arg0: string, arg1: boolean): unknown;
matchInPinyin (arg0: unknown[], arg1: string): unknown;
makeDirByPath (arg0: string): unknown;
emptyWorkingSet (arg0: number): unknown; // 参数是UINT32
runProcess (arg0: string, arg1: boolean): unknown;
runProcessArgs (arg0: string, arg1: { [key: string]: string; }, arg2: boolean): unknown;
@@ -141,6 +163,24 @@ export interface NodeQQNTWrapperUtil {
isNull (): unknown;
deletePath (path: string): unknown;
calculateDirectoryTotalSize (path: string): unknown;
GetBaseEmojiPathByIds (arg: unknown): unknown;
SetMobileBaseEmojiPath (arg0: unknown, arg1: unknown): unknown;
setCreateThumbailSupportedFileExtensions (arg0: unknown, arg1: unknown): unknown;
setFileDropNativeWindowHide (arg: unknown): unknown;
setFileDropWindowNativeWindowHandle (arg: unknown): unknown;
startListenFileDragEvent (arg: unknown): unknown;
stopAccessingSecurityScopedResource (arg: unknown): unknown;
createThumbnailImage (
serviceName: string,
filePath: string,
@@ -180,6 +220,43 @@ export interface NodeIQQNTWrapperSession {
startNT (): void;
// === Session lifecycle ===
close (arg: unknown): void;
onLine (arg: unknown): void;
offLine (arg: unknown): void;
disableIpDirect (arg: unknown): void;
getAccountPath (arg: unknown): string;
updateTicket (arg: unknown): void;
// === SSO/Network dispatch ===
onDispatchPush (arg1: unknown, arg2: unknown): void;
onDispatchPushWithJson (arg1: unknown, arg2: unknown): void;
onDispatchRequestReply (arg1: unknown, arg2: unknown, arg3: unknown): void;
onMsfPush (arg1: unknown, arg2: unknown, arg3: unknown): void;
onNetReply (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown): void;
onSendOidbReply (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): void;
onSendSSOReply (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): void;
onUIConfigUpdate (arg1: unknown, arg2: unknown): void;
setOnMsfStatusChanged (arg1: unknown, arg2: unknown, arg3: unknown): void;
setOnNetworkChanged (arg: unknown): void;
setOnWeakNetChanged (arg: unknown): void;
// === Service getters ===
getBdhUploadService (): unknown;
getECDHService (): NodeIKernelECDHService;
@@ -220,47 +297,47 @@ export interface NodeIQQNTWrapperSession {
getDirectSessionService (): unknown;
getRDeliveryService (): unknown;
getRDeliveryService (): NodeIKernelRDeliveryService;
getAvatarService (): NodeIKernelAvatarService;
getFeedChannelService (): unknown;
getYellowFaceService (): unknown;
getYellowFaceService (): NodeIYellowFaceService;
getCollectionService (): NodeIKernelCollectionService;
getSettingService (): unknown;
getSettingService (): NodeIKernelSettingService;
getQiDianService (): unknown;
getQiDianService (): NodeIKernelQiDianService;
getFileAssistantService (): unknown;
getFileAssistantService (): NodeIKernelFileAssistantService;
getGuildService (): unknown;
getSkinService (): unknown;
getSkinService (): NodeIKernelSkinService;
getTestPerformanceService (): NodeIkernelTestPerformanceService;
getQQPlayService (): unknown;
getQQPlayService (): NodeIKernelQQPlayService;
getDbToolsService (): unknown;
getDbToolsService (): NodeIKernelDbToolsService;
getUixConvertService (): NodeIKernelUixConvertService;
getOnlineStatusService (): unknown;
getOnlineStatusService (): NodeIKernelOnlineStatusService;
getRemotingService (): unknown;
getRemotingService (): NodeIKernelRemotingService;
getGroupTabService (): unknown;
getGroupTabService (): NodeIKernelGroupTabService;
getGroupSchoolService (): unknown;
getLiteBusinessService (): unknown;
getLiteBusinessService (): NodeIKernelLiteBusinessService;
getGuildMsgService (): unknown;
getLockService (): unknown;
getLockService (): NodeIKernelLockService;
getMSFService (): NodeIKernelMSFService;
@@ -270,7 +347,29 @@ export interface NodeIQQNTWrapperSession {
getRecentContactService (): NodeIKernelRecentContactService;
getConfigMgrService (): unknown;
getConfigMgrService (): NodeIKernelConfigMgrService;
getBaseEmojiService (): NodeIKernelBaseEmojiService;
getHandOffService (): NodeIKernelHandOffService;
getMiniAppService (): NodeIKernelMiniAppService;
getPublicAccountService (): NodeIKernelPublicAccountService;
getThirdPartySigService (): NodeIKernelThirdPartySigService;
getUnifySearchService (): NodeIKernelUnifySearchService;
getVasSystemUpdateService (): NodeIKernelVasSystemUpdateService;
getPersonalAlbumService (): NodeIKernelPersonalAlbumService;
getGProGuildMsgService (): unknown;
getFileBridgeHostService (): unknown;
getWiFiPhotoClientService (): unknown;
}
export interface EnginInitDesktopConfig {
@@ -291,6 +390,14 @@ export interface NodeIQQNTWrapperEngine {
get (): NodeIQQNTWrapperEngine;
initWithDeskTopConfig (config: EnginInitDesktopConfig, nodeIGlobalAdapter: NodeIGlobalAdapter): void;
initWithMobileConfig (config: unknown, nodeIGlobalAdapter: NodeIGlobalAdapter): void;
initLog (arg: unknown): void;
setLogLevel (arg: unknown): void;
onSendSSOReply (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): void;
}
export interface WrapperNodeApi {

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Xavier Monin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,4 @@
# @primno/dpapi
## 协议与说明
全部遵守原仓库要求

View File

@@ -0,0 +1,65 @@
/**
* napcat-dpapi - Windows DPAPI wrapper
*
* Loads the native @primno+dpapi.node addon from the runtime
* native/dpapi/ directory using process.dlopen, consistent
* with how other native modules (ffmpeg, packet, pty) are loaded.
*/
import { fileURLToPath } from 'node:url';
import path, { dirname } from 'node:path';
export type DataProtectionScope = 'CurrentUser' | 'LocalMachine';
export interface DpapiBindings {
protectData (dataToEncrypt: Uint8Array, optionalEntropy: Uint8Array | null, scope: DataProtectionScope): Uint8Array;
unprotectData (encryptData: Uint8Array, optionalEntropy: Uint8Array | null, scope: DataProtectionScope): Uint8Array;
}
let dpapiBindings: DpapiBindings | null = null;
let loadError: Error | null = null;
function getAddonPath (): string {
// At runtime, import.meta.url resolves to dist/ directory.
// Native files are at dist/native/dpapi/{platform}-{arch}/@primno+dpapi.node
const importDir = dirname(fileURLToPath(import.meta.url));
const platform = process.platform; // 'win32'
const arch = process.arch; // 'x64' or 'arm64'
return path.join(importDir, 'native', 'dpapi', `${platform}-${arch}`, '@primno+dpapi.node');
}
function loadDpapi (): DpapiBindings {
if (dpapiBindings) {
return dpapiBindings;
}
if (loadError) {
throw loadError;
}
try {
const addonPath = getAddonPath();
const nativeModule: { exports: DpapiBindings } = { exports: {} as DpapiBindings };
process.dlopen(nativeModule, addonPath);
dpapiBindings = nativeModule.exports;
return dpapiBindings;
} catch (e) {
loadError = e as Error;
throw new Error(`Failed to load DPAPI native addon: ${(e as Error).message}`);
}
}
export const isPlatformSupported = process.platform === 'win32';
export function protectData (data: Uint8Array, optionalEntropy: Uint8Array | null, scope: DataProtectionScope): Uint8Array {
return loadDpapi().protectData(data, optionalEntropy, scope);
}
export function unprotectData (data: Uint8Array, optionalEntropy: Uint8Array | null, scope: DataProtectionScope): Uint8Array {
return loadDpapi().unprotectData(data, optionalEntropy, scope);
}
export const Dpapi = {
protectData,
unprotectData,
};
export default Dpapi;

View File

@@ -0,0 +1,18 @@
{
"name": "napcat-dpapi",
"version": "0.0.1",
"private": true,
"type": "module",
"main": "index.ts",
"exports": {
".": {
"import": "./index.ts"
}
},
"devDependencies": {
"@types/node": "^22.0.1"
},
"engines": {
"node": ">=18.0.0"
}
}

View File

@@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": "."
},
"include": [
"./**/*.ts"
]
}

View File

@@ -2,6 +2,8 @@ import { NapCatPathWrapper } from 'napcat-common/src/path';
import { InitWebUi, WebUiConfig, webUiRuntimePort } from 'napcat-webui-backend/index';
import { NapCatAdapterManager } from 'napcat-adapter';
import { NativePacketHandler } from 'napcat-core/packet/handler/client';
import { Napi2NativeLoader } from 'napcat-core/packet/handler/napi2nativeLoader';
import { loadNapcatConfig } from '@/napcat-core/helper/config';
import { FFmpegService } from 'napcat-core/helper/ffmpeg/ffmpeg';
import { logSubscription, LogWrapper } from 'napcat-core/helper/log';
import { QQBasicInfoWrapper } from '@/napcat-core/helper/qq-basic-info';
@@ -40,10 +42,23 @@ export async function NCoreInitFramework (
const basicInfoWrapper = new QQBasicInfoWrapper({ logger });
const wrapper = loadQQWrapper(basicInfoWrapper.QQMainPath, basicInfoWrapper.getFullQQVersion());
const nativePacketHandler = new NativePacketHandler({ logger }); // 初始化 NativePacketHandler 用于后续使用
const napi2nativeLoader = new Napi2NativeLoader({ logger }); // 初始化 Napi2NativeLoader 用于后续使用
const napcatConfig = loadNapcatConfig(pathWrapper.configPath);
//console.log('[NapCat] [Napi2NativeLoader]', napi2nativeLoader.nativeExports.enableAllBypasses?.());
if (process.env['NAPCAT_DISABLE_BYPASS'] !== '1') {
const bypassOptions = napcatConfig.bypass ?? {};
const bypassEnabled = napi2nativeLoader.nativeExports.enableAllBypasses?.(bypassOptions);
if (bypassEnabled) {
logger.log('[NapCat] Napi2NativeLoader: 已启用Bypass');
}
logger.log('[NapCat] Napi2NativeLoader: Framework模式Bypass配置:', bypassOptions);
} else {
logger.log('[NapCat] Napi2NativeLoader: Bypass已通过环境变量禁用');
}
// nativePacketHandler.onAll((packet) => {
// console.log('[Packet]', packet.uin, packet.cmd, packet.hex_data);
// });
await nativePacketHandler.init(basicInfoWrapper.getFullQQVersion());
await nativePacketHandler.init(basicInfoWrapper.getFullQQVersion(), napcatConfig.o3HookMode === 1 ? true : false);
// 在 init 之后注册监听器
// 初始化 FFmpeg 服务
@@ -73,11 +88,12 @@ export async function NCoreInitFramework (
// 过早进入会导致addKernelMsgListener等Listener添加失败
// await sleep(2500);
// 初始化 NapCatFramework
const loaderObject = new NapCatFramework(wrapper, session, logger, selfInfo, basicInfoWrapper, pathWrapper, nativePacketHandler);
const loaderObject = new NapCatFramework(wrapper, session, logger, selfInfo, basicInfoWrapper, pathWrapper, nativePacketHandler, napi2nativeLoader);
await loaderObject.core.initCore();
// 启动WebUi
WebUiDataRuntime.setWorkingEnv(NapCatCoreWorkingEnv.Framework);
WebUiDataRuntime.setQQDataPath(loaderObject.core.dataPath);
InitWebUi(logger, pathWrapper, logSubscription, statusHelperSubscription).then().catch(e => logger.logError(e));
// 使用 NapCatAdapterManager 统一管理协议适配器
const adapterManager = new NapCatAdapterManager(loaderObject.core, loaderObject.context, pathWrapper);
@@ -100,10 +116,12 @@ export class NapCatFramework {
selfInfo: SelfInfo,
basicInfoWrapper: QQBasicInfoWrapper,
pathWrapper: NapCatPathWrapper,
packetHandler: NativePacketHandler
packetHandler: NativePacketHandler,
napi2nativeLoader: Napi2NativeLoader
) {
this.context = {
packetHandler,
napi2nativeLoader,
workingEnv: NapCatCoreWorkingEnv.Framework,
wrapper,
session,

View File

@@ -22,7 +22,8 @@
"napcat-adapter": "workspace:*",
"napcat-webui-backend": "workspace:*",
"napcat-vite": "workspace:*",
"napcat-qrcode": "workspace:*"
"napcat-qrcode": "workspace:*",
"json5": "^2.2.3"
},
"devDependencies": {
"@types/node": "^22.0.1"

Binary file not shown.

View File

@@ -17,7 +17,7 @@ export const OB11UserSchema = Type.Object({
login_days: Type.Optional(Type.Number({ description: '登录天数' })),
categoryName: Type.Optional(Type.String({ description: '分组名称' })),
categoryId: Type.Optional(Type.Number({ description: '分组ID' })),
}, { description: 'OneBot 11 用户信息' });
}, { $id: 'OB11User', description: 'OneBot 11 用户信息' });
export const OB11GroupSchema = Type.Object({
group_all_shut: Type.Number({ description: '是否全员禁言' }),
@@ -26,7 +26,7 @@ export const OB11GroupSchema = Type.Object({
group_name: Type.String({ description: '群名称' }),
member_count: Type.Optional(Type.Number({ description: '成员人数' })),
max_member_count: Type.Optional(Type.Number({ description: '最大成员人数' })),
}, { description: 'OneBot 11 群信息' });
}, { $id: 'OB11Group', description: 'OneBot 11 群信息' });
export const OB11GroupMemberSchema = Type.Object({
group_id: Type.Number({ description: '群号' }),
@@ -48,7 +48,7 @@ export const OB11GroupMemberSchema = Type.Object({
shut_up_timestamp: Type.Optional(Type.Number({ description: '禁言截止时间戳' })),
is_robot: Type.Optional(Type.Boolean({ description: '是否为机器人' })),
qage: Type.Optional(Type.Number({ description: 'Q龄' })),
}, { description: 'OneBot 11 群成员信息' });
}, { $id: 'OB11GroupMember', description: 'OneBot 11 群成员信息' });
export const OB11NotifySchema = Type.Object({
request_id: Type.Number({ description: '请求ID' }),
@@ -60,7 +60,7 @@ export const OB11NotifySchema = Type.Object({
checked: Type.Boolean({ description: '是否已处理' }),
actor: Type.Number({ description: '操作者QQ' }),
requester_nick: Type.String({ description: '申请者昵称' }),
}, { description: 'OneBot 11 通知信息' });
}, { $id: 'OB11Notify', description: 'OneBot 11 通知信息' });
export const lastestMessageSchema = Type.Object({
self_id: Type.Number({ description: '发送者QQ号' }),
@@ -82,7 +82,7 @@ export const lastestMessageSchema = Type.Object({
post_type: Type.String({ description: '发布类型' }),
group_id: Type.Number({ description: '群号' }),
group_name: Type.String({ description: '群名称' }),
}, { description: '最后一条消息' });
}, { $id: 'OB11LatestMessage', description: '最后一条消息' });
export const OB11MessageSchema = Type.Intersect([
lastestMessageSchema,
@@ -95,4 +95,4 @@ export const OB11MessageSchema = Type.Intersect([
likes_cnt: Type.String({ description: '点赞数' }),
})),
}, { description: 'OneBot 11 消息信息' })
]);
], { $id: 'OB11ActionMessage', description: 'OneBot 11 消息信息' });

View File

@@ -196,9 +196,14 @@ export class OB11PluginMangerAdapter extends IOB11NetworkAdapter<PluginConfig> i
* 创建插件上下文
*/
private createPluginContext (entry: PluginEntry): NapCatPluginContext {
const dataPath = path.join(entry.pluginPath, 'data');
const dataPath = path.join(this.core.context.pathWrapper.configPath, 'plugins', entry.id);
const configPath = path.join(dataPath, 'config.json');
// 确保插件配置目录存在
if (!fs.existsSync(dataPath)) {
fs.mkdirSync(dataPath, { recursive: true });
}
// 创建插件专用日志器
const pluginPrefix = `[Plugin: ${entry.id}]`;
const coreLogger = this.logger;
@@ -358,7 +363,7 @@ export class OB11PluginMangerAdapter extends IOB11NetworkAdapter<PluginConfig> i
}
const pluginPath = entry.pluginPath;
const dataPath = path.join(pluginPath, 'data');
const dataPath = path.join(this.core.context.pathWrapper.configPath, 'plugins', pluginId);
if (entry.loaded) {
await this.unloadPlugin(entry);
@@ -372,7 +377,7 @@ export class OB11PluginMangerAdapter extends IOB11NetworkAdapter<PluginConfig> i
fs.rmSync(pluginPath, { recursive: true, force: true });
}
// 清理数据
// 清理插件配置数据
if (cleanData && fs.existsSync(dataPath)) {
fs.rmSync(dataPath, { recursive: true, force: true });
}
@@ -440,11 +445,7 @@ export class OB11PluginMangerAdapter extends IOB11NetworkAdapter<PluginConfig> i
* 获取插件数据目录路径
*/
public getPluginDataPath (pluginId: string): string {
const entry = this.plugins.get(pluginId);
if (!entry) {
throw new Error(`Plugin ${pluginId} not found`);
}
return path.join(entry.pluginPath, 'data');
return path.join(this.core.context.pathWrapper.configPath, 'plugins', pluginId);
}
/**

View File

@@ -173,9 +173,14 @@ export class OB11PluginManager extends IOB11NetworkAdapter<PluginConfig> impleme
* 创建插件上下文
*/
private createPluginContext (entry: PluginEntry): NapCatPluginContext {
const dataPath = path.join(entry.pluginPath, 'data');
const dataPath = path.join(this.core.context.pathWrapper.configPath, 'plugins', entry.id);
const configPath = path.join(dataPath, 'config.json');
// 确保插件配置目录存在
if (!fs.existsSync(dataPath)) {
fs.mkdirSync(dataPath, { recursive: true });
}
// 创建插件专用日志器
const pluginPrefix = `[Plugin: ${entry.id}]`;
const coreLogger = this.logger;
@@ -323,7 +328,7 @@ export class OB11PluginManager extends IOB11NetworkAdapter<PluginConfig> impleme
}
const pluginPath = entry.pluginPath;
const dataPath = path.join(pluginPath, 'data');
const dataPath = path.join(this.core.context.pathWrapper.configPath, 'plugins', pluginId);
// 先卸载插件
await this.unloadPlugin(entry);
@@ -336,7 +341,7 @@ export class OB11PluginManager extends IOB11NetworkAdapter<PluginConfig> impleme
fs.rmSync(pluginPath, { recursive: true, force: true });
}
// 清理数据
// 清理插件配置数据
if (cleanData && fs.existsSync(dataPath)) {
fs.rmSync(dataPath, { recursive: true, force: true });
}
@@ -404,11 +409,7 @@ export class OB11PluginManager extends IOB11NetworkAdapter<PluginConfig> impleme
* 获取插件数据目录路径
*/
public getPluginDataPath (pluginId: string): string {
const entry = this.plugins.get(pluginId);
if (!entry) {
throw new Error(`Plugin ${pluginId} not found`);
}
return path.join(entry.pluginPath, 'data');
return path.join(this.core.context.pathWrapper.configPath, 'plugins', pluginId);
}
/**

View File

@@ -13,6 +13,8 @@ export interface PluginPackageJson {
main?: string;
description?: string;
author?: string;
homepage?: string;
repository?: string | { type: string; url: string; };
}
// ==================== 插件配置 Schema ====================

View File

@@ -325,8 +325,11 @@ export const OB11MessageDataSchema = Type.Union([
OB11MessageDiceSchema,
OB11MessageRPSSchema,
OB11MessageContactSchema,
OB11MessageLocationSchema,
OB11MessageJsonSchema,
OB11MessageXmlSchema,
OB11MessageMarkdownSchema,
OB11MessageMiniAppSchema,
OB11MessageNodeSchema,
OB11MessageForwardSchema,
OB11MessageOnlineFileSchema,

View File

@@ -2,13 +2,16 @@ import { getAllHandlers } from '@/napcat-onebot/action/index';
import { AutoRegisterRouter } from '@/napcat-onebot/action/auto-register';
import { writeFileSync, existsSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { TSchema } from '@sinclair/typebox';
import { fileURLToPath } from 'node:url';
import { OneBotAction } from '@/napcat-onebot/action/OneBotAction';
import { TSchema } from '@sinclair/typebox';
import { OneBotAction, ActionExamples } from '@/napcat-onebot/action/OneBotAction';
import { napCatVersion } from 'napcat-common/src/version';
import * as MessageSchemas from '@/napcat-onebot/types/message';
import * as ActionSchemas from '@/napcat-onebot/action/schemas';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
/* -------------------------------------------------------------------------- */
/* 基础类型 */
/* -------------------------------------------------------------------------- */
interface ActionSchemaInfo {
payload?: TSchema;
@@ -21,52 +24,524 @@ interface ActionSchemaInfo {
errorExamples?: Array<{ code: number, description: string; }>;
}
type JsonObject = { [key: string]: unknown; };
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const OPENAPI_OUTPUT_PATH = resolve(__dirname, 'openapi.json');
const MISSING_REPORT_PATH = resolve(__dirname, 'missing_props.log');
export const actionSchemas: Record<string, ActionSchemaInfo> = {};
/* -------------------------------------------------------------------------- */
/* 日志工具 */
/* -------------------------------------------------------------------------- */
/**
* 统一日志前缀,方便在构建日志中快速检索。
*/
const LOG_SCOPE = '[napcat-schema]';
function logSection (title: string) {
console.log(`\n${LOG_SCOPE} ── ${title}`);
}
function logInfo (message: string) {
console.log(`${LOG_SCOPE} ${message}`);
}
function logWarn (message: string) {
console.warn(`${LOG_SCOPE}${message}`);
}
function logSuccess (message: string) {
console.log(`${LOG_SCOPE}${message}`);
}
/* -------------------------------------------------------------------------- */
/* OpenAPI 基础组件(固定部分) */
/* -------------------------------------------------------------------------- */
const BaseResponseSchema: JsonObject = {
type: 'object',
'x-schema-id': 'BaseResponse',
properties: {
status: { type: 'string', description: '状态 (ok/failed)' },
retcode: { type: 'number', description: '返回码' },
data: { description: '业务数据(具体结构由各接口定义)' },
message: { type: 'string', description: '消息' },
wording: { type: 'string', description: '提示' },
stream: {
type: 'string',
description: '流式响应',
enum: ['stream-action', 'normal-action']
}
},
required: ['status', 'retcode']
};
const EmptyDataSchema: JsonObject = {
description: '无数据',
type: 'null'
};
const DEFAULT_SUCCESS_EXAMPLE_VALUE = {
status: 'ok',
retcode: 0,
data: {},
message: '',
wording: '',
stream: 'normal-action'
} as const;
const DEFAULT_ERROR_EXAMPLE_DEFINITIONS = ActionExamples.Common.errors;
const SUCCESS_DEFAULT_EXAMPLE_KEY = 'Success_Default';
function isObjectRecord (value: unknown): value is Record<string, unknown> {
return !!value && typeof value === 'object' && !Array.isArray(value);
}
function isEmptyObject (value: unknown): value is Record<string, never> {
return isObjectRecord(value) && Object.keys(value).length === 0;
}
function isEmptyArray (value: unknown): value is [] {
return Array.isArray(value) && value.length === 0;
}
function isMeaninglessSuccessExampleData (value: unknown): boolean {
return value === null || isEmptyObject(value) || isEmptyArray(value);
}
function resolveCommonErrorExampleKey (error: { code: number, description: string; }): string | null {
const matched = DEFAULT_ERROR_EXAMPLE_DEFINITIONS.find(
item => item.code === error.code && item.description === error.description
);
return matched ? `Error_${matched.code}` : null;
}
/* -------------------------------------------------------------------------- */
/* 通用工具函数 */
/* -------------------------------------------------------------------------- */
/**
* 深拷贝 schema优先使用 structuredClone失败时回落到 JSON 序列化。
*/
function cloneSchema<T> (schema: T): T {
if (typeof globalThis.structuredClone === 'function') {
try {
return globalThis.structuredClone(schema);
} catch {
// fallback
}
}
return JSON.parse(JSON.stringify(schema)) as T;
}
/**
* 在 anyOf/oneOf 中,将“多个单值 enum 分支 + 可选 nullable 分支”压缩为单个 enum。
*
* 例:
* - anyOf: [{ type:'string', enum:['a'] }, { type:'string', enum:['b'] }]
* -> { type:'string', enum:['a','b'] }
*/
function collapseSingleValueEnumCombinator (items: unknown[]): Record<string, unknown> | null {
const enumValues: unknown[] = [];
let type: string | undefined;
let nullable = false;
for (const item of items) {
if (!item || typeof item !== 'object') {
return null;
}
const branch = item as Record<string, unknown>;
// 兼容仅有 nullable 的分支
if (branch['nullable'] === true && Object.keys(branch).length === 1) {
nullable = true;
continue;
}
const branchEnum = branch['enum'];
if (!Array.isArray(branchEnum) || branchEnum.length !== 1) {
return null;
}
enumValues.push(branchEnum[0]);
if (typeof branch['type'] === 'string') {
if (!type) {
type = branch['type'];
} else if (type !== branch['type']) {
return null;
}
}
}
if (enumValues.length === 0) {
return null;
}
const merged: Record<string, unknown> = { enum: [...new Set(enumValues)] };
if (type) {
merged['type'] = type;
}
if (nullable) {
merged['nullable'] = true;
}
return merged;
}
/**
* 将 TypeBox/JSON-Schema 映射为 OpenAPI 3.1 兼容结构。
*
* 关键规则:
* - $id -> x-schema-id保留标识用于后续 $ref 替换)
* - const -> enum:[const]
* - type:'void' / type:'undefined' -> type:'null'
* - nullable:true -> type 包含 'null'
* - anyOf/oneOf 的简单 enum 分支做压缩
*/
function sanitizeSchemaForOpenAPI<T> (schema: T): T {
const walk = (value: unknown): unknown => {
if (Array.isArray(value)) {
return value.map(walk);
}
if (value && typeof value === 'object') {
const obj = value as Record<string, unknown>;
const next: Record<string, unknown> = {};
for (const [key, child] of Object.entries(obj)) {
// 特殊处理 properties 容器:只遍历每个属性的 schema避免将容器对象误判为 schema 元对象
if (key === 'properties' && child && typeof child === 'object' && !Array.isArray(child)) {
const cleanProps: Record<string, unknown> = {};
for (const [propName, propSchema] of Object.entries(child as Record<string, unknown>)) {
cleanProps[propName] = walk(propSchema);
}
next[key] = cleanProps;
continue;
}
if (key === '$id') {
if (typeof child === 'string' && child.length > 0) {
next['x-schema-id'] = child;
}
continue;
}
if (key === 'const') {
next['enum'] = [child];
continue;
}
if (key === 'type' && typeof child === 'string') {
if (child === 'void' || child === 'undefined') {
next['type'] = 'null';
} else {
next['type'] = child;
}
continue;
}
if (key === 'type' && Array.isArray(child)) {
const types = child
.filter((t): t is string => typeof t === 'string')
.map(t => (t === 'void' || t === 'undefined') ? 'null' : t);
const normalizedTypes = [...new Set(types)];
if (normalizedTypes.length === 0) {
next['type'] = 'null';
} else if (normalizedTypes.length === 1) {
next['type'] = normalizedTypes[0];
} else {
next['type'] = normalizedTypes;
}
continue;
}
if ((key === 'anyOf' || key === 'oneOf') && Array.isArray(child)) {
const normalized = child.map(walk);
const mergedEnum = collapseSingleValueEnumCombinator(normalized);
if (mergedEnum) {
Object.assign(next, mergedEnum);
} else {
next[key] = normalized;
}
continue;
}
next[key] = walk(child);
}
// OpenAPI 3.1:将 nullable 归一到 type 包含 null
if (next['nullable'] === true) {
const currentType = next['type'];
if (typeof currentType === 'string') {
next['type'] = currentType === 'null' ? 'null' : [currentType, 'null'];
} else if (Array.isArray(currentType)) {
const normalizedTypes = [
...new Set(currentType
.filter((t): t is string => typeof t === 'string')
.map(t => (t === 'void' || t === 'undefined') ? 'null' : t)
.concat('null'))
];
next['type'] = normalizedTypes.length === 1 ? normalizedTypes[0] : normalizedTypes;
} else if (!('anyOf' in next) && !('oneOf' in next) && !('allOf' in next) && !('$ref' in next)) {
next['type'] = 'null';
}
delete next['nullable'];
}
// 兜底:仅有描述/元信息但缺少 type 时,补 object避免严格校验失败
if (
!('type' in next)
&& !('$ref' in next)
&& !('anyOf' in next)
&& !('oneOf' in next)
&& !('allOf' in next)
&& !('enum' in next)
&& !('properties' in next)
&& !('items' in next)
) {
const schemaMetaKeys = [
'description', 'title', 'default', 'examples', 'example',
'deprecated', 'readOnly', 'writeOnly', 'x-schema-id'
];
if (schemaMetaKeys.some(key => key in next)) {
next['type'] = 'object';
}
}
return next;
}
return value;
};
return walk(schema) as T;
}
/* -------------------------------------------------------------------------- */
/* Schema 注册 & 引用替换逻辑 */
/* -------------------------------------------------------------------------- */
/**
* 将模块中所有“含 $id 的导出 schema”注册到 components.schemas。
*/
function registerSchemasFromModule (
openapi: JsonObject,
source: Record<string, unknown>,
sourceName: string
) {
const components = ((openapi['components'] as JsonObject)['schemas'] as JsonObject);
let registeredCount = 0;
let duplicatedCount = 0;
for (const exportedValue of Object.values(source)) {
if (!exportedValue || typeof exportedValue !== 'object') {
continue;
}
const schema = cloneSchema(exportedValue) as JsonObject;
const schemaId = typeof schema['$id'] === 'string' && (schema['$id'] as string).length > 0
? schema['$id'] as string
: '';
if (!schemaId) {
continue;
}
if (components[schemaId]) {
duplicatedCount += 1;
logWarn(`发现重复 schema id${sourceName}${schemaId},将覆盖旧定义`);
}
components[schemaId] = sanitizeSchemaForOpenAPI(schema);
registeredCount += 1;
}
logInfo(`${sourceName} 注册完成:${registeredCount} 个 schema重复 ${duplicatedCount}`);
}
/**
* 对 components.schemas 做去内联:
* - 若子节点含 x-schema-id 且在 components.schemas 可命中
* - 则替换为 $ref
*
* 注意:组件根节点不会替换为自身,避免根级自引用。
*/
function replaceComponentInlineSchemasWithRefs (openapi: JsonObject) {
const components = openapi['components'] as JsonObject | undefined;
const schemas = components?.['schemas'] as JsonObject | undefined;
if (!schemas || typeof schemas !== 'object') {
return;
}
const availableSchemaIds = new Set(Object.keys(schemas));
let replacedCount = 0;
const walk = (value: unknown, ownerSchemaId: string): unknown => {
if (Array.isArray(value)) {
return value.map(item => walk(item, ownerSchemaId));
}
if (value && typeof value === 'object') {
const obj = value as JsonObject;
const schemaId = obj['x-schema-id'];
if (
typeof schemaId === 'string'
&& schemaId !== ownerSchemaId
&& availableSchemaIds.has(schemaId)
) {
replacedCount += 1;
return { $ref: `#/components/schemas/${schemaId}` };
}
const next: JsonObject = {};
for (const [key, child] of Object.entries(obj)) {
next[key] = walk(child, ownerSchemaId);
}
return next;
}
return value;
};
for (const [schemaId, schema] of Object.entries(schemas)) {
schemas[schemaId] = walk(schema, schemaId);
}
logInfo(`components 内联替换完成:${replacedCount}`);
}
/**
* 对 paths 做去内联:
* - 若节点含 x-schema-id 且在 components.schemas 可命中
* - 则替换为 $ref
*/
function replacePathInlineSchemasWithRefs (openapi: JsonObject) {
const paths = openapi['paths'];
const components = openapi['components'] as JsonObject | undefined;
const schemas = components?.['schemas'] as JsonObject | undefined;
if (!paths || typeof paths !== 'object' || !schemas || typeof schemas !== 'object') {
return;
}
const availableSchemaIds = new Set(Object.keys(schemas));
let replacedCount = 0;
const walk = (value: unknown): unknown => {
if (Array.isArray(value)) {
return value.map(walk);
}
if (value && typeof value === 'object') {
const obj = value as JsonObject;
const schemaId = obj['x-schema-id'];
if (typeof schemaId === 'string' && availableSchemaIds.has(schemaId)) {
replacedCount += 1;
return { $ref: `#/components/schemas/${schemaId}` };
}
const next: JsonObject = {};
for (const [key, child] of Object.entries(obj)) {
next[key] = walk(child);
}
return next;
}
return value;
};
openapi['paths'] = walk(paths) as JsonObject;
logInfo(`paths 内联替换完成:${replacedCount}`);
}
/* -------------------------------------------------------------------------- */
/* Action 收集逻辑 */
/* -------------------------------------------------------------------------- */
/**
* 收集全部 action schema 信息。
*/
export function initSchemas () {
const handlers = getAllHandlers(null as any, null as any);
handlers.forEach(handler => {
if (handler.actionName && (handler.actionName as string) !== 'unknown') {
const action = handler as OneBotAction<unknown, unknown>;
actionSchemas[handler.actionName] = {
payload: action.payloadSchema,
return: action.returnSchema,
summary: action.actionSummary,
description: action.actionDescription,
tags: action.actionTags,
payloadExample: action.payloadExample,
returnExample: action.returnExample,
errorExamples: action.errorExamples
};
if (!handler.actionName || (handler.actionName as string) === 'unknown') {
return;
}
const action = handler as OneBotAction<unknown, unknown>;
actionSchemas[handler.actionName] = {
payload: action.payloadSchema,
return: action.returnSchema,
summary: action.actionSummary,
description: action.actionDescription,
tags: action.actionTags,
payloadExample: action.payloadExample,
returnExample: action.returnExample,
errorExamples: action.errorExamples
};
});
AutoRegisterRouter.forEach((ActionClass) => {
AutoRegisterRouter.forEach(ActionClass => {
const handler = new ActionClass(null as any, null as any);
if (handler.actionName && (handler.actionName as string) !== 'unknown') {
const action = handler as OneBotAction<unknown, unknown>;
actionSchemas[handler.actionName] = {
payload: action.payloadSchema,
return: action.returnSchema,
summary: action.actionSummary,
description: action.actionDescription,
tags: action.actionTags,
payloadExample: action.payloadExample,
returnExample: action.returnExample,
errorExamples: action.errorExamples
};
if (!handler.actionName || (handler.actionName as string) === 'unknown') {
return;
}
const action = handler as OneBotAction<unknown, unknown>;
actionSchemas[handler.actionName] = {
payload: action.payloadSchema,
return: action.returnSchema,
summary: action.actionSummary,
description: action.actionDescription,
tags: action.actionTags,
payloadExample: action.payloadExample,
returnExample: action.returnExample,
errorExamples: action.errorExamples
};
});
}
export function generateOpenAPI () {
try {
initSchemas();
} catch (e) {
console.warn('Init schemas partial failure, proceeding with collected data...');
}
/* -------------------------------------------------------------------------- */
/* OpenAPI 构建主流程 */
/* -------------------------------------------------------------------------- */
const openapi: Record<string, unknown> = {
openapi: '3.0.1',
function createOpenAPIDocument (): Record<string, unknown> {
const componentExamples: Record<string, unknown> = {
[SUCCESS_DEFAULT_EXAMPLE_KEY]: {
summary: '成功响应',
value: DEFAULT_SUCCESS_EXAMPLE_VALUE
}
};
DEFAULT_ERROR_EXAMPLE_DEFINITIONS.forEach(error => {
componentExamples[`Error_${error.code}`] = {
summary: error.description,
value: {
status: 'failed',
retcode: error.code,
data: null,
message: error.description,
wording: error.description,
stream: 'normal-action'
}
};
});
return {
openapi: '3.1.0',
info: {
title: 'NapCat OneBot 11 HTTP API',
description: 'NapCatOneBot11 HTTP POST 接口文档',
@@ -81,39 +556,43 @@ export function generateOpenAPI () {
],
paths: {} as Record<string, unknown>,
components: {
schemas: {},
schemas: {
BaseResponse: BaseResponseSchema,
EmptyData: EmptyDataSchema
},
examples: componentExamples,
responses: {},
securitySchemes: {}
},
servers: [],
security: []
};
}
for (const [actionName, schemas] of Object.entries(actionSchemas)) {
if (!schemas.payload && !schemas.summary) continue;
const path = '/' + actionName;
const cleanPayload = schemas.payload ? JSON.parse(JSON.stringify(schemas.payload)) : { type: 'object', properties: {} };
const cleanReturn = schemas.return ? JSON.parse(JSON.stringify(schemas.return)) : { type: 'object', properties: {} };
// 构造响应示例
const responseExamples: Record<string, any> = {
'Success': {
function buildResponseExamples (schemas: ActionSchemaInfo): Record<string, unknown> {
const successData = schemas.returnExample ?? {};
const examples: Record<string, any> = {
Success: isMeaninglessSuccessExampleData(successData)
? { $ref: `#/components/examples/${SUCCESS_DEFAULT_EXAMPLE_KEY}` }
: {
summary: '成功响应',
value: {
status: 'ok',
retcode: 0,
data: schemas.returnExample || {},
data: successData,
message: '',
wording: '',
stream: 'normal-action'
}
}
};
};
if (schemas.errorExamples) {
schemas.errorExamples.forEach(error => {
responseExamples['Error_' + error.code] = {
if (schemas.errorExamples) {
schemas.errorExamples.forEach(error => {
const commonErrorKey = resolveCommonErrorExampleKey(error);
examples[`Error_${error.code}`] = commonErrorKey
? { $ref: `#/components/examples/${commonErrorKey}` }
: {
summary: error.description,
value: {
status: 'failed',
@@ -124,23 +603,33 @@ export function generateOpenAPI () {
stream: 'normal-action'
}
};
});
} else {
// 默认提供一个通用错误
responseExamples['Generic_Error'] = {
summary: '通用错误',
value: {
status: 'failed',
retcode: 1400,
data: null,
message: '请求参数错误或业务逻辑执行失败',
wording: '请求参数错误或业务逻辑执行失败',
stream: 'normal-action'
}
};
});
return examples;
}
examples['Generic_Error'] = {
$ref: '#/components/examples/Error_1400'
};
return examples;
}
function appendActionPaths (openapi: Record<string, unknown>) {
const paths = openapi['paths'] as Record<string, any>;
for (const [actionName, schemas] of Object.entries(actionSchemas)) {
if (!schemas.payload && !schemas.summary) {
continue;
}
const paths = openapi['paths'] as Record<string, any>;
const path = `/${actionName}`;
const cleanPayload = schemas.payload
? sanitizeSchemaForOpenAPI(cloneSchema(schemas.payload))
: { type: 'object', properties: {} };
const cleanReturn = schemas.return
? sanitizeSchemaForOpenAPI(cloneSchema(schemas.return))
: { $ref: '#/components/schemas/EmptyData' };
paths[path] = {
post: {
summary: schemas.summary || actionName,
@@ -154,7 +643,7 @@ export function generateOpenAPI () {
'application/json': {
schema: cleanPayload,
examples: {
'Default': {
Default: {
summary: '默认请求示例',
value: schemas.payloadExample || {}
}
@@ -168,18 +657,21 @@ export function generateOpenAPI () {
content: {
'application/json': {
schema: {
type: 'object',
properties: {
status: { type: 'string', description: '状态 (ok/failed)' },
retcode: { type: 'number', description: '返回码' },
data: { ...cleanReturn, description: '数据' },
message: { type: 'string', description: '消息' },
wording: { type: 'string', description: '提示' },
stream: { type: 'string', description: '流式响应', enum: ['stream-action', 'normal-action'] }
},
required: ['status', 'retcode', 'data']
allOf: [
{ $ref: '#/components/schemas/BaseResponse' },
{
type: 'object',
required: ['data'],
properties: {
data: {
...(typeof cleanReturn === 'object' && cleanReturn ? cleanReturn : {}),
description: '业务数据'
}
}
}
]
},
examples: responseExamples
examples: buildResponseExamples(schemas)
}
}
}
@@ -188,16 +680,46 @@ export function generateOpenAPI () {
}
};
}
}
const outputPath = resolve(__dirname, 'openapi.json');
writeFileSync(outputPath, JSON.stringify(openapi, null, 2));
console.log('OpenAPI schema (3.0.1 Format) generated at: ' + outputPath);
export function generateOpenAPI () {
logSection('开始生成 OpenAPI 文档');
try {
initSchemas();
logInfo(`已收集 action: ${Object.keys(actionSchemas).length}`);
} catch {
logWarn('初始化 schema 过程中出现部分失败,将继续使用已收集的数据');
}
const openapi = createOpenAPIDocument();
logSection('注册组件 schema');
registerSchemasFromModule(openapi as JsonObject, MessageSchemas, 'types/message.ts');
registerSchemasFromModule(openapi as JsonObject, ActionSchemas, 'action/schemas.ts');
logSection('处理组件内联引用');
replaceComponentInlineSchemasWithRefs(openapi as JsonObject);
logSection('构建 paths');
appendActionPaths(openapi);
logSection('处理 paths 内联引用');
replacePathInlineSchemasWithRefs(openapi as JsonObject);
writeFileSync(OPENAPI_OUTPUT_PATH, JSON.stringify(openapi, null, 2));
logSuccess(`OpenAPI 生成完成:${OPENAPI_OUTPUT_PATH}`);
generateMissingReport();
}
/* -------------------------------------------------------------------------- */
/* 元数据缺失报告 */
/* -------------------------------------------------------------------------- */
function generateMissingReport () {
const missingReport: string[] = [];
for (const [actionName, schemas] of Object.entries(actionSchemas)) {
const missing: string[] = [];
if (!schemas.summary) missing.push('actionSummary');
@@ -206,18 +728,20 @@ function generateMissingReport () {
if (schemas.returnExample === undefined) missing.push('returnExample');
if (missing.length > 0) {
missingReport.push('[' + actionName + '] 缺失属性: ' + missing.join(', '));
missingReport.push(`[${actionName}] 缺失属性: ${missing.join(', ')}`);
}
}
const reportPath = resolve(__dirname, 'missing_props.log');
if (missingReport.length > 0) {
writeFileSync(reportPath, missingReport.join('\n'));
console.warn('\n检查到 ' + missingReport.length + ' 个接口存在元数据缺失,报告已保存至: ' + reportPath);
} else {
if (existsSync(reportPath)) writeFileSync(reportPath, '');
console.log('\n所有接口元数据已完整');
writeFileSync(MISSING_REPORT_PATH, missingReport.join('\n'));
logWarn(`检查到 ${missingReport.length} 个接口元数据缺失,报告已写入:${MISSING_REPORT_PATH}`);
return;
}
if (existsSync(MISSING_REPORT_PATH)) {
writeFileSync(MISSING_REPORT_PATH, '');
}
logSuccess('所有接口元数据完整');
}
generateOpenAPI();

View File

@@ -30,12 +30,15 @@ import { NodeIO3MiscListener } from 'napcat-core/listeners/NodeIO3MiscListener';
import { sleep } from 'napcat-common/src/helper';
import { FFmpegService } from '@/napcat-core/helper/ffmpeg/ffmpeg';
import { NativePacketHandler } from 'napcat-core/packet/handler/client';
import { Napi2NativeLoader } from 'napcat-core/packet/handler/napi2nativeLoader';
import { loadNapcatConfig } from '@/napcat-core/helper/config';
import { logSubscription, LogWrapper } from '@/napcat-core/helper/log';
import { proxiedListenerOf } from '@/napcat-core/helper/proxy-handler';
import { QQBasicInfoWrapper } from '@/napcat-core/helper/qq-basic-info';
import { statusHelperSubscription } from '@/napcat-core/helper/status';
import { applyPendingUpdates } from '@/napcat-webui-backend/src/api/UpdateNapCat';
import { connectToNamedPipe } from './pipe';
// NapCat Shell App ES 入口文件
async function handleUncaughtExceptions (logger: LogWrapper) {
process.on('uncaughtException', (err) => {
@@ -387,20 +390,35 @@ export async function NCoreInitShell () {
handleUncaughtExceptions(logger);
await applyPendingUpdates(pathWrapper, logger);
// 提前初始化 Native 模块(在登录前加载)
const basicInfoWrapper = new QQBasicInfoWrapper({ logger });
const nativePacketHandler = new NativePacketHandler({ logger });
const napi2nativeLoader = new Napi2NativeLoader({ logger });
// 初始化 FFmpeg 服务
await FFmpegService.init(pathWrapper.binaryPath, logger);
if (!(process.env['NAPCAT_DISABLE_PIPE'] == '1' || process.env['NAPCAT_WORKER_PROCESS'] == '1')) {
if (!(process.env['NAPCAT_DISABLE_PIPE'] === '1' || process.env['NAPCAT_WORKER_PROCESS'] === '1')) {
await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e));
}
const basicInfoWrapper = new QQBasicInfoWrapper({ logger });
const wrapper = loadQQWrapper(basicInfoWrapper.QQMainPath, basicInfoWrapper.getFullQQVersion());
const nativePacketHandler = new NativePacketHandler({ logger }); // 初始化 NativePacketHandler 用于后续使用
// nativePacketHandler.onAll((packet) => {
// console.log('[Packet]', packet.uin, packet.cmd, packet.hex_data);
// });
await nativePacketHandler.init(basicInfoWrapper.getFullQQVersion());
// wrapper.node 加载后再初始化 hook按 schema 读取配置
const napcatConfig = loadNapcatConfig(pathWrapper.configPath);
await nativePacketHandler.init(basicInfoWrapper.getFullQQVersion(), napcatConfig.o3HookMode === 1 ? true : false);
if (process.env['NAPCAT_ENABLE_VERBOSE_LOG'] === '1') {
napi2nativeLoader.nativeExports.setVerbose?.(true);
}
// wrapper.node 加载后立刻启用 Bypass可通过环境变量禁用
if (process.env['NAPCAT_DISABLE_BYPASS'] !== '1') {
const bypassOptions = napcatConfig.bypass ?? {};
logger.logDebug('[NapCat] Bypass 配置:', bypassOptions);
const bypassEnabled = napi2nativeLoader.nativeExports.enableAllBypasses?.(bypassOptions);
if (bypassEnabled) {
logger.log('[NapCat] Napi2NativeLoader: 已启用Bypass');
}
} else {
logger.log('[NapCat] Napi2NativeLoader: Bypass已通过环境变量禁用');
}
const o3Service = wrapper.NodeIO3MiscService.get();
o3Service.addO3MiscListener(new NodeIO3MiscListener());
@@ -425,6 +443,7 @@ export async function NCoreInitShell () {
}
}
const [dataPath, dataPathGlobal] = getDataPaths(wrapper);
WebUiDataRuntime.setQQDataPath(dataPath);
const systemPlatform = getPlatformType();
if (!basicInfoWrapper.QQVersionAppid || !basicInfoWrapper.QQVersionQua) throw new Error('QQVersionAppid or QQVersionQua is not defined');
@@ -450,6 +469,13 @@ export async function NCoreInitShell () {
o3Service.reportAmgomWeather('login', 'a1', [dataTimestape, '0', '0']);
const selfInfo = await handleLogin(loginService, logger, pathWrapper, quickLoginUin, historyLoginList);
// 登录成功后通知 Master 进程(用于切换崩溃重试策略)
if (typeof process.send === 'function') {
process.send({ type: 'login-success' });
logger.log('[NapCat] 已通知主进程登录成功');
}
const amgomDataPiece = 'eb1fd6ac257461580dc7438eb099f23aae04ca679f4d88f53072dc56e3bb1129';
o3Service.setAmgomDataPiece(basicInfoWrapper.QQVersionAppid, new Uint8Array(Buffer.from(amgomDataPiece, 'hex')));
@@ -487,7 +513,8 @@ export async function NCoreInitShell () {
selfInfo,
basicInfoWrapper,
pathWrapper,
nativePacketHandler
nativePacketHandler,
napi2nativeLoader
).InitNapCat();
}
@@ -502,10 +529,12 @@ export class NapCatShell {
selfInfo: SelfInfo,
basicInfoWrapper: QQBasicInfoWrapper,
pathWrapper: NapCatPathWrapper,
packetHandler: NativePacketHandler
packetHandler: NativePacketHandler,
napi2nativeLoader: Napi2NativeLoader
) {
this.context = {
packetHandler,
napi2nativeLoader,
workingEnv: NapCatCoreWorkingEnv.Shell,
wrapper,
session,

View File

@@ -45,7 +45,7 @@ const ENV = {
// Worker 消息类型
interface WorkerMessage {
type: 'restart' | 'restart-prepare' | 'shutdown';
type: 'restart' | 'restart-prepare' | 'shutdown' | 'login-success';
secretKey?: string;
port?: number;
}
@@ -65,6 +65,7 @@ const recentCrashTimestamps: number[] = [];
const CRASH_TIME_WINDOW = 10000; // 10秒时间窗口
const MAX_CRASHES_IN_WINDOW = 3; // 最大崩溃次数
/**
* 获取进程类型名称(用于日志)
*/
@@ -113,6 +114,42 @@ function forceKillProcess (pid: number): void {
}
}
/**
* 清理进程树中的残留子进程Electron 模式专用)
* 排除当前主进程和新 worker 进程
*/
async function cleanupOrphanedProcesses (excludePids: number[]): Promise<void> {
if (!isElectron) return;
try {
// 使用 Electron 的 app.getAppMetrics() 获取所有相关进程
// @ts-ignore - electron 运行时存在但类型声明可能缺失
const electron = await import('electron');
if (electron.app && typeof electron.app.getAppMetrics === 'function') {
const metrics = electron.app.getAppMetrics();
const mainPid = process.pid;
for (const metric of metrics) {
const pid = metric.pid;
// 排除主进程、新 worker 进程和明确排除的 PID
if (pid === mainPid || excludePids.includes(pid)) {
continue;
}
// 尝试终止残留进程
try {
process.kill(pid, 'SIGTERM');
logger.log(`[NapCat] [Process] 已清理残留进程: PID ${pid} (${metric.type})`);
} catch {
// 进程可能已经不存在,忽略错误
}
}
}
} catch (error) {
// Electron API 不可用或出错,静默忽略
logger.logDebug?.('[NapCat] [Process] 清理残留进程时出错:', error);
}
}
/**
* 重启 Worker 进程
*/
@@ -166,6 +203,13 @@ export async function restartWorker (secretKey?: string, port?: number): Promise
// 5. 启动新进程(重启模式不传递快速登录参数,传递密钥和端口)
await startWorker(false, secretKey, port);
// 6. Electron 模式下清理可能残留的子进程
if (isElectron && currentWorker?.pid) {
const excludePids = [process.pid, currentWorker.pid];
await cleanupOrphanedProcesses(excludePids);
}
isRestarting = false;
}
@@ -232,6 +276,8 @@ async function startWorker (passQuickLogin: boolean = true, secretKey?: string,
restartWorker(message.secretKey, message.port).catch(e => {
logger.logError(`[NapCat] [${processType}] 重启Worker进程失败:`, e);
});
} else if (message.type === 'login-success') {
logger.log(`[NapCat] [${processType}] Worker进程已登录成功切换到正常重试策略`);
}
}
});
@@ -254,13 +300,13 @@ async function startWorker (passQuickLogin: boolean = true, secretKey?: string,
// 记录本次崩溃
recentCrashTimestamps.push(now);
// 检查是否超过崩溃阈值
if (recentCrashTimestamps.length >= MAX_CRASHES_IN_WINDOW) {
logger.logError(`[NapCat] [${processType}] Worker进程在 ${CRASH_TIME_WINDOW / 1000} 秒内异常退出 ${MAX_CRASHES_IN_WINDOW} 次,主进程退出`);
process.exit(1);
}
logger.logWarn(`[NapCat] [${processType}] Worker进程意外退出 (${recentCrashTimestamps.length}/${MAX_CRASHES_IN_WINDOW}),正在尝试重新拉起...`);
startWorker(true).catch(e => {
logger.logError(`[NapCat] [${processType}] 重新拉起Worker进程失败:`, e);
});

View File

@@ -25,6 +25,7 @@
"napcat-qrcode": "workspace:*"
},
"devDependencies": {
"json5": "^2.2.3",
"@types/node": "^22.0.1",
"napcat-vite": "workspace:*"
},

Some files were not shown because too many files have changed in this diff Show More