mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b0eae307c2 | ||
![]() |
f5d2b54cca | ||
![]() |
3eefec3899 |
@@ -4,7 +4,7 @@
|
|||||||
"name": "NapCatQQ",
|
"name": "NapCatQQ",
|
||||||
"slug": "NapCat.Framework",
|
"slug": "NapCat.Framework",
|
||||||
"description": "高性能的 OneBot 11 协议实现",
|
"description": "高性能的 OneBot 11 协议实现",
|
||||||
"version": "3.0.3",
|
"version": "3.0.5",
|
||||||
"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.0.3",
|
"version": "3.0.5",
|
||||||
"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",
|
||||||
|
@@ -1 +1 @@
|
|||||||
export const napCatVersion = '3.0.3';
|
export const napCatVersion = '3.0.5';
|
||||||
|
@@ -1,18 +1,19 @@
|
|||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import {ChatType, InstanceContext, NapCatCore} from '..';
|
import { ChatType, InstanceContext, NapCatCore } from '..';
|
||||||
import offset from '@/core/external/offset.json';
|
import offset from '@/core/external/offset.json';
|
||||||
import {PacketClient, RecvPacketData} from '@/core/packet/client';
|
import { PacketClient, RecvPacketData } from '@/core/packet/client';
|
||||||
import {PacketSession} from "@/core/packet/session";
|
import { PacketSession } from "@/core/packet/session";
|
||||||
import {PacketHexStr} from "@/core/packet/packer";
|
import { PacketHexStr } from "@/core/packet/packer";
|
||||||
import {NapProtoMsg} from '@/core/packet/proto/NapProto';
|
import { NapProtoMsg } from '@/core/packet/proto/NapProto';
|
||||||
import {OidbSvcTrpcTcp0X9067_202_Rsp_Body} from '@/core/packet/proto/oidb/Oidb.0x9067_202';
|
import { OidbSvcTrpcTcp0X9067_202_Rsp_Body } from '@/core/packet/proto/oidb/Oidb.0x9067_202';
|
||||||
import {OidbSvcTrpcTcpBase, OidbSvcTrpcTcpBaseRsp} from '@/core/packet/proto/oidb/OidbBase';
|
import { OidbSvcTrpcTcpBase, OidbSvcTrpcTcpBaseRsp } from '@/core/packet/proto/oidb/OidbBase';
|
||||||
import {OidbSvcTrpcTcp0XFE1_2RSP} from '@/core/packet/proto/oidb/Oidb.0XFE1_2';
|
import { OidbSvcTrpcTcp0XFE1_2RSP } from '@/core/packet/proto/oidb/Oidb.0XFE1_2';
|
||||||
import {LogWrapper} from "@/common/log";
|
import { LogWrapper } from "@/common/log";
|
||||||
import {SendLongMsgResp} from "@/core/packet/proto/message/action";
|
import { SendLongMsgResp } from "@/core/packet/proto/message/action";
|
||||||
import {PacketMsg} from "@/core/packet/msg/message";
|
import { PacketMsg } from "@/core/packet/msg/message";
|
||||||
import {OidbSvcTrpcTcp0x6D6Response} from "@/core/packet/proto/oidb/Oidb.0x6D6";
|
import { OidbSvcTrpcTcp0x6D6Response } from "@/core/packet/proto/oidb/Oidb.0x6D6";
|
||||||
import {PacketMsgPicElement} from "@/core/packet/msg/element";
|
import { PacketMsgPicElement } from "@/core/packet/msg/element";
|
||||||
|
import { c } from 'vite/dist/node/types.d-aGj9QkWt';
|
||||||
|
|
||||||
interface OffsetType {
|
interface OffsetType {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
@@ -59,8 +60,12 @@ export class NTQQPacketApi {
|
|||||||
if (!table) return false;
|
if (!table) return false;
|
||||||
const url = 'ws://' + this.serverUrl + '/ws';
|
const url = 'ws://' + this.serverUrl + '/ws';
|
||||||
this.packetSession = new PacketSession(this.core.context.logger, new PacketClient(url, this.core));
|
this.packetSession = new PacketSession(this.core.context.logger, new PacketClient(url, this.core));
|
||||||
await this.packetSession.client.connect();
|
const cb = () => {
|
||||||
await this.packetSession.client.init(process.pid, table.recv, table.send);
|
if (this.packetSession && this.packetSession.client) {
|
||||||
|
this.packetSession.client.init(process.pid, table.recv, table.send).then().catch(this.logger.logError.bind(this.logger));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await this.packetSession.client.connect(cb);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,11 +111,11 @@ export class NTQQPacketApi {
|
|||||||
await this.sendPacket('OidbSvcTrpcTcp.0x8fc_2', data!, true);
|
await this.sendPacket('OidbSvcTrpcTcp.0x8fc_2', data!, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async uploadResources(msg: PacketMsg[], groupUin: number = 0){
|
private async uploadResources(msg: PacketMsg[], groupUin: number = 0) {
|
||||||
const reqList = []
|
const reqList = []
|
||||||
for (const m of msg){
|
for (const m of msg) {
|
||||||
for (const e of m.msg){
|
for (const e of m.msg) {
|
||||||
if (e instanceof PacketMsgPicElement){
|
if (e instanceof PacketMsgPicElement) {
|
||||||
reqList.push(this.packetSession?.highwaySession.uploadImage({
|
reqList.push(this.packetSession?.highwaySession.uploadImage({
|
||||||
chatType: groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C,
|
chatType: groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C,
|
||||||
peerUid: String(groupUin) ? String(groupUin) : this.core.selfInfo.uid
|
peerUid: String(groupUin) ? String(groupUin) : this.core.selfInfo.uid
|
||||||
@@ -135,7 +140,7 @@ export class NTQQPacketApi {
|
|||||||
const ret = await this.sendPacket('OidbSvcTrpcTcp.0x6d6_2', data!, true);
|
const ret = await this.sendPacket('OidbSvcTrpcTcp.0x6d6_2', data!, true);
|
||||||
const body = new NapProtoMsg(OidbSvcTrpcTcpBaseRsp).decode(Buffer.from(ret.hex_data, 'hex')).body;
|
const body = new NapProtoMsg(OidbSvcTrpcTcpBaseRsp).decode(Buffer.from(ret.hex_data, 'hex')).body;
|
||||||
const resp = new NapProtoMsg(OidbSvcTrpcTcp0x6D6Response).decode(body);
|
const resp = new NapProtoMsg(OidbSvcTrpcTcp0x6D6Response).decode(body);
|
||||||
if (resp.download.retCode !== 0){
|
if (resp.download.retCode !== 0) {
|
||||||
throw new Error(`sendGroupFileDownloadReq error: ${resp.download.clientWording}`);
|
throw new Error(`sendGroupFileDownloadReq error: ${resp.download.clientWording}`);
|
||||||
}
|
}
|
||||||
return `https://${resp.download.downloadDns}/ftn_handler/${Buffer.from(resp.download.downloadUrl).toString('hex')}/?fname=`
|
return `https://${resp.download.downloadDns}/ftn_handler/${Buffer.from(resp.download.downloadUrl).toString('hex')}/?fname=`
|
||||||
|
@@ -22,7 +22,7 @@ export class PacketClient {
|
|||||||
private websocket: WebSocket | undefined;
|
private websocket: WebSocket | undefined;
|
||||||
private isConnected: boolean = false;
|
private isConnected: boolean = false;
|
||||||
private reconnectAttempts: number = 0;
|
private reconnectAttempts: number = 0;
|
||||||
private readonly maxReconnectAttempts: number = 5;//现在暂时不可配置
|
private readonly maxReconnectAttempts: number = 60;//现在暂时不可配置
|
||||||
private readonly cb = new LRUCache<string, (json: RecvPacketData) => Promise<void>>(500); // trace_id-type callback
|
private readonly cb = new LRUCache<string, (json: RecvPacketData) => Promise<void>>(500); // trace_id-type callback
|
||||||
private readonly clientUrl: string = '';
|
private readonly clientUrl: string = '';
|
||||||
readonly napCatCore: NapCatCore;
|
readonly napCatCore: NapCatCore;
|
||||||
@@ -47,16 +47,17 @@ export class PacketClient {
|
|||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(): Promise<void> {
|
connect(cb: any): Promise<void> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
//this.logger.log.bind(this.logger)(`[Core] [Packet Server] Attempting to connect to ${this.clientUrl}`);
|
//this.logger.log.bind(this.logger)(`[Core] [Packet Server] Attempting to connect to ${this.clientUrl}`);
|
||||||
this.websocket = new WebSocket(this.clientUrl);
|
this.websocket = new WebSocket(this.clientUrl);
|
||||||
this.websocket.on('error', (err) => {}/*this.logger.logError.bind(this.logger)('[Core] [Packet Server] Error:', err.message)*/);
|
this.websocket.on('error', (err) => { }/*this.logger.logError.bind(this.logger)('[Core] [Packet Server] Error:', err.message)*/);
|
||||||
|
|
||||||
this.websocket.onopen = () => {
|
this.websocket.onopen = () => {
|
||||||
this.isConnected = true;
|
this.isConnected = true;
|
||||||
this.reconnectAttempts = 0;
|
this.reconnectAttempts = 0;
|
||||||
this.logger.log.bind(this.logger)(`[Core] [Packet Server] Connected to ${this.clientUrl}`);
|
this.logger.log.bind(this.logger)(`[Core] [Packet Server] Connected to ${this.clientUrl}`);
|
||||||
|
cb();
|
||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -74,17 +75,17 @@ export class PacketClient {
|
|||||||
this.websocket.onclose = () => {
|
this.websocket.onclose = () => {
|
||||||
this.isConnected = false;
|
this.isConnected = false;
|
||||||
//this.logger.logWarn.bind(this.logger)(`[Core] [Packet Server] Disconnected from ${this.clientUrl}`);
|
//this.logger.logWarn.bind(this.logger)(`[Core] [Packet Server] Disconnected from ${this.clientUrl}`);
|
||||||
this.attemptReconnect();
|
this.attemptReconnect(cb);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private attemptReconnect(): void {
|
private attemptReconnect(cb: any): void {
|
||||||
try {
|
try {
|
||||||
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
||||||
this.reconnectAttempts++;
|
this.reconnectAttempts++;
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.connect().catch((error) => {
|
this.connect(cb).catch((error) => {
|
||||||
this.logger.logError.bind(this.logger)(`[Core] [Packet Server] Reconnecting attempt failed,${error.message}`);
|
this.logger.logError.bind(this.logger)(`[Core] [Packet Server] Reconnecting attempt failed,${error.message}`);
|
||||||
});
|
});
|
||||||
}, 5000 * this.reconnectAttempts);
|
}, 5000 * this.reconnectAttempts);
|
||||||
|
@@ -576,8 +576,6 @@ export class NapCatOneBot11Adapter {
|
|||||||
this.networkManager.emitEvent(ob11Msg);
|
this.networkManager.emitEvent(ob11Msg);
|
||||||
}).catch(e => this.context.logger.logError.bind(this.context.logger)('constructMessage error: ', e));
|
}).catch(e => this.context.logger.logError.bind(this.context.logger)('constructMessage error: ', e));
|
||||||
|
|
||||||
console.log('message', message);
|
|
||||||
|
|
||||||
this.apis.GroupApi.parseGroupEvent(message).then(groupEvent => {
|
this.apis.GroupApi.parseGroupEvent(message).then(groupEvent => {
|
||||||
if (groupEvent) {
|
if (groupEvent) {
|
||||||
// log("post group event", groupEvent);
|
// log("post group event", groupEvent);
|
||||||
|
@@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) {
|
|||||||
SettingItem(
|
SettingItem(
|
||||||
'<span id="napcat-update-title">Napcat</span>',
|
'<span id="napcat-update-title">Napcat</span>',
|
||||||
undefined,
|
undefined,
|
||||||
SettingButton('V3.0.3', 'napcat-update-button', 'secondary'),
|
SettingButton('V3.0.5', 'napcat-update-button', 'secondary'),
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
SettingList([
|
SettingList([
|
||||||
|
@@ -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.0.3", "napcat-update-button", "secondary")
|
SettingButton("V3.0.5", "napcat-update-button", "secondary")
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
SettingList([
|
SettingList([
|
||||||
|
Reference in New Issue
Block a user