mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
Merge branch 'v3.4.0' into dev
# Conflicts: # src/common/utils.ts # src/global.d.ts # src/main/ipcsend.ts # src/main/main.ts # src/ntqqapi/hook.ts # src/onebot11/action/SendMsg.ts # src/onebot11/action/TestForwdMsg.ts # src/onebot11/action/types.ts # src/onebot11/server.ts # src/preload.ts
This commit is contained in:
@@ -4,6 +4,15 @@ import { NTQQApi, NTQQApiClass, sendMessagePool } from "./ntcall";
|
||||
import { Group, RawMessage, User } from "./types";
|
||||
import { addHistoryMsg, friends, groups, msgHistory } from "../common/data";
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import {BrowserWindow} from 'electron';
|
||||
import {log, sleep} from "../common/utils";
|
||||
import {NTQQApi, NTQQApiClass, sendMessagePool} from "./ntcall";
|
||||
import {Group, RawMessage, User} from "./types";
|
||||
import {addHistoryMsg, friends, groups, msgHistory} from "../common/data";
|
||||
import {v4 as uuidv4} from 'uuid';
|
||||
import {OB11GroupDecreaseEvent} from "../onebot11/event/notice/OB11GroupDecreaseEvent";
|
||||
import {OB11GroupIncreaseEvent} from "../onebot11/event/notice/OB11GroupIncreaseEvent";
|
||||
import {postMsg} from "../onebot11/server";
|
||||
|
||||
export let hookApiCallbacks: Record<string, (apiReturn: any) => void> = {}
|
||||
|
||||
@@ -110,25 +119,103 @@ export function removeReceiveHook(id: string) {
|
||||
receiveHooks.splice(index, 1);
|
||||
}
|
||||
|
||||
async function updateGroups(_groups: Group[]) {
|
||||
async function updateGroups(_groups: Group[], needUpdate: boolean = true) {
|
||||
for (let group of _groups) {
|
||||
let existGroup = groups.find(g => g.groupCode == group.groupCode)
|
||||
if (!existGroup) {
|
||||
NTQQApi.getGroupMembers(group.groupCode).then(members => {
|
||||
if (members) {
|
||||
group.members = members
|
||||
}
|
||||
})
|
||||
groups.push(group)
|
||||
log("update group members", group.members)
|
||||
} else {
|
||||
Object.assign(existGroup, group)
|
||||
let existGroup = groups.find(g => g.groupCode == group.groupCode);
|
||||
if (existGroup) {
|
||||
Object.assign(existGroup, group);
|
||||
}
|
||||
else {
|
||||
groups.push(group);
|
||||
existGroup = group;
|
||||
}
|
||||
|
||||
if (needUpdate) {
|
||||
const members = await NTQQApi.getGroupMembers(group.groupCode);
|
||||
|
||||
if (members) {
|
||||
existGroup.members = members;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registerReceiveHook<{ groupList: Group[] }>(ReceiveCmd.GROUPS, (payload) => updateGroups(payload.groupList).then())
|
||||
registerReceiveHook<{ groupList: Group[] }>(ReceiveCmd.GROUPS_UNIX, (payload) => updateGroups(payload.groupList).then())
|
||||
async function processGroupEvent(payload) {
|
||||
try {
|
||||
const newGroupList = payload.groupList;
|
||||
for (const group of newGroupList) {
|
||||
let existGroup = groups.find(g => g.groupCode == group.groupCode);
|
||||
if (existGroup) {
|
||||
if (existGroup.memberCount > group.memberCount) {
|
||||
const oldMembers = existGroup.members;
|
||||
|
||||
await sleep(200); // 如果请求QQ API的速度过快,通常无法正确拉取到最新的群信息,因此这里人为引入一个延时
|
||||
const newMembers = await NTQQApi.getGroupMembers(group.groupCode);
|
||||
|
||||
group.members = newMembers;
|
||||
const newMembersSet = new Set<string>(); // 建立索引降低时间复杂度
|
||||
|
||||
for (const member of newMembers) {
|
||||
newMembersSet.add(member.uin);
|
||||
}
|
||||
|
||||
for (const member of oldMembers) {
|
||||
if (!newMembersSet.has(member.uin)) {
|
||||
postMsg(new OB11GroupDecreaseEvent(group.groupCode, parseInt(member.uin)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else if (existGroup.memberCount < group.memberCount) {
|
||||
const oldMembers = existGroup.members;
|
||||
const oldMembersSet = new Set<string>();
|
||||
for (const member of oldMembers) {
|
||||
oldMembersSet.add(member.uin);
|
||||
}
|
||||
|
||||
await sleep(200);
|
||||
const newMembers = await NTQQApi.getGroupMembers(group.groupCode);
|
||||
|
||||
group.members = newMembers;
|
||||
for (const member of newMembers) {
|
||||
if (!oldMembersSet.has(member.uin)) {
|
||||
postMsg(new OB11GroupIncreaseEvent(group.groupCode, parseInt(member.uin)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateGroups(newGroupList, false).then();
|
||||
}
|
||||
catch (e) {
|
||||
updateGroups(payload.groupList).then();
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
registerReceiveHook<{ groupList: Group[], updateType: number }>(ReceiveCmd.GROUPS, (payload) => {
|
||||
if (payload.updateType != 2) {
|
||||
updateGroups(payload.groupList).then();
|
||||
}
|
||||
else {
|
||||
if (process.platform == "win32") {
|
||||
processGroupEvent(payload).then();
|
||||
}
|
||||
}
|
||||
})
|
||||
registerReceiveHook<{ groupList: Group[], updateType: number }>(ReceiveCmd.GROUPS_UNIX, (payload) => {
|
||||
if (payload.updateType != 2) {
|
||||
updateGroups(payload.groupList).then();
|
||||
}
|
||||
else {
|
||||
if (process.platform != "win32") {
|
||||
processGroupEvent(payload).then();
|
||||
}
|
||||
}
|
||||
})
|
||||
registerReceiveHook<{
|
||||
data: { categoryId: number, categroyName: string, categroyMbCount: number, buddyList: User[] }[]
|
||||
}>(ReceiveCmd.FRIENDS, payload => {
|
||||
@@ -145,11 +232,6 @@ registerReceiveHook<{
|
||||
}
|
||||
})
|
||||
|
||||
// registerReceiveHook<any>(ReceiveCmd.USER_INFO, (payload)=>{
|
||||
// log("user info", payload);
|
||||
// })
|
||||
|
||||
|
||||
registerReceiveHook<{ msgList: Array<RawMessage> }>(ReceiveCmd.NEW_MSG, (payload) => {
|
||||
for (const message of payload.msgList) {
|
||||
// log("收到新消息,push到历史记录", message)
|
||||
|
Reference in New Issue
Block a user