diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f227a4dc..33a845f8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ permissions: write-all env: OPENROUTER_API_URL: https://91vip.futureppo.top/v1/chat/completions - OPENROUTER_MODEL: "gemini-3-flash-preview" + OPENROUTER_MODEL: "deepseek-v3.2-chat" RELEASE_NAME: "NapCat" jobs: @@ -396,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 . diff --git a/packages/napcat-core/external/napcat.json b/packages/napcat-core/external/napcat.json index dcce2174..9b8b28dd 100644 --- a/packages/napcat-core/external/napcat.json +++ b/packages/napcat-core/external/napcat.json @@ -1,9 +1,17 @@ { - "fileLog": false, - "consoleLog": true, - "fileLogLevel": "debug", - "consoleLogLevel": "info", - "packetBackend": "auto", - "packetServer": "", - "o3HookMode": 1 - } \ No newline at end of file + "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 + } +} \ No newline at end of file diff --git a/packages/napcat-core/helper/config.ts b/packages/napcat-core/helper/config.ts index ae911bca..b1b323c9 100644 --- a/packages/napcat-core/helper/config.ts +++ b/packages/napcat-core/helper/config.ts @@ -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; +/** + * 从指定配置目录读取 napcat.json,按 NapcatConfigSchema 校验并填充默认值 + * 用于登录前(无 NapCatCore 实例时)的早期配置读取 + */ +export function loadNapcatConfig (configPath: string): NapcatConfig { + const ajv = new Ajv({ useDefaults: true, coerceTypes: true }); + const validate = ajv.compile(NapcatConfigSchema); + let data: Record = {}; + 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 { constructor (core: NapCatCore, configPath: string, schema: AnySchema) { super('napcat', core, configPath, schema); diff --git a/packages/napcat-core/index.ts b/packages/napcat-core/index.ts index 5058b35e..58fa83e5 100644 --- a/packages/napcat-core/index.ts +++ b/packages/napcat-core/index.ts @@ -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 { diff --git a/packages/napcat-core/packet/client/nativeClient.ts b/packages/napcat-core/packet/client/nativeClient.ts index 011d18e2..99782cbc 100644 --- a/packages/napcat-core/packet/client/nativeClient.ts +++ b/packages/napcat-core/packet/client/nativeClient.ts @@ -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 Promise | 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 { - 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; + } } } diff --git a/packages/napcat-core/packet/context/clientContext.ts b/packages/napcat-core/packet/context/clientContext.ts index 665ebeae..e62fca37 100644 --- a/packages/napcat-core/packet/context/clientContext.ts +++ b/packages/napcat-core/packet/context/clientContext.ts @@ -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(pkt: OidbPacket, rsp?: T, timeout?: number): Promise { + async sendOidbPacket (pkt: OidbPacket, rsp?: T, timeout?: number): Promise { 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将不会加载!'); } diff --git a/packages/napcat-core/packet/context/napCoreContext.ts b/packages/napcat-core/packet/context/napCoreContext.ts index 88420330..85b6b427 100644 --- a/packages/napcat-core/packet/context/napCoreContext.ts +++ b/packages/napcat-core/packet/context/napCoreContext.ts @@ -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); } diff --git a/packages/napcat-core/packet/context/packetContext.ts b/packages/napcat-core/packet/context/packetContext.ts index 80e4c8ae..f2cdda80 100644 --- a/packages/napcat-core/packet/context/packetContext.ts +++ b/packages/napcat-core/packet/context/packetContext.ts @@ -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); } diff --git a/packages/napcat-core/packet/handler/client.ts b/packages/napcat-core/packet/handler/client.ts index 48854b7b..3f3cc276 100644 --- a/packages/napcat-core/packet/handler/client.ts +++ b/packages/napcat-core/packet/handler/client.ts @@ -194,7 +194,7 @@ export class NativePacketHandler { } } - async init (version: string): Promise { + async init (version: string, o3HookMode: boolean = false): Promise { 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) { diff --git a/packages/napcat-core/packet/handler/napi2nativeLoader.ts b/packages/napcat-core/packet/handler/napi2nativeLoader.ts new file mode 100644 index 00000000..b7012a52 --- /dev/null +++ b/packages/napcat-core/packet/handler/napi2nativeLoader.ts @@ -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; + } + } +} diff --git a/packages/napcat-core/services/NodeIKernelAVSDKService.ts b/packages/napcat-core/services/NodeIKernelAVSDKService.ts new file mode 100644 index 00000000..af174ba2 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelAVSDKService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelAVSDKService { + addKernelAVSDKListener (listener: unknown): number; + + removeKernelAVSDKListener (listenerId: number): void; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelAddBuddyService.ts b/packages/napcat-core/services/NodeIKernelAddBuddyService.ts new file mode 100644 index 00000000..102792a8 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelAddBuddyService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelAlbumService.ts b/packages/napcat-core/services/NodeIKernelAlbumService.ts index f6699d67..76539ba5 100644 --- a/packages/napcat-core/services/NodeIKernelAlbumService.ts +++ b/packages/napcat-core/services/NodeIKernelAlbumService.ts @@ -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;// needs 4 arguments + deleteMedias (seq: number, group_code: string, album_id: string, media_ids: string[], ban_ids: unknown[]): Promise;// needs 4 arguments - modifyAlbum(...args: unknown[]): unknown;// needs 3 arguments + modifyAlbum (arg1: number, arg2: unknown, arg3: Array[]): 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;// 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;// needs 5 arguments - getRedPoints(...args: unknown[]): unknown;// needs 3 arguments + getRedPoints (arg1: string, arg2: number, arg3: string): unknown;// needs 3 arguments } diff --git a/packages/napcat-core/services/NodeIKernelAvatarService.ts b/packages/napcat-core/services/NodeIKernelAvatarService.ts index 2375c16d..ccb8e990 100644 --- a/packages/napcat-core/services/NodeIKernelAvatarService.ts +++ b/packages/napcat-core/services/NodeIKernelAvatarService.ts @@ -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[], arg2: number): unknown; - getGroupAvatarPaths(arg1: unknown, arg2: unknown): unknown; + getGroupAvatarPaths(arg1: Array[], arg2: string): unknown; getConfGroupAvatarPaths(arg: unknown): unknown; diff --git a/packages/napcat-core/services/NodeIKernelBdhUploadService.ts b/packages/napcat-core/services/NodeIKernelBdhUploadService.ts new file mode 100644 index 00000000..67c72829 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelBdhUploadService.ts @@ -0,0 +1,9 @@ +export interface NodeIKernelBdhUploadService { + addKernelBdhUploadListener (listener: unknown): number; + + removeKernelBdhUploadListener (listenerId: number): void; + + setBdhTestEnv (arg1: string, arg2: number): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelBuddyService.ts b/packages/napcat-core/services/NodeIKernelBuddyService.ts index 880f9232..7d1b3860 100644 --- a/packages/napcat-core/services/NodeIKernelBuddyService.ts +++ b/packages/napcat-core/services/NodeIKernelBuddyService.ts @@ -130,5 +130,21 @@ export interface NodeIKernelBuddyService { getBuddyRecommendContactArkJson (uid: string, phoneNumber: string): Promise; + checkIsBuddyAsync (uid: string): Promise; + + areBuddies (callFrom: string, uids: string[]): unknown; + + getCategoryById (id: number): unknown; + + addCategoryV2 (name: string, buddyUids?: unknown): Promise; + isNull (): boolean; + + getAddFriendBlockedList (): unknown; + + getAddFriendBlockedRedPoint (): unknown; + + reportAddFriendBlocked (): unknown; + + setWXMsgNotify (arg: unknown): unknown; } diff --git a/packages/napcat-core/services/NodeIKernelCollectionService.ts b/packages/napcat-core/services/NodeIKernelCollectionService.ts index 1b32757e..03527aa8 100644 --- a/packages/napcat-core/services/NodeIKernelCollectionService.ts +++ b/packages/napcat-core/services/NodeIKernelCollectionService.ts @@ -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, - 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 } diff --git a/packages/napcat-core/services/NodeIKernelConfigMgrService.ts b/packages/napcat-core/services/NodeIKernelConfigMgrService.ts new file mode 100644 index 00000000..885b0aec --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelConfigMgrService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelConfigMgrService { + addKernelConfigMgrListener (listener: unknown): number; + + removeKernelConfigMgrListener (listenerId: number): void; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelDbToolsService.ts b/packages/napcat-core/services/NodeIKernelDbToolsService.ts index 508bdc65..468faaba 100644 --- a/packages/napcat-core/services/NodeIKernelDbToolsService.ts +++ b/packages/napcat-core/services/NodeIKernelDbToolsService.ts @@ -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; } diff --git a/packages/napcat-core/services/NodeIKernelDirectSessionService.ts b/packages/napcat-core/services/NodeIKernelDirectSessionService.ts new file mode 100644 index 00000000..1986dad5 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelDirectSessionService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelDirectSessionService { + addKernelDirectSessionListener (listener: unknown): number; + + removeKernelDirectSessionListener (listenerId: number): void; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelECDHService.ts b/packages/napcat-core/services/NodeIKernelECDHService.ts index 7edb787e..441b6eca 100644 --- a/packages/napcat-core/services/NodeIKernelECDHService.ts +++ b/packages/napcat-core/services/NodeIKernelECDHService.ts @@ -1,3 +1,13 @@ export interface NodeIKernelECDHService { sendOIDBECRequest: (data: Uint8Array) => Promise; + + init (): unknown; + + setIsDebug (isDebug: boolean): unknown; + + setGuid (guid: string): unknown; + + sendOIDBRequest (cmd: number, serviceType: number, subCmd: number, data: string, extraData: unknown): Promise; + + sendSSORequest (cmd: string, serviceType: number, data: string, extraData: unknown): Promise; } diff --git a/packages/napcat-core/services/NodeIKernelEmojiService.ts b/packages/napcat-core/services/NodeIKernelEmojiService.ts new file mode 100644 index 00000000..2a4f23ea --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelEmojiService.ts @@ -0,0 +1,5 @@ +export interface NodeIKernelEmojiService { + getAIGCEmojiList (arg1: unknown, arg2: boolean): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelFeedService.ts b/packages/napcat-core/services/NodeIKernelFeedService.ts new file mode 100644 index 00000000..a845534a --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelFeedService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelFileAssistantService.ts b/packages/napcat-core/services/NodeIKernelFileAssistantService.ts index 8591e016..64bfce1d 100644 --- a/packages/napcat-core/services/NodeIKernelFileAssistantService.ts +++ b/packages/napcat-core/services/NodeIKernelFileAssistantService.ts @@ -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; } diff --git a/packages/napcat-core/services/NodeIKernelFileBridgeClientService.ts b/packages/napcat-core/services/NodeIKernelFileBridgeClientService.ts new file mode 100644 index 00000000..39ce972e --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelFileBridgeClientService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelFileBridgeHostService.ts b/packages/napcat-core/services/NodeIKernelFileBridgeHostService.ts new file mode 100644 index 00000000..cf49a9f6 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelFileBridgeHostService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelFileBridgeHostService { + addKernelFileBridgeHostListener (listener: unknown): number; + + removeKernelFileBridgeHostListener (listenerId: number): void; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelFlashTransferService.ts b/packages/napcat-core/services/NodeIKernelFlashTransferService.ts index c0c92bd7..6fb3e0b7 100644 --- a/packages/napcat-core/services/NodeIKernelFlashTransferService.ts +++ b/packages/napcat-core/services/NodeIKernelFlashTransferService.ts @@ -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; // 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; // 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[], 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; // 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; } diff --git a/packages/napcat-core/services/NodeIKernelGroupService.ts b/packages/napcat-core/services/NodeIKernelGroupService.ts index f8dbc473..ac68c23e 100644 --- a/packages/napcat-core/services/NodeIKernelGroupService.ts +++ b/packages/napcat-core/services/NodeIKernelGroupService.ts @@ -16,29 +16,29 @@ import { GeneralCallResult } from '@/napcat-core/services/common'; export interface NodeIKernelGroupService { - modifyGroupExtInfoV2(groupExtInfo: GroupExtInfo, groupExtFilter: GroupExtFilter): Promise; + modifyGroupExtInfoV2 (groupExtInfo: GroupExtInfo, groupExtFilter: GroupExtFilter): Promise; // ---> // 待启用 For Next Version 3.2.0 // isTroopMember ? 0 : 111 - getGroupMemberMaxNum(groupCode: string, serviceType: number): Promise; + getGroupMemberMaxNum (groupCode: string, serviceType: number): Promise; - getAllGroupPrivilegeFlag(troopUinList: string[], serviceType: number): Promise; + getAllGroupPrivilegeFlag (troopUinList: string[], serviceType: number): Promise; // <--- - getGroupExt0xEF0Info(enableGroupCodes: string[], bannedGroupCodes: string[], filter: GroupExt0xEF0InfoFilter, forceFetch: boolean): - Promise } }>; + getGroupExt0xEF0Info (enableGroupCodes: string[], bannedGroupCodes: string[], filter: GroupExt0xEF0InfoFilter, forceFetch: boolean): + Promise; }; }>; - kickMemberV2(param: KickMemberV2Req): Promise; + kickMemberV2 (param: KickMemberV2Req): Promise; - quitGroupV2(param: { groupCode: string; needDeleteLocalMsg: boolean; }): Promise; + quitGroupV2 (param: { groupCode: string; needDeleteLocalMsg: boolean; }): Promise; - 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; - getGroupMemberLevelInfo(groupCode: string): Promise; + getGroupMemberLevelInfo (groupCode: string): Promise; - getGroupInfoForJoinGroup(groupCode: string, needPrivilegeFlag: boolean, serviceType: number): Promise; + getGroupInfoForJoinGroup (groupCode: string, needPrivilegeFlag: boolean, serviceType: number): Promise; - getGroupHonorList(req: { groupCodes: Array }): Promise; + getGroupHonorList (req: { groupCodes: Array; }): Promise; - getUinByUids(uins: string[]): Promise<{ + getUinByUids (uins: string[]): Promise<{ errCode: number, errMsg: string, - uins: Map + uins: Map; }>; - getUidByUins(uins: string[]): Promise<{ + getUidByUins (uins: string[]): Promise<{ errCode: number, errMsg: string, - uids: Map + uids: Map; }>; - checkGroupMemberCache(arrayList: Array): Promise; + checkGroupMemberCache (arrayList: Array): Promise; - getGroupLatestEssenceList(groupCode: string): Promise; + getGroupLatestEssenceList (groupCode: string): Promise; - 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; - isEssenceMsg(req: { groupCode: string, msgRandom: number, msgSeq: number }): Promise; + isEssenceMsg (req: { groupCode: string, msgRandom: number, msgSeq: number; }): Promise; - queryCachedEssenceMsg(req: { groupCode: string, msgRandom: number, msgSeq: number }): Promise<{ items: Array }>; + queryCachedEssenceMsg (req: { groupCode: string, msgRandom: number, msgSeq: number; }): Promise<{ items: Array; }>; - fetchGroupEssenceList(req: { + fetchGroupEssenceList (req: { groupCode: string, pageStart: number, - pageLimit: number - }, Arg: unknown): Promise; + pageLimit: number; + }, Arg: string): Promise; - 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, finish: true, - hasRobot: false - } + hasRobot: false; + }; }>; - setHeader(uid: string, path: string): Promise; + setHeader (uid: string, path: string): Promise; - 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, finish: boolean, hasRobot: boolean } + result: { ids: string[], infos: Map, 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; + getMemberInfo (group_id: string, uids: string[], forceFetch: boolean): Promise; - kickMember(groupCode: string, memberUids: string[], refuseForever: boolean, kickReason: string): Promise; + kickMember (groupCode: string, memberUids: string[], refuseForever: boolean, kickReason: string): Promise; - 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; + getGroupList (force: boolean): Promise; - getGroupExtList(force: boolean): Promise; + getGroupExtList (force: boolean): Promise; - getGroupDetailInfo(groupCode: string, groupInfoSource: GroupInfoSource): Promise; + getGroupDetailInfo (groupCode: string, groupInfoSource: GroupInfoSource): Promise; - getMemberExtInfo(param: GroupExtParam): Promise;// req + getMemberExtInfo (param: GroupExtParam): Promise;// req - getGroupAllInfo(groupId: string, sourceId: number): Promise; + getGroupAllInfo (groupId: string, sourceId: number): Promise; - getDiscussExistInfo(): unknown; + getDiscussExistInfo (): unknown; - getGroupConfMember(): unknown; + getGroupConfMember (): unknown; - getGroupMsgMask(): unknown; + getGroupMsgMask (): unknown; - getGroupPortrait(): void; + getGroupPortrait (): void; - modifyGroupName(groupCode: string, groupName: string, isNormalMember: boolean): Promise; + modifyGroupName (groupCode: string, groupName: string, isNormalMember: boolean): Promise; - modifyGroupRemark(groupCode: string, remark: string): Promise; + modifyGroupRemark (groupCode: string, remark: string): Promise; - modifyGroupDetailInfo(groupCode: string, arg: unknown): void; + modifyGroupDetailInfo (groupCode: string, arg: unknown): void; // 第二个参数在大多数情况为0 设置群成员权限 例如上传群文件权限和群成员付费/加入邀请加入时为8 - modifyGroupDetailInfoV2(param: GroupDetailInfoV2Param, arg: number): Promise; + modifyGroupDetailInfoV2 (param: GroupDetailInfoV2Param, arg: number): Promise; - 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; + getSingleScreenNotifies (doubt: boolean, startSeq: string, count: number): Promise; - clearGroupNotifies(groupCode: string): void; + clearGroupNotifies (groupCode: string): void; - getGroupNotifiesUnreadCount(doubt: boolean): Promise; + getGroupNotifiesUnreadCount (doubt: boolean): Promise; - 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; - 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; + publishGroupBulletin (groupCode: string, pskey: string, data: unknown): Promise; - publishInstructionForNewcomers(groupCode: string, arg: unknown): void; + publishInstructionForNewcomers (groupCode: string, arg: unknown): void; - uploadGroupBulletinPic(groupCode: string, pskey: string, imagePath: string): Promise; - 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 & { + getGroupRemainAtTimes (groupCode: string): Promise & { 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; + setGroupShutUp (groupCode: string, shutUp: boolean): Promise; - getGroupShutUpMemberList(groupCode: string): Promise; + getGroupShutUpMemberList (groupCode: string): Promise; - setMemberShutUp(groupCode: string, memberTimes: { uid: string, timeStamp: number }[]): Promise; + setMemberShutUp (groupCode: string, memberTimes: { uid: string, timeStamp: number; }[]): Promise; - getGroupRecommendContactArkJson(groupCode: string): Promise; + getGroupRecommendContactArkJson (groupCode: string): Promise; - getJoinGroupLink(param: { + getJoinGroupLink (param: { groupCode: string, srcId: number, // 73 needShortUrl: boolean, // true - additionalParam: string// '' - }): Promise; + additionalParam: string;// '' + }): Promise; - 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; - removeGroupEssence(param: { - groupCode: string + removeGroupEssence (param: { + groupCode: string; msgRandom: number, - msgSeq: number + msgSeq: number; }): Promise; - 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[], arg3: boolean): unknown; + + getMemberInfoForMqqV2 (arg1: string, arg2: Array[], 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[], 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; + + getAllMemberListV2 (groupCode: string, arg: unknown): unknown; + + createGroupV2 (arg1: unknown, arg2: unknown): unknown; + + modifyGroupExtInfoV2 (groupExtInfo: GroupExtInfo, groupExtFilter: GroupExtFilter): Promise; + + modifyGroupDetailInfoV2 (param: GroupDetailInfoV2Param, arg: number): Promise; + + 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): Promise; + + cleanCapsuleCache (arg: unknown): unknown; + + downloadGroupBulletinRichMedia (groupCode: string): unknown; + + kickMemberV2 (param: KickMemberV2Req): Promise; + + destroyGroupV2 (arg: unknown): unknown; + + quitGroupV2 (param: { groupCode: string; needDeleteLocalMsg: boolean; }): Promise; + + inviteToGroupV2 (arg: unknown): unknown; + + getGroupMsgMask (): unknown; + + batchQueryCachedGroupDetailInfo (arg: unknown): unknown; + + getGroupMemberLevelInfo (groupCode: string): Promise; + + getIllegalMemberList (arg: unknown): unknown; + + getGroupRecommendContactArkJsonToWechat (arg: unknown): unknown; } diff --git a/packages/napcat-core/services/NodeIKernelGroupTabService.ts b/packages/napcat-core/services/NodeIKernelGroupTabService.ts new file mode 100644 index 00000000..9a13f709 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelGroupTabService.ts @@ -0,0 +1,9 @@ +export interface NodeIKernelGroupTabService { + addListener (listener: unknown): number; + + removeListener (listenerId: number): void; + + getGroupTab (arg1: unknown, arg2: unknown): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelHandOffService.ts b/packages/napcat-core/services/NodeIKernelHandOffService.ts new file mode 100644 index 00000000..f32d4bcb --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelHandOffService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelLiteBusinessService.ts b/packages/napcat-core/services/NodeIKernelLiteBusinessService.ts new file mode 100644 index 00000000..94792ed9 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelLiteBusinessService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelLockService.ts b/packages/napcat-core/services/NodeIKernelLockService.ts new file mode 100644 index 00000000..c034a205 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelLockService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelLockService { + addKernelLockListener (listener: unknown): number; + + removeKernelLockListener (listenerId: number): void; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelLoginService.ts b/packages/napcat-core/services/NodeIKernelLoginService.ts index 9b629ea5..4a3118aa 100644 --- a/packages/napcat-core/services/NodeIKernelLoginService.ts +++ b/packages/napcat-core/services/NodeIKernelLoginService.ts @@ -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; 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; - getLoginList (): Promise<{ - result: number, // 0是ok + result: number, LocalLoginInfoList: LoginListItem[]; }>; @@ -89,4 +89,32 @@ export interface NodeIKernelLoginService { passwordLogin (param: PasswordLoginArgType): Promise; 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; } diff --git a/packages/napcat-core/services/NodeIKernelMSFService.ts b/packages/napcat-core/services/NodeIKernelMSFService.ts index 185a57f5..f1b1275a 100644 --- a/packages/napcat-core/services/NodeIKernelMSFService.ts +++ b/packages/napcat-core/services/NodeIKernelMSFService.ts @@ -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; }): Promise; + onMsfPushForTesting (arg1: unknown, arg2: unknown): unknown; } diff --git a/packages/napcat-core/services/NodeIKernelMiniAppService.ts b/packages/napcat-core/services/NodeIKernelMiniAppService.ts new file mode 100644 index 00000000..a6e5cc25 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelMiniAppService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelMiniAppService { + addKernelMiniAppListener (listener: unknown): number; + + removeKernelMiniAppListener (listenerId: number): void; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelMsgBackupService.ts b/packages/napcat-core/services/NodeIKernelMsgBackupService.ts index 064377aa..b32db2f6 100644 --- a/packages/napcat-core/services/NodeIKernelMsgBackupService.ts +++ b/packages/napcat-core/services/NodeIKernelMsgBackupService.ts @@ -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 } diff --git a/packages/napcat-core/services/NodeIKernelMsgService.ts b/packages/napcat-core/services/NodeIKernelMsgService.ts index 3a33b799..899a336c 100644 --- a/packages/napcat-core/services/NodeIKernelMsgService.ts +++ b/packages/napcat-core/services/NodeIKernelMsgService.ts @@ -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, srcContact: Peer; }): Promise; @@ -10,21 +10,21 @@ export interface NodeIKernelMsgService { addKernelMsgListener (nodeIKernelMsgListener: NodeIKernelMsgListener): number; - sendMsg (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map): Promise; + sendMsg (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map): Promise; recallMsg (peer: Peer, msgIds: string[]): Promise; - 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, 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; switchForeGround (): unknown; - switchBackGround (arg: unknown): unknown; + switchBackGround (info: BackGroundInfo): Promise; setTokenForMqq (token: string): unknown; - switchForeGroundForMqq (...args: unknown[]): unknown; + switchForeGroundForMqq (data: string | Uint8Array): Promise; - switchBackGroundForMqq (...args: unknown[]): unknown; + switchBackGroundForMqq (data: string | Uint8Array): Promise; - 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): unknown; cancelSendMsg (peer: Peer, msgId: string): Promise; 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; - recallMsg (...args: unknown[]): unknown; + reeditRecallMsg (peer: Peer, msgId: string): unknown; - reeditRecallMsg (...args: unknown[]): unknown; + forwardMsg (msgIds: string[], peer: Peer, dstPeers: Peer[], commentElements: unknown): Promise; - forwardMsg (...args: unknown[]): Promise; + forwardMsgWithComment (msgIds: string[], srcContact: Peer, dstContacts: Peer[], commentElements: Array, arg5: unknown): unknown; - forwardMsgWithComment (...args: unknown[]): unknown; + forwardSubMsgWithComment (msgIds: string[], subMsgIds: string[], srcContact: Peer, dstContacts: Peer[], commentElements: Array, arg6: unknown): unknown; - forwardSubMsgWithComment (...args: unknown[]): unknown; + forwardRichMsgInVist (richMsgInfos: Array, 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, srcContact: Peer, dstContact: Peer, commentElements: Array, 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 | number, front: boolean): Promise; + addLocalRecordMsgWithExtInfos (peer: Peer, msgId: string, extInfos: unknown): unknown; + deleteMsg (Peer: Peer, msgIds: Array): Promise; - 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; - getAllOnlineFileMsgs (...args: unknown[]): unknown; + getAllOnlineFileMsgs (): unknown; getLatestDbMsgs (peer: Peer, cnt: number): Promise; // @deprecated - getMsgsWithMsgTimeAndClientSeqForC2C (...args: unknown[]): Promise; + getMsgsWithMsgTimeAndClientSeqForC2C (peer: Peer, arg2: string, arg3: string, arg4: number, arg5: boolean, arg6: boolean, arg7: boolean): Promise; getMsgsWithStatus (params: { peer: Peer; @@ -186,6 +186,7 @@ export interface NodeIKernelMsgService { getMsgsBySeqRange (peer: Peer, startSeq: string, endSeq: string): Promise; + // @deprecated getMsgsBySeqAndCount (peer: Peer, seq: string, count: number, desc: boolean, isReverseOrder: boolean): Promise; - getMsgsByTypeFilter (peer: Peer, msgId: string, cnt: unknown, queryOrder: boolean, typeFilter: { + getMsgsByTypeFilter (peer: Peer, msgId: string, cnt: Array, queryOrder: boolean, typeFilter: { type: number, subtype: Array; }): Promise; - 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; }>): Promise; - getMsgWithAbstractByFilterParam (...args: unknown[]): Promise; + getMsgWithAbstractByFilterParam (arg1: Peer, arg2: string, arg3: string, arg4: number, arg5: MsgTypeFilter): Promise; - queryMsgsWithFilter (...args: unknown[]): Promise; + queryMsgsWithFilter (msgId: string, msgTime: string, param: QueryMsgsParams): Promise; // queryMsgsWithFilterVer2(MsgId: string, MsgTime: string, param: QueryMsgsParams): Promise; @@ -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; - queryPicOrVideoMsgsDesktop (...args: unknown[]): unknown; + queryPicOrVideoMsgsDesktop (msgId: string, msgTime: string, msgSeq: string, param: QueryMsgsParams): unknown; queryEmoticonMsgs (msgId: string, msgTime: string, msgSeq: string, Params: QueryMsgsParams): Promise; @@ -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; setAllC2CAndGroupMsgRead (): Promise; - 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; }>; - 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[], arg3: number): unknown; - getMarketEmoticonPathBySync (...args: unknown[]): unknown; + getMarketEmoticonPathBySync (arg1: number, arg2: Array[], 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; - downloadEmojiPic (...args: unknown[]): unknown; + downloadEmojiPic (arg1: number, arg2: Array[], arg3: number, arg4: Map): 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; - 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; - cancelGetRichMediaElement (...args: unknown[]): unknown; + cancelGetRichMediaElement (arg: unknown): unknown; refuseGetRichMediaElement (args: { msgId: string, @@ -451,7 +452,7 @@ export interface NodeIKernelMsgService { downSourceType: number, // 1 }): Promise; - switchToOfflineGetRichMediaElement (...args: unknown[]): unknown; + switchToOfflineGetRichMediaElement (arg: unknown): unknown; downloadRichMedia (args: { fileModelId: string, @@ -473,21 +474,21 @@ export interface NodeIKernelMsgService { guildId: string; }): Promise; - 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; - setCurOnScreenMsg (...args: unknown[]): unknown; + setCurOnScreenMsg (arg: unknown): unknown; setCurOnScreenMsgForMsgEvent (peer: Peer, msgRegList: Map): 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; - 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; - setDraft (...args: unknown[]): unknown; + setDraft (arg1: Peer, arg2: Array[]): 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; - 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; - unregisterSysMsgNotification (...args: unknown[]): unknown; + unregisterSysMsgNotification (arg1: number, arg2: string, arg3: Array[]): 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; - 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;// 频道的东西 - 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; fetchGetHitEmotionsByWord (args: unknown): Promise;// 表情推荐? - 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; - } diff --git a/packages/napcat-core/services/NodeIKernelNearbyProService.ts b/packages/napcat-core/services/NodeIKernelNearbyProService.ts new file mode 100644 index 00000000..efc8e090 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelNearbyProService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelNodeMiscService.ts b/packages/napcat-core/services/NodeIKernelNodeMiscService.ts index c278e605..5b2cdd78 100644 --- a/packages/napcat-core/services/NodeIKernelNodeMiscService.ts +++ b/packages/napcat-core/services/NodeIKernelNodeMiscService.ts @@ -14,4 +14,118 @@ export interface NodeIKernelNodeMiscService { startNewMiniApp (appfile: string, params: string): unknown; getQimei36WithNewSdk (): Promise; + + 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; } diff --git a/packages/napcat-core/services/NodeIKernelOnlineStatusService.ts b/packages/napcat-core/services/NodeIKernelOnlineStatusService.ts index 9a6b04f2..a7a2e288 100644 --- a/packages/napcat-core/services/NodeIKernelOnlineStatusService.ts +++ b/packages/napcat-core/services/NodeIKernelOnlineStatusService.ts @@ -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; - setLikeStatus(arg: unknown): unknown; + setLikeStatus (arg: unknown): Promise; - 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; - isNull(): boolean; + isNull (): boolean; } diff --git a/packages/napcat-core/services/NodeIKernelPersonalAlbumService.ts b/packages/napcat-core/services/NodeIKernelPersonalAlbumService.ts new file mode 100644 index 00000000..24ead3f9 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelPersonalAlbumService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelProfileLikeService.ts b/packages/napcat-core/services/NodeIKernelProfileLikeService.ts index 0dcac752..a6d02561 100644 --- a/packages/napcat-core/services/NodeIKernelProfileLikeService.ts +++ b/packages/napcat-core/services/NodeIKernelProfileLikeService.ts @@ -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, // 哪些人点我 + userInfos: Array, 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, // 点过哪些人 - } + userInfos: Array; + }; }>, friendMaxVotes: number, - start: number - } + start: number; + }; }>; - getProfileLikeScidResourceInfo(...args: unknown[]): void; + getProfileLikeScidResourceInfo (arg: unknown): void; - isNull(): boolean; + isNull (): boolean; } diff --git a/packages/napcat-core/services/NodeIKernelProfileService.ts b/packages/napcat-core/services/NodeIKernelProfileService.ts index b3edfd84..5ed30797 100644 --- a/packages/napcat-core/services/NodeIKernelProfileService.ts +++ b/packages/napcat-core/services/NodeIKernelProfileService.ts @@ -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>; + getOtherFlag (callfrom: string, uids: string[]): Promise>; - getVasInfo(callfrom: string, uids: string[]): Promise>; + getVasInfo (callfrom: string, uids: string[]): Promise>; - getRelationFlag(callfrom: string, uids: string[]): Promise>; + getRelationFlag (callfrom: string, uids: string[]): Promise>; - getUidByUin(callfrom: string, uin: Array): Map; + getUidByUin (callfrom: string, uin: Array): Map; - getUinByUid(callfrom: string, uid: Array): Map; + getUinByUid (callfrom: string, uid: Array): Map; - getCoreAndBaseInfo(callfrom: string, uids: string[]): Promise>; + getCoreAndBaseInfo (callfrom: string, uids: string[]): Promise>; - fetchUserDetailInfo(trace: string, uids: string[], source: UserDetailSource, bizType: ProfileBizType[]): Promise detail - detail: Map, - } - >; + fetchUserDetailInfo (trace: string, uids: string[], source: UserDetailSource, bizType: ProfileBizType[]): Promise detail + detail: Map, + } + >; - addKernelProfileListener(listener: NodeIKernelProfileListener): number; + addKernelProfileListener (listener: NodeIKernelProfileListener): number; - removeKernelProfileListener(listenerId: number): void; + removeKernelProfileListener (listenerId: number): void; - prepareRegionConfig(...args: unknown[]): unknown; + prepareRegionConfig (): unknown; - getLocalStrangerRemark(): Promise; + getLocalStrangerRemark (): Promise; - enumCountryOptions(): Array; + enumCountryOptions (): Array; - enumProvinceOptions(country: string): Array; + enumProvinceOptions (country: string): Array; - 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; + modifySelfProfile (param: unknown): Promise; - modifyDesktopMiniProfile(param: ModifyProfileParams): Promise; + modifyDesktopMiniProfile (param: ModifyProfileParams): Promise; - setNickName(nickName: string): Promise; + setNickName (nickName: string): Promise; - setLongNick(longNick: string): Promise; + setLongNick (longNick: string): Promise; - setBirthday(...args: unknown[]): Promise; + setBirthday (year: number, month: number, day: number): Promise; - setGander(...args: unknown[]): Promise; + setGander (gender: unknown): Promise; - setHeader(arg: string): Promise; + setHeader (arg: string): Promise; - setRecommendImgFlag(...args: unknown[]): Promise; + setRecommendImgFlag (flag: unknown): Promise; - getUserSimpleInfo(force: boolean, uids: string[]): Promise; + getUserSimpleInfo (force: boolean, uids: string[]): Promise; - getUserDetailInfo(uid: string): Promise; + getUserDetailInfo (uid: string): Promise; - getUserDetailInfoWithBizInfo(uid: string, Biz: BizKey[]): Promise; + getUserDetailInfoWithBizInfo (uid: string, Biz: BizKey[]): Promise; - getUserDetailInfoByUin(uin: string): Promise; + getUserDetailInfoByUin (uin: string): Promise; - getZplanAvatarInfos(args: string[]): Promise; + getZplanAvatarInfos (args: string[]): Promise; - getStatus(uid: string): Promise; + getStatus (uid: string): Promise; - startStatusPolling(isForceReset: boolean): Promise; + startStatusPolling (isForceReset: boolean): Promise; - getSelfStatus(): Promise; + getSelfStatus (): Promise; - setdisableEmojiShortCuts(...args: unknown[]): unknown; + setdisableEmojiShortCuts (arg: unknown): unknown; - getProfileQzonePicInfo(uid: string, type: number, force: boolean): Promise; + getProfileQzonePicInfo (uid: string, type: number, force: boolean): Promise; // 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; } diff --git a/packages/napcat-core/services/NodeIKernelPublicAccountService.ts b/packages/napcat-core/services/NodeIKernelPublicAccountService.ts new file mode 100644 index 00000000..6dd7325a --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelPublicAccountService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelQQPlayService.ts b/packages/napcat-core/services/NodeIKernelQQPlayService.ts new file mode 100644 index 00000000..958c67f7 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelQQPlayService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelQiDianService.ts b/packages/napcat-core/services/NodeIKernelQiDianService.ts new file mode 100644 index 00000000..37ca318c --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelQiDianService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelRDeliveryService.ts b/packages/napcat-core/services/NodeIKernelRDeliveryService.ts new file mode 100644 index 00000000..581b6274 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelRDeliveryService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelRecentContactService.ts b/packages/napcat-core/services/NodeIKernelRecentContactService.ts index 5aebeb96..626376b1 100644 --- a/packages/napcat-core/services/NodeIKernelRecentContactService.ts +++ b/packages/napcat-core/services/NodeIKernelRecentContactService.ts @@ -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 - } - }>; // 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; + getContacts (peers: Peer[]): Promise; - 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; + getRecentContactList (): Promise; - 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; } diff --git a/packages/napcat-core/services/NodeIKernelRemotingService.ts b/packages/napcat-core/services/NodeIKernelRemotingService.ts new file mode 100644 index 00000000..a5331e1d --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelRemotingService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelRichMediaService.ts b/packages/napcat-core/services/NodeIKernelRichMediaService.ts index 647ee421..432f5bb4 100644 --- a/packages/napcat-core/services/NodeIKernelRichMediaService.ts +++ b/packages/napcat-core/services/NodeIKernelRichMediaService.ts @@ -62,7 +62,7 @@ export interface NodeIKernelRichMediaService { // KHAND, // KAUTO // } - getVideoPlayUrl(peer: Peer, msgId: string, elemId: string, videoCodecFormat: number, VideoRequestWay: number): Promise; + getVideoPlayUrl (peer: Peer, msgId: string, elemId: string, videoCodecFormat: number, VideoRequestWay: number): Promise; // 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, - 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; - isFileExpired(arg: number): unknown; + isFileExpired (arg: number): unknown; - deleteGroupFolder(GroupCode: string, FolderId: string): Promise; // 参数与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; + downloadFileForModelId (peer: Peer, ModelId: string[], unknown: string): Promise; // 第三个参数 Array // 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; - downloadFileByUrlList(fileDownloadTyp: UrlFileDownloadType, urlList: Array): unknown; + downloadFileByUrlList (fileDownloadTyp: UrlFileDownloadType, urlList: Array): unknown; - downloadFileForFileInfo(fileInfo: CommonFileInfo[], savePath: string): unknown; + downloadFileForFileInfo (fileInfo: CommonFileInfo[], savePath: string): unknown; - createGroupFolder(GroupCode: string, FolderName: string): Promise } + createGroupFolder (GroupCode: string, FolderName: string): Promise; }; }>; - 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[], 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; - 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, fileList: Array, currentParentDirectory: string, targetParentDirectory: string): Promise, fileList: Array, currentParentDirectory: string, targetParentDirectory: string): Promise, - failFileIdList: Array - } + failFileIdList: Array; + }; }>; - transGroupFile(groupCode: string, fileId: string): Promise; - searchGroupFile( + searchGroupFile ( keywords: Array, param: { groupIds: Array, @@ -230,55 +230,57 @@ export interface NodeIKernelRichMediaService { context: string, count: number, sortType: number, - groupNames: Array + groupNames: Array; }): Promise; - 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, Files: Array): Promise, Files: Array): Promise - failFileIdList: Array - } + result: unknown; + successFileIdList: Array; + failFileIdList: Array; + }; }>; - translateEnWordToZn(words: string[]): Promise; + translateEnWordToZn (words: string[]): Promise; - getScreenOCR(path: string): Promise; + getScreenOCR (path: string): Promise; - batchGetGroupFileCount(Gids: Array): Promise): Promise, - groupFileCounts: Array + groupFileCounts: Array; }>; - 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; - 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; - 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; } diff --git a/packages/napcat-core/services/NodeIKernelRobotService.ts b/packages/napcat-core/services/NodeIKernelRobotService.ts index 1822e6d5..71a617b8 100644 --- a/packages/napcat-core/services/NodeIKernelRobotService.ts +++ b/packages/napcat-core/services/NodeIKernelRobotService.ts @@ -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; - getAllRobotFriendsFromCache(): Promise; + 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; }; }>; - getRobotUinRange(data: unknown): Promise<{ response: { robotUinRanges: Array } }>; - - getRobotFunctions(peer: Peer, params: { + getRobotFunctions (peer: Peer, params: { uins: Array, 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, next_page: number } }>; + bkn: ''; + }): Promise, 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; } diff --git a/packages/napcat-core/services/NodeIKernelSearchService.ts b/packages/napcat-core/services/NodeIKernelSearchService.ts index 8806fdcf..dffede09 100644 --- a/packages/napcat-core/services/NodeIKernelSearchService.ts +++ b/packages/napcat-core/services/NodeIKernelSearchService.ts @@ -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; + searchStranger (keyword: string, searchType: unknown, searchParams: unknown): Promise; - searchGroup(param: { + searchGroup (param: { keyWords: string, groupNum: number, exactSearch: boolean, - penetrate: string - }): Promise;// needs 1 arguments + penetrate: string; + }): Promise; - 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[], 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[], 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[], 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; + searchMsgWithKeywords (keyWords: string[], param: Peer & { searchFields: number, pageLimit: number; }): Promise; - 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;// needs 2 arguments + searchFileWithKeywords (keywords: string[], source: number): Promise; - 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; } diff --git a/packages/napcat-core/services/NodeIKernelSettingService.ts b/packages/napcat-core/services/NodeIKernelSettingService.ts new file mode 100644 index 00000000..f13dfdbc --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelSettingService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelSkinService.ts b/packages/napcat-core/services/NodeIKernelSkinService.ts new file mode 100644 index 00000000..e854594d --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelSkinService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelStorageCleanService.ts b/packages/napcat-core/services/NodeIKernelStorageCleanService.ts index d0309658..ff391120 100644 --- a/packages/napcat-core/services/NodeIKernelStorageCleanService.ts +++ b/packages/napcat-core/services/NodeIKernelStorageCleanService.ts @@ -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; - getFileCacheInfo (arg1: unknown, arg2: unknown, arg3: unknown, arg44: unknown, args5: unknown): unknown; + getFileCacheInfo (fileType: number, restart: boolean, pageSize: number, lastRecord: number, param: unknown): Promise; - clearChatCacheInfo (arg1: unknown, arg2: unknown): unknown; + clearChatCacheInfo (chatInfoList: unknown[], clearKeys: number[]): Promise; clearCacheDataByKeys (keys: Array): Promise; - setSilentScan (is_silent: boolean): unknown; + setSilentScan (isSilent: boolean): unknown; closeCleanWindow (): unknown; diff --git a/packages/napcat-core/services/NodeIKernelThirdPartySigService.ts b/packages/napcat-core/services/NodeIKernelThirdPartySigService.ts new file mode 100644 index 00000000..2bbb295e --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelThirdPartySigService.ts @@ -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; + + getThirdPartySigByUin (arg1: string, arg2: number, arg3: number, arg4: number, arg5: string, arg6: string): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelTianShuService.ts b/packages/napcat-core/services/NodeIKernelTianShuService.ts index 70259356..40cf7b6d 100644 --- a/packages/napcat-core/services/NodeIKernelTianShuService.ts +++ b/packages/napcat-core/services/NodeIKernelTianShuService.ts @@ -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 } diff --git a/packages/napcat-core/services/NodeIKernelTicketService.ts b/packages/napcat-core/services/NodeIKernelTicketService.ts index 135c9d8e..ac4ab7f6 100644 --- a/packages/napcat-core/services/NodeIKernelTicketService.ts +++ b/packages/napcat-core/services/NodeIKernelTicketService.ts @@ -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; + forceFetchClientKey (arg: string): Promise; - isNull(): boolean; + isNull (): boolean; } diff --git a/packages/napcat-core/services/NodeIKernelTipOffService.ts b/packages/napcat-core/services/NodeIKernelTipOffService.ts index e7a4fc89..db45e0c1 100644 --- a/packages/napcat-core/services/NodeIKernelTipOffService.ts +++ b/packages/napcat-core/services/NodeIKernelTipOffService.ts @@ -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;// 2 + tipOffSendJsData (arg1: unknown, arg2: unknown): Promise; - getPskey(domainList: string[], nocache: boolean): Promise + getPskey (domainList: string[], nocache: boolean): Promise; }>; - tipOffSendJsData(args: unknown[]): Promise;// 2 + tipOffMsgs (arg: unknown): Promise; - tipOffMsgs(args: unknown[]): Promise;// 1 + encodeUinAesInfo (arg1: unknown, arg2: unknown): Promise; - encodeUinAesInfo(args: unknown[]): Promise;// 2 - - isNull(): boolean; + isNull (): boolean; } diff --git a/packages/napcat-core/services/NodeIKernelUnifySearchService.ts b/packages/napcat-core/services/NodeIKernelUnifySearchService.ts new file mode 100644 index 00000000..646014a4 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelUnifySearchService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelUnitedConfigService.ts b/packages/napcat-core/services/NodeIKernelUnitedConfigService.ts index d94d2ca0..90dafd93 100644 --- a/packages/napcat-core/services/NodeIKernelUnitedConfigService.ts +++ b/packages/napcat-core/services/NodeIKernelUnitedConfigService.ts @@ -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 + loadUnitedConfig (id: string): Promise; } diff --git a/packages/napcat-core/services/NodeIKernelVasSystemUpdateService.ts b/packages/napcat-core/services/NodeIKernelVasSystemUpdateService.ts new file mode 100644 index 00000000..62a5b680 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelVasSystemUpdateService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelVasSystemUpdateService { + getResPath (arg: unknown): unknown; + + isExist (arg: unknown): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelWiFiPhotoClientService.ts b/packages/napcat-core/services/NodeIKernelWiFiPhotoClientService.ts new file mode 100644 index 00000000..3fd3521e --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelWiFiPhotoClientService.ts @@ -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; + + resumeUncompleteDownloadRecords (arg: unknown): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIKernelWiFiPhotoHostService.ts b/packages/napcat-core/services/NodeIKernelWiFiPhotoHostService.ts new file mode 100644 index 00000000..30f28cd4 --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelWiFiPhotoHostService.ts @@ -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; +} diff --git a/packages/napcat-core/services/NodeIKernelYellowFaceForManagerService.ts b/packages/napcat-core/services/NodeIKernelYellowFaceForManagerService.ts new file mode 100644 index 00000000..5820cd1a --- /dev/null +++ b/packages/napcat-core/services/NodeIKernelYellowFaceForManagerService.ts @@ -0,0 +1,7 @@ +export interface NodeIKernelYellowFaceForManagerService { + download (arg1: string, arg2: string, arg3: string, arg4: boolean): unknown; + + setHistory (arg: unknown): unknown; + + isNull (): boolean; +} diff --git a/packages/napcat-core/services/NodeIO3MiscService.ts b/packages/napcat-core/services/NodeIO3MiscService.ts index 7c1018a9..4f0f188b 100644 --- a/packages/napcat-core/services/NodeIO3MiscService.ts +++ b/packages/napcat-core/services/NodeIO3MiscService.ts @@ -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): void; + passthroughO3Data (arg1: unknown, arg2: unknown): unknown; + + reportAmgomWeather (arg1: unknown, arg2: unknown, arg3: unknown): unknown; + + setAmgomDataPiece (appid: string, dataPiece: Uint8Array): void; } diff --git a/packages/napcat-core/services/NodeIYellowFaceService.ts b/packages/napcat-core/services/NodeIYellowFaceService.ts index 79a93e4a..5681d729 100644 --- a/packages/napcat-core/services/NodeIYellowFaceService.ts +++ b/packages/napcat-core/services/NodeIYellowFaceService.ts @@ -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; } diff --git a/packages/napcat-core/services/index.ts b/packages/napcat-core/services/index.ts index 5e607438..b0b7beb1 100644 --- a/packages/napcat-core/services/index.ts +++ b/packages/napcat-core/services/index.ts @@ -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; }; diff --git a/packages/napcat-core/types/msg.ts b/packages/napcat-core/types/msg.ts index aa5592a4..8b1278e6 100644 --- a/packages/napcat-core/types/msg.ts +++ b/packages/napcat-core/types/msg.ts @@ -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; }>; + filterSendersUid: string[]; +} + +/** + * 空间流参数 + */ +export interface SgrpStreamParams { + sgrpStreamPginSourceName: string; + sgrpVisitFrom: string; + sgrpSessionId: string; +} + /** * 临时聊天信息API接口 */ diff --git a/packages/napcat-core/wrapper.ts b/packages/napcat-core/wrapper.ts index 52f69844..06247a74 100644 --- a/packages/napcat-core/wrapper.ts +++ b/packages/napcat-core/wrapper.ts @@ -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; // 直接的猜测 + getFileSize (path: string): Promise; - 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 { diff --git a/packages/napcat-dpapi/LICENSE b/packages/napcat-dpapi/LICENSE new file mode 100644 index 00000000..cc72d92f --- /dev/null +++ b/packages/napcat-dpapi/LICENSE @@ -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. diff --git a/packages/napcat-dpapi/README.md b/packages/napcat-dpapi/README.md new file mode 100644 index 00000000..d7f8c6af --- /dev/null +++ b/packages/napcat-dpapi/README.md @@ -0,0 +1,4 @@ +# @primno/dpapi + +## 协议与说明 +全部遵守原仓库要求 \ No newline at end of file diff --git a/packages/napcat-dpapi/index.ts b/packages/napcat-dpapi/index.ts new file mode 100644 index 00000000..40dc29f4 --- /dev/null +++ b/packages/napcat-dpapi/index.ts @@ -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; diff --git a/packages/napcat-dpapi/package.json b/packages/napcat-dpapi/package.json new file mode 100644 index 00000000..e41cebd9 --- /dev/null +++ b/packages/napcat-dpapi/package.json @@ -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" + } +} \ No newline at end of file diff --git a/packages/napcat-dpapi/tsconfig.json b/packages/napcat-dpapi/tsconfig.json new file mode 100644 index 00000000..b0b9beb2 --- /dev/null +++ b/packages/napcat-dpapi/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "." + }, + "include": [ + "./**/*.ts" + ] +} \ No newline at end of file diff --git a/packages/napcat-framework/napcat.ts b/packages/napcat-framework/napcat.ts index 882c64bc..ecd0ae6b 100644 --- a/packages/napcat-framework/napcat.ts +++ b/packages/napcat-framework/napcat.ts @@ -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, diff --git a/packages/napcat-framework/package.json b/packages/napcat-framework/package.json index 382efebd..38c51c8c 100644 --- a/packages/napcat-framework/package.json +++ b/packages/napcat-framework/package.json @@ -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" diff --git a/packages/napcat-native/dpapi/win32-arm64/@primno+dpapi.node b/packages/napcat-native/dpapi/win32-arm64/@primno+dpapi.node new file mode 100644 index 00000000..8edda4f3 Binary files /dev/null and b/packages/napcat-native/dpapi/win32-arm64/@primno+dpapi.node differ diff --git a/packages/napcat-native/dpapi/win32-x64/@primno+dpapi.node b/packages/napcat-native/dpapi/win32-x64/@primno+dpapi.node new file mode 100644 index 00000000..b9c3c50c Binary files /dev/null and b/packages/napcat-native/dpapi/win32-x64/@primno+dpapi.node differ diff --git a/packages/napcat-native/napi2native/ffmpeg.dll b/packages/napcat-native/napi2native/ffmpeg.dll new file mode 100644 index 00000000..18409447 Binary files /dev/null and b/packages/napcat-native/napi2native/ffmpeg.dll differ diff --git a/packages/napcat-native/napi2native/napi2native.linux.arm64.node b/packages/napcat-native/napi2native/napi2native.linux.arm64.node index d3a9fc55..887e336d 100644 Binary files a/packages/napcat-native/napi2native/napi2native.linux.arm64.node and b/packages/napcat-native/napi2native/napi2native.linux.arm64.node differ diff --git a/packages/napcat-native/napi2native/napi2native.linux.x64.node b/packages/napcat-native/napi2native/napi2native.linux.x64.node index 0e383193..ddc20c9f 100644 Binary files a/packages/napcat-native/napi2native/napi2native.linux.x64.node and b/packages/napcat-native/napi2native/napi2native.linux.x64.node differ diff --git a/packages/napcat-native/napi2native/napi2native.win32.x64.node b/packages/napcat-native/napi2native/napi2native.win32.x64.node index 47aa330c..d276a610 100644 Binary files a/packages/napcat-native/napi2native/napi2native.win32.x64.node and b/packages/napcat-native/napi2native/napi2native.win32.x64.node differ diff --git a/packages/napcat-onebot/network/plugin-manger.ts b/packages/napcat-onebot/network/plugin-manger.ts index 467d0ec0..09efc0bd 100644 --- a/packages/napcat-onebot/network/plugin-manger.ts +++ b/packages/napcat-onebot/network/plugin-manger.ts @@ -196,9 +196,14 @@ export class OB11PluginMangerAdapter extends IOB11NetworkAdapter 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 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 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 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); } /** diff --git a/packages/napcat-onebot/network/plugin/manager.ts b/packages/napcat-onebot/network/plugin/manager.ts index 57918e3d..871a7c10 100644 --- a/packages/napcat-onebot/network/plugin/manager.ts +++ b/packages/napcat-onebot/network/plugin/manager.ts @@ -173,9 +173,14 @@ export class OB11PluginManager extends IOB11NetworkAdapter 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 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 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 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); } /** diff --git a/packages/napcat-shell/base.ts b/packages/napcat-shell/base.ts index 81730793..1937059c 100644 --- a/packages/napcat-shell/base.ts +++ b/packages/napcat-shell/base.ts @@ -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')) { 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, diff --git a/packages/napcat-shell/napcat.ts b/packages/napcat-shell/napcat.ts index cc06b679..488d25a2 100644 --- a/packages/napcat-shell/napcat.ts +++ b/packages/napcat-shell/napcat.ts @@ -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 { + 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); }); diff --git a/packages/napcat-shell/package.json b/packages/napcat-shell/package.json index 47ebd68a..5a30079a 100644 --- a/packages/napcat-shell/package.json +++ b/packages/napcat-shell/package.json @@ -25,6 +25,7 @@ "napcat-qrcode": "workspace:*" }, "devDependencies": { + "json5": "^2.2.3", "@types/node": "^22.0.1", "napcat-vite": "workspace:*" }, diff --git a/packages/napcat-shell/vite.config.ts b/packages/napcat-shell/vite.config.ts index 6b7daaf7..d0e801f8 100644 --- a/packages/napcat-shell/vite.config.ts +++ b/packages/napcat-shell/vite.config.ts @@ -45,6 +45,7 @@ const ShellBaseConfig = (source_map: boolean = false) => '@/napcat-common': resolve(__dirname, '../napcat-common'), '@/napcat-onebot': resolve(__dirname, '../napcat-onebot'), '@/napcat-pty': resolve(__dirname, '../napcat-pty'), + '@/napcat-dpapi': resolve(__dirname, '../napcat-dpapi'), '@/napcat-webui-backend': resolve(__dirname, '../napcat-webui-backend'), '@/napcat-image-size': resolve(__dirname, '../napcat-image-size'), '@/napcat-protocol': resolve(__dirname, '../napcat-protocol'), diff --git a/packages/napcat-webui-backend/package.json b/packages/napcat-webui-backend/package.json index b3b140b7..ce36f97b 100644 --- a/packages/napcat-webui-backend/package.json +++ b/packages/napcat-webui-backend/package.json @@ -26,6 +26,7 @@ "json5": "^2.2.3", "multer": "^2.0.1", "napcat-common": "workspace:*", + "napcat-dpapi": "workspace:*", "napcat-pty": "workspace:*", "ws": "^8.18.3" }, diff --git a/packages/napcat-webui-backend/src/api/NapCatConfig.ts b/packages/napcat-webui-backend/src/api/NapCatConfig.ts new file mode 100644 index 00000000..f0adc41a --- /dev/null +++ b/packages/napcat-webui-backend/src/api/NapCatConfig.ts @@ -0,0 +1,90 @@ +import { RequestHandler } from 'express'; +import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { webUiPathWrapper } from '@/napcat-webui-backend/index'; +import { sendError, sendSuccess } from '@/napcat-webui-backend/src/utils/response'; +import json5 from 'json5'; + +import Ajv from 'ajv'; +import { NapcatConfigSchema } from '@/napcat-core/helper/config'; + +// 动态获取 NapCat 配置默认值 +function getDefaultNapcatConfig (): Record { + const ajv = new Ajv({ useDefaults: true, coerceTypes: true }); + const validate = ajv.compile(NapcatConfigSchema); + const data = {}; + validate(data); + return data; +} + +/** + * 获取 napcat 配置文件路径 + */ +function getNapcatConfigPath (): string { + return resolve(webUiPathWrapper.configPath, './napcat.json'); +} + +/** + * 读取 napcat 配置 + */ +function readNapcatConfig (): Record { + const configPath = getNapcatConfigPath(); + try { + if (existsSync(configPath)) { + const content = readFileSync(configPath, 'utf-8'); + return { ...getDefaultNapcatConfig(), ...json5.parse(content) }; + } + } catch (_e) { + // 读取失败,使用默认值 + } + return { ...getDefaultNapcatConfig() }; +} + +/** + * 写入 napcat 配置 + */ +function writeNapcatConfig (config: Record): void { + const configPath = resolve(webUiPathWrapper.configPath, './napcat.json'); + mkdirSync(webUiPathWrapper.configPath, { recursive: true }); + writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8'); +} + +// 获取 NapCat 配置 +export const NapCatGetConfigHandler: RequestHandler = (_, res) => { + try { + const config = readNapcatConfig(); + return sendSuccess(res, config); + } catch (e) { + return sendError(res, 'Config Get Error: ' + (e as Error).message); + } +}; + +// 设置 NapCat 配置 +export const NapCatSetConfigHandler: RequestHandler = (req, res) => { + try { + const newConfig = req.body; + if (!newConfig || typeof newConfig !== 'object') { + return sendError(res, 'config is empty or invalid'); + } + + // 读取当前配置并合并 + const currentConfig = readNapcatConfig(); + const mergedConfig = { ...currentConfig, ...newConfig }; + + // 验证 bypass 字段 + if (mergedConfig.bypass && typeof mergedConfig.bypass === 'object') { + const bypass = mergedConfig.bypass as Record; + const validKeys = ['hook', 'window', 'module', 'process', 'container', 'js']; + for (const key of validKeys) { + if (key in bypass && typeof bypass[key] !== 'boolean') { + return sendError(res, `bypass.${key} must be boolean`); + } + } + } + + writeNapcatConfig(mergedConfig); + return sendSuccess(res, null); + } catch (e) { + return sendError(res, 'Config Set Error: ' + (e as Error).message); + } +}; diff --git a/packages/napcat-webui-backend/src/api/QQLogin.ts b/packages/napcat-webui-backend/src/api/QQLogin.ts index 2ce7df04..2d0beeb0 100644 --- a/packages/napcat-webui-backend/src/api/QQLogin.ts +++ b/packages/napcat-webui-backend/src/api/QQLogin.ts @@ -4,6 +4,36 @@ import { WebUiDataRuntime } from '@/napcat-webui-backend/src/helper/Data'; import { WebUiConfig } from '@/napcat-webui-backend/index'; import { isEmpty } from '@/napcat-webui-backend/src/utils/check'; import { sendError, sendSuccess } from '@/napcat-webui-backend/src/utils/response'; +import { Registry20Utils, MachineInfoUtils } from '@/napcat-webui-backend/src/utils/guid'; +import os from 'node:os'; + +// 获取 Registry20 路径的辅助函数 +const getRegistryPath = () => { + // 优先从 WebUiDataRuntime 获取早期设置的 dataPath + let dataPath = WebUiDataRuntime.getQQDataPath(); + if (!dataPath) { + // 回退: 从 OneBotContext 获取 + const oneBotContext = WebUiDataRuntime.getOneBotContext(); + dataPath = oneBotContext?.core?.dataPath; + } + if (!dataPath) { + throw new Error('QQ data path not available yet'); + } + return Registry20Utils.getRegistryPath(dataPath); +}; + +// 获取 machine-info 路径的辅助函数 (Linux) +const getMachineInfoPath = () => { + let dataPath = WebUiDataRuntime.getQQDataPath(); + if (!dataPath) { + const oneBotContext = WebUiDataRuntime.getOneBotContext(); + dataPath = oneBotContext?.core?.dataPath; + } + if (!dataPath) { + throw new Error('QQ data path not available yet'); + } + return MachineInfoUtils.getMachineInfoPath(dataPath); +}; // 获取QQ登录二维码 export const QQGetQRcodeHandler: RequestHandler = async (_, res) => { @@ -147,3 +177,239 @@ export const QQPasswordLoginHandler: RequestHandler = async (req, res) => { } return sendSuccess(res, null); }; + +// 重置设备信息 +export const QQResetDeviceIDHandler: RequestHandler = async (_, res) => { + try { + const registryPath = getRegistryPath(); + // 自动备份 + try { + await Registry20Utils.backup(registryPath); + } catch (e) { + // 忽略备份错误(例如文件不存在) + } + + await Registry20Utils.delete(registryPath); + return sendSuccess(res, { message: 'Device ID reset successfully (Registry20 deleted)' }); + } catch (e) { + return sendError(res, `Failed to reset Device ID: ${(e as Error).message}`); + } +}; + +// 获取设备 GUID +export const QQGetDeviceGUIDHandler: RequestHandler = async (_, res) => { + try { + const registryPath = getRegistryPath(); + const guid = await Registry20Utils.readGuid(registryPath); + return sendSuccess(res, { guid }); + } catch (e) { + // 可能是文件不存在,或者非 Windows 平台,或者解密失败 + return sendError(res, `Failed to get GUID: ${(e as Error).message}`); + } +}; + +// 设置设备 GUID +export const QQSetDeviceGUIDHandler: RequestHandler = async (req, res) => { + const { guid } = req.body; + if (!guid || typeof guid !== 'string' || guid.length !== 32) { + return sendError(res, 'Invalid GUID format, must be 32 hex characters'); + } + try { + const registryPath = getRegistryPath(); + // 自动备份 + try { + await Registry20Utils.backup(registryPath); + } catch { } + + await Registry20Utils.writeGuid(registryPath, guid); + return sendSuccess(res, { message: 'GUID set successfully' }); + } catch (e) { + return sendError(res, `Failed to set GUID: ${(e as Error).message}`); + } +}; + +// 获取备份列表 +export const QQGetGUIDBackupsHandler: RequestHandler = async (_, res) => { + try { + const registryPath = getRegistryPath(); + const backups = Registry20Utils.getBackups(registryPath); + return sendSuccess(res, backups); + } catch (e) { + return sendError(res, `Failed to get backups: ${(e as Error).message}`); + } +}; + +// 恢复备份 +export const QQRestoreGUIDBackupHandler: RequestHandler = async (req, res) => { + const { backupName } = req.body; + if (!backupName) { + return sendError(res, 'Backup name is required'); + } + try { + const registryPath = getRegistryPath(); + await Registry20Utils.restore(registryPath, backupName); + return sendSuccess(res, { message: 'Restored successfully' }); + } catch (e) { + return sendError(res, `Failed to restore: ${(e as Error).message}`); + } +}; + +// 创建备份 +export const QQCreateGUIDBackupHandler: RequestHandler = async (_, res) => { + try { + const registryPath = getRegistryPath(); + const backupPath = await Registry20Utils.backup(registryPath); + return sendSuccess(res, { message: 'Backup created', path: backupPath }); + } catch (e) { + return sendError(res, `Failed to backup: ${(e as Error).message}`); + } +}; + +// 重启NapCat +export const QQRestartNapCatHandler: RequestHandler = async (_, res) => { + try { + const result = await WebUiDataRuntime.requestRestartProcess(); + if (result.result) { + return sendSuccess(res, { message: result.message || 'Restart initiated' }); + } else { + return sendError(res, result.message || 'Restart failed'); + } + } catch (e) { + return sendError(res, `Restart error: ${(e as Error).message}`); + } +}; + +// ============================================================ +// 平台信息 & Linux GUID 管理 +// ============================================================ + +// 获取平台信息 +export const QQGetPlatformInfoHandler: RequestHandler = async (_, res) => { + return sendSuccess(res, { platform: os.platform() }); +}; + +// 获取 Linux MAC 地址 (从 machine-info 文件读取) +export const QQGetLinuxMACHandler: RequestHandler = async (_, res) => { + try { + const machineInfoPath = getMachineInfoPath(); + const mac = MachineInfoUtils.readMac(machineInfoPath); + return sendSuccess(res, { mac }); + } catch (e) { + return sendError(res, `Failed to get MAC: ${(e as Error).message}`); + } +}; + +// 设置 Linux MAC 地址 (写入 machine-info 文件) +export const QQSetLinuxMACHandler: RequestHandler = async (req, res) => { + const { mac } = req.body; + if (!mac || typeof mac !== 'string') { + return sendError(res, 'MAC address is required'); + } + try { + const machineInfoPath = getMachineInfoPath(); + // 自动备份 + try { + MachineInfoUtils.backup(machineInfoPath); + } catch { } + + MachineInfoUtils.writeMac(machineInfoPath, mac); + return sendSuccess(res, { message: 'MAC set successfully' }); + } catch (e) { + return sendError(res, `Failed to set MAC: ${(e as Error).message}`); + } +}; + +// 获取 Linux machine-id +export const QQGetLinuxMachineIdHandler: RequestHandler = async (_, res) => { + try { + const machineId = MachineInfoUtils.readMachineId(); + return sendSuccess(res, { machineId }); + } catch (e) { + return sendError(res, `Failed to read machine-id: ${(e as Error).message}`); + } +}; + +// 计算 Linux GUID (用于前端实时预览) +export const QQComputeLinuxGUIDHandler: RequestHandler = async (req, res) => { + const { mac, machineId } = req.body; + try { + // 如果没传 machineId,从 /etc/machine-id 读取 + let mid = machineId; + if (!mid || typeof mid !== 'string') { + try { + mid = MachineInfoUtils.readMachineId(); + } catch { + mid = ''; + } + } + // 如果没传 mac,从 machine-info 文件读取 + let macStr = mac; + if (!macStr || typeof macStr !== 'string') { + try { + const machineInfoPath = getMachineInfoPath(); + macStr = MachineInfoUtils.readMac(machineInfoPath); + } catch { + macStr = ''; + } + } + const guid = MachineInfoUtils.computeGuid(mid, macStr); + return sendSuccess(res, { guid, machineId: mid, mac: macStr }); + } catch (e) { + return sendError(res, `Failed to compute GUID: ${(e as Error).message}`); + } +}; + +// 获取 Linux machine-info 备份列表 +export const QQGetLinuxMachineInfoBackupsHandler: RequestHandler = async (_, res) => { + try { + const machineInfoPath = getMachineInfoPath(); + const backups = MachineInfoUtils.getBackups(machineInfoPath); + return sendSuccess(res, backups); + } catch (e) { + return sendError(res, `Failed to get backups: ${(e as Error).message}`); + } +}; + +// 创建 Linux machine-info 备份 +export const QQCreateLinuxMachineInfoBackupHandler: RequestHandler = async (_, res) => { + try { + const machineInfoPath = getMachineInfoPath(); + const backupPath = MachineInfoUtils.backup(machineInfoPath); + return sendSuccess(res, { message: 'Backup created', path: backupPath }); + } catch (e) { + return sendError(res, `Failed to backup: ${(e as Error).message}`); + } +}; + +// 恢复 Linux machine-info 备份 +export const QQRestoreLinuxMachineInfoBackupHandler: RequestHandler = async (req, res) => { + const { backupName } = req.body; + if (!backupName) { + return sendError(res, 'Backup name is required'); + } + try { + const machineInfoPath = getMachineInfoPath(); + MachineInfoUtils.restore(machineInfoPath, backupName); + return sendSuccess(res, { message: 'Restored successfully' }); + } catch (e) { + return sendError(res, `Failed to restore: ${(e as Error).message}`); + } +}; + +// 重置 Linux 设备信息 (删除 machine-info) +export const QQResetLinuxDeviceIDHandler: RequestHandler = async (_, res) => { + try { + const machineInfoPath = getMachineInfoPath(); + // 自动备份 + try { + MachineInfoUtils.backup(machineInfoPath); + } catch { } + + MachineInfoUtils.delete(machineInfoPath); + return sendSuccess(res, { message: 'Device ID reset successfully (machine-info deleted)' }); + } catch (e) { + return sendError(res, `Failed to reset Device ID: ${(e as Error).message}`); + } +}; + + diff --git a/packages/napcat-webui-backend/src/helper/Data.ts b/packages/napcat-webui-backend/src/helper/Data.ts index cc8092a7..f272b632 100644 --- a/packages/napcat-webui-backend/src/helper/Data.ts +++ b/packages/napcat-webui-backend/src/helper/Data.ts @@ -16,6 +16,7 @@ const LoginRuntime: LoginRuntimeType = { }, QQLoginError: '', QQVersion: 'unknown', + QQDataPath: '', OneBotContext: null, onQQLoginStatusChange: async (status: boolean) => { LoginRuntime.QQLoginStatus = status; @@ -167,6 +168,14 @@ export const WebUiDataRuntime = { return LoginRuntime.QQVersion; }, + setQQDataPath (dataPath: string) { + LoginRuntime.QQDataPath = dataPath; + }, + + getQQDataPath (): string { + return LoginRuntime.QQDataPath; + }, + setWebUiConfigQuickFunction (func: LoginRuntimeType['WebUiConfigQuickFunction']): void { LoginRuntime.WebUiConfigQuickFunction = func; }, diff --git a/packages/napcat-webui-backend/src/router/NapCatConfig.ts b/packages/napcat-webui-backend/src/router/NapCatConfig.ts new file mode 100644 index 00000000..15f08f40 --- /dev/null +++ b/packages/napcat-webui-backend/src/router/NapCatConfig.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; + +import { NapCatGetConfigHandler, NapCatSetConfigHandler } from '@/napcat-webui-backend/src/api/NapCatConfig'; + +const router: Router = Router(); + +// router:获取 NapCat 配置 +router.get('/GetConfig', NapCatGetConfigHandler); +// router:设置 NapCat 配置 +router.post('/SetConfig', NapCatSetConfigHandler); + +export { router as NapCatConfigRouter }; diff --git a/packages/napcat-webui-backend/src/router/QQLogin.ts b/packages/napcat-webui-backend/src/router/QQLogin.ts index 81b0fe91..7165de61 100644 --- a/packages/napcat-webui-backend/src/router/QQLogin.ts +++ b/packages/napcat-webui-backend/src/router/QQLogin.ts @@ -11,6 +11,22 @@ import { setAutoLoginAccountHandler, QQRefreshQRcodeHandler, QQPasswordLoginHandler, + QQResetDeviceIDHandler, + QQRestartNapCatHandler, + QQGetDeviceGUIDHandler, + QQSetDeviceGUIDHandler, + QQGetGUIDBackupsHandler, + QQRestoreGUIDBackupHandler, + QQCreateGUIDBackupHandler, + QQGetPlatformInfoHandler, + QQGetLinuxMACHandler, + QQSetLinuxMACHandler, + QQGetLinuxMachineIdHandler, + QQComputeLinuxGUIDHandler, + QQGetLinuxMachineInfoBackupsHandler, + QQCreateLinuxMachineInfoBackupHandler, + QQRestoreLinuxMachineInfoBackupHandler, + QQResetLinuxDeviceIDHandler, } from '@/napcat-webui-backend/src/api/QQLogin'; const router: Router = Router(); @@ -34,5 +50,41 @@ router.post('/SetQuickLoginQQ', setAutoLoginAccountHandler); router.post('/RefreshQRcode', QQRefreshQRcodeHandler); // router:密码登录 router.post('/PasswordLogin', QQPasswordLoginHandler); +// router:重置设备信息 +router.post('/ResetDeviceID', QQResetDeviceIDHandler); +// router:重启NapCat +router.post('/RestartNapCat', QQRestartNapCatHandler); +// router:获取设备GUID +router.post('/GetDeviceGUID', QQGetDeviceGUIDHandler); +// router:设置设备GUID +router.post('/SetDeviceGUID', QQSetDeviceGUIDHandler); +// router:获取GUID备份列表 +router.post('/GetGUIDBackups', QQGetGUIDBackupsHandler); +// router:恢复GUID备份 +router.post('/RestoreGUIDBackup', QQRestoreGUIDBackupHandler); +// router:创建GUID备份 +router.post('/CreateGUIDBackup', QQCreateGUIDBackupHandler); + +// ============================================================ +// 平台信息 & Linux GUID 管理 +// ============================================================ +// router:获取平台信息 +router.post('/GetPlatformInfo', QQGetPlatformInfoHandler); +// router:获取Linux MAC地址 +router.post('/GetLinuxMAC', QQGetLinuxMACHandler); +// router:设置Linux MAC地址 +router.post('/SetLinuxMAC', QQSetLinuxMACHandler); +// router:获取Linux machine-id +router.post('/GetLinuxMachineId', QQGetLinuxMachineIdHandler); +// router:计算Linux GUID +router.post('/ComputeLinuxGUID', QQComputeLinuxGUIDHandler); +// router:获取Linux machine-info备份列表 +router.post('/GetLinuxMachineInfoBackups', QQGetLinuxMachineInfoBackupsHandler); +// router:创建Linux machine-info备份 +router.post('/CreateLinuxMachineInfoBackup', QQCreateLinuxMachineInfoBackupHandler); +// router:恢复Linux machine-info备份 +router.post('/RestoreLinuxMachineInfoBackup', QQRestoreLinuxMachineInfoBackupHandler); +// router:重置Linux设备信息 +router.post('/ResetLinuxDeviceID', QQResetLinuxDeviceIDHandler); export { router as QQLoginRouter }; diff --git a/packages/napcat-webui-backend/src/router/index.ts b/packages/napcat-webui-backend/src/router/index.ts index 8c98ff9f..853e48f5 100644 --- a/packages/napcat-webui-backend/src/router/index.ts +++ b/packages/napcat-webui-backend/src/router/index.ts @@ -19,6 +19,7 @@ import DebugRouter from '@/napcat-webui-backend/src/api/Debug'; import { ProcessRouter } from './Process'; import { PluginRouter } from './Plugin'; import { MirrorRouter } from './Mirror'; +import { NapCatConfigRouter } from './NapCatConfig'; const router: Router = Router(); @@ -53,5 +54,7 @@ router.use('/Process', ProcessRouter); router.use('/Plugin', PluginRouter); // router:镜像管理相关路由 router.use('/Mirror', MirrorRouter); +// router:NapCat配置相关路由 +router.use('/NapCatConfig', NapCatConfigRouter); export { router as ALLRouter }; diff --git a/packages/napcat-webui-backend/src/types/index.ts b/packages/napcat-webui-backend/src/types/index.ts index f19259be..d0464871 100644 --- a/packages/napcat-webui-backend/src/types/index.ts +++ b/packages/napcat-webui-backend/src/types/index.ts @@ -49,6 +49,7 @@ export interface LoginRuntimeType { QQLoginInfo: SelfInfo; QQLoginError: string; QQVersion: string; + QQDataPath: string; onQQLoginStatusChange: (status: boolean) => Promise; onWebUiTokenChange: (token: string) => Promise; onRefreshQRCode: () => Promise; diff --git a/packages/napcat-webui-backend/src/utils/guid.ts b/packages/napcat-webui-backend/src/utils/guid.ts new file mode 100644 index 00000000..f8712d55 --- /dev/null +++ b/packages/napcat-webui-backend/src/utils/guid.ts @@ -0,0 +1,275 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import os from 'node:os'; +import crypto from 'node:crypto'; +import { protectData, unprotectData } from 'napcat-dpapi'; + +const GUID_HEADER = Buffer.from([0x00, 0x00, 0x00, 0x14]); +const XOR_KEY = 0x10; + +/** + * Unprotects data using Windows DPAPI via napcat-dpapi. + */ +function dpapiUnprotect (filePath: string): Buffer { + const encrypted = fs.readFileSync(filePath); + return Buffer.from(unprotectData(encrypted, null, 'CurrentUser')); +} + +/** + * Protects data using Windows DPAPI and writes to file. + */ +function dpapiProtectAndWrite (filePath: string, data: Buffer): void { + const encrypted = protectData(data, null, 'CurrentUser'); + fs.writeFileSync(filePath, Buffer.from(encrypted)); +} + +export class Registry20Utils { + static getRegistryPath (dataPath: string): string { + return path.join(dataPath, 'nt_qq', 'global', 'nt_data', 'msf', 'Registry20'); + } + + static readGuid (registryPath: string): string { + if (!fs.existsSync(registryPath)) { + throw new Error('Registry20 file not found'); + } + if (os.platform() !== 'win32') { + throw new Error('Registry20 decryption is only supported on Windows'); + } + + const decrypted = dpapiUnprotect(registryPath); + + if (decrypted.length < 20) { + throw new Error(`Decrypted data too short (got ${decrypted.length} bytes, need 20)`); + } + + // Decode payload: header(4) + obfuscated_guid(16) + const payload = decrypted.subarray(4, 20); + const guidBuf = Buffer.alloc(16); + for (let i = 0; i < 16; i++) { + const payloadByte = payload[i] ?? 0; + guidBuf[i] = (~(payloadByte ^ XOR_KEY)) & 0xFF; + } + + return guidBuf.toString('hex'); + } + + static writeGuid (registryPath: string, guidHex: string): void { + if (guidHex.length !== 32) { + throw new Error('Invalid GUID length, must be 32 hex chars'); + } + if (os.platform() !== 'win32') { + throw new Error('Registry20 encryption is only supported on Windows'); + } + + const guidBytes = Buffer.from(guidHex, 'hex'); + const payload = Buffer.alloc(16); + for (let i = 0; i < 16; i++) { + const guidByte = guidBytes[i] ?? 0; + payload[i] = XOR_KEY ^ (~guidByte & 0xFF); + } + + const data = Buffer.concat([GUID_HEADER, payload]); + + // Create directory if not exists + const dir = path.dirname(registryPath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + + dpapiProtectAndWrite(registryPath, data); + } + + static getBackups (registryPath: string): string[] { + const dir = path.dirname(registryPath); + const baseName = path.basename(registryPath); + if (!fs.existsSync(dir)) return []; + + return fs.readdirSync(dir) + .filter(f => f.startsWith(`${baseName}.bak.`)) + .sort() + .reverse(); + } + + static backup (registryPath: string): string { + if (!fs.existsSync(registryPath)) { + throw new Error('Registry20 does not exist'); + } + const timestamp = new Date().toISOString().replace(/[-:T.]/g, '').slice(0, 14); + const backupPath = `${registryPath}.bak.${timestamp}`; + fs.copyFileSync(registryPath, backupPath); + return backupPath; + } + + static restore (registryPath: string, backupFileName: string): void { + const dir = path.dirname(registryPath); + const backupPath = path.join(dir, backupFileName); + if (!fs.existsSync(backupPath)) { + throw new Error('Backup file not found'); + } + fs.copyFileSync(backupPath, registryPath); + } + + static delete (registryPath: string): void { + if (fs.existsSync(registryPath)) { + fs.unlinkSync(registryPath); + } + } +} + +// ============================================================ +// Linux machine-info 工具类 +// ============================================================ + +/** + * ROT13 编解码 (自逆运算) + * 字母偏移13位,数字和符号不变 + */ +function rot13 (s: string): string { + return s.replace(/[a-zA-Z]/g, (c) => { + const base = c <= 'Z' ? 65 : 97; + return String.fromCharCode(((c.charCodeAt(0) - base + 13) % 26) + base); + }); +} + +/** + * Linux 平台 machine-info 文件工具类 + * + * 文件格式 (逆向自 machine_guid_util.cc): + * [4字节 BE uint32 长度 N] [N字节 ROT13 编码的 MAC 字符串] + * - MAC 格式: xx-xx-xx-xx-xx-xx (17 字符) + * - ROT13: 字母偏移13位, 数字和 '-' 不变 + * + * GUID 生成算法: + * GUID = MD5( /etc/machine-id + MAC地址 ) + */ +export class MachineInfoUtils { + /** + * 获取 machine-info 文件路径 + */ + static getMachineInfoPath (dataPath: string): string { + return path.join(dataPath, 'nt_qq', 'global', 'nt_data', 'msf', 'machine-info'); + } + + /** + * 从 machine-info 文件读取 MAC 地址 + */ + static readMac (machineInfoPath: string): string { + if (!fs.existsSync(machineInfoPath)) { + throw new Error('machine-info file not found'); + } + + const data = fs.readFileSync(machineInfoPath); + + if (data.length < 4) { + throw new Error(`machine-info data too short: ${data.length} < 4 bytes`); + } + + const length = data.readUInt32BE(0); + + if (length >= 18) { + throw new Error(`MAC string length abnormal: ${length} >= 18`); + } + + if (data.length < 4 + length) { + throw new Error(`machine-info data incomplete: need ${4 + length} bytes, got ${data.length}`); + } + + const rot13Str = data.subarray(4, 4 + length).toString('ascii'); + return rot13(rot13Str); + } + + /** + * 将 MAC 地址写入 machine-info 文件 + */ + static writeMac (machineInfoPath: string, mac: string): void { + mac = mac.trim().toLowerCase(); + + // 验证 MAC 格式: xx-xx-xx-xx-xx-xx + if (!/^[0-9a-f]{2}(-[0-9a-f]{2}){5}$/.test(mac)) { + throw new Error('Invalid MAC format, must be xx-xx-xx-xx-xx-xx'); + } + + const encoded = rot13(mac); + const length = encoded.length; + const buf = Buffer.alloc(4 + length); + buf.writeUInt32BE(length, 0); + buf.write(encoded, 4, 'ascii'); + + // 确保目录存在 + const dir = path.dirname(machineInfoPath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + + fs.writeFileSync(machineInfoPath, buf); + } + + /** + * 读取 /etc/machine-id + */ + static readMachineId (): string { + const machineIdPath = '/etc/machine-id'; + if (!fs.existsSync(machineIdPath)) { + throw new Error('/etc/machine-id not found'); + } + return fs.readFileSync(machineIdPath, 'utf-8').trim(); + } + + /** + * 计算 Linux GUID = MD5(machine-id + MAC) + */ + static computeGuid (machineId: string, mac: string): string { + const md5 = crypto.createHash('md5'); + md5.update(machineId, 'ascii'); + md5.update(mac, 'ascii'); + return md5.digest('hex'); + } + + /** + * 获取备份列表 + */ + static getBackups (machineInfoPath: string): string[] { + const dir = path.dirname(machineInfoPath); + const baseName = path.basename(machineInfoPath); + if (!fs.existsSync(dir)) return []; + + return fs.readdirSync(dir) + .filter(f => f.startsWith(`${baseName}.bak.`)) + .sort() + .reverse(); + } + + /** + * 创建备份 + */ + static backup (machineInfoPath: string): string { + if (!fs.existsSync(machineInfoPath)) { + throw new Error('machine-info file does not exist'); + } + const timestamp = new Date().toISOString().replace(/[-:T.]/g, '').slice(0, 14); + const backupPath = `${machineInfoPath}.bak.${timestamp}`; + fs.copyFileSync(machineInfoPath, backupPath); + return backupPath; + } + + /** + * 恢复备份 + */ + static restore (machineInfoPath: string, backupFileName: string): void { + const dir = path.dirname(machineInfoPath); + const backupPath = path.join(dir, backupFileName); + if (!fs.existsSync(backupPath)) { + throw new Error('Backup file not found'); + } + fs.copyFileSync(backupPath, machineInfoPath); + } + + /** + * 删除 machine-info + */ + static delete (machineInfoPath: string): void { + if (fs.existsSync(machineInfoPath)) { + fs.unlinkSync(machineInfoPath); + } + } +} diff --git a/packages/napcat-webui-frontend/src/components/button/add_button.tsx b/packages/napcat-webui-frontend/src/components/button/add_button.tsx index f6b230b7..7972f5e2 100644 --- a/packages/napcat-webui-frontend/src/components/button/add_button.tsx +++ b/packages/napcat-webui-frontend/src/components/button/add_button.tsx @@ -54,7 +54,7 @@ const AddButton: React.FC = (props) => { textValue='title' >
-
+
新建网络配置
diff --git a/packages/napcat-webui-frontend/src/components/guid_manager.tsx b/packages/napcat-webui-frontend/src/components/guid_manager.tsx new file mode 100644 index 00000000..b53ba684 --- /dev/null +++ b/packages/napcat-webui-frontend/src/components/guid_manager.tsx @@ -0,0 +1,714 @@ +import { Button } from '@heroui/button'; +import { Input } from '@heroui/input'; +import { Divider } from '@heroui/divider'; +import { Chip } from '@heroui/chip'; +import { Listbox, ListboxItem } from '@heroui/listbox'; +import { Spinner } from '@heroui/spinner'; +import { useEffect, useState, useCallback, useMemo } from 'react'; +import toast from 'react-hot-toast'; +import { MdContentCopy, MdDelete, MdRefresh, MdSave, MdRestorePage, MdBackup } from 'react-icons/md'; +import MD5 from 'crypto-js/md5'; + +import QQManager from '@/controllers/qq_manager'; +import useDialog from '@/hooks/use-dialog'; + +interface GUIDManagerProps { + /** 是否显示重启按钮 */ + showRestart?: boolean; + /** 紧凑模式(用于弹窗场景) */ + compact?: boolean; +} + +const GUIDManager: React.FC = ({ showRestart = true, compact = false }) => { + const dialog = useDialog(); + + // 平台检测 + const [platform, setPlatform] = useState(''); + const isWindows = platform === 'win32'; + const isMac = platform === 'darwin'; + const isLinux = platform !== '' && platform !== 'win32' && platform !== 'darwin'; + const platformDetected = platform !== ''; + + // Windows 状态 + const [currentGUID, setCurrentGUID] = useState(''); + const [inputGUID, setInputGUID] = useState(''); + const [backups, setBackups] = useState([]); + + // Linux 状态 + const [currentMAC, setCurrentMAC] = useState(''); + const [inputMAC, setInputMAC] = useState(''); + const [machineId, setMachineId] = useState(''); + const [linuxBackups, setLinuxBackups] = useState([]); + + // 通用状态 + const [loading, setLoading] = useState(false); + const [saving, setSaving] = useState(false); + const [restarting, setRestarting] = useState(false); + + const isValidGUID = (guid: string) => /^[0-9a-fA-F]{32}$/.test(guid); + const isValidMAC = (mac: string) => /^[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){5}$/.test(mac.trim().toLowerCase()); + + // 前端实时计算 Linux GUID = MD5(machine-id + MAC) + const computedLinuxGUID = useMemo(() => { + if (!isLinux) return ''; + const mac = inputMAC.trim().toLowerCase(); + if (!machineId && !mac) return ''; + return MD5(machineId + mac).toString(); + }, [isLinux, machineId, inputMAC]); + + // 当前生效的 GUID (基于已保存的 MAC) + const currentLinuxGUID = useMemo(() => { + if (!isLinux || !currentMAC) return ''; + return MD5(machineId + currentMAC).toString(); + }, [isLinux, machineId, currentMAC]); + + // 检测平台 + const fetchPlatform = useCallback(async () => { + try { + const data = await QQManager.getPlatformInfo(); + setPlatform(data.platform); + } catch { + // 如果获取失败,默认 win32 向后兼容 + setPlatform('win32'); + } + }, []); + + // Windows: 获取 GUID + const fetchGUID = useCallback(async () => { + setLoading(true); + try { + const data = await QQManager.getDeviceGUID(); + setCurrentGUID(data.guid); + setInputGUID(data.guid); + } catch (error) { + const msg = (error as Error).message; + setCurrentGUID(''); + setInputGUID(''); + if (!msg.includes('not found')) { + toast.error(`获取 GUID 失败: ${msg}`); + } + } finally { + setLoading(false); + } + }, []); + + // Windows: 获取备份 + const fetchBackups = useCallback(async () => { + try { + const data = await QQManager.getGUIDBackups(); + setBackups(data); + } catch { + // ignore + } + }, []); + + // Linux: 获取 MAC + machine-id + const fetchLinuxInfo = useCallback(async () => { + setLoading(true); + try { + const [macData, midData] = await Promise.all([ + QQManager.getLinuxMAC().catch(() => ({ mac: '' })), + QQManager.getLinuxMachineId().catch(() => ({ machineId: '' })), + ]); + setCurrentMAC(macData.mac); + setInputMAC(macData.mac); + setMachineId(midData.machineId); + } catch (error) { + const msg = (error as Error).message; + toast.error(`获取设备信息失败: ${msg}`); + } finally { + setLoading(false); + } + }, []); + + // Linux: 获取备份 + const fetchLinuxBackups = useCallback(async () => { + try { + const data = await QQManager.getLinuxMachineInfoBackups(); + setLinuxBackups(data); + } catch { + // ignore + } + }, []); + + useEffect(() => { + fetchPlatform(); + }, [fetchPlatform]); + + useEffect(() => { + if (!platformDetected) return; + if (isWindows) { + fetchGUID(); + fetchBackups(); + } else { + fetchLinuxInfo(); + fetchLinuxBackups(); + } + }, [platformDetected, isWindows, fetchGUID, fetchBackups, fetchLinuxInfo, fetchLinuxBackups]); + + // ========== Windows 操作 ========== + + const handleCopy = () => { + const guid = isLinux ? currentLinuxGUID : currentGUID; + if (guid) { + navigator.clipboard.writeText(guid); + toast.success('已复制到剪贴板'); + } + }; + + const handleSave = async () => { + if (!isValidGUID(inputGUID)) { + toast.error('GUID 格式无效,需要 32 位十六进制字符'); + return; + } + setSaving(true); + try { + await QQManager.setDeviceGUID(inputGUID); + setCurrentGUID(inputGUID); + toast.success('GUID 已设置,重启后生效'); + await fetchBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`设置 GUID 失败: ${msg}`); + } finally { + setSaving(false); + } + }; + + const handleDelete = () => { + dialog.confirm({ + title: '确认删除', + content: '删除 Registry20 后,QQ 将在下次启动时生成新的设备标识。确定要删除吗?', + confirmText: '删除', + cancelText: '取消', + onConfirm: async () => { + try { + await QQManager.resetDeviceID(); + setCurrentGUID(''); + setInputGUID(''); + toast.success('已删除,重启后生效'); + await fetchBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`删除失败: ${msg}`); + } + }, + }); + }; + + const handleBackup = async () => { + try { + await QQManager.createGUIDBackup(); + toast.success('备份已创建'); + await fetchBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`备份失败: ${msg}`); + } + }; + + const handleRestore = (backupName: string) => { + dialog.confirm({ + title: '确认恢复', + content: `确定要从备份 "${backupName}" 恢复吗?当前的 Registry20 将被覆盖。`, + confirmText: '恢复', + cancelText: '取消', + onConfirm: async () => { + try { + await QQManager.restoreGUIDBackup(backupName); + toast.success('已恢复,重启后生效'); + await fetchGUID(); + await fetchBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`恢复失败: ${msg}`); + } + }, + }); + }; + + // ========== Linux 操作 ========== + + const handleLinuxSaveMAC = async () => { + const mac = inputMAC.trim().toLowerCase(); + if (!isValidMAC(mac)) { + toast.error('MAC 格式无效,需要 xx-xx-xx-xx-xx-xx 格式'); + return; + } + setSaving(true); + try { + await QQManager.setLinuxMAC(mac); + setCurrentMAC(mac); + toast.success('MAC 已设置,重启后生效'); + await fetchLinuxBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`设置 MAC 失败: ${msg}`); + } finally { + setSaving(false); + } + }; + + const handleLinuxCopyMAC = () => { + if (currentMAC) { + navigator.clipboard.writeText(currentMAC); + toast.success('MAC 已复制到剪贴板'); + } + }; + + const handleLinuxDelete = () => { + dialog.confirm({ + title: '确认删除', + content: '删除 machine-info 后,QQ 将在下次启动时生成新的设备标识。确定要删除吗?', + confirmText: '删除', + cancelText: '取消', + onConfirm: async () => { + try { + await QQManager.resetLinuxDeviceID(); + setCurrentMAC(''); + setInputMAC(''); + toast.success('已删除,重启后生效'); + await fetchLinuxBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`删除失败: ${msg}`); + } + }, + }); + }; + + const handleLinuxBackup = async () => { + try { + await QQManager.createLinuxMachineInfoBackup(); + toast.success('备份已创建'); + await fetchLinuxBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`备份失败: ${msg}`); + } + }; + + const handleLinuxRestore = (backupName: string) => { + dialog.confirm({ + title: '确认恢复', + content: `确定要从备份 "${backupName}" 恢复吗?当前的 machine-info 将被覆盖。`, + confirmText: '恢复', + cancelText: '取消', + onConfirm: async () => { + try { + await QQManager.restoreLinuxMachineInfoBackup(backupName); + toast.success('已恢复,重启后生效'); + await fetchLinuxInfo(); + await fetchLinuxBackups(); + } catch (error) { + const msg = (error as Error).message; + toast.error(`恢复失败: ${msg}`); + } + }, + }); + }; + + // ========== 重启 ========== + + const handleRestart = () => { + dialog.confirm({ + title: '确认重启', + content: '确定要重启 NapCat 吗?这将导致当前连接断开。', + confirmText: '重启', + cancelText: '取消', + onConfirm: async () => { + setRestarting(true); + try { + await QQManager.restartNapCat(); + toast.success('重启指令已发送'); + } catch (error) { + const msg = (error as Error).message; + toast.error(`重启失败: ${msg}`); + } finally { + setRestarting(false); + } + }, + }); + }; + + if (loading || !platformDetected) { + return ( +
+ +
+ ); + } + + // ========== macOS 不支持 ========== + if (isMac) { + return ( +
+
+ + macOS 平台暂不支持 GUID 管理 + +
+ 该功能仅适用于 Windows 和 Linux 平台 +
+
+
+ ); + } + + // ========== Linux 渲染 ========== + if (isLinux) { + return ( +
+ {/* 当前设备信息 */} +
+
当前设备 GUID
+
+ {currentLinuxGUID ? ( + + {currentLinuxGUID} + + ) : ( + + 未设置 / 不存在 + + )} + {currentLinuxGUID && ( + + )} + +
+
+ GUID = MD5(machine-id + MAC),修改 MAC 即可改变 GUID +
+
+ + + + {/* machine-id 显示 */} +
+
Machine ID
+ + {machineId || '未知'} + +
+ 来自 /etc/machine-id,不可修改 +
+
+ + + + {/* 当前 MAC 显示 */} +
+
当前 MAC 地址
+
+ {currentMAC ? ( + + {currentMAC} + + ) : ( + + 未设置 / 不存在 + + )} + {currentMAC && ( + + )} +
+
+ + + + {/* 编辑 MAC 地址 */} +
+
设置 MAC 地址
+
+ 0 && !isValidMAC(inputMAC)} + errorMessage={inputMAC.length > 0 && !isValidMAC(inputMAC) ? '格式: xx-xx-xx-xx-xx-xx' : undefined} + classNames={{ + input: 'font-mono text-sm', + }} + maxLength={17} + /> +
+ + {/* 实时 GUID 预览 */} + {inputMAC && isValidMAC(inputMAC) && ( +
+
预览 GUID
+
+ {computedLinuxGUID} +
+ {computedLinuxGUID !== currentLinuxGUID && ( +
+ 与当前 GUID 不同,保存后重启生效 +
+ )} +
+ )} + +
+ + + +
+
+ 修改 MAC 后 GUID 将变化,需重启 NapCat 才能生效,操作前会自动备份 +
+
+ + {/* 备份恢复 */} + {linuxBackups.length > 0 && ( + <> + +
+
+ 备份列表 + (点击恢复) +
+
+ handleLinuxRestore(key as string)} + > + {linuxBackups.map((name) => ( + } + className='font-mono text-xs' + > + {name} + + ))} + +
+
+ + )} + + {/* 重启 */} + {showRestart && ( + <> + + + + )} +
+ ); + } + + // ========== Windows 渲染 ========== + return ( +
+ {/* 当前 GUID 显示 */} +
+
当前设备 GUID
+
+ {currentGUID ? ( + + {currentGUID} + + ) : ( + + 未设置 / 不存在 + + )} + {currentGUID && ( + + )} + +
+
+ + + + {/* 设置 GUID */} +
+
设置 GUID
+
+ 0 && !isValidGUID(inputGUID)} + errorMessage={inputGUID.length > 0 && !isValidGUID(inputGUID) ? '需要32位十六进制字符' : undefined} + classNames={{ + input: 'font-mono text-sm', + }} + maxLength={32} + /> +
+
+ + + +
+
+ 修改或删除 GUID 后需重启 NapCat 才能生效,操作前会自动备份 +
+
+ + {/* 备份恢复 */} + {backups.length > 0 && ( + <> + +
+
+ 备份列表 + (点击恢复) +
+
+ handleRestore(key as string)} + > + {backups.map((name) => ( + } + className='font-mono text-xs' + > + {name} + + ))} + +
+
+ + )} + + {/* 重启 */} + {showRestart && ( + <> + + + + )} +
+ ); +}; + +export default GUIDManager; diff --git a/packages/napcat-webui-frontend/src/controllers/qq_manager.ts b/packages/napcat-webui-frontend/src/controllers/qq_manager.ts index 05dccb44..b0da8488 100644 --- a/packages/napcat-webui-frontend/src/controllers/qq_manager.ts +++ b/packages/napcat-webui-frontend/src/controllers/qq_manager.ts @@ -101,4 +101,100 @@ export default class QQManager { passwordMd5, }); } + + public static async resetDeviceID () { + await serverRequest.post>('/QQLogin/ResetDeviceID'); + } + + public static async restartNapCat () { + await serverRequest.post>('/QQLogin/RestartNapCat'); + } + + public static async getDeviceGUID () { + const data = await serverRequest.post>('/QQLogin/GetDeviceGUID'); + return data.data.data; + } + + public static async setDeviceGUID (guid: string) { + await serverRequest.post>('/QQLogin/SetDeviceGUID', { guid }); + } + + public static async getGUIDBackups () { + const data = await serverRequest.post>('/QQLogin/GetGUIDBackups'); + return data.data.data; + } + + public static async restoreGUIDBackup (backupName: string) { + await serverRequest.post>('/QQLogin/RestoreGUIDBackup', { backupName }); + } + + public static async createGUIDBackup () { + const data = await serverRequest.post>('/QQLogin/CreateGUIDBackup'); + return data.data.data; + } + + // ============================================================ + // 平台信息 & Linux GUID 管理 + // ============================================================ + + public static async getPlatformInfo () { + const data = await serverRequest.post>('/QQLogin/GetPlatformInfo'); + return data.data.data; + } + + public static async getLinuxMAC () { + const data = await serverRequest.post>('/QQLogin/GetLinuxMAC'); + return data.data.data; + } + + public static async setLinuxMAC (mac: string) { + await serverRequest.post>('/QQLogin/SetLinuxMAC', { mac }); + } + + public static async getLinuxMachineId () { + const data = await serverRequest.post>('/QQLogin/GetLinuxMachineId'); + return data.data.data; + } + + public static async computeLinuxGUID (mac?: string, machineId?: string) { + const data = await serverRequest.post>('/QQLogin/ComputeLinuxGUID', { mac, machineId }); + return data.data.data; + } + + public static async getLinuxMachineInfoBackups () { + const data = await serverRequest.post>('/QQLogin/GetLinuxMachineInfoBackups'); + return data.data.data; + } + + public static async createLinuxMachineInfoBackup () { + const data = await serverRequest.post>('/QQLogin/CreateLinuxMachineInfoBackup'); + return data.data.data; + } + + public static async restoreLinuxMachineInfoBackup (backupName: string) { + await serverRequest.post>('/QQLogin/RestoreLinuxMachineInfoBackup', { backupName }); + } + + public static async resetLinuxDeviceID () { + await serverRequest.post>('/QQLogin/ResetLinuxDeviceID'); + } + + // ============================================================ + // NapCat 配置管理 + // ============================================================ + + public static async getNapCatConfig () { + const { data } = await serverRequest.get>( + '/NapCatConfig/GetConfig' + ); + return data.data; + } + + public static async setNapCatConfig (config: Partial) { + await serverRequest.post>( + '/NapCatConfig/SetConfig', + config + ); + } } + diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/config/bypass.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/config/bypass.tsx new file mode 100644 index 00000000..be736a17 --- /dev/null +++ b/packages/napcat-webui-frontend/src/pages/dashboard/config/bypass.tsx @@ -0,0 +1,175 @@ +import { useEffect, useState } from 'react'; +import { Controller, useForm } from 'react-hook-form'; +import toast from 'react-hot-toast'; + +import SaveButtons from '@/components/button/save_buttons'; +import PageLoading from '@/components/page_loading'; +import SwitchCard from '@/components/switch_card'; + +import QQManager from '@/controllers/qq_manager'; + +interface BypassFormData { + hook: boolean; + window: boolean; + module: boolean; + process: boolean; + container: boolean; + js: boolean; + o3HookMode: boolean; +} + + +const BypassConfigCard = () => { + const [loading, setLoading] = useState(true); + const { + control, + handleSubmit, + formState: { isSubmitting }, + setValue, + } = useForm(); + + const loadConfig = async (showTip = false) => { + try { + setLoading(true); + const config = await QQManager.getNapCatConfig(); + const bypass = config.bypass ?? {} as Partial; + setValue('hook', bypass.hook ?? false); + setValue('window', bypass.window ?? false); + setValue('module', bypass.module ?? false); + setValue('process', bypass.process ?? false); + setValue('container', bypass.container ?? false); + setValue('js', bypass.js ?? false); + setValue('o3HookMode', config.o3HookMode === 1); + if (showTip) toast.success('刷新成功'); + } catch (error) { + const msg = (error as Error).message; + toast.error(`获取配置失败: ${msg}`); + } finally { + setLoading(false); + } + }; + + const onSubmit = handleSubmit(async (data) => { + try { + const { o3HookMode, ...bypass } = data; + await QQManager.setNapCatConfig({ bypass, o3HookMode: o3HookMode ? 1 : 0 }); + toast.success('保存成功,重启后生效'); + } catch (error) { + const msg = (error as Error).message; + toast.error(`保存失败: ${msg}`); + } + }); + + const onReset = () => { + loadConfig(); + }; + + const onRefresh = async () => { + await loadConfig(true); + }; + + useEffect(() => { + loadConfig(); + }, []); + + if (loading) return ; + + return ( + <> + 反检测配置 - NapCat WebUI +
+

