mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
fix: reply msg id
This commit is contained in:
@@ -4,6 +4,8 @@ import {mergeNewProperties} from "./utils";
|
|||||||
|
|
||||||
export const HOOK_LOG = false;
|
export const HOOK_LOG = false;
|
||||||
|
|
||||||
|
export const ALLOW_SEND_TEMP_MSG = false;
|
||||||
|
|
||||||
export class ConfigUtil {
|
export class ConfigUtil {
|
||||||
private readonly configPath: string;
|
private readonly configPath: string;
|
||||||
private config: Config | null = null;
|
private config: Config | null = null;
|
||||||
|
@@ -11,6 +11,7 @@ import {
|
|||||||
import {type FileCache, type LLOneBotError} from './types'
|
import {type FileCache, type LLOneBotError} from './types'
|
||||||
import {dbUtil} from "./db";
|
import {dbUtil} from "./db";
|
||||||
import {raw} from "express";
|
import {raw} from "express";
|
||||||
|
import {log} from "./utils";
|
||||||
|
|
||||||
export const selfInfo: SelfInfo = {
|
export const selfInfo: SelfInfo = {
|
||||||
uid: '',
|
uid: '',
|
||||||
@@ -30,28 +31,33 @@ export const llonebotError: LLOneBotError = {
|
|||||||
export const fileCache = new Map<string, FileCache>()
|
export const fileCache = new Map<string, FileCache>()
|
||||||
|
|
||||||
|
|
||||||
export async function getHistoryMsgByShortId(shortId: number) {
|
export async function getFriend(qq: string, uid: string = ""): Promise<Friend | undefined> {
|
||||||
// log("getHistoryMsgByShortId", shortId, Object.values(msgHistory).map(m=>m.msgShortId))
|
let filterKey = uid ? "uid" : "uin"
|
||||||
return await dbUtil.getMsgByShortId(shortId);
|
let filterValue = uid ? uid : qq
|
||||||
}
|
let friend = friends.find(friend => friend[filterKey] === filterValue.toString())
|
||||||
|
|
||||||
export async function getFriend(qq: string): Promise<Friend | undefined> {
|
|
||||||
let friend = friends.find(friend => friend.uin === qq)
|
|
||||||
if (!friend) {
|
if (!friend) {
|
||||||
|
try {
|
||||||
friends = (await NTQQApi.getFriends(true))
|
friends = (await NTQQApi.getFriends(true))
|
||||||
friend = friends.find(friend => friend.uin === qq)
|
friend = friends.find(friend => friend[filterKey] === filterValue.toString())
|
||||||
|
} catch (e) {
|
||||||
|
// log("刷新好友列表失败", e.stack.toString())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return friend
|
return friend
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getGroup(qq: string): Promise<Group | undefined> {
|
export async function getGroup(qq: string): Promise<Group | undefined> {
|
||||||
let group = groups.find(group => group.groupCode === qq)
|
let group = groups.find(group => group.groupCode === qq.toString())
|
||||||
if (!group) {
|
if (!group) {
|
||||||
|
try {
|
||||||
const _groups = await NTQQApi.getGroups(true);
|
const _groups = await NTQQApi.getGroups(true);
|
||||||
group = _groups.find(group => group.groupCode === qq)
|
group = _groups.find(group => group.groupCode === qq.toString())
|
||||||
if (group) {
|
if (group) {
|
||||||
groups.push(group)
|
groups.push(group)
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return group
|
return group
|
||||||
}
|
}
|
||||||
@@ -63,18 +69,20 @@ export async function getGroupMember(groupQQ: string | number, memberQQ: string
|
|||||||
}
|
}
|
||||||
const group = await getGroup(groupQQ)
|
const group = await getGroup(groupQQ)
|
||||||
if (group) {
|
if (group) {
|
||||||
let filterFunc: (member: GroupMember) => boolean
|
const filterKey = memberQQ ? "uin" : "uid"
|
||||||
if (memberQQ) {
|
const filterValue = memberQQ ? memberQQ : memberUid
|
||||||
filterFunc = member => member.uin === memberQQ
|
let filterFunc: (member: GroupMember) => boolean = member => member[filterKey] === filterValue
|
||||||
} else if (memberUid) {
|
|
||||||
filterFunc = member => member.uid === memberUid
|
|
||||||
}
|
|
||||||
let member = group.members?.find(filterFunc)
|
let member = group.members?.find(filterFunc)
|
||||||
if (!member) {
|
if (!member) {
|
||||||
|
try {
|
||||||
const _members = await NTQQApi.getGroupMembers(groupQQ)
|
const _members = await NTQQApi.getGroupMembers(groupQQ)
|
||||||
if (_members.length > 0) {
|
if (_members.length > 0) {
|
||||||
group.members = _members
|
group.members = _members
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// log("刷新群成员列表失败", e.stack.toString())
|
||||||
|
}
|
||||||
|
|
||||||
member = group.members?.find(filterFunc)
|
member = group.members?.find(filterFunc)
|
||||||
}
|
}
|
||||||
return member
|
return member
|
||||||
|
@@ -114,7 +114,7 @@ class DBUtil {
|
|||||||
this.db.put(shortIdKey, msg.msgId).then();
|
this.db.put(shortIdKey, msg.msgId).then();
|
||||||
this.db.put(longIdKey, JSON.stringify(msg)).then();
|
this.db.put(longIdKey, JSON.stringify(msg)).then();
|
||||||
this.db.put(seqIdKey, msg.msgId).then();
|
this.db.put(seqIdKey, msg.msgId).then();
|
||||||
|
log(`消息入库 ${seqIdKey}: ${msg.msgId}, ${shortMsgId}: ${msg.msgId}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("addMsg db error", e.stack.toString());
|
log("addMsg db error", e.stack.toString());
|
||||||
}
|
}
|
||||||
@@ -134,7 +134,11 @@ class DBUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Object.assign(existMsg, msg)
|
Object.assign(existMsg, msg)
|
||||||
await this.db.put(longIdKey, JSON.stringify(existMsg));
|
this.db.put(longIdKey, JSON.stringify(existMsg)).then();
|
||||||
|
const shortIdKey = this.DB_KEY_PREFIX_MSG_SHORT_ID + existMsg.msgShortId;
|
||||||
|
const seqIdKey = this.DB_KEY_PREFIX_MSG_SEQ_ID + msg.msgSeq;
|
||||||
|
this.db.put(shortIdKey, msg.msgId).then();
|
||||||
|
this.db.put(seqIdKey, msg.msgId).then();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async genMsgShortId(): Promise<number> {
|
private async genMsgShortId(): Promise<number> {
|
||||||
|
@@ -13,7 +13,7 @@ import {
|
|||||||
import {ob11WebsocketServer} from "../onebot11/server/ws/WebsocketServer";
|
import {ob11WebsocketServer} from "../onebot11/server/ws/WebsocketServer";
|
||||||
import {checkFfmpeg, DATA_DIR, getConfigUtil, log} from "../common/utils";
|
import {checkFfmpeg, DATA_DIR, getConfigUtil, log} from "../common/utils";
|
||||||
import {
|
import {
|
||||||
friendRequests,
|
friendRequests, getFriend,
|
||||||
getGroup,
|
getGroup,
|
||||||
getGroupMember,
|
getGroupMember,
|
||||||
groupNotifies,
|
groupNotifies,
|
||||||
@@ -305,7 +305,10 @@ function onLoad() {
|
|||||||
log("收到邀请我加群通知")
|
log("收到邀请我加群通知")
|
||||||
let groupInviteEvent = new OB11GroupRequestEvent();
|
let groupInviteEvent = new OB11GroupRequestEvent();
|
||||||
groupInviteEvent.group_id = parseInt(notify.group.groupCode);
|
groupInviteEvent.group_id = parseInt(notify.group.groupCode);
|
||||||
let user_id = (await NTQQApi.getUserDetailInfo(notify.user2.uid))?.uin
|
let user_id = (await getFriend("", notify.user2.uid))?.uin
|
||||||
|
if (!user_id){
|
||||||
|
user_id = (await NTQQApi.getUserDetailInfo(notify.user2.uid))?.uin
|
||||||
|
}
|
||||||
groupInviteEvent.user_id = parseInt(user_id);
|
groupInviteEvent.user_id = parseInt(user_id);
|
||||||
groupInviteEvent.sub_type = "invite";
|
groupInviteEvent.sub_type = "invite";
|
||||||
groupInviteEvent.flag = notify.seq;
|
groupInviteEvent.flag = notify.seq;
|
||||||
|
@@ -17,7 +17,7 @@ import {
|
|||||||
type User
|
type User
|
||||||
} from './types'
|
} from './types'
|
||||||
import * as fs from 'node:fs'
|
import * as fs from 'node:fs'
|
||||||
import {friendRequests, groupNotifies, selfInfo} from '../common/data'
|
import {friendRequests, groupNotifies, selfInfo, uidMaps} from '../common/data'
|
||||||
import {v4 as uuidv4} from 'uuid'
|
import {v4 as uuidv4} from 'uuid'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
import {dbUtil} from "../common/db";
|
import {dbUtil} from "../common/db";
|
||||||
@@ -292,7 +292,7 @@ export class NTQQApi {
|
|||||||
|
|
||||||
const members: GroupMember[] = Array.from(values)
|
const members: GroupMember[] = Array.from(values)
|
||||||
for (const member of members) {
|
for (const member of members) {
|
||||||
// uidMaps[member.uid] = member.uin;
|
uidMaps[member.uid] = member.uin;
|
||||||
}
|
}
|
||||||
// log(uidMaps);
|
// log(uidMaps);
|
||||||
// log("members info", values);
|
// log("members info", values);
|
||||||
@@ -469,7 +469,7 @@ export class NTQQApi {
|
|||||||
await sleep(500)
|
await sleep(500)
|
||||||
return await checkSendComplete()
|
return await checkSendComplete()
|
||||||
}
|
}
|
||||||
|
log("开始发送消息", peer, msgElements)
|
||||||
callNTQQApi({
|
callNTQQApi({
|
||||||
methodName: NTQQApiMethod.SEND_MSG,
|
methodName: NTQQApiMethod.SEND_MSG,
|
||||||
args: [{
|
args: [{
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import {AtType, ChatType, Group, RawMessage, SendArkElement, SendMessageElement} from "../../ntqqapi/types";
|
import {AtType, ChatType, Group, RawMessage, SendArkElement, SendMessageElement} from "../../ntqqapi/types";
|
||||||
import {friends, getGroup, getGroupMember, getUidByUin, selfInfo,} from "../../common/data";
|
import {friends, getFriend, getGroup, getGroupMember, getUidByUin, selfInfo,} from "../../common/data";
|
||||||
import {
|
import {
|
||||||
OB11MessageCustomMusic,
|
OB11MessageCustomMusic,
|
||||||
OB11MessageData,
|
OB11MessageData,
|
||||||
@@ -17,6 +17,7 @@ import * as fs from "node:fs";
|
|||||||
import {log} from "../../common/utils";
|
import {log} from "../../common/utils";
|
||||||
import {decodeCQCode} from "../cqcode";
|
import {decodeCQCode} from "../cqcode";
|
||||||
import {dbUtil} from "../../common/db";
|
import {dbUtil} from "../../common/db";
|
||||||
|
import {ALLOW_SEND_TEMP_MSG} from "../../common/config";
|
||||||
|
|
||||||
function checkSendMessage(sendMsgList: OB11MessageData[]) {
|
function checkSendMessage(sendMsgList: OB11MessageData[]) {
|
||||||
function checkUri(uri: string): boolean {
|
function checkUri(uri: string): boolean {
|
||||||
@@ -69,6 +70,22 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
message: "转发消息不能和普通消息混在一起发送,转发需要保证message只有type为node的元素"
|
message: "转发消息不能和普通消息混在一起发送,转发需要保证message只有type为node的元素"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (payload.group_id && !(await getGroup(payload.group_id))) {
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
message: `群${payload.group_id}不存在`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (payload.user_id && payload.message_type !== "group") {
|
||||||
|
if (!(await getFriend(payload.user_id))) {
|
||||||
|
if (!ALLOW_SEND_TEMP_MSG) {
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
message: `不能发送临时消息`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
valid: true,
|
valid: true,
|
||||||
}
|
}
|
||||||
@@ -79,17 +96,16 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
chatType: ChatType.friend,
|
chatType: ChatType.friend,
|
||||||
peerUid: ""
|
peerUid: ""
|
||||||
}
|
}
|
||||||
|
let isTempMsg = false;
|
||||||
let group: Group | undefined = undefined;
|
let group: Group | undefined = undefined;
|
||||||
if (payload?.group_id) {
|
const genGroupPeer = async () => {
|
||||||
group = await getGroup(payload.group_id.toString())
|
group = await getGroup(payload.group_id.toString())
|
||||||
if (!group) {
|
|
||||||
throw (`群${payload.group_id}不存在`)
|
|
||||||
}
|
|
||||||
peer.chatType = ChatType.group
|
peer.chatType = ChatType.group
|
||||||
// peer.name = group.name
|
// peer.name = group.name
|
||||||
peer.peerUid = group.groupCode
|
peer.peerUid = group.groupCode
|
||||||
} else if (payload?.user_id) {
|
}
|
||||||
|
|
||||||
|
const genFriendPeer = () => {
|
||||||
const friend = friends.find(f => f.uin == payload.user_id.toString())
|
const friend = friends.find(f => f.uin == payload.user_id.toString())
|
||||||
if (friend) {
|
if (friend) {
|
||||||
// peer.name = friend.nickName
|
// peer.name = friend.nickName
|
||||||
@@ -101,9 +117,20 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
throw (`找不到私聊对象${payload.user_id}`)
|
throw (`找不到私聊对象${payload.user_id}`)
|
||||||
}
|
}
|
||||||
// peer.name = tempUser.nickName
|
// peer.name = tempUser.nickName
|
||||||
|
isTempMsg = true;
|
||||||
peer.peerUid = tempUserUid;
|
peer.peerUid = tempUserUid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (payload?.group_id && payload.message_type === "group") {
|
||||||
|
await genGroupPeer()
|
||||||
|
|
||||||
|
} else if (payload?.user_id) {
|
||||||
|
genFriendPeer()
|
||||||
|
} else if (payload.group_id) {
|
||||||
|
await genGroupPeer()
|
||||||
|
} else {
|
||||||
|
throw ("发送消息参数错误, 请指定group_id或user_id")
|
||||||
|
}
|
||||||
const messages = this.convertMessage2List(payload.message);
|
const messages = this.convertMessage2List(payload.message);
|
||||||
if (this.getSpecialMsgNum(payload, OB11MessageDataType.node)) {
|
if (this.getSpecialMsgNum(payload, OB11MessageDataType.node)) {
|
||||||
try {
|
try {
|
||||||
@@ -130,7 +157,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
// log("send msg:", peer, sendElements)
|
// log("send msg:", peer, sendElements)
|
||||||
const {sendElements, deleteAfterSentFiles} = await this.createSendElements(messages, group)
|
const {sendElements, deleteAfterSentFiles} = await this.createSendElements(messages, group)
|
||||||
try {
|
try {
|
||||||
const returnMsg = await this.send(peer, sendElements, deleteAfterSentFiles)
|
const returnMsg = await this.send(peer, sendElements, deleteAfterSentFiles, isTempMsg)
|
||||||
return {message_id: returnMsg.msgShortId}
|
return {message_id: returnMsg.msgShortId}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("发送消息失败", e.stack.toString())
|
log("发送消息失败", e.stack.toString())
|
||||||
@@ -278,7 +305,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
case OB11MessageDataType.reply: {
|
case OB11MessageDataType.reply: {
|
||||||
let replyMsgId = sendMsg.data.id;
|
let replyMsgId = sendMsg.data.id;
|
||||||
if (replyMsgId) {
|
if (replyMsgId) {
|
||||||
const replyMsg = await dbUtil.getMsgByShortId(parseInt(replyMsgId))
|
const replyMsg = await dbUtil.getMsgBySeqId(replyMsgId)
|
||||||
if (replyMsg) {
|
if (replyMsg) {
|
||||||
sendElements.push(SendMsgElementConstructor.reply(replyMsg.msgSeq, replyMsg.msgId, replyMsg.senderUin, replyMsg.senderUin))
|
sendElements.push(SendMsgElementConstructor.reply(replyMsg.msgSeq, replyMsg.msgId, replyMsg.senderUin, replyMsg.senderUin))
|
||||||
}
|
}
|
||||||
|
@@ -96,12 +96,18 @@ export class OB11Constructor {
|
|||||||
message_data["data"]["text"] = text
|
message_data["data"]["text"] = text
|
||||||
} else if (element.replyElement) {
|
} else if (element.replyElement) {
|
||||||
message_data["type"] = "reply"
|
message_data["type"] = "reply"
|
||||||
|
log("收到回复消息", element.replyElement.replayMsgSeq)
|
||||||
|
try{
|
||||||
const replyMsg = await dbUtil.getMsgBySeqId(element.replyElement.replayMsgSeq)
|
const replyMsg = await dbUtil.getMsgBySeqId(element.replyElement.replayMsgSeq)
|
||||||
if (replyMsg) {
|
if (replyMsg) {
|
||||||
message_data["data"]["id"] = replyMsg.msgShortId.toString()
|
message_data["data"]["id"] = replyMsg.msgShortId.toString()
|
||||||
} else {
|
} else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
}catch (e) {
|
||||||
|
log("获取不到引用的消息", e.stack)
|
||||||
|
}
|
||||||
|
|
||||||
} else if (element.picElement) {
|
} else if (element.picElement) {
|
||||||
message_data["type"] = "image"
|
message_data["type"] = "image"
|
||||||
// message_data["data"]["file"] = element.picElement.sourcePath
|
// message_data["data"]["file"] = element.picElement.sourcePath
|
||||||
|
@@ -1 +1 @@
|
|||||||
export const version = "3.13.2"
|
export const version = "3.13.3"
|
Reference in New Issue
Block a user