Merge pull request #474 from LLOneBot/dev

release: 4.0.9
This commit is contained in:
idranme 2024-10-13 23:51:30 +08:00 committed by GitHub
commit a4beeba528
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 35 additions and 20 deletions

View File

@ -4,7 +4,7 @@
"name": "LLOneBot", "name": "LLOneBot",
"slug": "LLOneBot", "slug": "LLOneBot",
"description": "实现 OneBot 11 和 Satori 协议,用于 QQ 机器人开发", "description": "实现 OneBot 11 和 Satori 协议,用于 QQ 机器人开发",
"version": "4.0.8", "version": "4.0.9",
"icon": "./icon.webp", "icon": "./icon.webp",
"authors": [ "authors": [
{ {

View File

@ -58,7 +58,7 @@ export class NTQQFriendApi extends Service {
return Object.values(data.userSimpleInfos).filter(v => uids.includes(v.uid!)) return Object.values(data.userSimpleInfos).filter(v => uids.includes(v.uid!))
} }
/** uid => uin */ /** uid -> uin */
async getBuddyIdMap(refresh = false): Promise<Map<string, string>> { async getBuddyIdMap(refresh = false): Promise<Map<string, string>> {
const retMap: Map<string, string> = new Map() const retMap: Map<string, string> = new Map()
const data = await invoke<{ const data = await invoke<{

View File

@ -52,7 +52,7 @@ export class NTQQMsgApi extends Service {
} }
async getMsgHistory(peer: Peer, msgId: string, cnt: number, queryOrder = false) { async getMsgHistory(peer: Peer, msgId: string, cnt: number, queryOrder = false) {
// 默认情况下消息时间从旧到 // 默认情况下消息时间从到旧
return await invoke(NTMethod.HISTORY_MSG, [{ peer, msgId, cnt, queryOrder }]) return await invoke(NTMethod.HISTORY_MSG, [{ peer, msgId, cnt, queryOrder }])
} }
@ -93,7 +93,7 @@ export class NTQQMsgApi extends Service {
const uniqueId = await this.generateMsgUniqueId(destPeer.chatType) const uniqueId = await this.generateMsgUniqueId(destPeer.chatType)
destPeer.guildId = uniqueId destPeer.guildId = uniqueId
const data = await invoke<{ msgList: RawMessage[] }>( const data = await invoke<{ msgList: RawMessage[] }>(
'nodeIKernelMsgService/forwardMsg', 'nodeIKernelMsgService/forwardMsgWithComment',
[{ [{
msgIds, msgIds,
srcContact: srcPeer, srcContact: srcPeer,
@ -111,7 +111,8 @@ export class NTQQMsgApi extends Service {
} }
} }
return false return false
} },
timeout: 3000
} }
) )
delete destPeer.guildId delete destPeer.guildId

View File

@ -178,7 +178,7 @@ export class NTQQUserApi extends Service {
if (uin) return uin if (uin) return uin
uin = (await invoke('nodeIKernelUixConvertService/getUin', [{ uids: [uid] }])).uinInfo.get(uid) uin = (await invoke('nodeIKernelUixConvertService/getUin', [{ uids: [uid] }])).uinInfo.get(uid)
if (uin) return uin if (uin) return uin
uin = (await this.ctx.ntFriendApi.getBuddyIdMap(true)).get(uid) uin = (await this.ctx.ntFriendApi.getBuddyIdMap()).get(uid)
if (uin) return uin if (uin) return uin
uin = (await this.getUserDetailInfo(uid)).uin uin = (await this.getUserDetailInfo(uid)).uin
return uin return uin

View File

@ -1,6 +1,9 @@
import { Context } from 'cordis' import { Context } from 'cordis'
import { Dict } from 'cosmokit' import { Dict } from 'cosmokit'
import { getBuildVersion } from '@/common/utils/misc' import { getBuildVersion } from '@/common/utils/misc'
import { TEMP_DIR } from '@/common/globalVars'
import { copyFile } from 'fs/promises'
import path from 'node:path'
import addon from './external/crychic-win32-x64.node?asset' import addon from './external/crychic-win32-x64.node?asset'
export class Native { export class Native {
@ -18,11 +21,11 @@ export class Native {
checkVersion() { checkVersion() {
const version = getBuildVersion() const version = getBuildVersion()
// 27187—27597 // 27333—27597
return version >= 27187 && version < 28060 return version >= 27333 && version < 28060
} }
start() { async start() {
if (this.crychic) { if (this.crychic) {
return return
} }
@ -33,7 +36,10 @@ export class Native {
return return
} }
try { try {
this.crychic = require(addon) const fileName = path.basename(addon)
const dest = path.join(TEMP_DIR, fileName)
await copyFile(addon, dest)
this.crychic = require(dest)
this.crychic!.init() this.crychic!.init()
} catch (e) { } catch (e) {
this.ctx.logger.warn('crychic 加载失败', e) this.ctx.logger.warn('crychic 加载失败', e)

View File

@ -30,12 +30,12 @@ export class GetGroupMsgHistory extends BaseAction<Payload, Response> {
const { count, reverseOrder } = payload const { count, reverseOrder } = payload
const peer = { chatType: ChatType.Group, peerUid: payload.group_id.toString() } const peer = { chatType: ChatType.Group, peerUid: payload.group_id.toString() }
let msgList: RawMessage[] let msgList: RawMessage[]
if (!payload.message_seq || payload.message_seq === '0') { if (!payload.message_seq || +payload.message_seq === 0) {
msgList = (await this.ctx.ntMsgApi.getAioFirstViewLatestMsgs(peer, +count)).msgList msgList = (await this.ctx.ntMsgApi.getAioFirstViewLatestMsgs(peer, +count)).msgList
} else { } else {
const startMsgId = (await this.ctx.store.getMsgInfoByShortId(+payload.message_seq))?.msgId const startMsgId = (await this.ctx.store.getMsgInfoByShortId(+payload.message_seq))?.msgId
if (!startMsgId) throw new Error(`消息${payload.message_seq}不存在`) if (!startMsgId) throw new Error(`消息${payload.message_seq}不存在`)
msgList = (await this.ctx.ntMsgApi.getMsgHistory(peer, startMsgId, +count)).msgList msgList = (await this.ctx.ntMsgApi.getMsgHistory(peer, startMsgId, +count, true)).msgList
} }
if (!msgList?.length) throw new Error('未找到消息') if (!msgList?.length) throw new Error('未找到消息')
if (reverseOrder) msgList.reverse() if (reverseOrder) msgList.reverse()

View File

@ -17,7 +17,7 @@ export class FriendPoke extends BaseAction<Payload, null> {
throw new Error('当前系统平台或架构不支持') throw new Error('当前系统平台或架构不支持')
} }
if (!this.ctx.app.native.checkVersion()) { if (!this.ctx.app.native.checkVersion()) {
throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 27187—27597`) throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 27333—27597`)
} }
await this.ctx.app.native.sendFriendPoke(+payload.user_id) await this.ctx.app.native.sendFriendPoke(+payload.user_id)
return null return null

View File

@ -19,7 +19,7 @@ export class GroupPoke extends BaseAction<Payload, null> {
throw new Error('当前系统平台或架构不支持') throw new Error('当前系统平台或架构不支持')
} }
if (!this.ctx.app.native.checkVersion()) { if (!this.ctx.app.native.checkVersion()) {
throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 27187—27597`) throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 27333—27597`)
} }
await this.ctx.app.native.sendGroupPoke(+payload.group_id, +payload.user_id) await this.ctx.app.native.sendGroupPoke(+payload.group_id, +payload.user_id)
return null return null

View File

@ -79,11 +79,14 @@ export namespace OB11Entities {
if (msg.chatType === ChatType.Group) { if (msg.chatType === ChatType.Group) {
resMsg.sub_type = 'normal' resMsg.sub_type = 'normal'
resMsg.group_id = parseInt(msg.peerUin) resMsg.group_id = parseInt(msg.peerUin)
const member = await ctx.ntGroupApi.getGroupMember(msg.peerUin, msg.senderUid) // 284840486: 合并转发内部
if (member) { if (msg.peerUin !== '284840486') {
resMsg.sender.role = groupMemberRole(member.role) const member = await ctx.ntGroupApi.getGroupMember(msg.peerUin, msg.senderUid)
resMsg.sender.nickname = member.nick if (member) {
resMsg.sender.title = member.memberSpecialTitle ?? '' resMsg.sender.role = groupMemberRole(member.role)
resMsg.sender.nickname = member.nick
resMsg.sender.title = member.memberSpecialTitle ?? ''
}
} }
} }
else if (msg.chatType === ChatType.C2C) { else if (msg.chatType === ChatType.C2C) {

View File

@ -129,6 +129,11 @@ async function decodeElement(ctx: Context, data: NT.RawMessage, quoted = false)
type: String(faceType), type: String(faceType),
platform: 'llonebot' platform: 'llonebot'
})) }))
} else if (v.arkElement) {
// llonebot:ark
buffer.push(h('llonebot:ark', {
data: v.arkElement.bytesData
}))
} }
} }
return buffer return buffer

View File

@ -1 +1 @@
export const version = '4.0.8' export const version = '4.0.9'