diff --git a/.env.development b/.env.liteloader similarity index 100% rename from .env.development rename to .env.liteloader diff --git a/.env.production b/.env.shell similarity index 100% rename from .env.production rename to .env.shell diff --git a/package.json b/package.json index 5774da9b..8a5232bf 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,10 @@ "type": "module", "version": "1.8.3", "scripts": { - "watch:dev": "vite --mode development", - "watch:prod": "vite --mode production", - "build:dev": "vite build --mode development", - "build:prod": "vite build --mode production", - "build": "npm run build:dev", - "build:core": "cd ./src/core && npm run build && cd ../.. && node ./script/copy-core.cjs", + "build:liteloader": "vite build --mode ", + "build:shell": "vite build --mode production", "build:webui": "cd ./src/webui && vite build", - "watch": "npm run watch:dev", - "debug-win": "powershell dist/napcat.ps1", "lint": "eslint --fix src/**/*.{js,ts}", - "release": "npm run build:prod", "depend": "cd dist && npm install --omit=dev" }, "devDependencies": { diff --git a/src/common/utils/proxy-handler.ts b/src/common/utils/proxy-handler.ts index e69de29b..330cb1dd 100644 --- a/src/common/utils/proxy-handler.ts +++ b/src/common/utils/proxy-handler.ts @@ -0,0 +1,21 @@ +import { LogWrapper } from "./log"; + +export function proxyHandlerOf(logger: LogWrapper) { + return { + get(target: any, prop: any, receiver: any) { + // console.log('get', prop, typeof target[prop]); + if (typeof target[prop] === 'undefined') { + // 如果方法不存在,返回一个函数,这个函数调用existentMethod + return (..._args: unknown[]) => { + logger.logDebug(`${target.constructor.name} has no method ${prop}`); + }; + } + // 如果方法存在,正常返回 + return Reflect.get(target, prop, receiver); + } + }; +} + +export function proxiedListenerOf(listener: T, logger: LogWrapper) { + return new Proxy(listener, proxyHandlerOf(logger)) +} \ No newline at end of file diff --git a/src/core/core.ts b/src/core/core.ts index ca83a1ae..c300a8dc 100644 --- a/src/core/core.ts +++ b/src/core/core.ts @@ -3,6 +3,7 @@ import { NodeIQQNTWrapperSession, WrapperNodeApi } from "./wrapper/wrapper"; import path from "node:path"; import fs from "node:fs"; import { NodeIKernelLoginService } from "./services"; +import { SelfInfo } from "./entities"; export enum NapCatCoreWorkingEnv { Unknown = 0, @@ -20,26 +21,22 @@ export function loadQQWrapper(QQVersion: string): WrapperNodeApi { return nativemodule.exports; } -export class NapCatCore { +export interface InstanceContext { readonly workingEnv: NapCatCoreWorkingEnv; + readonly core: NapCatCore; readonly wrapper: WrapperNodeApi; readonly session: NodeIQQNTWrapperSession; readonly logger: LogWrapper; readonly loginService: NodeIKernelLoginService; + readonly selfInfo: SelfInfo; + readonly QQVersion: string; +} - constructor( - env: NapCatCoreWorkingEnv, - wrapper: WrapperNodeApi, - session: NodeIQQNTWrapperSession, - logger: LogWrapper, - loginService: NodeIKernelLoginService, - QQVersion: string - ) { - this.workingEnv = env; - this.logger = logger; - this.wrapper = wrapper; - this.session = session; - this.loginService = loginService; +export class NapCatCore { + readonly context: InstanceContext; + + constructor(context: InstanceContext) { + this.context = context; } // Renamed from 'InitDataListener' diff --git a/src/core/index.ts b/src/core/index.ts index e69de29b..02bb11c7 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -0,0 +1 @@ +export * from './core'; \ No newline at end of file diff --git a/src/liteloader/napcat.cjs b/src/liteloader/napcat.cjs index 7ae7c3f2..d5c1caab 100644 --- a/src/liteloader/napcat.cjs +++ b/src/liteloader/napcat.cjs @@ -77,9 +77,10 @@ async function checkNTIsInit() { } async function NCInit() { console.log("[NapCat] [Info] 开始初始化NapCat"); - //await import("file://" + path.join(CurrentPath, './napcat.mjs')); + const { NCoreInitLiteLoader } = await import("file://" + path.join(CurrentPath, './napcat.mjs')); //传入LoginService Session 其余自载入 - console.log("[NapCat] [Info] NapCat初始化完成"); + await NCoreInitLiteLoader(getWrapperSession(), getWrapperLoginService()); + //console.log("[NapCat] [Info] NapCat初始化完成"); } (async () => { try { diff --git a/src/liteloader/napcat.ts b/src/liteloader/napcat.ts index 9cdaa380..ffbc01ae 100644 --- a/src/liteloader/napcat.ts +++ b/src/liteloader/napcat.ts @@ -5,6 +5,7 @@ import { LogWrapper } from "@/common/utils/log"; import { proxiedListenerOf } from "@/common/utils/proxy-handler"; import { QQBasicInfoWrapper } from "@/common/utils/QQBasicInfo"; import { NapCatCoreWorkingEnv, loadQQWrapper } from "@/core/core"; +import { SelfInfo } from "@/core/entities"; import { LoginListener } from "@/core/listeners"; import { NodeIKernelLoginService } from "@/core/services"; import { selfInfo } from "@/core/wrapper/data"; @@ -21,9 +22,14 @@ export async function NCoreInitLiteLoader(session: NodeIQQNTWrapperSession, logi let LLNC = new NapCatLiteLoader(logger, session, loginService, BasicInfo); //直到登录成功后,执行下一步 - await new Promise((resolve) => { + let selfInfo = await new Promise((resolve) => { let OBLoginListener = new LoginListener(); - OBLoginListener.onQRCodeLoginSucceed = async (arg) => resolve(); + OBLoginListener.onQRCodeLoginSucceed = async (loginResult) => resolve({ + uid: loginResult.uid, + uin: loginResult.uin, + nick: '', // 获取不到 + online: true + }); loginService.addKernelLoginListener(new LLNC.wrapper.NodeIKernelLoginListener(proxiedListenerOf(OBLoginListener, logger))); }); //启动WebUi diff --git a/src/liteloader/preload.cjs b/src/liteloader/preload.cjs new file mode 100644 index 00000000..e69de29b diff --git a/src/liteloader/renderer.cjs b/src/liteloader/renderer.cjs new file mode 100644 index 00000000..e69de29b diff --git a/vite.config.ts b/vite.config.ts index 5d1a3bad..082fe9d8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,8 +8,6 @@ import nodeResolve from '@rollup/plugin-node-resolve'; import { builtinModules } from 'module'; import fs from 'node:fs'; import babel from 'vite-plugin-babel'; -import { version } from 'os'; -// "@rollup/plugin-babel": "^6.0.4", const external = ['silk-wasm', 'ws', 'express', 'fluent-ffmpeg', 'log4js', 'qrcode-terminal']; const nodeModules = [...builtinModules, builtinModules.map(m => `node:${m}`)].flat(); @@ -55,7 +53,6 @@ const baseConfigPlugin: PluginOption[] = [ { src: './package.json', dest: 'dist' }, { src: './README.md', dest: 'dist' }, { src: './logo.png', dest: 'dist/logs' }, - // ...MoeHooModule, ...(startScripts.map((startScript) => { return { src: startScript, dest: 'dist' }; })), @@ -63,17 +60,13 @@ const baseConfigPlugin: PluginOption[] = [ }), nodeResolve(), ]; -// if (os.platform() !== 'win32') { -// startScripts = ['./script/napcat.sh']; -// } - let corePath = resolve(__dirname, './src/core/src'); if (!fs.existsSync(corePath)) { corePath = resolve(__dirname, './src/core.lib/src'); } -const baseConfig = (mode: string = 'development') => defineConfig({ +const baseConfig = (mode: string = 'shell') => defineConfig({ resolve: { conditions: ['node', 'default'], alias: { @@ -89,7 +82,7 @@ const baseConfig = (mode: string = 'development') => defineConfig({ // 压缩代码出现了未知问题导致无法运行,暂时不启用 minify: false, lib: { - entry: 'src/index.ts', + entry: mode === "shell" ? 'src/shell/napcat.ts' : "src/liteloader/napcat.ts", formats: ['es'], fileName: () => 'napcat.mjs', }, @@ -101,37 +94,11 @@ const baseConfig = (mode: string = 'development') => defineConfig({ }); export default defineConfig(({ mode }): UserConfig => { - if (mode === 'production') { + if (mode === 'shell') { return { ...baseConfig(mode), plugins: [ - ...baseConfigPlugin, - // { - // ...(obfuscator({ - // options: { - // compact: true, - // controlFlowFlattening: true, - // controlFlowFlatteningThreshold: 0.75, - // deadCodeInjection: true, - // deadCodeInjectionThreshold: 0.4, - // debugProtection: false, - // disableConsoleOutput: false, - // identifierNamesGenerator: 'hexadecimal', - // log: false, - // renameGlobals: false, - // rotateStringArray: true, - // selfDefending: true, - // stringArray: true, - // stringArrayEncoding: ['base64'], - // stringArrayThreshold: 0.75, - // transformObjectKeys: true, - // unicodeEscapeSequence: false - // }, - // include: ['src/**/*.js', 'src/**/*.ts'], - // }) as Plugin), - // enforce: 'post', - // apply: 'build', - // }, + ...baseConfigPlugin ] }; } else {