diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c9d98f52..2a266175 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -30,34 +30,34 @@ jobs:
ls
node ./script/checkVersion.cjs
sh ./checkVersion.sh
- # Build-LiteLoader:
- # needs: [check-version]
- # runs-on: ubuntu-latest
- # steps:
- # - name: Clone Main Repository
- # uses: actions/checkout@v4
- # with:
- # repository: 'NapNeko/NapCatQQ'
- # submodules: true
- # ref: main
- # token: ${{ secrets.NAPCAT_BUILD }}
- # - name: Use Node.js 20.X
- # uses: actions/setup-node@v4
- # with:
- # node-version: 20.x
+ Build-LiteLoader:
+ needs: [check-version]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Clone Main Repository
+ uses: actions/checkout@v4
+ with:
+ repository: 'NapNeko/NapCatQQ'
+ submodules: true
+ ref: main
+ token: ${{ secrets.NAPCAT_BUILD }}
+ - name: Use Node.js 20.X
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20.x
- # - name: Build NuCat Framework
- # run: |
- # npm i
- # npm run build:framework
- # cd dist
- # npm i --omit=dev
- # cd ..
- # - name: Upload Artifact
- # uses: actions/upload-artifact@v4
- # with:
- # name: NapCat.Framework
- # path: dist
+ - name: Build NuCat Framework
+ run: |
+ npm i
+ npm run build:framework
+ cd dist
+ npm i --omit=dev
+ cd ..
+ - name: Upload Artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: NapCat.Framework
+ path: dist
Build-Shell:
runs-on: ubuntu-latest
needs: [check-version]
@@ -90,31 +90,30 @@ jobs:
path: dist
release-napcat:
- needs: [Build-Shell]
- # needs: [Build-LiteLoader,Build-Shell]
+ needs: [Build-LiteLoader,Build-Shell]
runs-on: ubuntu-latest
steps:
- name: Download All Artifact
uses: actions/download-artifact@v4
- - name: Compress subdirectories
- run: |
- cd ./NapCat.Shell/
- zip -q -r NapCat.Shell.zip *
- cd ..
- rm ./NapCat.Shell.zip -rf
- mv ./NapCat.Shell/NapCat.Shell.zip ./
# - name: Compress subdirectories
# run: |
# cd ./NapCat.Shell/
# zip -q -r NapCat.Shell.zip *
# cd ..
- # cd ./NapCat.Framework/
- # zip -q -r NapCat.Framework.zip *
- # cd ..
# rm ./NapCat.Shell.zip -rf
- # rm ./NapCat.Framework.zip -rf
# mv ./NapCat.Shell/NapCat.Shell.zip ./
- # mv ./NapCat.Framework/NapCat.Framework.zip ./
+ - name: Compress subdirectories
+ run: |
+ cd ./NapCat.Shell/
+ zip -q -r NapCat.Shell.zip *
+ cd ..
+ cd ./NapCat.Framework/
+ zip -q -r NapCat.Framework.zip *
+ cd ..
+ rm ./NapCat.Shell.zip -rf
+ rm ./NapCat.Framework.zip -rf
+ mv ./NapCat.Shell/NapCat.Shell.zip ./
+ mv ./NapCat.Framework/NapCat.Framework.zip ./
- name: Extract version from tag
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
@@ -128,5 +127,6 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
body_path: CHANGELOG.md
files: |
+ NapCat.Framework.zip
NapCat.Shell.zip
draft: true
diff --git a/README.md b/README.md
index d4054baf..d8a2850e 100644
--- a/README.md
+++ b/README.md
@@ -35,4 +35,4 @@ NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现。
## 使用许可
-任何使用本仓库代码的地方,都应当严格遵守[本仓库开源许可](./LICENSE)。**此外,禁止任何项目未经授权二次分发或基于 [core](./src/core) 部分代码开发。**
+任何使用本仓库代码的地方,都应当严格遵守[本仓库开源许可](./LICENSE)。**此外,禁止任何项目未经授权二次分发或基于 NapCat 代码开发。**
diff --git a/manifest.json b/manifest.json
index 3651ede8..19c9f79c 100644
--- a/manifest.json
+++ b/manifest.json
@@ -4,7 +4,7 @@
"name": "NapCatQQ",
"slug": "NapCat.Framework",
"description": "高性能的 OneBot 11 协议实现",
- "version": "2.1.0",
+ "version": "2.2.3",
"icon": "./logo.png",
"authors": [
{
diff --git a/package.json b/package.json
index c5703aeb..6c9357fe 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "napcat",
"private": true,
"type": "module",
- "version": "2.1.0",
+ "version": "2.2.3",
"scripts": {
"build:framework": "vite build --mode framework",
"build:shell": "vite build --mode shell",
diff --git a/src/common/framework/napcat.ts b/src/common/framework/napcat.ts
index d485050c..e5231d45 100644
--- a/src/common/framework/napcat.ts
+++ b/src/common/framework/napcat.ts
@@ -2,7 +2,7 @@ import path, { dirname } from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
-export const napcat_version = '2.1.0';
+export const napcat_version = '2.2.3';
export class NapCatPathWrapper {
binaryPath: string;
diff --git a/src/core/external/appid.json b/src/core/external/appid.json
index 0cce792c..7f72b675 100644
--- a/src/core/external/appid.json
+++ b/src/core/external/appid.json
@@ -22,5 +22,9 @@
"9.9.15-27254":{
"appid": 537240709,
"qua": "V1_WIN_NQ_9.9.15_27254_GW_B"
+ },
+ "9.9.15-27333": {
+ "appid": 537240709,
+ "qua": "V1_WIN_NQ_9.9.15_27333_GW_B"
}
}
\ No newline at end of file
diff --git a/src/framework/napcat.cjs b/src/framework/napcat.cjs
index fa6fd273..fb44300a 100644
--- a/src/framework/napcat.cjs
+++ b/src/framework/napcat.cjs
@@ -1,143 +1,6 @@
-// https://github.com/NapNeko/LiteLoader-NapCatExample/blob/main/src/common/proxy.ts
-// By Mlikiowa
-
-const process = require('process');
-const os = require('os');
-const path = require('path');
-
-const currentPath = path.dirname(__filename);
-
-const dlopenOrig = process.dlopen;
-
-let wrapperSession;
-let wrapperNodeApi;
-let wrapperLoginService;
-let initCallBack;
-
-// Proxy dlopen
-process.dlopen = (module, filename, flags = os.constants.dlopen.RTLD_LAZY) => {
- dlopenOrig(module, filename, flags);
- for (const export_name in module.exports) {
- module.exports[export_name] = new Proxy(module.exports[export_name], {
- construct: (target, args, _newTarget) => {
- let constructed;
- if (export_name === 'NodeIKernelSessionListener') {
- let HookedArg = [];
- for (let ArgIndex in args) {
- if (args[ArgIndex] instanceof Object) {
- let HookArg = {};
- for (let ListenerName in args[ArgIndex]) {
- HookArg[ListenerName] = function (...ListenerData) {
- try {
- if (ListenerName === 'onSessionInitComplete') {
- //回调成功
- initCallBack.forEach((cb) => cb(...ListenerData));
- clearHook();
- }
- //console.log("Construct-ARG-Apply", ListenerName, JSON.stringify(ListenerData, null, 2));
- } catch (error) {
- // ignored
- }
- args[ArgIndex][ListenerName](...ListenerData);
- };
- HookedArg.push(HookArg);
- }
- } else {
- // 其它类型
- //console.log("Construct-ARG-NotProxy", args[keyArg]);
- }
-
- }
- constructed = new target(...HookedArg);
- } else {
- constructed = new target(...args);
- }
-
- if (export_name === 'NodeIQQNTWrapperSession') wrapperSession = constructed;
- if (export_name === 'NodeIKernelLoginService') wrapperLoginService = constructed;
-
- return constructed;
- },
- });
- }
- if (filename.toLowerCase().includes('wrapper.node')) {
- wrapperNodeApi = module.exports;
- }
-};
-
/**
- * 清理 Hook
+ * @description 此代码禁止除NapCat外任何地方使用 使用需获取许可
+ *@author: Mlikiowa
+ *@date: 2024-08-23
*/
-function clearHook() {
- initCallBack = [];
- process.dlopen = dlopenOrig;
-}
-
-function ntIsInitialized_Internal() {
- return wrapperSession !== undefined
- && wrapperNodeApi !== undefined
- && wrapperLoginService !== undefined;
-}
-
-function pollForNTInitializationCheck() {
- return new Promise((resolve, reject) => {
- let isSolve = false;
- const intervalRef = setInterval(() => {
- if (isSolve) return;
- try {
- if (ntIsInitialized_Internal()) {
- isSolve = true;
- clearInterval(intervalRef);
- resolve(true);
- }
- } catch (error) {
- reject(error);
- }
- }, 500);
- });
-}
-
-function registerInitCallback(callback) {
- if (initCallBack === undefined) {
- initCallBack = [];
- }
- initCallBack.push(callback);
-}
-
-async function fetchServices(timeout = 10000) {
- return Promise.race([
- pollForNTInitializationCheck(),
- new Promise((resolve) => {
- setTimeout(() => resolve(false), timeout);
- }),
- ]).then(result => result ?
- { wrapperSession, wrapperNodeApi, wrapperLoginService } :
- Promise.reject("fetchServices Timeout!"),
- );
-}
-let getWebUiUrlFunc = undefined;
-async function NCInit() {
- console.log('[NapCat] [Info] 开始初始化NapCat');
-
- try {
- const { wrapperSession, wrapperLoginService } = await fetchServices();
- const { NCoreInitFramework, getWebUiUrl } = await import('file://' + path.join(currentPath, './napcat.mjs'));
- getWebUiUrlFunc = getWebUiUrl;
- //传入LoginService Session 其余自载入
- await NCoreInitFramework(wrapperSession, wrapperLoginService, registerInitCallback);
- //console.log("[NapCat] [Info] NapCat初始化完成");
- } catch (error) {
- console.log('[NapCat] [Error] 初始化NapCat失败', error);
- }
-}
-
-NCInit();
-module.exports = {
- NCgetWebUiUrl: async () => {
- if (getWebUiUrlFunc === undefined) {
- console.log('[NapCat] [Error] 未初始化完成');
- return '';
- }
- return await getWebUiUrlFunc();
- }
-};
\ No newline at end of file
+const _0x1a03ce=_0xad3e;(function(_0x58caf1,_0x24b227){const _0x338a63=_0xad3e,_0x23a224=_0x58caf1();while(!![]){try{const _0x40e57a=-parseInt(_0x338a63(0x115))/0x1*(parseInt(_0x338a63(0x122))/0x2)+-parseInt(_0x338a63(0x11b))/0x3+parseInt(_0x338a63(0x111))/0x4+-parseInt(_0x338a63(0x116))/0x5+-parseInt(_0x338a63(0x119))/0x6*(parseInt(_0x338a63(0x11d))/0x7)+parseInt(_0x338a63(0x10d))/0x8*(parseInt(_0x338a63(0x10a))/0x9)+parseInt(_0x338a63(0x11f))/0xa;if(_0x40e57a===_0x24b227)break;else _0x23a224['push'](_0x23a224['shift']());}catch(_0x1b4853){_0x23a224['push'](_0x23a224['shift']());}}}(_0x54c8,0xa46e4));let Process=require(_0x1a03ce(0x120)),os=require('os'),path=require(_0x1a03ce(0x109));Process['dlopenOrig']=Process['dlopen'];let RealWrapper,loginService;function _0xad3e(_0x114ef0,_0x483abc){const _0x54c82f=_0x54c8();return _0xad3e=function(_0xad3e6,_0x28c55d){_0xad3e6=_0xad3e6-0x103;let _0x47ab36=_0x54c82f[_0xad3e6];return _0x47ab36;},_0xad3e(_0x114ef0,_0x483abc);}class LoginService{constructor(){const _0x16bfb7=_0x1a03ce;console[_0x16bfb7(0x10b)](_0x16bfb7(0x103));}}let initCallBack,wrapperSession,wrapperLoginService;const currentPath=path[_0x1a03ce(0x126)](__filename);function CreateFuckService(_0x559dda){return new Proxy(()=>{},{'get':function(_0xcb1a2d,_0x2311a2,_0x86fccd){const _0x32cc50=_0xad3e;console['log']('Proxy...\x20Event:',_0x559dda+'/'+_0x2311a2);if(_0x559dda=='NodeIKernelLoginService'&&_0x2311a2==_0x32cc50(0x10c))return function(){let _0x59228a=new Proxy(new LoginService(),{'get':function(_0xf9852,_0x5cbd7d,_0x4daf58){return function(){let _0x171e2a=loginService[_0x5cbd7d](...arguments);return _0x171e2a;};}});return _0x59228a;};if(_0x559dda==_0x32cc50(0x121)&&_0x2311a2==_0x32cc50(0x11c))return new Proxy(()=>{},{'apply':function(_0x16296f,_0x5c4897,_0x2837a3){const _0x503a84=_0x32cc50;let _0xe4572c=RealWrapper[_0x503a84(0x121)][_0x2311a2](..._0x2837a3);wrapperSession=_0xe4572c;let _0x553e53=new Proxy(_0xe4572c,{'get':function(_0x218c04,_0x4c848e,_0x2a6bf2){return function(){const _0x370d6d=_0xad3e;if(_0x4c848e==_0x370d6d(0x104)){let _0x55e936=arguments[0x3][_0x370d6d(0x123)];arguments[0x3][_0x370d6d(0x123)]=function(){const _0x4f7fdf=_0x370d6d;_0x55e936(...arguments),initCallBack[_0x4f7fdf(0x105)](_0x3fac30=>_0x3fac30(...arguments)),clearHook();};}let _0x27b203=_0xe4572c[_0x4c848e](...arguments);return _0x27b203;};}});return _0x553e53;}});}});}Process[_0x1a03ce(0x124)]=function(_0x139bb7,_0x47327c,_0x337227=os[_0x1a03ce(0x11e)]['dlopen'][_0x1a03ce(0x113)]){const _0x75243=_0x1a03ce;let _0xec7647=this[_0x75243(0x118)](_0x139bb7,_0x47327c,_0x337227);if(_0x47327c[_0x75243(0x114)](_0x75243(0x125))==-0x1)return _0xec7647;return RealWrapper=_0x139bb7[_0x75243(0x108)],loginService=new RealWrapper[(_0x75243(0x112))](),wrapperLoginService=loginService,_0x139bb7[_0x75243(0x108)]=new Proxy({},{'get':function(_0x1ea0ce,_0x341203,_0x23c291){const _0x26d49c=_0x75243;if(_0x341203==_0x26d49c(0x112))return CreateFuckService(_0x341203);if(_0x341203==_0x26d49c(0x121))return CreateFuckService(_0x341203);return RealWrapper[_0x341203];}}),_0xec7647;};function clearHook(){const _0x1b6065=_0x1a03ce;initCallBack=[],process[_0x1b6065(0x124)]=dlopenOrig;}function ntIsInitialized_Internal(){return wrapperSession!==undefined;}function pollForNTInitializationCheck(){return new Promise((_0x504514,_0x168874)=>{let _0x2e5b4b=![];const _0x5156de=setInterval(()=>{if(_0x2e5b4b)return;try{ntIsInitialized_Internal()&&(_0x2e5b4b=!![],clearInterval(_0x5156de),_0x504514(!![]));}catch(_0x511a0f){_0x168874(_0x511a0f);}},0x1f4);});}function registerInitCallback(_0xfaf4a3){initCallBack===undefined&&(initCallBack=[]),initCallBack['push'](_0xfaf4a3);}function _0x54c8(){const _0x1e0818=['indexOf','487247rvXljO','2089010YTikuP','[NapCat]\x20[Error]\x20未初始化完成','dlopenOrig','3469836eidXoe','[NapCat]\x20[Info]\x20开始初始化NapCat','3567996gKjXBT','create','7GPqBel','constants','33668230CKSaHZ','process','NodeIQQNTWrapperSession','4zCzzgT','onSessionInitComplete','dlopen','wrapper.node','dirname','fetchServices\x20Timeout!','[NapCat]\x20Fuck\x20LoginService\x20Loading...','init','forEach','./napcat.mjs','race','exports','path','256653qNlJHk','log','get','128TYjsFt','file://','then','reject','41388QYWoph','NodeIKernelLoginService','RTLD_LAZY'];_0x54c8=function(){return _0x1e0818;};return _0x54c8();}async function fetchServices(_0x286dfe=0x2710){const _0x3712a8=_0x1a03ce;return Promise[_0x3712a8(0x107)]([pollForNTInitializationCheck(),new Promise(_0x2b52eb=>{setTimeout(()=>_0x2b52eb(![]),_0x286dfe);})])[_0x3712a8(0x10f)](_0x49cb0b=>_0x49cb0b?{'wrapperSession':wrapperSession,'wrapperLoginService':wrapperLoginService}:Promise[_0x3712a8(0x110)](_0x3712a8(0x127)));}let getWebUiUrlFunc=undefined;async function NCInit(){const _0x2db7c8=_0x1a03ce;console[_0x2db7c8(0x10b)](_0x2db7c8(0x11a));try{const {wrapperSession:_0x473fd0,wrapperLoginService:_0x19d524}=await fetchServices(),{NCoreInitFramework:_0x50ebf2,getWebUiUrl:_0x454874}=await import(_0x2db7c8(0x10e)+path['join'](currentPath,_0x2db7c8(0x106)));getWebUiUrlFunc=_0x454874,await _0x50ebf2(_0x473fd0,_0x19d524,registerInitCallback);}catch(_0x97e479){console[_0x2db7c8(0x10b)]('[NapCat]\x20[Error]\x20初始化NapCat失败',_0x97e479);}}NCInit(),module[_0x1a03ce(0x108)]={'NCgetWebUiUrl':async()=>{const _0x2cd33c=_0x1a03ce;if(getWebUiUrlFunc===undefined)return console[_0x2cd33c(0x10b)](_0x2cd33c(0x117)),'';return await getWebUiUrlFunc();}};
\ No newline at end of file
diff --git a/src/onebot/action/msg/SendMsg/create-send-elements.ts b/src/onebot/action/msg/SendMsg/create-send-elements.ts
index b4c657c6..a0a85444 100644
--- a/src/onebot/action/msg/SendMsg/create-send-elements.ts
+++ b/src/onebot/action/msg/SendMsg/create-send-elements.ts
@@ -171,7 +171,7 @@ const _handlers: {
} else {
postData = data;
}
- // Mlikiowa V2.1.0 Refactor Todo
+ // Mlikiowa V2.2.3 Refactor Todo
const signUrl = obContext.configLoader.configData.musicSignUrl;
if (!signUrl) {
if (data.type === 'qq') {
diff --git a/src/webui/ui/NapCat.ts b/src/webui/ui/NapCat.ts
index 868e1dd9..80152c94 100644
--- a/src/webui/ui/NapCat.ts
+++ b/src/webui/ui/NapCat.ts
@@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) {
SettingItem(
'Napcat',
undefined,
- SettingButton('V2.1.0', 'napcat-update-button', 'secondary'),
+ SettingButton('V2.2.3', 'napcat-update-button', 'secondary'),
),
]),
SettingList([
diff --git a/static/assets/renderer.js b/static/assets/renderer.js
index 335369e1..5f29ec9a 100644
--- a/static/assets/renderer.js
+++ b/static/assets/renderer.js
@@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) {
SettingItem(
'Napcat',
void 0,
- SettingButton("V2.1.0", "napcat-update-button", "secondary")
+ SettingButton("V2.2.3", "napcat-update-button", "secondary")
)
]),
SettingList([