mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
89f7892681 | ||
![]() |
aad5ed55d2 | ||
![]() |
86da417c17 | ||
![]() |
96b1f71437 | ||
![]() |
5e0b3b2f35 | ||
![]() |
6829fad5bd | ||
![]() |
7af0d9e87b | ||
![]() |
c089ebea99 |
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@@ -1,5 +1,8 @@
|
|||||||
name: "Build Action"
|
name: "Build Action"
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions: write-all
|
permissions: write-all
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"name": "NapCatQQ",
|
"name": "NapCatQQ",
|
||||||
"slug": "NapCat.Framework",
|
"slug": "NapCat.Framework",
|
||||||
"description": "高性能的 OneBot 11 协议实现",
|
"description": "高性能的 OneBot 11 协议实现",
|
||||||
"version": "3.7.0",
|
"version": "4.0.2",
|
||||||
"icon": "./logo.png",
|
"icon": "./logo.png",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
"name": "napcat",
|
"name": "napcat",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "3.7.0",
|
"version": "4.0.2",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:framework": "vite build --mode framework",
|
"build:framework": "vite build --mode framework",
|
||||||
"build:shell": "vite build --mode shell",
|
"build:shell": "vite build --mode shell",
|
||||||
@@ -44,13 +44,13 @@
|
|||||||
"vite": "^5.2.6",
|
"vite": "^5.2.6",
|
||||||
"vite-plugin-cp": "^4.0.8",
|
"vite-plugin-cp": "^4.0.8",
|
||||||
"vite-tsconfig-paths": "^5.1.0",
|
"vite-tsconfig-paths": "^5.1.0",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0"
|
||||||
"fluent-ffmpeg": "^2.1.2"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^5.0.0",
|
"express": "^5.0.0",
|
||||||
"silk-wasm": "^3.6.1",
|
"silk-wasm": "^3.6.1",
|
||||||
"ws": "^8.18.0",
|
"ws": "^8.18.0",
|
||||||
"qrcode-terminal": "^0.12.0"
|
"qrcode-terminal": "^0.12.0",
|
||||||
|
"fluent-ffmpeg": "^2.1.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1 +1 @@
|
|||||||
export const napCatVersion = '3.7.0';
|
export const napCatVersion = '4.0.2';
|
||||||
|
@@ -472,7 +472,7 @@ export class NTQQFileApi {
|
|||||||
return IMAGE_HTTP_HOST_NT + urlRkey;
|
return IMAGE_HTTP_HOST_NT + urlRkey;
|
||||||
} else if (isNTV2 && rkeyData.online_rkey) {
|
} else if (isNTV2 && rkeyData.online_rkey) {
|
||||||
const rkey = imageAppid === '1406' ? rkeyData.private_rkey : rkeyData.group_rkey;
|
const rkey = imageAppid === '1406' ? rkeyData.private_rkey : rkeyData.group_rkey;
|
||||||
return IMAGE_HTTP_HOST_NT + parsedUrl.pathname + `&rkey=${rkey}`;
|
return IMAGE_HTTP_HOST_NT + `/download?appid=${imageAppid}&fileid=${imageFileId}&rkey=${rkey}`;
|
||||||
} else if (isNTV2 && imageFileId) {
|
} else if (isNTV2 && imageFileId) {
|
||||||
const rkey = imageAppid === '1406' ? rkeyData.private_rkey : rkeyData.group_rkey;
|
const rkey = imageAppid === '1406' ? rkeyData.private_rkey : rkeyData.group_rkey;
|
||||||
return IMAGE_HTTP_HOST + `/download?appid=${imageAppid}&fileid=${imageFileId}&rkey=${rkey}`;
|
return IMAGE_HTTP_HOST + `/download?appid=${imageAppid}&fileid=${imageFileId}&rkey=${rkey}`;
|
||||||
|
@@ -65,35 +65,22 @@ export class PacketOperationContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async UploadResources(msg: PacketMsg[], groupUin: number = 0) {
|
async UploadResources(msg: PacketMsg[], groupUin: number = 0) {
|
||||||
const reqList = [];
|
const chatType = groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C;
|
||||||
for (const m of msg) {
|
const peerUid = groupUin ? String(groupUin) : this.context.napcore.basicInfo.uid;
|
||||||
for (const e of m.msg) {
|
const reqList = msg.flatMap(m =>
|
||||||
|
m.msg.map(e => {
|
||||||
if (e instanceof PacketMsgPicElement) {
|
if (e instanceof PacketMsgPicElement) {
|
||||||
reqList.push(this.context.highway.uploadImage({
|
return this.context.highway.uploadImage({ chatType, peerUid }, e);
|
||||||
chatType: groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C,
|
} else if (e instanceof PacketMsgVideoElement) {
|
||||||
peerUid: groupUin ? String(groupUin) : this.context.napcore.basicInfo.uid
|
return this.context.highway.uploadVideo({ chatType, peerUid }, e);
|
||||||
}, e));
|
} else if (e instanceof PacketMsgPttElement) {
|
||||||
}
|
return this.context.highway.uploadPtt({ chatType, peerUid }, e);
|
||||||
if (e instanceof PacketMsgVideoElement) {
|
} else if (e instanceof PacketMsgFileElement) {
|
||||||
reqList.push(this.context.highway.uploadVideo({
|
return this.context.highway.uploadFile({ chatType, peerUid }, e);
|
||||||
chatType: groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C,
|
|
||||||
peerUid: groupUin ? String(groupUin) : this.context.napcore.basicInfo.uid
|
|
||||||
}, e));
|
|
||||||
}
|
|
||||||
if (e instanceof PacketMsgPttElement) {
|
|
||||||
reqList.push(this.context.highway.uploadPtt({
|
|
||||||
chatType: groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C,
|
|
||||||
peerUid: groupUin ? String(groupUin) : this.context.napcore.basicInfo.uid
|
|
||||||
}, e));
|
|
||||||
}
|
|
||||||
if (e instanceof PacketMsgFileElement) {
|
|
||||||
reqList.push(this.context.highway.uploadFile({
|
|
||||||
chatType: groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C,
|
|
||||||
peerUid: groupUin ? String(groupUin) : this.context.napcore.basicInfo.uid
|
|
||||||
}, e));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}).filter(Boolean)
|
||||||
|
);
|
||||||
const res = await Promise.allSettled(reqList);
|
const res = await Promise.allSettled(reqList);
|
||||||
this.context.logger.info(`上传资源${res.length}个,失败${res.filter(r => r.status === 'rejected').length}个`);
|
this.context.logger.info(`上传资源${res.length}个,失败${res.filter(r => r.status === 'rejected').length}个`);
|
||||||
res.forEach((result, index) => {
|
res.forEach((result, index) => {
|
||||||
|
@@ -45,11 +45,17 @@ export class Sha1Stream {
|
|||||||
let e = this._state[4];
|
let e = this._state[4];
|
||||||
|
|
||||||
for (let i = 0; i < 80; i++) {
|
for (let i = 0; i < 80; i++) {
|
||||||
const [f, k] = (i < 20) ? [(b & c) | ((~b) & d), 0x5A827999] :
|
let temp;
|
||||||
(i < 40) ? [b ^ c ^ d, 0x6ED9EBA1] :
|
if (i < 20) {
|
||||||
(i < 60) ? [(b & c) | (b & d) | (c & d), 0x8F1BBCDC] :
|
temp = ((b & c) | (~b & d)) + 0x5A827999;
|
||||||
[b ^ c ^ d, 0xCA62C1D6];
|
} else if (i < 40) {
|
||||||
const temp = (this.rotateLeft(a, 5) + f + k + e + w[i]) >>> 0;
|
temp = (b ^ c ^ d) + 0x6ED9EBA1;
|
||||||
|
} else if (i < 60) {
|
||||||
|
temp = ((b & c) | (b & d) | (c & d)) + 0x8F1BBCDC;
|
||||||
|
} else {
|
||||||
|
temp = (b ^ c ^ d) + 0xCA62C1D6;
|
||||||
|
}
|
||||||
|
temp += ((this.rotateLeft(a, 5) + e + w[i]) >>> 0);
|
||||||
e = d;
|
e = d;
|
||||||
d = c;
|
d = c;
|
||||||
c = this.rotateLeft(b, 30) >>> 0;
|
c = this.rotateLeft(b, 30) >>> 0;
|
||||||
|
@@ -8,6 +8,7 @@ const SchemaData = {
|
|||||||
properties: {
|
properties: {
|
||||||
message_id: { type: ['string', 'number'] },
|
message_id: { type: ['string', 'number'] },
|
||||||
emoji_id: { type: ['string', 'number'] },
|
emoji_id: { type: ['string', 'number'] },
|
||||||
|
set: { type: ['boolean', 'string'] }
|
||||||
},
|
},
|
||||||
required: ['message_id', 'emoji_id'],
|
required: ['message_id', 'emoji_id'],
|
||||||
} as const satisfies JSONSchema;
|
} as const satisfies JSONSchema;
|
||||||
@@ -26,10 +27,19 @@ export class SetMsgEmojiLike extends BaseAction<Payload, any> {
|
|||||||
if (!payload.emoji_id) {
|
if (!payload.emoji_id) {
|
||||||
throw new Error('emojiId not found');
|
throw new Error('emojiId not found');
|
||||||
}
|
}
|
||||||
|
if (!payload.set) {
|
||||||
|
payload.set = true;
|
||||||
|
}
|
||||||
|
|
||||||
const msgData = (await this.core.apis.MsgApi.getMsgsByMsgId(msg.Peer, [msg.MsgId])).msgList;
|
const msgData = (await this.core.apis.MsgApi.getMsgsByMsgId(msg.Peer, [msg.MsgId])).msgList;
|
||||||
if (!msgData || msgData.length == 0 || !msgData[0].msgSeq) {
|
if (!msgData || msgData.length == 0 || !msgData[0].msgSeq) {
|
||||||
throw new Error('find msg by msgid error');
|
throw new Error('find msg by msgid error');
|
||||||
}
|
}
|
||||||
return await this.core.apis.MsgApi.setEmojiLike(msg.Peer, msgData[0].msgSeq, payload.emoji_id.toString(), true);
|
return await this.core.apis.MsgApi.setEmojiLike(
|
||||||
|
msg.Peer,
|
||||||
|
msgData[0].msgSeq,
|
||||||
|
payload.emoji_id.toString(),
|
||||||
|
typeof payload.set == 'string' ? payload.set === 'true' : !!payload
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -290,7 +290,7 @@ export async function NCoreInitShell() {
|
|||||||
await initializeEngine(engine, basicInfoWrapper, dataPathGlobal, systemPlatform, systemVersion);
|
await initializeEngine(engine, basicInfoWrapper, dataPathGlobal, systemPlatform, systemVersion);
|
||||||
await initializeLoginService(loginService, basicInfoWrapper, dataPathGlobal, systemVersion, hostname);
|
await initializeLoginService(loginService, basicInfoWrapper, dataPathGlobal, systemVersion, hostname);
|
||||||
|
|
||||||
let quickLoginUin = cmdOptions.qq;
|
const quickLoginUin = cmdOptions.qq;
|
||||||
const historyLoginList = (await loginService.getLoginList()).LocalLoginInfoList;
|
const historyLoginList = (await loginService.getLoginList()).LocalLoginInfoList;
|
||||||
|
|
||||||
const dataTimestape = new Date().getTime().toString();
|
const dataTimestape = new Date().getTime().toString();
|
||||||
|
@@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) {
|
|||||||
SettingItem(
|
SettingItem(
|
||||||
'<span id="napcat-update-title">Napcat</span>',
|
'<span id="napcat-update-title">Napcat</span>',
|
||||||
void 0,
|
void 0,
|
||||||
SettingButton("V3.7.0", "napcat-update-button", "secondary")
|
SettingButton("V4.0.2", "napcat-update-button", "secondary")
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
SettingList([
|
SettingList([
|
||||||
|
@@ -4,7 +4,7 @@ import { resolve } from 'path';
|
|||||||
import nodeResolve from '@rollup/plugin-node-resolve';
|
import nodeResolve from '@rollup/plugin-node-resolve';
|
||||||
import { builtinModules } from 'module';
|
import { builtinModules } from 'module';
|
||||||
//依赖排除
|
//依赖排除
|
||||||
const external = ['silk-wasm', 'ws', 'express', 'qrcode-terminal'];
|
const external = ['silk-wasm', 'ws', 'express', 'qrcode-terminal', 'fluent-ffmpeg'];
|
||||||
const nodeModules = [...builtinModules, builtinModules.map(m => `node:${m}`)].flat();
|
const nodeModules = [...builtinModules, builtinModules.map(m => `node:${m}`)].flat();
|
||||||
function genCpModule(module: string) {
|
function genCpModule(module: string) {
|
||||||
return { src: `./node_modules/${module}`, dest: `dist/node_modules/${module}`, flatten: false };
|
return { src: `./node_modules/${module}`, dest: `dist/node_modules/${module}`, flatten: false };
|
||||||
|
Reference in New Issue
Block a user