反检测开关配置

+

+ 控制 Napi2Native 模块的各项反检测功能,修改后需重启生效。 +

+
+
+ ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> +
+ + + ); +}; + +export default BypassConfigCard; diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/config/index.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/config/index.tsx index 1274b879..836009cd 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/config/index.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/config/index.tsx @@ -14,6 +14,7 @@ import SSLConfigCard from './ssl'; import ThemeConfigCard from './theme'; import WebUIConfigCard from './webui'; import BackupConfigCard from './backup'; +import BypassConfigCard from './bypass'; export interface ConfigPageProps { children?: React.ReactNode; @@ -114,6 +115,11 @@ export default function ConfigPage () { + + + + + ); diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/config/login.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/config/login.tsx index aa1e96e3..bb1e39b9 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/config/login.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/config/login.tsx @@ -1,11 +1,13 @@ import { Input } from '@heroui/input'; import { Button } from '@heroui/button'; +import { Divider } from '@heroui/divider'; import { useRequest } from 'ahooks'; import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import toast from 'react-hot-toast'; import SaveButtons from '@/components/button/save_buttons'; +import GUIDManager from '@/components/guid_manager'; import PageLoading from '@/components/page_loading'; import QQManager from '@/controllers/qq_manager'; @@ -131,6 +133,14 @@ const LoginConfigCard = () => { 重启进程将关闭当前 Worker 进程,等待 3 秒后启动新进程
+ +
+
设备 GUID 管理
+
+ GUID 是设备登录唯一识别码,存储在 Registry20 文件中。修改后需重启生效。 +
+ +
); }; diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/config/webui.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/config/webui.tsx index 28ad1702..19d539fd 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/config/webui.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/config/webui.tsx @@ -131,7 +131,7 @@ const WebUIConfigCard = () => { isLoading={isLoadingOptions} className='w-fit' > - {!isLoadingOptions && '📥'} + {!isLoadingOptions} 准备选项 {registrationOptions && (
- ✅ 注册选项已准备就绪,可以开始注册 + 注册选项已准备就绪,可以开始注册
)} diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/extension.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/extension.tsx index ea004267..902a3cb4 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/extension.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/extension.tsx @@ -115,39 +115,42 @@ export default function ExtensionPage () { {extensionPages.length > 0 && ( - setSelectedTab(key as string)} - classNames={{ - tabList: 'bg-white/40 dark:bg-black/20 backdrop-blur-md', - cursor: 'bg-white/80 dark:bg-white/10 backdrop-blur-md shadow-sm', - panel: 'hidden', - }} - > - {tabs.map((tab) => ( - - {tab.icon && {tab.icon}} - { - e.stopPropagation(); - openInNewWindow(tab.pluginId, tab.path); - }} - > - {tab.title} - - ({tab.pluginName}) - - } - /> - ))} - +
+ setSelectedTab(key as string)} + classNames={{ + tabList: 'bg-white/40 dark:bg-black/20 backdrop-blur-md flex-nowrap', + cursor: 'bg-white/80 dark:bg-white/10 backdrop-blur-md shadow-sm', + panel: 'hidden', + }} + > + {tabs.map((tab) => ( + + {tab.icon && {tab.icon}} + { + e.stopPropagation(); + openInNewWindow(tab.pluginId, tab.path); + }} + > + {tab.title} + + ({tab.pluginName}) +
+ } + /> + ))} + + )} diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/plugin.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/plugin.tsx index 667ab4b6..33c31ea2 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/plugin.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/plugin.tsx @@ -61,30 +61,28 @@ export default function PluginPage () { const handleUninstall = async (plugin: PluginItem) => { return new Promise((resolve, reject) => { + let cleanData = false; dialog.confirm({ title: '卸载插件', content: (
-

确定要卸载插件「{plugin.name}」吗? 此操作不可恢复。

-

如果插件创建了数据文件,是否一并删除?

+

确定要卸载插件「{plugin.name}」吗? 此操作不可恢复。

+
+ +

配置目录: config/plugins/{plugin.id}

+
), - // This 'dialog' utility might not support returning a value from UI interacting. - // We might need to implement a custom confirmation flow if we want a checkbox. - // Alternatively, use two buttons? "Uninstall & Clean", "Uninstall Only"? - // Standard dialog usually has Confirm/Cancel. - // Let's stick to a simpler "Uninstall" and then maybe a second prompt? Or just clean data? - // User requested: "Uninstall prompts whether to clean data". - // Let's use `window.confirm` for the second step or assume `dialog.confirm` is flexible enough? - // I will implement a two-step confirmation or try to modify the dialog hook if visible (not visible here). - // Let's use a standard `window.confirm` for the data cleanup question if the custom dialog doesn't support complex return. - // Better: Inside onConfirm, ask again? + confirmText: '确定卸载', + cancelText: '取消', onConfirm: async () => { - // Ask for data cleanup - // Since we are in an async callback, we can use another dialog or confirm. - // Native confirm is ugly but works reliably for logic: - const cleanData = window.confirm(`是否同时清理插件「${plugin.name}」的数据文件?\n点击“确定”清理数据,点击“取消”仅卸载插件。`); - const loadingToast = toast.loading('卸载中...'); try { await PluginManager.uninstallPlugin(plugin.id, cleanData); diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/plugin_config_modal.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/plugin_config_modal.tsx index 180e987e..339df615 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/plugin_config_modal.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/plugin_config_modal.tsx @@ -374,10 +374,10 @@ export default function PluginConfigModal ({ isOpen, onOpenChange, pluginId }: P diff --git a/packages/napcat-webui-frontend/src/pages/qq_login.tsx b/packages/napcat-webui-frontend/src/pages/qq_login.tsx index 1268d806..68744964 100644 --- a/packages/napcat-webui-frontend/src/pages/qq_login.tsx +++ b/packages/napcat-webui-frontend/src/pages/qq_login.tsx @@ -6,8 +6,11 @@ import { useEffect, useRef, useState } from 'react'; import { toast } from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; import CryptoJS from 'crypto-js'; +import { MdSettings } from 'react-icons/md'; import logo from '@/assets/images/logo.png'; +import GUIDManager from '@/components/guid_manager'; +import Modal from '@/components/modal'; import HoverEffectCard from '@/components/effect_card'; import { title } from '@/components/primitives'; @@ -174,6 +177,8 @@ export default function QQLoginPage () { } }; + const [showGUIDManager, setShowGUIDManager] = useState(false); + useEffect(() => { const timer = setInterval(() => { onUpdateQrCode(); @@ -210,7 +215,12 @@ export default function QQLoginPage () { - +
+ + +
@@ -266,6 +276,15 @@ export default function QQLoginPage () { + {showGUIDManager && ( + } + size='lg' + hideFooter + onClose={() => setShowGUIDManager(false)} + /> + )} ); } diff --git a/packages/napcat-webui-frontend/src/types/napcat_conf.d.ts b/packages/napcat-webui-frontend/src/types/napcat_conf.d.ts new file mode 100644 index 00000000..e954c35e --- /dev/null +++ b/packages/napcat-webui-frontend/src/types/napcat_conf.d.ts @@ -0,0 +1,19 @@ +interface BypassOptions { + hook: boolean; + window: boolean; + module: boolean; + process: boolean; + container: boolean; + js: boolean; +} + +interface NapCatConfig { + fileLog: boolean; + consoleLog: boolean; + fileLogLevel: string; + consoleLogLevel: string; + packetBackend: string; + packetServer: string; + o3HookMode: number; + bypass?: BypassOptions; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfcbd7eb..885a3776 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,8 +128,17 @@ importers: specifier: ^22.0.1 version: 22.19.1 + packages/napcat-dpapi: + devDependencies: + '@types/node': + specifier: ^22.0.1 + version: 22.19.1 + packages/napcat-framework: dependencies: + json5: + specifier: ^2.2.3 + version: 2.2.3 napcat-adapter: specifier: workspace:* version: link:../napcat-adapter @@ -351,6 +360,9 @@ importers: '@types/node': specifier: ^22.0.1 version: 22.19.1 + json5: + specifier: ^2.2.3 + version: 2.2.3 napcat-vite: specifier: workspace:* version: link:../napcat-vite @@ -441,6 +453,9 @@ importers: napcat-common: specifier: workspace:* version: link:../napcat-common + napcat-dpapi: + specifier: workspace:* + version: link:../napcat-dpapi napcat-pty: specifier: workspace:* version: link:../napcat-pty @@ -1898,89 +1913,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -2731,56 +2762,67 @@ packages: resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.53.2': resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.53.2': resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.53.2': resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.53.2': resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.53.2': resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.53.2': resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.53.2': resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.53.2': resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.53.2': resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.53.2': resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.53.2': resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} @@ -2855,24 +2897,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.15.1': resolution: {integrity: sha512-fKzP9mRQGbhc5QhJPIsqKNNX/jyWrZgBxmo3Nz1SPaepfCUc7RFmtcJQI5q8xAun3XabXjh90wqcY/OVyg2+Kg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.15.1': resolution: {integrity: sha512-ZLjMi138uTJxb+1wzo4cB8mIbJbAsSLWRNeHc1g1pMvkERPWOGlem+LEYkkzaFzCNv1J8aKcL653Vtw8INHQeg==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.15.1': resolution: {integrity: sha512-jvSI1IdsIYey5kOITzyajjofXOOySVitmLxb45OPUjoNojql4sDojvlW5zoHXXFePdA6qAX4Y6KbzAOV3T3ctA==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.15.1': resolution: {integrity: sha512-X/FcDtNrDdY9r4FcXHt9QxUqC/2FbQdvZobCKHlHe8vTSKhUHOilWl5EBtkFVfsEs4D5/yAri9e3bJbwyBhhBw==} @@ -3237,41 +3283,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}