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([