mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9f82007116 | ||
![]() |
f79198a472 | ||
![]() |
ce3d35d7ec | ||
![]() |
f4d40f0466 | ||
![]() |
a2fa085d5f | ||
![]() |
a598266a6e | ||
![]() |
f5fe33cee7 | ||
![]() |
200c7226ef | ||
![]() |
53475a6a0e | ||
![]() |
b4ec1ad6c0 | ||
![]() |
ef511a729d | ||
![]() |
275c4ce226 | ||
![]() |
45f9c029c8 | ||
![]() |
db5e4ad5d9 | ||
![]() |
f05d0a9727 | ||
![]() |
04593e9d9a |
@@ -4,7 +4,7 @@
|
|||||||
"name": "NapCatQQ",
|
"name": "NapCatQQ",
|
||||||
"slug": "NapCat.Framework",
|
"slug": "NapCat.Framework",
|
||||||
"description": "高性能的 OneBot 11 协议实现",
|
"description": "高性能的 OneBot 11 协议实现",
|
||||||
"version": "2.2.22",
|
"version": "2.2.24",
|
||||||
"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": "2.2.22",
|
"version": "2.2.24",
|
||||||
"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",
|
||||||
|
@@ -51,7 +51,7 @@ export class FileNapCatOneBotUUID {
|
|||||||
msgId: string,
|
msgId: string,
|
||||||
elementId: string
|
elementId: string
|
||||||
} {
|
} {
|
||||||
if (!uuid.startsWith('NapCatOneBot-File-')) return undefined;
|
if (!uuid.startsWith('NapCatOneBot-MsgFile-')) return undefined;
|
||||||
const data = uuid.split('-');
|
const data = uuid.split('-');
|
||||||
if (data.length !== 6) return undefined;
|
if (data.length !== 6) return undefined;
|
||||||
const [, , chatType, peerUid, msgId, elementId] = data;
|
const [, , chatType, peerUid, msgId, elementId] = data;
|
||||||
|
@@ -1 +1 @@
|
|||||||
export const napCatVersion = '2.2.22';
|
export const napCatVersion = '2.2.24';
|
||||||
|
@@ -302,13 +302,16 @@ export class NTQQFileApi {
|
|||||||
async downloadMediaByUuid() {
|
async downloadMediaByUuid() {
|
||||||
//napCatCore.session.getRichMediaService().downloadFileForFileUuid();
|
//napCatCore.session.getRichMediaService().downloadFileForFileUuid();
|
||||||
}
|
}
|
||||||
async downloadFileForModelId(peer: Peer, modelId: string, timeout = 1000 * 60 * 2) {
|
async downloadFileForModelId(peer: Peer, modelId: string, unknown: string, timeout = 1000 * 60 * 2) {
|
||||||
const [, fileTransNotifyInfo] = await this.core.eventWrapper.callNormalEventV2(
|
const [, fileTransNotifyInfo] = await this.core.eventWrapper.callNormalEventV2(
|
||||||
'NodeIKernelRichMediaService/downloadFileForModelId',
|
'NodeIKernelRichMediaService/downloadFileForModelId',
|
||||||
'NodeIKernelMsgListener/onRichMediaDownloadComplete',
|
'NodeIKernelMsgListener/onRichMediaDownloadComplete',
|
||||||
[peer, [modelId]],
|
[peer, [modelId], unknown],
|
||||||
() => true,
|
() => true,
|
||||||
(arg) => arg?.commonFileInfo?.fileModelId === modelId,
|
(arg) => {
|
||||||
|
console.log(arg);
|
||||||
|
return arg?.commonFileInfo?.fileModelId === modelId
|
||||||
|
},
|
||||||
1,
|
1,
|
||||||
timeout,
|
timeout,
|
||||||
);
|
);
|
||||||
@@ -356,17 +359,15 @@ export class NTQQFileApi {
|
|||||||
if (msg.msgList.length === 0) {
|
if (msg.msgList.length === 0) {
|
||||||
return fileTransNotifyInfo.filePath;
|
return fileTransNotifyInfo.filePath;
|
||||||
}
|
}
|
||||||
//获取原始消息
|
const mixElement = msg.msgList.find((msg) => msg.msgId === msgId)?.elements.find((e) => e.elementId === elementId);
|
||||||
const FileElements = msg?.msgList[0]?.elements?.find(e => e.elementId === elementId);
|
const mixElementInner = mixElement?.videoElement ?? mixElement?.fileElement ?? mixElement?.pttElement ?? mixElement?.picElement;
|
||||||
if (!FileElements) {
|
let realPath = mixElementInner?.filePath;
|
||||||
//失败则就乱来 Todo
|
if (!realPath) {
|
||||||
return fileTransNotifyInfo.filePath;
|
let picThumbPath: Map<number, string> = (mixElementInner as any)?.picThumbPath;
|
||||||
|
let picThumbPathList = Array.from(picThumbPath.values());
|
||||||
|
if (picThumbPathList.length > 0) realPath = picThumbPathList[0];
|
||||||
}
|
}
|
||||||
//从原始消息获取文件路径
|
return realPath;
|
||||||
return FileElements?.fileElement?.filePath ??
|
|
||||||
FileElements?.pttElement?.filePath ??
|
|
||||||
FileElements?.videoElement?.filePath ??
|
|
||||||
FileElements?.picElement?.sourcePath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getImageSize(filePath: string): Promise<ISizeCalculationResult | undefined> {
|
async getImageSize(filePath: string): Promise<ISizeCalculationResult | undefined> {
|
||||||
|
@@ -309,12 +309,12 @@ export class NTQQGroupApi {
|
|||||||
return this.context.session.getGroupService().removeGroupEssence(param);
|
return this.context.session.getGroupService().removeGroupEssence(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getSingleScreenNotifies(num: number) {
|
async getSingleScreenNotifies(doubt: boolean, num: number) {
|
||||||
const [, , , notifies] = await this.core.eventWrapper.callNormalEventV2(
|
const [, , , notifies] = await this.core.eventWrapper.callNormalEventV2(
|
||||||
'NodeIKernelGroupService/getSingleScreenNotifies',
|
'NodeIKernelGroupService/getSingleScreenNotifies',
|
||||||
'NodeIKernelGroupListener/onGroupSingleScreenNotifies',
|
'NodeIKernelGroupListener/onGroupSingleScreenNotifies',
|
||||||
[
|
[
|
||||||
false,
|
doubt,
|
||||||
'',
|
'',
|
||||||
num,
|
num,
|
||||||
],
|
],
|
||||||
|
@@ -34,11 +34,26 @@ export class NTQQWebApi {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
async getGroupEssenceMsgAll(GroupCode: string) {
|
||||||
|
let ret: GroupEssenceMsgRet[] = [];
|
||||||
|
for (let i = 0; i < 4; i++) {
|
||||||
|
let data = await this.getGroupEssenceMsg(GroupCode, i, 50);
|
||||||
|
if (!data) break;
|
||||||
|
if (data.data.is_end) {
|
||||||
|
ret.push(data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret.push(data);
|
||||||
|
|
||||||
async getGroupEssenceMsg(GroupCode: string) {
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
async getGroupEssenceMsg(GroupCode: string, page_start: number = 0, page_limit: number = 50) {
|
||||||
const cookieObject = await this.core.apis.UserApi.getCookies('qun.qq.com');
|
const cookieObject = await this.core.apis.UserApi.getCookies('qun.qq.com');
|
||||||
const url = `https://qun.qq.com/cgi-bin/group_digest/digest_list?${new URLSearchParams({
|
const url = `https://qun.qq.com/cgi-bin/group_digest/digest_list?${new URLSearchParams({
|
||||||
bkn: this.getBknFromCookie(cookieObject),
|
bkn: this.getBknFromCookie(cookieObject),
|
||||||
|
page_start: page_start.toString(),
|
||||||
|
page_limit: page_limit.toString(),
|
||||||
group_code: GroupCode,
|
group_code: GroupCode,
|
||||||
}).toString()
|
}).toString()
|
||||||
}`;
|
}`;
|
||||||
|
@@ -593,6 +593,7 @@ export const IMAGE_HTTP_HOST_NT = 'https://multimedia.nt.qq.com.cn';
|
|||||||
|
|
||||||
export interface PicElement {
|
export interface PicElement {
|
||||||
md5HexStr?: string;
|
md5HexStr?: string;
|
||||||
|
filePath?: string;
|
||||||
fileSize: number | string;//number
|
fileSize: number | string;//number
|
||||||
picWidth: number;
|
picWidth: number;
|
||||||
picHeight: number;
|
picHeight: number;
|
||||||
|
@@ -1,25 +1,6 @@
|
|||||||
import { ChatType, RawMessage } from '@/core/entities';
|
import { ChatType, RawMessage } from '@/core/entities';
|
||||||
export interface CommonFileInfo {
|
import { CommonFileInfo } from '@/core';
|
||||||
bizType: null;
|
|
||||||
chatType: number;
|
|
||||||
elemId: string;
|
|
||||||
favId: null;
|
|
||||||
fileModelId: string;
|
|
||||||
fileName: string;
|
|
||||||
fileSize: string;
|
|
||||||
md5: string;
|
|
||||||
md510m: string;
|
|
||||||
msgId: string;
|
|
||||||
msgTime: string;
|
|
||||||
parent: null;
|
|
||||||
peerUid: string;
|
|
||||||
picThumbPath: null;
|
|
||||||
sha: string;
|
|
||||||
sha3: string;
|
|
||||||
subId: string;
|
|
||||||
uuid: string;
|
|
||||||
[property: string]: any;
|
|
||||||
}
|
|
||||||
export interface OnRichMediaDownloadCompleteParams {
|
export interface OnRichMediaDownloadCompleteParams {
|
||||||
fileModelId: string,
|
fileModelId: string,
|
||||||
msgElementId: string,
|
msgElementId: string,
|
||||||
|
@@ -19,6 +19,13 @@ message EmojiLikeToOthersMsgSpec {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message EmojiLikeToOthersAttributes {
|
message EmojiLikeToOthersAttributes {
|
||||||
|
enum Operation {
|
||||||
|
FALLBACK = 0;
|
||||||
|
LIKE = 1;
|
||||||
|
UNLIKE = 2;
|
||||||
|
}
|
||||||
|
|
||||||
string emojiId = 1;
|
string emojiId = 1;
|
||||||
string senderUid = 4;
|
string senderUid = 4;
|
||||||
|
Operation operation = 5;
|
||||||
}
|
}
|
||||||
|
@@ -62,6 +62,27 @@ export interface EmojiLikeToOthersAttributes {
|
|||||||
* @generated from protobuf field: string senderUid = 4;
|
* @generated from protobuf field: string senderUid = 4;
|
||||||
*/
|
*/
|
||||||
senderUid: string;
|
senderUid: string;
|
||||||
|
/**
|
||||||
|
* @generated from protobuf field: SysMessage.EmojiLikeToOthersAttributes.Operation operation = 5;
|
||||||
|
*/
|
||||||
|
operation: EmojiLikeToOthersAttributes_Operation;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @generated from protobuf enum SysMessage.EmojiLikeToOthersAttributes.Operation
|
||||||
|
*/
|
||||||
|
export enum EmojiLikeToOthersAttributes_Operation {
|
||||||
|
/**
|
||||||
|
* @generated from protobuf enum value: FALLBACK = 0;
|
||||||
|
*/
|
||||||
|
FALLBACK = 0,
|
||||||
|
/**
|
||||||
|
* @generated from protobuf enum value: LIKE = 1;
|
||||||
|
*/
|
||||||
|
LIKE = 1,
|
||||||
|
/**
|
||||||
|
* @generated from protobuf enum value: UNLIKE = 2;
|
||||||
|
*/
|
||||||
|
UNLIKE = 2
|
||||||
}
|
}
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
// @generated message type with reflection information, may provide speed optimized methods
|
||||||
class EmojiLikeToOthersWrapper1$Type extends MessageType<EmojiLikeToOthersWrapper1> {
|
class EmojiLikeToOthersWrapper1$Type extends MessageType<EmojiLikeToOthersWrapper1> {
|
||||||
@@ -260,13 +281,15 @@ class EmojiLikeToOthersAttributes$Type extends MessageType<EmojiLikeToOthersAttr
|
|||||||
constructor() {
|
constructor() {
|
||||||
super("SysMessage.EmojiLikeToOthersAttributes", [
|
super("SysMessage.EmojiLikeToOthersAttributes", [
|
||||||
{ no: 1, name: "emojiId", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
{ no: 1, name: "emojiId", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
||||||
{ no: 4, name: "senderUid", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
{ no: 4, name: "senderUid", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
||||||
|
{ no: 5, name: "operation", kind: "enum", T: () => ["SysMessage.EmojiLikeToOthersAttributes.Operation", EmojiLikeToOthersAttributes_Operation] }
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
create(value?: PartialMessage<EmojiLikeToOthersAttributes>): EmojiLikeToOthersAttributes {
|
create(value?: PartialMessage<EmojiLikeToOthersAttributes>): EmojiLikeToOthersAttributes {
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
const message = globalThis.Object.create((this.messagePrototype!));
|
||||||
message.emojiId = "";
|
message.emojiId = "";
|
||||||
message.senderUid = "";
|
message.senderUid = "";
|
||||||
|
message.operation = 0;
|
||||||
if (value !== undefined)
|
if (value !== undefined)
|
||||||
reflectionMergePartial<EmojiLikeToOthersAttributes>(this, message, value);
|
reflectionMergePartial<EmojiLikeToOthersAttributes>(this, message, value);
|
||||||
return message;
|
return message;
|
||||||
@@ -282,6 +305,9 @@ class EmojiLikeToOthersAttributes$Type extends MessageType<EmojiLikeToOthersAttr
|
|||||||
case /* string senderUid */ 4:
|
case /* string senderUid */ 4:
|
||||||
message.senderUid = reader.string();
|
message.senderUid = reader.string();
|
||||||
break;
|
break;
|
||||||
|
case /* SysMessage.EmojiLikeToOthersAttributes.Operation operation */ 5:
|
||||||
|
message.operation = reader.int32();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
let u = options.readUnknownField;
|
let u = options.readUnknownField;
|
||||||
if (u === "throw")
|
if (u === "throw")
|
||||||
@@ -300,6 +326,9 @@ class EmojiLikeToOthersAttributes$Type extends MessageType<EmojiLikeToOthersAttr
|
|||||||
/* string senderUid = 4; */
|
/* string senderUid = 4; */
|
||||||
if (message.senderUid !== "")
|
if (message.senderUid !== "")
|
||||||
writer.tag(4, WireType.LengthDelimited).string(message.senderUid);
|
writer.tag(4, WireType.LengthDelimited).string(message.senderUid);
|
||||||
|
/* SysMessage.EmojiLikeToOthersAttributes.Operation operation = 5; */
|
||||||
|
if (message.operation !== 0)
|
||||||
|
writer.tag(5, WireType.Varint).int32(message.operation);
|
||||||
let u = options.writeUnknownFields;
|
let u = options.writeUnknownFields;
|
||||||
if (u !== false)
|
if (u !== false)
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
||||||
|
@@ -182,8 +182,7 @@ export interface NodeIKernelGroupService {
|
|||||||
|
|
||||||
destroyGroup(groupCode: string): void;
|
destroyGroup(groupCode: string): void;
|
||||||
|
|
||||||
//获取单屏群通知列表
|
getSingleScreenNotifies(doubted: boolean, start_seq: string, num: number): Promise<GeneralCallResult>;
|
||||||
getSingleScreenNotifies(force: boolean, start_seq: string, num: number): Promise<GeneralCallResult>;
|
|
||||||
|
|
||||||
clearGroupNotifies(groupCode: string): void;
|
clearGroupNotifies(groupCode: string): void;
|
||||||
|
|
||||||
|
@@ -155,7 +155,7 @@ export interface NodeIKernelRichMediaService {
|
|||||||
}): unknown;
|
}): unknown;
|
||||||
|
|
||||||
//arg3为“”
|
//arg3为“”
|
||||||
downloadFileForModelId(peer: Peer, ModelId: string[]): Promise<unknown>;
|
downloadFileForModelId(peer: Peer, ModelId: string[], unknown: string): Promise<unknown>;
|
||||||
|
|
||||||
//第三个参数 Array<Type>
|
//第三个参数 Array<Type>
|
||||||
// this.fileId = "";
|
// this.fileId = "";
|
||||||
|
@@ -33,20 +33,16 @@ export class GetFileBase extends BaseAction<GetFilePayload, GetFileResponse> {
|
|||||||
const NTQQFileApi = this.core.apis.FileApi;
|
const NTQQFileApi = this.core.apis.FileApi;
|
||||||
|
|
||||||
const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file);
|
const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file);
|
||||||
|
|
||||||
//接收消息标记模式
|
//接收消息标记模式
|
||||||
if (contextMsgFile) {
|
if (contextMsgFile) {
|
||||||
const { peer, msgId, elementId } = contextMsgFile;
|
const { peer, msgId, elementId } = contextMsgFile;
|
||||||
|
|
||||||
const downloadPath = await NTQQFileApi.downloadMedia(msgId, peer.chatType, peer.peerUid, elementId, '', '');
|
const downloadPath = await NTQQFileApi.downloadMedia(msgId, peer.chatType, peer.peerUid, elementId, '', '');
|
||||||
|
|
||||||
const mixElement = (await NTQQMsgApi.getMsgsByMsgId(peer, [msgId]))?.msgList
|
const mixElement = (await NTQQMsgApi.getMsgsByMsgId(peer, [msgId]))?.msgList
|
||||||
.find(msg => msg.msgId === msgId)?.elements.find(e => e.elementId === elementId);
|
.find(msg => msg.msgId === msgId)?.elements.find(e => e.elementId === elementId);
|
||||||
const mixElementInner = mixElement?.videoElement ?? mixElement?.fileElement ?? mixElement?.pttElement ?? mixElement?.picElement;
|
const mixElementInner = mixElement?.videoElement ?? mixElement?.fileElement ?? mixElement?.pttElement ?? mixElement?.picElement;
|
||||||
if (!mixElementInner) throw new Error('element not found');
|
if (!mixElementInner) throw new Error('element not found');
|
||||||
|
const fileSize = mixElementInner.fileSize?.toString() ?? '';
|
||||||
const fileSize = mixElementInner.fileSize?.toString() || '';
|
const fileName = mixElementInner.fileName ?? '';
|
||||||
const fileName = mixElementInner.fileName || '';
|
|
||||||
|
|
||||||
const res: GetFileResponse = {
|
const res: GetFileResponse = {
|
||||||
file: downloadPath,
|
file: downloadPath,
|
||||||
@@ -68,7 +64,7 @@ export class GetFileBase extends BaseAction<GetFilePayload, GetFileResponse> {
|
|||||||
const contextModelIdFile = FileNapCatOneBotUUID.decodeModelId(payload.file);
|
const contextModelIdFile = FileNapCatOneBotUUID.decodeModelId(payload.file);
|
||||||
if (contextModelIdFile) {
|
if (contextModelIdFile) {
|
||||||
const { peer, modelId } = contextModelIdFile;
|
const { peer, modelId } = contextModelIdFile;
|
||||||
const downloadPath = await NTQQFileApi.downloadFileForModelId(peer, modelId);
|
const downloadPath = await NTQQFileApi.downloadFileForModelId(peer, modelId,'');
|
||||||
const res: GetFileResponse = {
|
const res: GetFileResponse = {
|
||||||
file: downloadPath,
|
file: downloadPath,
|
||||||
url: downloadPath,
|
url: downloadPath,
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
import BaseAction from '../BaseAction';
|
import BaseAction from '../BaseAction';
|
||||||
import { ActionName } from '../types';
|
import { ActionName } from '../types';
|
||||||
|
import { FileNapCatOneBotUUID } from '@/common/helper';
|
||||||
|
|
||||||
const SchemaData = {
|
const SchemaData = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
@@ -37,6 +38,13 @@ export class GetGroupFileList extends BaseAction<Payload, { FileList: Array<any>
|
|||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
return [];
|
return [];
|
||||||
});
|
});
|
||||||
|
ret.forEach((e) => {
|
||||||
|
let fileModelId = e?.fileInfo?.fileModelId;
|
||||||
|
if (fileModelId) {
|
||||||
|
e.fileModelId = fileModelId;
|
||||||
|
}
|
||||||
|
e.fileId = FileNapCatOneBotUUID.encodeModelId({ chatType: 2, peerUid: payload.group_id.toString() }, fileModelId);
|
||||||
|
});
|
||||||
return { FileList: ret };
|
return { FileList: ret };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { ChatType, GroupEssenceMsgRet, Peer } from '@/core';
|
import { ChatType, Peer } from '@/core';
|
||||||
import BaseAction from '../BaseAction';
|
import BaseAction from '../BaseAction';
|
||||||
import { ActionName } from '../types';
|
import { ActionName } from '../types';
|
||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
@@ -18,64 +18,30 @@ type Payload = FromSchema<typeof SchemaData>;
|
|||||||
export class GetGroupEssence extends BaseAction<Payload, any> {
|
export class GetGroupEssence extends BaseAction<Payload, any> {
|
||||||
actionName = ActionName.GoCQHTTP_GetEssenceMsg;
|
actionName = ActionName.GoCQHTTP_GetEssenceMsg;
|
||||||
payloadSchema = SchemaData;
|
payloadSchema = SchemaData;
|
||||||
async parseEssenceMsgImage(ele: any) {
|
|
||||||
return {
|
private async msgSeqToMsgId(peer: Peer, msgSeq: string, msgRandom: string) {
|
||||||
type: 'image',
|
const replyMsgList = (await this.core.apis.MsgApi.getMsgsBySeqAndCount(peer, msgSeq, 1, true, true)).msgList.find((msg) => msg.msgSeq === msgSeq && msg.msgRandom === msgRandom);
|
||||||
data: {
|
|
||||||
url: ele?.image_url,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async parseEssenceMsgText(ele: any) {
|
|
||||||
return {
|
|
||||||
type: 'text',
|
|
||||||
data: {
|
|
||||||
text: ele?.text
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async parseEssenceMsg(msgs: any) {
|
|
||||||
let handledMsg: any[] = [];
|
|
||||||
for (let msg of msgs) {
|
|
||||||
switch (msg.msg_type) {
|
|
||||||
case 1:
|
|
||||||
handledMsg.push(await this.parseEssenceMsgText(msg));
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
handledMsg.push(await this.parseEssenceMsgImage(msg));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return handledMsg;
|
|
||||||
}
|
|
||||||
async msgSeqToMsgId(peer: Peer, msgSeq: string, msgRandom: string) {
|
|
||||||
const NTQQMsgApi = this.core.apis.MsgApi;
|
|
||||||
const replyMsgList = (await NTQQMsgApi.getMsgsBySeqAndCount(peer, msgSeq, 1, true, true)).msgList.find((msg) => msg.msgSeq === msgSeq && msg.msgRandom === msgRandom);
|
|
||||||
if (!replyMsgList) {
|
if (!replyMsgList) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
id: MessageUnique.createUniqueMsgId(peer, replyMsgList.msgId),
|
id: MessageUnique.createUniqueMsgId(peer, replyMsgList.msgId),
|
||||||
msg: replyMsgList
|
msg: replyMsgList
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
async _handle(payload: Payload) {
|
async _handle(payload: Payload) {
|
||||||
const NTQQWebApi = this.core.apis.WebApi;
|
const NTQQWebApi = this.core.apis.WebApi;
|
||||||
const NTQQGroupApi = this.core.apis.GroupApi;
|
const NTQQGroupApi = this.core.apis.GroupApi;
|
||||||
//await NTQQGroupApi.fetchGroupEssenceList(payload.group_id.toString());
|
const msglist = (await NTQQWebApi.getGroupEssenceMsgAll(payload.group_id.toString())).flatMap((e) => e.data.msg_list);
|
||||||
let peer = {
|
if (!msglist) {
|
||||||
chatType: ChatType.KCHATTYPEGROUP,
|
|
||||||
peerUid: payload.group_id.toString(),
|
|
||||||
};
|
|
||||||
|
|
||||||
const ret = await NTQQWebApi.getGroupEssenceMsg(payload.group_id.toString());
|
|
||||||
if (!ret) {
|
|
||||||
throw new Error('获取失败');
|
throw new Error('获取失败');
|
||||||
}
|
}
|
||||||
const Ob11Ret = await Promise.all(ret.data.msg_list.map(async (msg) => {
|
return await Promise.all(msglist.map(async (msg) => {
|
||||||
let msgOriginData = await this.msgSeqToMsgId(peer, msg.msg_seq.toString(), msg.msg_random.toString());
|
const msgOriginData = await this.msgSeqToMsgId({
|
||||||
|
chatType: ChatType.KCHATTYPEGROUP,
|
||||||
|
peerUid: payload.group_id.toString(),
|
||||||
|
}, msg.msg_seq.toString(), msg.msg_random.toString());
|
||||||
if (msgOriginData) {
|
if (msgOriginData) {
|
||||||
const { id: message_id, msg: rawMessage } = msgOriginData;
|
const { id: message_id, msg: rawMessage } = msgOriginData;
|
||||||
return {
|
return {
|
||||||
@@ -109,9 +75,25 @@ export class GetGroupEssence extends BaseAction<Payload, any> {
|
|||||||
operator_nick: msg.add_digest_nick,
|
operator_nick: msg.add_digest_nick,
|
||||||
message_id: shortId,
|
message_id: shortId,
|
||||||
operator_time: msg.add_digest_time,
|
operator_time: msg.add_digest_time,
|
||||||
content: await this.parseEssenceMsg(msg.msg_content)
|
content: msg.msg_content.map((msg) => {
|
||||||
|
if (msg.msg_type === 1) {
|
||||||
|
return {
|
||||||
|
type: 'text',
|
||||||
|
data: {
|
||||||
|
text: msg?.text
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else if (msg.msg_type === 3) {
|
||||||
|
return {
|
||||||
|
type: 'image',
|
||||||
|
data: {
|
||||||
|
url: msg?.image_url,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}).filter(e => e !== undefined),
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
return Ob11Ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
39
src/onebot/action/group/GetGroupIgnoredNotifies.ts
Normal file
39
src/onebot/action/group/GetGroupIgnoredNotifies.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { GroupNotifyMsgStatus } from '@/core';
|
||||||
|
import BaseAction from '../BaseAction';
|
||||||
|
import { ActionName } from '../types';
|
||||||
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
|
|
||||||
|
const SchemaData = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
group_id: { type: ['number', 'string'] },
|
||||||
|
},
|
||||||
|
} as const satisfies JSONSchema;
|
||||||
|
|
||||||
|
type Payload = FromSchema<typeof SchemaData>;
|
||||||
|
|
||||||
|
export class GetGroupIgnoredNotifies extends BaseAction<void, any> {
|
||||||
|
actionName = ActionName.GetGroupIgnoredNotifies;
|
||||||
|
|
||||||
|
async _handle(payload: void) {
|
||||||
|
const NTQQUserApi = this.core.apis.UserApi;
|
||||||
|
const NTQQGroupApi = this.core.apis.GroupApi;
|
||||||
|
const ignoredNotifies = await NTQQGroupApi.getSingleScreenNotifies(true, 10);
|
||||||
|
const retData: any = {
|
||||||
|
join_requests: await Promise.all(
|
||||||
|
ignoredNotifies
|
||||||
|
.filter(notify => notify.type === 7)
|
||||||
|
.map(async SSNotify => ({
|
||||||
|
request_id: SSNotify.seq,
|
||||||
|
requester_uin: await NTQQUserApi.getUinByUidV2(SSNotify.user1?.uid),
|
||||||
|
requester_nick: SSNotify.user1?.nickName,
|
||||||
|
group_id: SSNotify.group?.groupCode,
|
||||||
|
group_name: SSNotify.group?.groupName,
|
||||||
|
checked: SSNotify.status !== GroupNotifyMsgStatus.KUNHANDLE,
|
||||||
|
actor: await NTQQUserApi.getUinByUidV2(SSNotify.user2?.uid) || 0,
|
||||||
|
}))),
|
||||||
|
};
|
||||||
|
|
||||||
|
return retData;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,50 +0,0 @@
|
|||||||
import { GroupNotifyMsgStatus } from '@/core';
|
|
||||||
import BaseAction from '../BaseAction';
|
|
||||||
import { ActionName } from '../types';
|
|
||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
|
||||||
|
|
||||||
const SchemaData = {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
group_id: { type: ['number', 'string'] },
|
|
||||||
},
|
|
||||||
} as const satisfies JSONSchema;
|
|
||||||
|
|
||||||
type Payload = FromSchema<typeof SchemaData>;
|
|
||||||
|
|
||||||
export class GetGroupSystemMsg extends BaseAction<void, any> {
|
|
||||||
actionName = ActionName.GetGroupSystemMsg;
|
|
||||||
|
|
||||||
async _handle(payload: void) {
|
|
||||||
const NTQQUserApi = this.core.apis.UserApi;
|
|
||||||
const NTQQGroupApi = this.core.apis.GroupApi;
|
|
||||||
// 默认10条 该api未完整实现 包括响应数据规范化 类型规范化
|
|
||||||
const SingleScreenNotifies = await NTQQGroupApi.getSingleScreenNotifies(10);
|
|
||||||
const retData: any = { InvitedRequest: [], join_requests: [] };
|
|
||||||
for (const SSNotify of SingleScreenNotifies) {
|
|
||||||
if (SSNotify.type == 1) {
|
|
||||||
retData.InvitedRequest.push({
|
|
||||||
request_id: SSNotify.seq,
|
|
||||||
invitor_uin: await NTQQUserApi.getUinByUidV2(SSNotify.user1?.uid),
|
|
||||||
invitor_nick: SSNotify.user1?.nickName,
|
|
||||||
group_id: SSNotify.group?.groupCode,
|
|
||||||
group_name: SSNotify.group?.groupName,
|
|
||||||
checked: SSNotify.status === GroupNotifyMsgStatus.KUNHANDLE ? false : true,
|
|
||||||
actor: await NTQQUserApi.getUinByUidV2(SSNotify.user2?.uid) || 0,
|
|
||||||
});
|
|
||||||
} else if (SSNotify.type == 7) {
|
|
||||||
retData.join_requests.push({
|
|
||||||
request_id: SSNotify.seq,
|
|
||||||
requester_uin: await NTQQUserApi.getUinByUidV2(SSNotify.user1?.uid),
|
|
||||||
requester_nick: SSNotify.user1?.nickName,
|
|
||||||
group_id: SSNotify.group?.groupCode,
|
|
||||||
group_name: SSNotify.group?.groupName,
|
|
||||||
checked: SSNotify.status === GroupNotifyMsgStatus.KUNHANDLE ? false : true,
|
|
||||||
actor: await NTQQUserApi.getUinByUidV2(SSNotify.user2?.uid) || 0,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retData;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -52,7 +52,7 @@ import { GetFriendWithCategory } from './extends/GetFriendWithCategory';
|
|||||||
import { SendGroupNotice } from './go-cqhttp/SendGroupNotice';
|
import { SendGroupNotice } from './go-cqhttp/SendGroupNotice';
|
||||||
import { GetGroupHonorInfo } from './go-cqhttp/GetGroupHonorInfo';
|
import { GetGroupHonorInfo } from './go-cqhttp/GetGroupHonorInfo';
|
||||||
import { GoCQHTTPHandleQuickAction } from './go-cqhttp/QuickAction';
|
import { GoCQHTTPHandleQuickAction } from './go-cqhttp/QuickAction';
|
||||||
import { GetGroupSystemMsg } from './group/GetGroupSystemMsg';
|
import { GetGroupIgnoredNotifies } from './group/GetGroupIgnoredNotifies';
|
||||||
import { GetOnlineClient } from './go-cqhttp/GetOnlineClient';
|
import { GetOnlineClient } from './go-cqhttp/GetOnlineClient';
|
||||||
import { IOCRImage, OCRImage } from './extends/OCRImage';
|
import { IOCRImage, OCRImage } from './extends/OCRImage';
|
||||||
import { GetGroupFileCount } from './file/GetGroupFileCount';
|
import { GetGroupFileCount } from './file/GetGroupFileCount';
|
||||||
@@ -159,7 +159,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo
|
|||||||
new GoCQHTTPGetForwardMsgAction(obContext, core),
|
new GoCQHTTPGetForwardMsgAction(obContext, core),
|
||||||
new GetFriendMsgHistory(obContext, core),
|
new GetFriendMsgHistory(obContext, core),
|
||||||
new GoCQHTTPHandleQuickAction(obContext, core),
|
new GoCQHTTPHandleQuickAction(obContext, core),
|
||||||
new GetGroupSystemMsg(obContext, core),
|
new GetGroupIgnoredNotifies(obContext, core),
|
||||||
new DelEssenceMsg(obContext, core),
|
new DelEssenceMsg(obContext, core),
|
||||||
new SetEssenceMsg(obContext, core),
|
new SetEssenceMsg(obContext, core),
|
||||||
new GetRecentContact(obContext, core),
|
new GetRecentContact(obContext, core),
|
||||||
|
@@ -87,7 +87,7 @@ export enum ActionName {
|
|||||||
GoCQHTTP_GetGroupMsgHistory = 'get_group_msg_history',
|
GoCQHTTP_GetGroupMsgHistory = 'get_group_msg_history',
|
||||||
GoCQHTTP_GetForwardMsg = 'get_forward_msg',
|
GoCQHTTP_GetForwardMsg = 'get_forward_msg',
|
||||||
GetFriendMsgHistory = 'get_friend_msg_history',
|
GetFriendMsgHistory = 'get_friend_msg_history',
|
||||||
GetGroupSystemMsg = 'get_group_system_msg',
|
GetGroupIgnoredNotifies = 'get_group_ignored_notifies',
|
||||||
GetOnlineClient = 'get_online_clients',
|
GetOnlineClient = 'get_online_clients',
|
||||||
OCRImage = 'ocr_image',
|
OCRImage = 'ocr_image',
|
||||||
IOCRImage = '.ocr_image',
|
IOCRImage = '.ocr_image',
|
||||||
|
@@ -116,18 +116,22 @@ export class OneBotGroupApi {
|
|||||||
const searchParams = new URL(json.items[0].jp).searchParams;
|
const searchParams = new URL(json.items[0].jp).searchParams;
|
||||||
const msgSeq = searchParams.get('msgSeq')!;
|
const msgSeq = searchParams.get('msgSeq')!;
|
||||||
const Group = searchParams.get('groupCode');
|
const Group = searchParams.get('groupCode');
|
||||||
|
if (!Group) return;
|
||||||
// const businessId = searchParams.get('businessid');
|
// const businessId = searchParams.get('businessid');
|
||||||
const Peer = {
|
const Peer = {
|
||||||
guildId: '',
|
guildId: '',
|
||||||
chatType: ChatType.KCHATTYPEGROUP,
|
chatType: ChatType.KCHATTYPEGROUP,
|
||||||
peerUid: Group!,
|
peerUid: Group,
|
||||||
};
|
};
|
||||||
const msgData = await NTQQMsgApi.getMsgsBySeqAndCount(Peer, msgSeq.toString(), 1, true, true);
|
const msgData = await NTQQMsgApi.getMsgsBySeqAndCount(Peer, msgSeq.toString(), 1, true, true);
|
||||||
|
let msgList = (await this.core.apis.WebApi.getGroupEssenceMsgAll(Group)).flatMap((e) => e.data.msg_list);
|
||||||
|
let realMsg = msgList.find((e) => e.msg_seq.toString() == msgSeq);
|
||||||
return new OB11GroupEssenceEvent(
|
return new OB11GroupEssenceEvent(
|
||||||
this.core,
|
this.core,
|
||||||
parseInt(msg.peerUid),
|
parseInt(msg.peerUid),
|
||||||
MessageUnique.getShortIdByMsgId(msgData.msgList[0].msgId)!,
|
MessageUnique.getShortIdByMsgId(msgData.msgList[0].msgId)!,
|
||||||
parseInt(msgData.msgList[0].senderUin),
|
parseInt(msgData.msgList[0].senderUin),
|
||||||
|
parseInt(realMsg?.add_digest_uin ?? '0'),
|
||||||
);
|
);
|
||||||
// 获取MsgSeq+Peer可获取具体消息
|
// 获取MsgSeq+Peer可获取具体消息
|
||||||
}
|
}
|
||||||
|
@@ -5,11 +5,14 @@ export class OB11GroupEssenceEvent extends OB11GroupNoticeEvent {
|
|||||||
notice_type = 'essence';
|
notice_type = 'essence';
|
||||||
message_id: number;
|
message_id: number;
|
||||||
sender_id: number;
|
sender_id: number;
|
||||||
|
operator_id: number;
|
||||||
sub_type: 'add' | 'delete' = 'add';
|
sub_type: 'add' | 'delete' = 'add';
|
||||||
|
|
||||||
constructor(core: NapCatCore, groupId: number, message_id: number, sender_id: number) {
|
|
||||||
|
constructor(core: NapCatCore, groupId: number, message_id: number, sender_id: number, operator_id: number) {
|
||||||
super(core, groupId, sender_id);
|
super(core, groupId, sender_id);
|
||||||
this.group_id = groupId;
|
this.group_id = groupId;
|
||||||
|
this.operator_id = operator_id;
|
||||||
this.message_id = message_id;
|
this.message_id = message_id;
|
||||||
this.sender_id = sender_id;
|
this.sender_id = sender_id;
|
||||||
}
|
}
|
||||||
|
@@ -255,6 +255,9 @@ export class NapCatOneBot11Adapter {
|
|||||||
.fromBinary(greyTip.rest)
|
.fromBinary(greyTip.rest)
|
||||||
.wrapper!
|
.wrapper!
|
||||||
.body!;
|
.body!;
|
||||||
|
if (emojiLikeToOthers.attributes?.operation !== 1) { // Un-like
|
||||||
|
return;
|
||||||
|
}
|
||||||
const eventOrEmpty = await this.apis.GroupApi.createGroupEmojiLikeEvent(
|
const eventOrEmpty = await this.apis.GroupApi.createGroupEmojiLikeEvent(
|
||||||
greyTip.groupCode.toString(),
|
greyTip.groupCode.toString(),
|
||||||
await this.core.apis.UserApi.getUinByUidV2(emojiLikeToOthers.attributes!.senderUid),
|
await this.core.apis.UserApi.getUinByUidV2(emojiLikeToOthers.attributes!.senderUid),
|
||||||
|
@@ -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('V2.2.22', 'napcat-update-button', 'secondary'),
|
SettingButton('V2.2.24', '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("V2.2.22", "napcat-update-button", "secondary")
|
SettingButton("V2.2.24", "napcat-update-button", "secondary")
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
SettingList([
|
SettingList([
|
||||||
|
Reference in New Issue
Block a user