mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
optimize
This commit is contained in:
@@ -18,7 +18,7 @@ import {
|
||||
CHANNEL_UPDATE,
|
||||
CHANNEL_SET_CONFIG_CONFIRMED
|
||||
} from '../common/channels'
|
||||
import { hookNTQQApiCall, hookNTQQApiReceive } from '../ntqqapi/hook'
|
||||
import { startHook } from '../ntqqapi/hook'
|
||||
import { checkNewVersion, upgradeLLOneBot } from '../common/utils/upgrade'
|
||||
import { getConfigUtil } from '../common/config'
|
||||
import { checkFfmpeg } from '../common/utils/video'
|
||||
@@ -217,23 +217,11 @@ function onLoad() {
|
||||
|
||||
// 创建窗口时触发
|
||||
function onBrowserWindowCreated(window: BrowserWindow) {
|
||||
if (![2, 4, 6].includes(window.id)) {
|
||||
return
|
||||
}
|
||||
if (window.id === 2) {
|
||||
mainWindow = window
|
||||
}
|
||||
//log('window create', window.webContents.getURL().toString())
|
||||
try {
|
||||
hookNTQQApiCall(window, window.id !== 2)
|
||||
hookNTQQApiReceive(window, window.id !== 2)
|
||||
} catch (e) {
|
||||
log('LLOneBot hook error: ', String(e))
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
onLoad()
|
||||
startHook()
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
@@ -16,7 +16,7 @@ import {
|
||||
SendTextElement,
|
||||
SendVideoElement,
|
||||
} from './types'
|
||||
import { stat, writeFile, copyFile, unlink } from 'node:fs/promises'
|
||||
import { stat, writeFile, copyFile, unlink, access } from 'node:fs/promises'
|
||||
import { calculateFileMD5 } from '../common/utils/file'
|
||||
import { defaultVideoThumb, getVideoInfo } from '../common/utils/video'
|
||||
import { encodeSilk } from '../common/utils/audio'
|
||||
@@ -115,25 +115,17 @@ export namespace SendElement {
|
||||
}
|
||||
|
||||
export async function video(ctx: Context, filePath: string, fileName = '', diyThumbPath = ''): Promise<SendVideoElement> {
|
||||
try {
|
||||
await stat(filePath)
|
||||
} catch (e) {
|
||||
throw `文件${filePath}异常,不存在`
|
||||
}
|
||||
ctx.logger.info('复制视频到QQ目录', filePath)
|
||||
await access(filePath)
|
||||
const { fileName: _fileName, path, fileSize, md5 } = await ctx.ntFileApi.uploadFile(filePath, ElementType.Video)
|
||||
|
||||
ctx.logger.info('复制视频到QQ目录完成', path)
|
||||
if (fileSize === 0) {
|
||||
throw '文件异常,大小为0'
|
||||
throw new Error('文件异常,大小为 0')
|
||||
}
|
||||
const maxMB = 100;
|
||||
const maxMB = 100
|
||||
if (fileSize > 1024 * 1024 * maxMB) {
|
||||
throw `视频过大,最大支持${maxMB}MB,当前文件大小${fileSize}B`
|
||||
throw new Error(`视频过大,最大支持${maxMB}MB,当前文件大小${fileSize}B`)
|
||||
}
|
||||
let thumbDir = path.replace(`${pathLib.sep}Ori${pathLib.sep}`, `${pathLib.sep}Thumb${pathLib.sep}`)
|
||||
thumbDir = pathLib.dirname(thumbDir)
|
||||
// log("thumb 目录", thumb)
|
||||
const thumbDir = pathLib.dirname(path.replaceAll('\\', '/').replace(`/Ori/`, `/Thumb/`))
|
||||
let videoInfo = {
|
||||
width: 1920,
|
||||
height: 1080,
|
||||
@@ -194,7 +186,6 @@ export namespace SendElement {
|
||||
const _thumbPath = await createThumb
|
||||
ctx.logger.info('生成视频缩略图', _thumbPath)
|
||||
const thumbSize = (await stat(_thumbPath)).size
|
||||
// log("生成缩略图", _thumbPath)
|
||||
thumbPath.set(0, _thumbPath)
|
||||
const thumbMd5 = await calculateFileMD5(_thumbPath)
|
||||
const element: SendVideoElement = {
|
||||
|
@@ -1,8 +1,7 @@
|
||||
import type { BrowserWindow } from 'electron'
|
||||
import { NTClass, NTMethod } from './ntcall'
|
||||
import { NTMethod } from './ntcall'
|
||||
import { log } from '@/common/utils'
|
||||
import { randomUUID } from 'node:crypto'
|
||||
import { Dict } from 'cosmokit'
|
||||
import { ipcMain } from 'electron'
|
||||
|
||||
export const hookApiCallbacks: Record<string, (res: any) => void> = {}
|
||||
|
||||
@@ -28,19 +27,6 @@ export enum ReceiveCmdS {
|
||||
MEDIA_UPLOAD_COMPLETE = 'nodeIKernelMsgListener/onRichMediaUploadComplete',
|
||||
}
|
||||
|
||||
type NTReturnData = [
|
||||
{
|
||||
type: 'request'
|
||||
eventName: NTClass
|
||||
callbackId?: string
|
||||
},
|
||||
{
|
||||
cmdName: ReceiveCmdS
|
||||
cmdType: 'event'
|
||||
payload: unknown
|
||||
}[]
|
||||
]
|
||||
|
||||
const logHook = false
|
||||
|
||||
const receiveHooks: Array<{
|
||||
@@ -54,92 +40,64 @@ const callHooks: Array<{
|
||||
hookFunc: (callParams: unknown[]) => void | Promise<void>
|
||||
}> = []
|
||||
|
||||
export function hookNTQQApiReceive(window: BrowserWindow, onlyLog: boolean) {
|
||||
window.webContents.send = new Proxy(window.webContents.send, {
|
||||
apply(target, thisArg, args: [channel: string, ...args: NTReturnData]) {
|
||||
try {
|
||||
if (logHook && !args[1]?.eventName?.startsWith('ns-LoggerApi')) {
|
||||
log('received ntqq api message', args)
|
||||
}
|
||||
} catch { }
|
||||
if (!onlyLog) {
|
||||
if (args[2] instanceof Array) {
|
||||
for (const receiveData of args[2]) {
|
||||
const ntMethodName = receiveData.cmdName
|
||||
for (const hook of receiveHooks) {
|
||||
if (hook.method.includes(ntMethodName)) {
|
||||
Promise.resolve(hook.hookFunc(receiveData.payload))
|
||||
export function startHook() {
|
||||
const senderExclude = Symbol()
|
||||
|
||||
ipcMain.emit = new Proxy(ipcMain.emit, {
|
||||
apply(target, thisArg, args: [eventName: string, ...args: any]) {
|
||||
if (args[2]?.eventName.startsWith('ns-LoggerApi')) {
|
||||
return target.apply(thisArg, args)
|
||||
}
|
||||
if (logHook) {
|
||||
log('request', args)
|
||||
}
|
||||
|
||||
const event = args[1]
|
||||
if (event.sender && !event.sender[senderExclude]) {
|
||||
event.sender[senderExclude] = true
|
||||
event.sender.send = new Proxy(event.sender.send, {
|
||||
apply(target, thisArg, args: any[]) {
|
||||
if (args[1].eventName?.startsWith('ns-LoggerApi')) {
|
||||
return target.apply(thisArg, args)
|
||||
}
|
||||
if (logHook) {
|
||||
log('received', args)
|
||||
}
|
||||
|
||||
const callbackId = args[1].callbackId
|
||||
if (callbackId) {
|
||||
if (hookApiCallbacks[callbackId]) {
|
||||
Promise.resolve(hookApiCallbacks[callbackId](args[2]))
|
||||
delete hookApiCallbacks[callbackId]
|
||||
}
|
||||
} else if (args[2]) {
|
||||
for (const receiveData of args[2]) {
|
||||
for (const hook of receiveHooks) {
|
||||
if (hook.method.includes(receiveData.cmdName)) {
|
||||
Promise.resolve(hook.hookFunc(receiveData.payload))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return target.apply(thisArg, args)
|
||||
}
|
||||
}
|
||||
if (args[1]?.callbackId) {
|
||||
const callbackId = args[1].callbackId
|
||||
if (hookApiCallbacks[callbackId]) {
|
||||
Promise.resolve(hookApiCallbacks[callbackId](args[2]))
|
||||
delete hookApiCallbacks[callbackId]
|
||||
})
|
||||
}
|
||||
|
||||
if (args[3]?.length) {
|
||||
const method = args[3][0]
|
||||
const callParams = args[3].slice(1)
|
||||
for (const hook of callHooks) {
|
||||
if (hook.method.includes(method)) {
|
||||
Promise.resolve(hook.hookFunc(callParams))
|
||||
}
|
||||
}
|
||||
}
|
||||
return target.apply(thisArg, args)
|
||||
},
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function hookNTQQApiCall(window: BrowserWindow, onlyLog: boolean) {
|
||||
const webContents = window.webContents as Dict
|
||||
const ipc_message_proxy = webContents._events['-ipc-message']?.[0] || webContents._events['-ipc-message']
|
||||
|
||||
const proxyIpcMsg = new Proxy(ipc_message_proxy, {
|
||||
apply(target, thisArg, args) {
|
||||
const isLogger = args[3]?.[0]?.eventName?.startsWith('ns-LoggerApi')
|
||||
if (!isLogger) {
|
||||
try {
|
||||
logHook && log('call NTQQ api', args)
|
||||
} catch (e) { }
|
||||
if (!onlyLog) {
|
||||
try {
|
||||
const _args: unknown[] = args[3][1]
|
||||
const cmdName = _args[0] as NTMethod
|
||||
const callParams = _args.slice(1)
|
||||
callHooks.forEach((hook) => {
|
||||
if (hook.method.includes(cmdName)) {
|
||||
Promise.resolve(hook.hookFunc(callParams))
|
||||
}
|
||||
})
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
return target.apply(thisArg, args)
|
||||
},
|
||||
})
|
||||
if (webContents._events['-ipc-message']?.[0]) {
|
||||
webContents._events['-ipc-message'][0] = proxyIpcMsg
|
||||
} else {
|
||||
webContents._events['-ipc-message'] = proxyIpcMsg
|
||||
}
|
||||
|
||||
/*const ipc_invoke_proxy = webContents._events['-ipc-invoke']?.[0] || webContents._events['-ipc-invoke']
|
||||
const proxyIpcInvoke = new Proxy(ipc_invoke_proxy, {
|
||||
apply(target, thisArg, args) {
|
||||
//HOOK_LOG && log('call NTQQ invoke api', thisArg, args)
|
||||
args[0]['_replyChannel']['sendReply'] = new Proxy(args[0]['_replyChannel']['sendReply'], {
|
||||
apply(sendtarget, sendthisArg, sendargs) {
|
||||
sendtarget.apply(sendthisArg, sendargs)
|
||||
},
|
||||
})
|
||||
const ret = target.apply(thisArg, args)
|
||||
//HOOK_LOG && log('call NTQQ invoke api return', ret)
|
||||
return ret
|
||||
},
|
||||
})
|
||||
if (webContents._events['-ipc-invoke']?.[0]) {
|
||||
webContents._events['-ipc-invoke'][0] = proxyIpcInvoke
|
||||
} else {
|
||||
webContents._events['-ipc-invoke'] = proxyIpcInvoke
|
||||
}*/
|
||||
}
|
||||
|
||||
export function registerReceiveHook<PayloadType>(
|
||||
method: string | string[],
|
||||
hookFunc: (payload: PayloadType) => void,
|
||||
|
@@ -95,4 +95,6 @@ export interface NodeIKernelMsgService {
|
||||
getMultiMsg(...args: unknown[]): Promise<GeneralCallResult & { msgList: RawMessage[] }>
|
||||
|
||||
getTempChatInfo(chatType: number, uid: string): Promise<TmpChatInfoApi>
|
||||
|
||||
sendSsoCmdReqByContend(ssoCmd: string, content: string): Promise<GeneralCallResult & { rsp: string }>
|
||||
}
|
||||
|
@@ -56,7 +56,7 @@ export class SatoriServer {
|
||||
|
||||
const { listen, port } = this.config
|
||||
this.httpServer = this.express.listen(port, listen, () => {
|
||||
this.ctx.logger.info(`HTTP server started ${listen}:${port}`)
|
||||
this.ctx.logger.info(`server started ${listen}:${port}`)
|
||||
})
|
||||
this.wsServer = new WebSocketServer({
|
||||
server: this.httpServer
|
||||
|
Reference in New Issue
Block a user