fix: message_id过长导致koishi对接失败

perf: 初始化卡顿优化
This commit is contained in:
linyuchen 2024-02-13 21:17:16 +08:00
parent b28b812396
commit 282b2a0da0
10 changed files with 59 additions and 37 deletions

View File

@ -4,7 +4,7 @@
"name": "LLOneBot",
"slug": "LLOneBot",
"description": "LiteLoaderQQNT的OneBotApi",
"version": "3.0.3",
"version": "3.0.4",
"thumbnail": "./icon.png",
"authors": [{
"name": "linyuchen",

View File

@ -1,10 +1,30 @@
import { NTQQApi } from '../ntqqapi/ntcall';
import { Friend, Group, GroupMember, RawMessage, SelfInfo } from "../ntqqapi/types";
import { log } from "./utils";
export let groups: Group[] = []
export let friends: Friend[] = []
export let msgHistory: Record<string, RawMessage> = {} // msgId: RawMessage
let globalMsgId = Date.now()
export function addHistoryMsg(msg: RawMessage){
let existMsg = msgHistory[msg.msgId]
if (existMsg){
Object.assign(existMsg, msg)
msg.msgShortId = existMsg.msgShortId;
return
}
msg.msgShortId = ++globalMsgId
msgHistory[msg.msgId] = msg
}
export function getHistoryMsgByShortId(shortId: number | string){
log("getHistoryMsgByShortId", shortId, Object.values(msgHistory).map(m=>m.msgShortId))
return Object.values(msgHistory).find(msg => msg.msgShortId.toString() == shortId.toString())
}
export async function getFriend(qq: string): Promise<Friend | undefined> {
let friend = friends.find(friend => friend.uin === qq)
// if (!friend){

View File

@ -10,10 +10,9 @@ import {
CHANNEL_LOG,
CHANNEL_SET_CONFIG,
} from "../common/channels";
import { ConfigUtil } from "../common/config";
import { postMsg, startExpress } from "../onebot11/server";
import { CONFIG_DIR, getConfigUtil, log } from "../common/utils";
import { friends, groups, msgHistory, selfInfo } from "../common/data";
import { addHistoryMsg, selfInfo } from "../common/data";
import { hookNTQQApiReceive, ReceiveCmd, registerReceiveHook } from "../ntqqapi/hook";
import { OB11Constructor } from "../onebot11/constructor";
import { NTQQApi } from "../ntqqapi/ntcall";
@ -48,7 +47,8 @@ function onLoad() {
function postRawMsg(msgList: RawMessage[]) {
const {debug, reportSelfMessage} = getConfigUtil().getConfig();
for (const message of msgList) {
for (let message of msgList) {
addHistoryMsg(message)
OB11Constructor.message(message).then((msg) => {
if (debug) {
msg.raw = message;
@ -86,8 +86,7 @@ function onLoad() {
NTQQApi.getGroups(true).then()
startExpress(getConfigUtil().getConfig().port)
}
async function getSelfInfo() {
const initLoop = setInterval(async ()=>{
try {
const _ = await NTQQApi.getSelfInfo()
Object.assign(selfInfo, _)
@ -95,7 +94,6 @@ function onLoad() {
log("get self simple info", _)
} catch (e) {
log("retry get self info")
}
if (selfInfo.uin) {
try {
@ -104,22 +102,17 @@ function onLoad() {
if (userInfo) {
selfInfo.nick = userInfo.nick
} else {
return setTimeout(() => {
getSelfInfo().then()
}, 100)
return
}
} catch (e) {
log("get self nickname failed", e.toString())
return setTimeout(() => {
getSelfInfo().then()
}, 100)
return log("get self nickname failed", e.toString())
}
clearInterval(initLoop);
start();
} else {
setTimeout(() => {
getSelfInfo().then()
}, 100)
}
}, 1000)
async function getSelfInfo() {
}
getSelfInfo().then()

View File

@ -3,7 +3,7 @@ import { getConfigUtil, log } from "../common/utils";
import { NTQQApi, NTQQApiClass, sendMessagePool } from "./ntcall";
import { Group, User } from "./types";
import { RawMessage } from "./types";
import { friends, groups, msgHistory } from "../common/data";
import { addHistoryMsg, friends, groups, msgHistory } from "../common/data";
import { v4 as uuidv4 } from 'uuid';
export let hookApiCallbacks: Record<string, (apiReturn: any) => void> = {}
@ -131,7 +131,7 @@ registerReceiveHook<{
registerReceiveHook<{ msgList: Array<RawMessage> }>(ReceiveCmd.UPDATE_MSG, (payload) => {
for (const message of payload.msgList) {
msgHistory[message.msgId] = message;
addHistoryMsg(message)
}
})
@ -139,13 +139,13 @@ registerReceiveHook<{ msgList: Array<RawMessage> }>(ReceiveCmd.NEW_MSG, (payload
for (const message of payload.msgList) {
log("收到新消息push到历史记录", message)
if (!msgHistory[message.msgId]) {
msgHistory[message.msgId] = message
addHistoryMsg(message)
} else {
Object.assign(msgHistory[message.msgId], message)
}
}
const msgIds = Object.keys(msgHistory);
if (msgIds.length > 3000) {
if (msgIds.length > 30000) {
delete msgHistory[msgIds.sort()[0]]
}
})

View File

@ -182,6 +182,7 @@ export interface PicElement {
export interface RawMessage {
msgId: string;
msgShortId?: number; // 自己维护的消息id
msgTime: string;
msgSeq: string;
senderUin: string; // 发送者QQ号

View File

@ -1,21 +1,21 @@
import { ActionName } from "./types";
import BaseAction from "./BaseAction";
import { NTQQApi } from "../../ntqqapi/ntcall";
import { msgHistory } from "../../common/data";
import { getHistoryMsgByShortId, msgHistory } from "../../common/data";
interface Payload {
message_id: string
message_id: number
}
class DeleteMsg extends BaseAction<Payload, void> {
actionName = ActionName.DeleteMsg
protected async _handle(payload:Payload){
let msg = msgHistory[payload.message_id]
let msg = getHistoryMsgByShortId(payload.message_id)
await NTQQApi.recallMsg({
chatType: msg.chatType,
peerUid: msg.peerUid
}, [payload.message_id])
}, [msg.msgId])
}
}

View File

@ -1,4 +1,4 @@
import { msgHistory } from "../../common/data";
import { getHistoryMsgByShortId, msgHistory } from "../../common/data";
import { OB11Message } from '../types';
import { OB11Constructor } from "../constructor";
import { log } from "../../common/utils";
@ -7,7 +7,7 @@ import { ActionName } from "./types";
export interface PayloadType {
message_id: string
message_id: number
}
export type ReturnDataType = OB11Message
@ -17,7 +17,7 @@ class GetMsg extends BaseAction<PayloadType, OB11Message> {
protected async _handle(payload: PayloadType){
// log("history msg ids", Object.keys(msgHistory));
const msg = msgHistory[payload.message_id.toString()]
const msg = getHistoryMsgByShortId(payload.message_id)
if (msg) {
const msgData = await OB11Constructor.message(msg);
return msgData

View File

@ -1,5 +1,12 @@
import { AtType, ChatType, Group } from "../../ntqqapi/types";
import { friends, getGroup, getStrangerByUin, msgHistory } from "../../common/data";
import {
addHistoryMsg,
friends,
getGroup,
getHistoryMsgByShortId,
getStrangerByUin,
msgHistory
} from "../../common/data";
import { OB11MessageData, OB11MessageDataType, OB11PostSendMsg } from '../types';
import { NTQQApi } from "../../ntqqapi/ntcall";
import { Peer } from "../../ntqqapi/ntcall";
@ -13,7 +20,7 @@ import { ActionName } from "./types";
import * as fs from "fs";
export interface ReturnDataType {
message_id: string
message_id: number
}
class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
@ -90,7 +97,7 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
let replyMsgId = sendMsg.data.id;
if (replyMsgId) {
replyMsgId = replyMsgId.toString()
const replyMsg = msgHistory[replyMsgId]
const replyMsg = getHistoryMsgByShortId(replyMsgId)
if (replyMsg) {
sendElements.push(SendMsgElementConstructor.reply(replyMsg.msgSeq, replyMsgId, replyMsg.senderUin, replyMsg.senderUin))
}
@ -119,8 +126,9 @@ class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
// log("send msg:", peer, sendElements)
try {
const returnMsg = await NTQQApi.sendMsg(peer, sendElements)
addHistoryMsg(returnMsg)
deleteAfterSentFiles.map(f=>fs.unlink(f, ()=>{}))
return { message_id: returnMsg.msgId }
return { message_id: returnMsg.msgShortId }
} catch (e) {
throw(e.toString())
}

View File

@ -1,6 +1,6 @@
import {OB11MessageDataType, OB11GroupMemberRole, OB11Message, OB11MessageData, OB11Group, OB11GroupMember, OB11User} from "./types";
import { AtType, ChatType, Group, GroupMember, IMAGE_HTTP_HOST, RawMessage, SelfInfo, User } from '../ntqqapi/types';
import { getFriend, getGroupMember, getHistoryMsgBySeq, selfInfo } from '../common/data';
import { addHistoryMsg, getFriend, getGroupMember, getHistoryMsgBySeq, selfInfo } from '../common/data';
import {file2base64, getConfigUtil, log} from "../common/utils";
import { NTQQApi } from "../ntqqapi/ntcall";
@ -13,7 +13,7 @@ export class OB11Constructor {
self_id: selfInfo.uin,
user_id: msg.senderUin,
time: parseInt(msg.msgTime) || 0,
message_id: msg.msgId,
message_id: msg.msgShortId,
real_id: msg.msgId,
message_type: msg.chatType == ChatType.group ? "group" : "private",
sender: {
@ -85,7 +85,7 @@ export class OB11Constructor {
message_data["type"] = "reply"
const replyMsg = getHistoryMsgBySeq(element.replyElement.replayMsgSeq)
if (replyMsg) {
message_data["data"]["id"] = replyMsg.msgId
message_data["data"]["id"] = replyMsg.msgShortId
}
else{
continue

View File

@ -58,7 +58,7 @@ export enum OB11MessageType {
export interface OB11Message {
self_id?: string,
time: number,
message_id: string,
message_id: number,
real_id: string,
user_id: string,
group_id?: string,