diff --git a/manifest.json b/manifest.json index 6668488..64f93ac 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "LLOneBot", "slug": "LLOneBot", "description": "实现 OneBot 11 协议,用于 QQ 机器人开发", - "version": "3.31.7", + "version": "3.31.8", "icon": "./icon.webp", "authors": [ { diff --git a/src/common/utils/audio.ts b/src/common/utils/audio.ts index e6152aa..c11c30f 100644 --- a/src/common/utils/audio.ts +++ b/src/common/utils/audio.ts @@ -3,7 +3,6 @@ import ffmpeg from 'fluent-ffmpeg' import fsPromise from 'node:fs/promises' import { decode, encode, getDuration, getWavFileInfo, isWav, isSilk, EncodeResult } from 'silk-wasm' import { TEMP_DIR } from '../globalVars' -import { getConfigUtil } from '../config' import { randomUUID } from 'node:crypto' import { Readable } from 'node:stream' import { Context } from 'cordis' @@ -38,7 +37,7 @@ function convert(ctx: Context, input: Input, options: FFmpegOptions, outputPath? if (options.output) { command = command.outputOptions(options.output) } - const ffmpegPath = getConfigUtil().getConfig().ffmpeg + const ffmpegPath: string | undefined = ctx.config.ffmpeg if (ffmpegPath) { command = command.setFfmpegPath(ffmpegPath) } diff --git a/src/common/utils/video.ts b/src/common/utils/video.ts index ec46c5a..507948a 100644 --- a/src/common/utils/video.ts +++ b/src/common/utils/video.ts @@ -1,14 +1,14 @@ import ffmpeg from 'fluent-ffmpeg' import fs from 'node:fs' import { log } from './legacyLog' -import { getConfigUtil } from '../config' +import { Context } from 'cordis' const defaultVideoThumbB64 = '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' export const defaultVideoThumb = Buffer.from(defaultVideoThumbB64, 'base64') -export async function getVideoInfo(filePath: string) { +export async function getVideoInfo(ctx: Context, filePath: string) { const size = fs.statSync(filePath).size return new Promise<{ width: number @@ -18,7 +18,7 @@ export async function getVideoInfo(filePath: string) { size: number filePath: string }>((resolve, reject) => { - let ffmpegPath = getConfigUtil().getConfig().ffmpeg + const ffmpegPath: string | undefined = ctx.config.ffmpeg ffmpegPath && ffmpeg.setFfmpegPath(ffmpegPath) ffmpeg(filePath).ffprobe((err, metadata) => { if (err) { diff --git a/src/main/main.ts b/src/main/main.ts index c12f47b..442b3db 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -175,6 +175,9 @@ function onLoad() { debug: config.debug!, reportSelfMessage: config.reportSelfMessage!, msgCacheExpire: config.msgCacheExpire!, + musicSignUrl: config.musicSignUrl, + enableLocalFile2Url: config.enableLocalFile2Url!, + ffmpeg: config.ffmpeg, }) ctx.start() ipcMain.on(CHANNEL_SET_CONFIG_CONFIRMED, (event, config: LLOBConfig) => { diff --git a/src/ntqqapi/core.ts b/src/ntqqapi/core.ts index 3ed93ad..88ab2c0 100644 --- a/src/ntqqapi/core.ts +++ b/src/ntqqapi/core.ts @@ -52,6 +52,9 @@ class Core extends Service { MessageUnique.init(selfInfo.uin) this.registerListener() this.ctx.logger.info(`LLOneBot/${version}`) + this.ctx.on('llonebot/config-updated', input => { + Object.assign(this.config, input) + }) } private registerListener() { diff --git a/src/ntqqapi/entities.ts b/src/ntqqapi/entities.ts index 3a8cc3e..8fb3c27 100644 --- a/src/ntqqapi/entities.ts +++ b/src/ntqqapi/entities.ts @@ -147,7 +147,7 @@ export namespace SendElementEntities { filePath, } try { - videoInfo = await getVideoInfo(path) + videoInfo = await getVideoInfo(ctx, path) ctx.logger.info('视频信息', videoInfo) } catch (e) { ctx.logger.info('获取视频信息失败', e) diff --git a/src/onebot11/action/file/GetFile.ts b/src/onebot11/action/file/GetFile.ts index 8f5544a..24fd776 100644 --- a/src/onebot11/action/file/GetFile.ts +++ b/src/onebot11/action/file/GetFile.ts @@ -1,6 +1,5 @@ import BaseAction from '../BaseAction' import fsPromise from 'node:fs/promises' -import { getConfigUtil } from '@/common/config' import { ActionName } from '../types' import { Peer, ElementType } from '@/ntqqapi/types' import { MessageUnique } from '@/common/utils/messageUnique' @@ -20,7 +19,7 @@ export interface GetFileResponse { export abstract class GetFileBase extends BaseAction { // forked from https://github.com/NapNeko/NapCatQQ/blob/6f6b258f22d7563f15d84e7172c4d4cbb547f47e/src/onebot11/action/file/GetFile.ts#L44 protected async _handle(payload: GetFilePayload): Promise { - const { enableLocalFile2Url } = getConfigUtil().getConfig() + const { enableLocalFile2Url } = this.adapter.config let fileCache = await MessageUnique.getFileCacheById(String(payload.file)) if (!fileCache?.length) { diff --git a/src/onebot11/action/file/GetRecord.ts b/src/onebot11/action/file/GetRecord.ts index 1f68e78..5c9745f 100644 --- a/src/onebot11/action/file/GetRecord.ts +++ b/src/onebot11/action/file/GetRecord.ts @@ -1,7 +1,6 @@ import { GetFileBase, GetFilePayload, GetFileResponse } from './GetFile' import { ActionName } from '../types' import { decodeSilk } from '@/common/utils/audio' -import { getConfigUtil } from '@/common/config' import path from 'node:path' import fs from 'node:fs' @@ -17,7 +16,7 @@ export default class GetRecord extends GetFileBase { res.file = await decodeSilk(this.ctx, res.file!, payload.out_format) res.file_name = path.basename(res.file) res.file_size = fs.statSync(res.file).size.toString() - if (getConfigUtil().getConfig().enableLocalFile2Url) { + if (this.adapter.config.enableLocalFile2Url) { res.base64 = fs.readFileSync(res.file, 'base64') } return res diff --git a/src/onebot11/action/msg/SendMsg.ts b/src/onebot11/action/msg/SendMsg.ts index 9ee583f..9a882d9 100644 --- a/src/onebot11/action/msg/SendMsg.ts +++ b/src/onebot11/action/msg/SendMsg.ts @@ -13,10 +13,9 @@ import { OB11MessageNode, OB11PostSendMsg, } from '../../types' +import fs from 'node:fs' import BaseAction from '../BaseAction' import { ActionName, BaseCheckResult } from '../types' -import fs from 'node:fs' -import { getConfigUtil } from '@/common/config' import { CustomMusicSignPostData, IdMusicSignPostData, MusicSign, MusicSignPostData } from '@/common/utils/sign' import { Peer } from '@/ntqqapi/types/msg' import { MessageUnique } from '@/common/utils/messageUnique' @@ -76,7 +75,7 @@ export class SendMsg extends BaseAction { else if (this.getSpecialMsgNum(messages, OB11MessageDataType.music)) { const music = messages[0] as OB11MessageMusic if (music) { - const { musicSignUrl } = getConfigUtil().getConfig() + const { musicSignUrl } = this.adapter.config if (!musicSignUrl) { throw '音乐签名地址未配置' } diff --git a/src/onebot11/adapter.ts b/src/onebot11/adapter.ts index 152b225..c082206 100644 --- a/src/onebot11/adapter.ts +++ b/src/onebot11/adapter.ts @@ -342,10 +342,13 @@ class OneBot11Adapter extends Service { Object.assign(this.config, { ...config.ob11, heartInterval: config.heartInterval, - token: config.token!, - debug: config.debug!, - reportSelfMessage: config.reportSelfMessage!, - msgCacheExpire: config.msgCacheExpire!, + token: config.token, + debug: config.debug, + reportSelfMessage: config.reportSelfMessage, + msgCacheExpire: config.msgCacheExpire, + musicSignUrl: config.musicSignUrl, + enableLocalFile2Url: config.enableLocalFile2Url, + ffmpeg: config.ffmpeg }) } @@ -417,6 +420,9 @@ namespace OneBot11Adapter { debug: boolean reportSelfMessage: boolean msgCacheExpire: number + musicSignUrl?: string + enableLocalFile2Url: boolean + ffmpeg?: string } } diff --git a/src/onebot11/entities.ts b/src/onebot11/entities.ts index 3a1680b..0c4ee66 100644 --- a/src/onebot11/entities.ts +++ b/src/onebot11/entities.ts @@ -1,4 +1,4 @@ -import fastXmlParser from 'fast-xml-parser' +import { XMLParser } from 'fast-xml-parser' import { OB11Group, OB11GroupMember, @@ -32,7 +32,6 @@ import { OB11GroupBanEvent } from './event/notice/OB11GroupBanEvent' import { OB11GroupUploadNoticeEvent } from './event/notice/OB11GroupUploadNoticeEvent' import { OB11GroupNoticeEvent } from './event/notice/OB11GroupNoticeEvent' import { calcQQLevel } from '../common/utils/misc' -import { getConfigUtil } from '../common/config' import { OB11GroupTitleEvent } from './event/notice/OB11GroupTitleEvent' import { OB11GroupCardEvent } from './event/notice/OB11GroupCardEvent' import { OB11GroupDecreaseEvent } from './event/notice/OB11GroupDecreaseEvent' @@ -47,14 +46,14 @@ import { omit, isNullable, pick } from 'cosmokit' import { Context } from 'cordis' import { selfInfo } from '@/common/globalVars' import { pathToFileURL } from 'node:url' +import OneBot11Adapter from './adapter' export namespace OB11Entities { export async function message(ctx: Context, msg: RawMessage): Promise { - let config = getConfigUtil().getConfig() const { debug, - ob11: { messagePostFormat }, - } = config + messagePostFormat, + } = ctx.config as OneBot11Adapter.Config const selfUin = selfInfo.uin const resMsg: OB11Message = { self_id: parseInt(selfUin), @@ -96,10 +95,10 @@ export namespace OB11Entities { resMsg.sub_type = 'group' const ret = await ctx.ntMsgApi.getTempChatInfo(ChatType2.KCHATTYPETEMPC2CFROMGROUP, msg.senderUid) if (ret?.result === 0) { - resMsg.group_id = parseInt(ret.tmpChatInfo!.groupCode) - resMsg.sender.nickname = ret.tmpChatInfo!.fromNick + resMsg.temp_source = Number(ret.tmpChatInfo?.groupCode) + resMsg.sender.nickname = ret.tmpChatInfo?.fromNick! } else { - resMsg.group_id = 284840486 //兜底数据 + resMsg.temp_source = 284840486 //兜底数据 resMsg.sender.nickname = '临时会话' } } @@ -515,7 +514,7 @@ export namespace OB11Entities { // // // ", - const emojiLikeData = new fastXmlParser.XMLParser({ + const emojiLikeData = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '', }).parse(xmlElement.content) diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts index 2d737ee..4e857a1 100644 --- a/src/onebot11/types.ts +++ b/src/onebot11/types.ts @@ -93,6 +93,7 @@ export interface OB11Message { font: number post_type?: EventType raw?: RawMessage + temp_source?: number } export interface OB11ForwardMessage extends OB11Message { diff --git a/src/version.ts b/src/version.ts index e63cc64..bbcd881 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = '3.31.7' +export const version = '3.31.8'