mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
21 Commits
feat-new-c
...
v4.7.68
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5dd3bade53 | ||
![]() |
665360f48d | ||
![]() |
65719cb56a | ||
![]() |
bdb76d4639 | ||
![]() |
15634412ef | ||
![]() |
bbcf9649fa | ||
![]() |
e845d7314e | ||
![]() |
6927b1c94f | ||
![]() |
a09c6acd0d | ||
![]() |
0963650ccb | ||
![]() |
380688b353 | ||
![]() |
ad5466bff8 | ||
![]() |
a83652bf3f | ||
![]() |
c632de314d | ||
![]() |
259c9610d5 | ||
![]() |
e9936c5524 | ||
![]() |
3f60440e72 | ||
![]() |
71a15f92fb | ||
![]() |
32bc0dd820 | ||
![]() |
20d1ac9d01 | ||
![]() |
18baf89e0e |
@@ -4,7 +4,7 @@
|
|||||||
"name": "NapCatQQ",
|
"name": "NapCatQQ",
|
||||||
"slug": "NapCat.Framework",
|
"slug": "NapCat.Framework",
|
||||||
"description": "高性能的 OneBot 11 协议实现",
|
"description": "高性能的 OneBot 11 协议实现",
|
||||||
"version": "4.7.63",
|
"version": "4.7.67",
|
||||||
"icon": "./logo.png",
|
"icon": "./logo.png",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
@@ -92,7 +92,9 @@ const MusicInsert = () => {
|
|||||||
className="w-96"
|
className="w-96"
|
||||||
fullWidth
|
fullWidth
|
||||||
selectedKey={mode}
|
selectedKey={mode}
|
||||||
onSelectionChange={setMode}
|
onSelectionChange={(key) => {
|
||||||
|
if (key !== null) setMode(key)
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<Tab title="主流平台" key="default" className="flex flex-col gap-2">
|
<Tab title="主流平台" key="default" className="flex flex-col gap-2">
|
||||||
<Select
|
<Select
|
||||||
|
@@ -56,9 +56,9 @@ export default function TerminalPage() {
|
|||||||
|
|
||||||
setTabs((prev) => [...prev, newTab])
|
setTabs((prev) => [...prev, newTab])
|
||||||
setSelectedTab(id)
|
setSelectedTab(id)
|
||||||
} catch (error) {
|
} catch (error: unknown) {
|
||||||
console.error('Failed to create terminal:', error)
|
console.error('Failed to create terminal:', error)
|
||||||
toast.error('创建终端失败')
|
toast.error((error as Error).message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
"name": "napcat",
|
"name": "napcat",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "4.7.63",
|
"version": "4.7.67",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:universal": "npm run build:webui && vite build --mode universal || exit 1",
|
"build:universal": "npm run build:webui && vite build --mode universal || exit 1",
|
||||||
"build:framework": "npm run build:webui && vite build --mode framework || exit 1",
|
"build:framework": "npm run build:webui && vite build --mode framework || exit 1",
|
||||||
|
@@ -1 +1 @@
|
|||||||
export const napCatVersion = '4.7.63';
|
export const napCatVersion = '4.7.67';
|
||||||
|
8
src/core/external/appid.json
vendored
8
src/core/external/appid.json
vendored
@@ -294,5 +294,13 @@
|
|||||||
"9.9.19-35184": {
|
"9.9.19-35184": {
|
||||||
"appid": 537291048,
|
"appid": 537291048,
|
||||||
"qua": "V1_WIN_NQ_9.9.19_35184_GW_B"
|
"qua": "V1_WIN_NQ_9.9.19_35184_GW_B"
|
||||||
|
},
|
||||||
|
"3.2.17-35341": {
|
||||||
|
"appid": 537291383,
|
||||||
|
"qua": "V1_LNX_NQ_3.2.17_35341_GW_B"
|
||||||
|
},
|
||||||
|
"9.9.19-35341": {
|
||||||
|
"appid": 537291347,
|
||||||
|
"qua": "V1_WIN_NQ_9.9.19_35341_GW_B"
|
||||||
}
|
}
|
||||||
}
|
}
|
12
src/core/external/offset.json
vendored
12
src/core/external/offset.json
vendored
@@ -378,5 +378,17 @@
|
|||||||
"9.9.19-35184-x64": {
|
"9.9.19-35184-x64": {
|
||||||
"send": "3BE5A10",
|
"send": "3BE5A10",
|
||||||
"recv": "3BEA210"
|
"recv": "3BEA210"
|
||||||
|
},
|
||||||
|
"9.9.19-35341-x64": {
|
||||||
|
"send": "3BF1D50",
|
||||||
|
"recv": "3BF6550"
|
||||||
|
},
|
||||||
|
"3.2.17-35341-x64": {
|
||||||
|
"send": "AE2F700",
|
||||||
|
"recv": "AE33120"
|
||||||
|
},
|
||||||
|
"3.2.17-35341-arm64": {
|
||||||
|
"send": "778D840",
|
||||||
|
"recv": "7791170"
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -30,13 +30,8 @@ export class PacketOperationContext {
|
|||||||
return await this.context.client.sendOidbPacket(pkt, rsp);
|
return await this.context.client.sendOidbPacket(pkt, rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
async GroupPoke(groupUin: number, uin: number) {
|
async SendPoke(is_group: boolean, peer: number, target?: number) {
|
||||||
const req = trans.SendPoke.build(uin, groupUin);
|
const req = trans.SendPoke.build(is_group, peer, target ?? peer);
|
||||||
await this.context.client.sendOidbPacket(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
async FriendPoke(uin: number) {
|
|
||||||
const req = trans.SendPoke.build(uin);
|
|
||||||
await this.context.client.sendOidbPacket(req);
|
await this.context.client.sendOidbPacket(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,13 +8,13 @@ class SendPoke extends PacketTransformer<typeof proto.OidbSvcTrpcTcpBase> {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
build(peer: number, group?: number): OidbPacket {
|
build(is_group: boolean, peer: number, target: number): OidbPacket {
|
||||||
const data = new NapProtoMsg(proto.OidbSvcTrpcTcp0XED3_1).encode({
|
const payload = {
|
||||||
uin: peer,
|
uin: target,
|
||||||
groupUin: group,
|
ext: 0,
|
||||||
friendUin: group ?? peer,
|
...(is_group ? { groupUin: peer } : { friendUin: peer })
|
||||||
ext: 0
|
};
|
||||||
});
|
const data = new NapProtoMsg(proto.OidbSvcTrpcTcp0XED3_1).encode(payload);
|
||||||
return OidbBase.build(0xED3, 1, data);
|
return OidbBase.build(0xED3, 1, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@ class OidbBase extends PacketTransformer<typeof proto.OidbSvcTrpcTcpBase> {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
build(cmd: number, subCmd: number, body: Uint8Array, isUid: boolean = true, isLafter: boolean = false): OidbPacket {
|
build(cmd: number, subCmd: number, body: Uint8Array, isUid: boolean = true, _isLafter: boolean = false): OidbPacket {
|
||||||
const data = new NapProtoMsg(proto.OidbSvcTrpcTcpBase).encode({
|
const data = new NapProtoMsg(proto.OidbSvcTrpcTcpBase).encode({
|
||||||
command: cmd,
|
command: cmd,
|
||||||
subCommand: subCmd,
|
subCommand: subCmd,
|
||||||
|
@@ -1,19 +0,0 @@
|
|||||||
import { ActionName } from '@/onebot/action/router';
|
|
||||||
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
|
|
||||||
import { Static, Type } from '@sinclair/typebox';
|
|
||||||
|
|
||||||
const SchemaData = Type.Object({
|
|
||||||
group_id: Type.Union([Type.Number(), Type.String()]),
|
|
||||||
user_id: Type.Union([Type.Number(), Type.String()]),
|
|
||||||
});
|
|
||||||
|
|
||||||
type Payload = Static<typeof SchemaData>;
|
|
||||||
|
|
||||||
export class GroupPoke extends GetPacketStatusDepends<Payload, void> {
|
|
||||||
override actionName = ActionName.GroupPoke;
|
|
||||||
override payloadSchema = SchemaData;
|
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
|
||||||
await this.core.apis.PacketApi.pkt.operation.GroupPoke(+payload.group_id, +payload.user_id);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -78,7 +78,6 @@ import { GetGroupFileSystemInfo } from '@/onebot/action/go-cqhttp/GetGroupFileSy
|
|||||||
import { GetGroupRootFiles } from '@/onebot/action/go-cqhttp/GetGroupRootFiles';
|
import { GetGroupRootFiles } from '@/onebot/action/go-cqhttp/GetGroupRootFiles';
|
||||||
import { GetGroupFilesByFolder } from '@/onebot/action/go-cqhttp/GetGroupFilesByFolder';
|
import { GetGroupFilesByFolder } from '@/onebot/action/go-cqhttp/GetGroupFilesByFolder';
|
||||||
import { GetGroupSystemMsg } from './system/GetSystemMsg';
|
import { GetGroupSystemMsg } from './system/GetSystemMsg';
|
||||||
import { GroupPoke } from './group/GroupPoke';
|
|
||||||
import { GetUserStatus } from './extends/GetUserStatus';
|
import { GetUserStatus } from './extends/GetUserStatus';
|
||||||
import { GetRkey } from './extends/GetRkey';
|
import { GetRkey } from './extends/GetRkey';
|
||||||
import { SetSpecialTitle } from './extends/SetSpecialTitle';
|
import { SetSpecialTitle } from './extends/SetSpecialTitle';
|
||||||
@@ -86,7 +85,6 @@ import { GetGroupShutList } from './group/GetGroupShutList';
|
|||||||
import { GetGroupMemberList } from './group/GetGroupMemberList';
|
import { GetGroupMemberList } from './group/GetGroupMemberList';
|
||||||
import { GetGroupFileUrl } from '@/onebot/action/file/GetGroupFileUrl';
|
import { GetGroupFileUrl } from '@/onebot/action/file/GetGroupFileUrl';
|
||||||
import { GetPacketStatus } from '@/onebot/action/packet/GetPacketStatus';
|
import { GetPacketStatus } from '@/onebot/action/packet/GetPacketStatus';
|
||||||
import { FriendPoke } from '@/onebot/action/user/FriendPoke';
|
|
||||||
import { GetCredentials } from './system/GetCredentials';
|
import { GetCredentials } from './system/GetCredentials';
|
||||||
import { SendGroupSign, SetGroupSign } from './extends/SetGroupSign';
|
import { SendGroupSign, SetGroupSign } from './extends/SetGroupSign';
|
||||||
import { GoCQHTTPGetGroupAtAllRemain } from './go-cqhttp/GetGroupAtAllRemain';
|
import { GoCQHTTPGetGroupAtAllRemain } from './go-cqhttp/GetGroupAtAllRemain';
|
||||||
@@ -102,7 +100,7 @@ import { GetGuildList } from './guild/GetGuildList';
|
|||||||
import { GetGuildProfile } from './guild/GetGuildProfile';
|
import { GetGuildProfile } from './guild/GetGuildProfile';
|
||||||
import { GetClientkey } from './extends/GetClientkey';
|
import { GetClientkey } from './extends/GetClientkey';
|
||||||
import { SendPacket } from './extends/SendPacket';
|
import { SendPacket } from './extends/SendPacket';
|
||||||
import { SendPoke } from '@/onebot/action/packet/SendPoke';
|
import { FriendPoke, GroupPoke, SendPoke } from '@/onebot/action/packet/SendPoke';
|
||||||
import { SetDiyOnlineStatus } from './extends/SetDiyOnlineStatus';
|
import { SetDiyOnlineStatus } from './extends/SetDiyOnlineStatus';
|
||||||
import { BotExit } from './extends/BotExit';
|
import { BotExit } from './extends/BotExit';
|
||||||
import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton';
|
import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton';
|
||||||
|
@@ -3,21 +3,36 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
|
|||||||
import { Static, Type } from '@sinclair/typebox';
|
import { Static, Type } from '@sinclair/typebox';
|
||||||
|
|
||||||
const SchemaData = Type.Object({
|
const SchemaData = Type.Object({
|
||||||
group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
|
group_id: Type.Optional(Type.String()),
|
||||||
user_id: Type.Union([Type.Number(), Type.String()]),
|
user_id: Type.Optional(Type.String()),
|
||||||
|
target_id: Type.Optional(Type.String()),
|
||||||
});
|
});
|
||||||
|
|
||||||
type Payload = Static<typeof SchemaData>;
|
type Payload = Static<typeof SchemaData>;
|
||||||
|
export class SendPokeBase extends GetPacketStatusDepends<Payload, void> {
|
||||||
export class SendPoke extends GetPacketStatusDepends<Payload, void> {
|
|
||||||
override actionName = ActionName.SendPoke;
|
|
||||||
override payloadSchema = SchemaData;
|
override payloadSchema = SchemaData;
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
async _handle(payload: Payload) {
|
||||||
if (payload.group_id) {
|
// 这里的 !! 可以传入空字符串 忽略这些数据有利用接口统一接口
|
||||||
await this.core.apis.PacketApi.pkt.operation.GroupPoke(+payload.group_id, +payload.user_id);
|
const target_id = !!payload.target_id ? payload.target_id : payload.user_id;
|
||||||
} else {
|
const peer_id = !!payload.group_id ? payload.group_id : payload.user_id;
|
||||||
await this.core.apis.PacketApi.pkt.operation.FriendPoke(+payload.user_id);
|
|
||||||
|
const is_group = !!payload.group_id;
|
||||||
|
if (!target_id || !peer_id) {
|
||||||
|
throw new Error('请检查参数,缺少 user_id 或 group_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await this.core.apis.PacketApi.pkt.operation.SendPoke(is_group, +peer_id, +target_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export class SendPoke extends SendPokeBase {
|
||||||
|
override actionName = ActionName.SendPoke;
|
||||||
|
}
|
||||||
|
export class GroupPoke extends SendPokeBase {
|
||||||
|
override actionName = ActionName.GroupPoke;
|
||||||
|
}
|
||||||
|
export class FriendPoke extends SendPokeBase {
|
||||||
|
override actionName = ActionName.FriendPoke;
|
||||||
|
}
|
||||||
|
@@ -1,18 +0,0 @@
|
|||||||
import { ActionName } from '@/onebot/action/router';
|
|
||||||
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
|
|
||||||
import { Static, Type } from '@sinclair/typebox';
|
|
||||||
|
|
||||||
const SchemaData = Type.Object({
|
|
||||||
user_id: Type.Union([Type.Number(), Type.String()])
|
|
||||||
});
|
|
||||||
|
|
||||||
type Payload = Static<typeof SchemaData>;
|
|
||||||
|
|
||||||
export class FriendPoke extends GetPacketStatusDepends<Payload, void> {
|
|
||||||
override actionName = ActionName.FriendPoke;
|
|
||||||
override payloadSchema = SchemaData;
|
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
|
||||||
await this.core.apis.PacketApi.pkt.operation.FriendPoke(+payload.user_id);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -282,7 +282,8 @@ export class NapCatOneBot11Adapter {
|
|||||||
}, 1, 10 * 60 * 1000);
|
}, 1, 10 * 60 * 1000);
|
||||||
// 10分钟 超时
|
// 10分钟 超时
|
||||||
const updatemsg = updatemsgs.find((e) => e.msgId === msg.msgId);
|
const updatemsg = updatemsgs.find((e) => e.msgId === msg.msgId);
|
||||||
if (updatemsg?.sendStatus == SendStatusType.KSEND_STATUS_SUCCESS || updatemsg?.sendStatus == SendStatusType.KSEND_STATUS_SUCCESS_NOSEQ) {
|
// updatemsg?.sendStatus == SendStatusType.KSEND_STATUS_SUCCESS_NOSEQ NOSEQ一般是服务器未下发SEQ 这意味着这条消息不应该推送network
|
||||||
|
if (updatemsg?.sendStatus == SendStatusType.KSEND_STATUS_SUCCESS) {
|
||||||
updatemsg.id = MessageUnique.createUniqueMsgId(
|
updatemsg.id = MessageUnique.createUniqueMsgId(
|
||||||
{
|
{
|
||||||
chatType: updatemsg.chatType,
|
chatType: updatemsg.chatType,
|
||||||
|
@@ -47,6 +47,9 @@ export const CreateTerminalHandler: RequestHandler = async (req, res) => {
|
|||||||
if (isMacOS) {
|
if (isMacOS) {
|
||||||
return sendError(res, 'MacOS不支持终端');
|
return sendError(res, 'MacOS不支持终端');
|
||||||
}
|
}
|
||||||
|
if ((await WebUiConfig.GetWebUIConfig()).token === 'napcat') {
|
||||||
|
return sendError(res, '默认密码禁止创建终端');
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
const { cols, rows } = req.body;
|
const { cols, rows } = req.body;
|
||||||
const { id } = terminalManager.createTerminal(cols, rows);
|
const { id } = terminalManager.createTerminal(cols, rows);
|
||||||
|
@@ -9,7 +9,7 @@ Object.defineProperty(global, '__dirname', {
|
|||||||
// 注意:堆栈格式可能不同,请根据实际环境调整索引及正则表达式
|
// 注意:堆栈格式可能不同,请根据实际环境调整索引及正则表达式
|
||||||
for (const line of stack) {
|
for (const line of stack) {
|
||||||
const match = line.match(/\((.*):\d+:\d+\)/);
|
const match = line.match(/\((.*):\d+:\d+\)/);
|
||||||
if (match) {
|
if (match?.[1]) {
|
||||||
callerFile = match[1];
|
callerFile = match[1];
|
||||||
if (!callerFile.includes('init-dynamic-dirname.ts')) {
|
if (!callerFile.includes('init-dynamic-dirname.ts')) {
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user