mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-06 07:29:38 +00:00
148 lines
6.3 KiB
TypeScript
148 lines
6.3 KiB
TypeScript
import { ChatType, GrayTipElement, NapCatCore } from '@/core';
|
|
import { NapCatOneBot11Adapter } from '@/onebot';
|
|
import { OB11GroupBanEvent } from '../event/notice/OB11GroupBanEvent';
|
|
import { OB11GroupIncreaseEvent } from '../event/notice/OB11GroupIncreaseEvent';
|
|
import { OB11GroupDecreaseEvent } from '../event/notice/OB11GroupDecreaseEvent';
|
|
import fastXmlParser from 'fast-xml-parser';
|
|
import { OB11GroupMsgEmojiLikeEvent } from '../event/notice/OB11MsgEmojiLikeEvent';
|
|
import { MessageUnique } from '@/common/utils/MessageUnique';
|
|
|
|
export class OneBotGroupApi {
|
|
obContext: NapCatOneBot11Adapter;
|
|
coreContext: NapCatCore;
|
|
GroupMemberList: Map<string, any> = new Map();//此处作为缓存 group_id->memberUin->info
|
|
constructor(obContext: NapCatOneBot11Adapter, coreContext: NapCatCore) {
|
|
this.obContext = obContext;
|
|
this.coreContext = coreContext;
|
|
}
|
|
async parseGroupBanEvent(GroupCode: string, grayTipElement: GrayTipElement) {
|
|
const groupElement = grayTipElement?.groupElement;
|
|
const NTQQGroupApi = this.coreContext.apis.GroupApi;
|
|
if (!groupElement?.shutUp) return undefined;
|
|
const memberUid = groupElement.shutUp!.member.uid;
|
|
const adminUid = groupElement.shutUp!.admin.uid;
|
|
let memberUin: string = '';
|
|
let duration = parseInt(groupElement.shutUp!.duration);
|
|
const subType: 'ban' | 'lift_ban' = duration > 0 ? 'ban' : 'lift_ban';
|
|
if (memberUid) {
|
|
memberUin = (await NTQQGroupApi.getGroupMember(GroupCode, memberUid))?.uin || '';
|
|
} else {
|
|
memberUin = '0'; // 0表示全员禁言
|
|
if (duration > 0) {
|
|
duration = -1;
|
|
}
|
|
}
|
|
const adminUin = (await NTQQGroupApi.getGroupMember(GroupCode, adminUid))?.uin;
|
|
if (memberUin && adminUin) {
|
|
return new OB11GroupBanEvent(
|
|
this.coreContext,
|
|
parseInt(GroupCode),
|
|
parseInt(memberUin),
|
|
parseInt(adminUin),
|
|
duration,
|
|
subType
|
|
);
|
|
}
|
|
return undefined;
|
|
}
|
|
async parseGroupIncreaseEvent(GroupCode: string, grayTipElement: GrayTipElement) {
|
|
this.coreContext.context.logger.logDebug('收到新人被邀请进群消息', grayTipElement);
|
|
const xmlElement = grayTipElement.xmlElement;
|
|
if (xmlElement?.content) {
|
|
const regex = /jp="(\d+)"/g;
|
|
|
|
const matches = [];
|
|
let match = null;
|
|
|
|
while ((match = regex.exec(xmlElement.content)) !== null) {
|
|
matches.push(match[1]);
|
|
}
|
|
// log("新人进群匹配到的QQ号", matches)
|
|
if (matches.length === 2) {
|
|
const [inviter, invitee] = matches;
|
|
return new OB11GroupIncreaseEvent(
|
|
this.coreContext,
|
|
parseInt(GroupCode),
|
|
parseInt(invitee),
|
|
parseInt(inviter),
|
|
'invite'
|
|
);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
async parseGroupMemberIncreaseEvent(GroupCode: string, grayTipElement: GrayTipElement) {
|
|
const NTQQGroupApi = this.coreContext.apis.GroupApi;
|
|
const groupElement = grayTipElement?.groupElement;
|
|
if (!groupElement) return undefined;
|
|
const member = await NTQQGroupApi.getGroupMember(GroupCode, groupElement.memberUid);
|
|
const memberUin = member?.uin;
|
|
const adminMember = await NTQQGroupApi.getGroupMember(GroupCode, groupElement.adminUid);
|
|
if (memberUin) {
|
|
const operatorUin = adminMember?.uin || memberUin;
|
|
return new OB11GroupIncreaseEvent(
|
|
this.coreContext,
|
|
parseInt(GroupCode),
|
|
parseInt(memberUin),
|
|
parseInt(operatorUin)
|
|
);
|
|
}
|
|
return undefined;
|
|
}
|
|
async parseGroupKickEvent(GroupCode: string, grayTipElement: GrayTipElement) {
|
|
const NTQQGroupApi = this.coreContext.apis.GroupApi;
|
|
const NTQQUserApi = this.coreContext.apis.UserApi;
|
|
const groupElement = grayTipElement?.groupElement;
|
|
if (!groupElement) return undefined;
|
|
const adminUin = (await NTQQGroupApi.getGroupMember(GroupCode, groupElement.adminUid))?.uin || (await NTQQUserApi.getUidByUinV2(groupElement.adminUid));
|
|
if (adminUin) {
|
|
return new OB11GroupDecreaseEvent(
|
|
this.coreContext,
|
|
parseInt(GroupCode),
|
|
parseInt(this.coreContext.selfInfo.uin),
|
|
parseInt(adminUin),
|
|
'kick_me'
|
|
);
|
|
}
|
|
return undefined;
|
|
}
|
|
async parseGroupEmjioLikeEvent(GroupCode: string, grayTipElement: GrayTipElement) {
|
|
const NTQQMsgApi = this.coreContext.apis.MsgApi;
|
|
const emojiLikeData = new fastXmlParser.XMLParser({
|
|
ignoreAttributes: false,
|
|
attributeNamePrefix: '',
|
|
}).parse(grayTipElement.xmlElement.content);
|
|
this.coreContext.context.logger.logDebug('收到表情回应我的消息', emojiLikeData);
|
|
try {
|
|
const senderUin = emojiLikeData.gtip.qq.jp;
|
|
const msgSeq = emojiLikeData.gtip.url.msgseq;
|
|
const emojiId = emojiLikeData.gtip.face.id;
|
|
const peer = {
|
|
chatType: ChatType.KCHATTYPEGROUP,
|
|
guildId: '',
|
|
peerUid: GroupCode
|
|
};
|
|
const replyMsgList = (await NTQQMsgApi.getMsgExBySeq(peer, msgSeq)).msgList;
|
|
if (replyMsgList.length < 1) {
|
|
return;
|
|
}
|
|
const replyMsg = replyMsgList.filter(e => e.msgSeq == msgSeq).sort((a, b) => parseInt(a.msgTime) - parseInt(b.msgTime))[0];
|
|
//console.log("表情回应消息长度检测", msgSeq, replyMsg.elements);
|
|
if (!replyMsg) throw new Error('找不到回应消息');
|
|
return new OB11GroupMsgEmojiLikeEvent(
|
|
this.coreContext,
|
|
parseInt(GroupCode),
|
|
parseInt(senderUin),
|
|
MessageUnique.getShortIdByMsgId(replyMsg.msgId)!,
|
|
[{
|
|
emoji_id: emojiId,
|
|
count: 1,
|
|
}],
|
|
);
|
|
} catch (e: any) {
|
|
this.coreContext.context.logger.logError('解析表情回应消息失败', e.stack);
|
|
}
|
|
return undefined;
|
|
}
|
|
}
|