mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
Compare commits
41 Commits
v4.2.2
...
0d27ef7ebc
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0d27ef7ebc | ||
![]() |
e3dffa24f8 | ||
![]() |
edf7a97269 | ||
![]() |
66335ddf9b | ||
![]() |
70b3005005 | ||
![]() |
ac5fe4d275 | ||
![]() |
4aadcd5288 | ||
![]() |
2f74de667e | ||
![]() |
8b89fd7a0b | ||
![]() |
8239e9a243 | ||
![]() |
951afea794 | ||
![]() |
a4beeba528 | ||
![]() |
9b32140f87 | ||
![]() |
e10a67ce05 | ||
![]() |
e07c06f3e9 | ||
![]() |
0d8d3ac24f | ||
![]() |
9d0f9e7096 | ||
![]() |
e988908784 | ||
![]() |
b40c81c5cb | ||
![]() |
457ffc0922 | ||
![]() |
41822eb052 | ||
![]() |
0bc6e23343 | ||
![]() |
9ec09c6eee | ||
![]() |
0876e4645f | ||
![]() |
36d990e328 | ||
![]() |
d5875c9e5b | ||
![]() |
a58fb31f8e | ||
![]() |
f9270c38cf | ||
![]() |
e5ab6134cd | ||
![]() |
24f09d485e | ||
![]() |
f400d43b8a | ||
![]() |
1c6364d98f | ||
![]() |
ac07c98ae1 | ||
![]() |
6c66dab3dc | ||
![]() |
936b1d911c | ||
![]() |
1876dd29ac | ||
![]() |
64c5eb6c04 | ||
![]() |
476d498e44 | ||
![]() |
b03bcf9a7c | ||
![]() |
9284fc7e8a | ||
![]() |
1d63473a04 |
@@ -23,6 +23,10 @@ TG 群:<https://t.me/+nLZEnpne-pQ1OWFl>
|
|||||||
|
|
||||||
[](https://starchart.cc/LLOneBot/LLOneBot)
|
[](https://starchart.cc/LLOneBot/LLOneBot)
|
||||||
|
|
||||||
|
## 贡献者
|
||||||
|
|
||||||
|
[](https://github.com/LOneBot/LLOneBot/graphs/contributors)
|
||||||
|
|
||||||
## 鸣谢
|
## 鸣谢
|
||||||
|
|
||||||
- [NapCatQQ](https://github.com/NapNeko/NapCatQQ)
|
- [NapCatQQ](https://github.com/NapNeko/NapCatQQ)
|
||||||
|
@@ -39,7 +39,6 @@ const config: ElectronViteConfig = {
|
|||||||
...external.map(genCpModule),
|
...external.map(genCpModule),
|
||||||
{ src: './manifest.json', dest: 'dist' },
|
{ src: './manifest.json', dest: 'dist' },
|
||||||
{ src: './icon.webp', dest: 'dist' },
|
{ src: './icon.webp', dest: 'dist' },
|
||||||
{ src: './src/ntqqapi/native/napcat-protocol-packet/Moehoo/*', dest: 'dist/main/Moehoo' },
|
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@@ -4,16 +4,12 @@
|
|||||||
"name": "LLOneBot",
|
"name": "LLOneBot",
|
||||||
"slug": "LLOneBot",
|
"slug": "LLOneBot",
|
||||||
"description": "实现 OneBot 11 和 Satori 协议,用于 QQ 机器人开发",
|
"description": "实现 OneBot 11 和 Satori 协议,用于 QQ 机器人开发",
|
||||||
"version": "4.2.2",
|
"version": "4.1.4",
|
||||||
"icon": "./icon.webp",
|
"icon": "./icon.webp",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "linyuchen",
|
"name": "linyuchen",
|
||||||
"link": "https://github.com/linyuchen"
|
"link": "https://github.com/linyuchen"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "idranme",
|
|
||||||
"link": "https://github.com/idranme"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@@ -13,10 +13,6 @@ const manifest = {
|
|||||||
{
|
{
|
||||||
name: 'linyuchen',
|
name: 'linyuchen',
|
||||||
link: 'https://github.com/linyuchen'
|
link: 'https://github.com/linyuchen'
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "idranme",
|
|
||||||
"link": "https://github.com/idranme"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
repository: {
|
repository: {
|
||||||
|
@@ -27,10 +27,9 @@ export function checkFileReceived(path: string, timeout: number = 3000): Promise
|
|||||||
|
|
||||||
export function calculateFileMD5(filePath: string): Promise<string> {
|
export function calculateFileMD5(filePath: string): Promise<string> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const hash = createHash('md5')
|
|
||||||
|
|
||||||
// 创建一个流式读取器
|
// 创建一个流式读取器
|
||||||
const stream = fs.createReadStream(filePath)
|
const stream = fs.createReadStream(filePath)
|
||||||
|
const hash = createHash('md5')
|
||||||
|
|
||||||
stream.on('data', (data: Buffer) => {
|
stream.on('data', (data: Buffer) => {
|
||||||
// 当读取到数据时,更新哈希对象的状态
|
// 当读取到数据时,更新哈希对象的状态
|
||||||
|
@@ -228,9 +228,6 @@ function onLoad() {
|
|||||||
|
|
||||||
// 创建窗口时触发
|
// 创建窗口时触发
|
||||||
function onBrowserWindowCreated(window: BrowserWindow) {
|
function onBrowserWindowCreated(window: BrowserWindow) {
|
||||||
if (window.id === 2) {
|
|
||||||
mainWindow = window
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@@ -19,8 +19,7 @@ import {
|
|||||||
import { selfInfo } from '../common/globalVars'
|
import { selfInfo } from '../common/globalVars'
|
||||||
import { version } from '../version'
|
import { version } from '../version'
|
||||||
import { invoke } from './ntcall'
|
import { invoke } from './ntcall'
|
||||||
import { Native } from './native/crychic'
|
import { Native } from './native/index'
|
||||||
import { initWrapperSession, NTQQPacketApi } from './native/napcat-protocol-packet'
|
|
||||||
|
|
||||||
declare module 'cordis' {
|
declare module 'cordis' {
|
||||||
interface Context {
|
interface Context {
|
||||||
@@ -41,14 +40,10 @@ class Core extends Service {
|
|||||||
static inject = ['ntMsgApi', 'ntFriendApi', 'ntGroupApi', 'store']
|
static inject = ['ntMsgApi', 'ntFriendApi', 'ntGroupApi', 'store']
|
||||||
public startTime = 0
|
public startTime = 0
|
||||||
public native
|
public native
|
||||||
public packet!: NTQQPacketApi
|
|
||||||
|
|
||||||
constructor(protected ctx: Context, public config: Core.Config) {
|
constructor(protected ctx: Context, public config: Core.Config) {
|
||||||
super(ctx, 'app', true)
|
super(ctx, 'app', true)
|
||||||
this.native = new Native(ctx)
|
this.native = new Native(ctx)
|
||||||
initWrapperSession().then(session => {
|
|
||||||
this.packet = new NTQQPacketApi(session)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public start() {
|
public start() {
|
||||||
|
@@ -2,7 +2,6 @@ import { NTMethod } from './ntcall'
|
|||||||
import { log } from '@/common/utils'
|
import { log } from '@/common/utils'
|
||||||
import { randomUUID } from 'node:crypto'
|
import { randomUUID } from 'node:crypto'
|
||||||
import { ipcMain } from 'electron'
|
import { ipcMain } from 'electron'
|
||||||
import { Dict } from 'cosmokit'
|
|
||||||
|
|
||||||
export const hookApiCallbacks: Record<string, (res: any) => void> = {}
|
export const hookApiCallbacks: Record<string, (res: any) => void> = {}
|
||||||
|
|
||||||
@@ -46,8 +45,8 @@ export function startHook() {
|
|||||||
const senderExclude = Symbol()
|
const senderExclude = Symbol()
|
||||||
|
|
||||||
ipcMain.emit = new Proxy(ipcMain.emit, {
|
ipcMain.emit = new Proxy(ipcMain.emit, {
|
||||||
apply(target, thisArg, args: [channel: string, ...args: any]) {
|
apply(target, thisArg, args: [eventName: string, ...args: any]) {
|
||||||
if (args[2]?.eventName?.startsWith('ns-LoggerApi')) {
|
if (args[2]?.eventName.startsWith('ns-LoggerApi')) {
|
||||||
return target.apply(thisArg, args)
|
return target.apply(thisArg, args)
|
||||||
}
|
}
|
||||||
if (logHook) {
|
if (logHook) {
|
||||||
@@ -57,15 +56,15 @@ export function startHook() {
|
|||||||
if (event.sender && !event.sender[senderExclude]) {
|
if (event.sender && !event.sender[senderExclude]) {
|
||||||
event.sender[senderExclude] = true
|
event.sender[senderExclude] = true
|
||||||
event.sender.send = new Proxy(event.sender.send, {
|
event.sender.send = new Proxy(event.sender.send, {
|
||||||
apply(target, thisArg, args: [channel: string, meta: Dict, data: Dict[]]) {
|
apply(target, thisArg, args: any[]) {
|
||||||
if (args[1]?.eventName?.startsWith('ns-LoggerApi')) {
|
if (args[1].eventName?.startsWith('ns-LoggerApi')) {
|
||||||
return target.apply(thisArg, args)
|
return target.apply(thisArg, args)
|
||||||
}
|
}
|
||||||
if (logHook) {
|
if (logHook) {
|
||||||
log('received', args)
|
log('received', args)
|
||||||
}
|
}
|
||||||
|
|
||||||
const callbackId = args[1]?.callbackId
|
const callbackId = args[1].callbackId
|
||||||
if (callbackId) {
|
if (callbackId) {
|
||||||
if (hookApiCallbacks[callbackId]) {
|
if (hookApiCallbacks[callbackId]) {
|
||||||
Promise.resolve(hookApiCallbacks[callbackId](args[2]))
|
Promise.resolve(hookApiCallbacks[callbackId](args[2]))
|
||||||
@@ -97,7 +96,7 @@ export function startHook() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return target.apply(thisArg, args)
|
return target.apply(thisArg, args)
|
||||||
},
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,9 +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 { TEMP_DIR } from '@/common/globalVars'
|
||||||
import { copyFile } from 'fs/promises'
|
import { copyFile } from 'fs/promises'
|
||||||
import { ChatType, Peer } from '../../types'
|
import { ChatType, Peer } from '../types'
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
import addon from './external/crychic-win32-x64.node?asset'
|
import addon from './external/crychic-win32-x64.node?asset'
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ export class Native {
|
|||||||
public activated = false
|
public activated = false
|
||||||
private crychic?: Dict
|
private crychic?: Dict
|
||||||
private seq = 0
|
private seq = 0
|
||||||
private cb: Map<number, (res: any) => void> = new Map()
|
private cb: Map<number, Function> = new Map()
|
||||||
|
|
||||||
constructor(private ctx: Context) {
|
constructor(private ctx: Context) {
|
||||||
ctx.on('ready', () => {
|
ctx.on('ready', () => {
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,17 +0,0 @@
|
|||||||
import { WrapperSession } from './wrapper-session/types';
|
|
||||||
export { initWrapperSession } from './wrapper-session';
|
|
||||||
export declare class NTQQPacketApi {
|
|
||||||
private qqVersion;
|
|
||||||
private packetSession;
|
|
||||||
private logger;
|
|
||||||
private readonly wrapperSession;
|
|
||||||
constructor(wrapperSession: WrapperSession);
|
|
||||||
get available(): boolean;
|
|
||||||
private checkQQVersion;
|
|
||||||
private InitSendPacket;
|
|
||||||
private sendPacket;
|
|
||||||
private sendOidbPacket;
|
|
||||||
sendPokePacket(peer: number, group?: number): Promise<void>;
|
|
||||||
sendGroupSignPacket(selfUin: string, groupCode: string): Promise<void>;
|
|
||||||
sendSetSpecialTittlePacket(groupCode: string, uid: string, tittle: string): Promise<void>;
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
export declare function initWrapperSession(): Promise<any>;
|
|
@@ -1,6 +0,0 @@
|
|||||||
export interface MsgService {
|
|
||||||
sendSsoCmdReqByContend: (cmd: string, trace_id: string) => Promise<unknown>;
|
|
||||||
}
|
|
||||||
export type WrapperSession = {
|
|
||||||
getMsgService(): MsgService;
|
|
||||||
};
|
|
@@ -442,7 +442,6 @@ export interface RawMessage {
|
|||||||
attrType: number
|
attrType: number
|
||||||
attrId: string
|
attrId: string
|
||||||
}>
|
}>
|
||||||
isOnlineMsg: boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Peer {
|
export interface Peer {
|
||||||
|
@@ -12,7 +12,6 @@ interface Payload {
|
|||||||
interface Response extends OB11User {
|
interface Response extends OB11User {
|
||||||
reg_time: number
|
reg_time: number
|
||||||
long_nick: string
|
long_nick: string
|
||||||
city: string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GetStrangerInfo extends BaseAction<Payload, Response> {
|
export class GetStrangerInfo extends BaseAction<Payload, Response> {
|
||||||
@@ -34,8 +33,7 @@ export class GetStrangerInfo extends BaseAction<Payload, Response> {
|
|||||||
level: data.detail.commonExt.qqLevel && calcQQLevel(data.detail.commonExt.qqLevel) || 0,
|
level: data.detail.commonExt.qqLevel && calcQQLevel(data.detail.commonExt.qqLevel) || 0,
|
||||||
login_days: 0,
|
login_days: 0,
|
||||||
reg_time: data.detail.commonExt.regTime,
|
reg_time: data.detail.commonExt.regTime,
|
||||||
long_nick: data.detail.simpleInfo.baseInfo.longNick,
|
long_nick: data.detail.simpleInfo.baseInfo.longNick
|
||||||
city: data.detail.commonExt.city
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const data = await this.ctx.ntUserApi.getUserDetailInfoByUin(uin)
|
const data = await this.ctx.ntUserApi.getUserDetailInfoByUin(uin)
|
||||||
@@ -48,8 +46,7 @@ export class GetStrangerInfo extends BaseAction<Payload, Response> {
|
|||||||
level: data.info.qqLevel && calcQQLevel(data.info.qqLevel) || 0,
|
level: data.info.qqLevel && calcQQLevel(data.info.qqLevel) || 0,
|
||||||
login_days: 0,
|
login_days: 0,
|
||||||
reg_time: data.info.regTime,
|
reg_time: data.info.regTime,
|
||||||
long_nick: data.info.longNick,
|
long_nick: data.info.longNick
|
||||||
city: data.info.city
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,19 +0,0 @@
|
|||||||
import { BaseAction, Schema } from '../BaseAction'
|
|
||||||
import { ActionName } from '../types'
|
|
||||||
import { selfInfo } from '@/common/globalVars'
|
|
||||||
|
|
||||||
interface Payload {
|
|
||||||
group_id: number | string
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SendGroupSign extends BaseAction<Payload, null> {
|
|
||||||
actionName = ActionName.GoCQHTTP_SendGroupSign
|
|
||||||
payloadSchema = Schema.object({
|
|
||||||
group_id: Schema.union([Number, String]).required(),
|
|
||||||
})
|
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
|
||||||
await this.ctx.app.packet.sendGroupSignPacket(selfInfo.uin, payload.group_id.toString())
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,30 +0,0 @@
|
|||||||
import { BaseAction, Schema } from '../BaseAction'
|
|
||||||
import { ActionName } from '../types'
|
|
||||||
import { selfInfo } from '@/common/globalVars'
|
|
||||||
import { GroupMemberRole } from '@/ntqqapi/types'
|
|
||||||
|
|
||||||
interface Payload {
|
|
||||||
group_id: number | string
|
|
||||||
user_id: number | string
|
|
||||||
special_title?: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SetGroupSpecialTitle extends BaseAction<Payload, null> {
|
|
||||||
actionName = ActionName.GoCQHTTP_SetGroupSpecialTitle
|
|
||||||
payloadSchema = Schema.object({
|
|
||||||
group_id: Schema.union([Number, String]).required(),
|
|
||||||
user_id: Schema.union([Number, String]).required(),
|
|
||||||
special_title: Schema.string()
|
|
||||||
})
|
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
|
||||||
const uid = await this.ctx.ntUserApi.getUidByUin(payload.user_id.toString(), payload.group_id.toString())
|
|
||||||
if (!uid) throw new Error(`用户${payload.user_id}的uid获取失败`)
|
|
||||||
const self = await this.ctx.ntGroupApi.getGroupMember(payload.group_id.toString(), selfInfo.uid, false)
|
|
||||||
if (self.role !== GroupMemberRole.Owner){
|
|
||||||
throw new Error(`不是群${payload.group_id}的群主,无法设置群头衔`)
|
|
||||||
}
|
|
||||||
await this.ctx.app.packet.sendSetSpecialTittlePacket(payload.group_id.toString(), uid, payload.special_title || "")
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
@@ -78,8 +78,6 @@ import { GroupPoke } from './llonebot/GroupPoke'
|
|||||||
import { FriendPoke } from './llonebot/FriendPoke'
|
import { FriendPoke } from './llonebot/FriendPoke'
|
||||||
import { GetGroupFileSystemInfo } from './go-cqhttp/GetGroupFileSystemInfo'
|
import { GetGroupFileSystemInfo } from './go-cqhttp/GetGroupFileSystemInfo'
|
||||||
import { GetCredentials } from './system/GetCredentials'
|
import { GetCredentials } from './system/GetCredentials'
|
||||||
import { SetGroupSpecialTitle } from '@/onebot11/action/go-cqhttp/SetGroupSpecialTitle'
|
|
||||||
import { SendGroupSign } from '@/onebot11/action/go-cqhttp/SendGroupSign'
|
|
||||||
|
|
||||||
export function initActionMap(adapter: Adapter) {
|
export function initActionMap(adapter: Adapter) {
|
||||||
const actionHandlers = [
|
const actionHandlers = [
|
||||||
@@ -163,8 +161,6 @@ export function initActionMap(adapter: Adapter) {
|
|||||||
new DeleteFriend(adapter),
|
new DeleteFriend(adapter),
|
||||||
new OCRImage(adapter),
|
new OCRImage(adapter),
|
||||||
new GetGroupFileSystemInfo(adapter),
|
new GetGroupFileSystemInfo(adapter),
|
||||||
new SetGroupSpecialTitle(adapter),
|
|
||||||
new SendGroupSign(adapter),
|
|
||||||
]
|
]
|
||||||
const actionMap = new Map()
|
const actionMap = new Map()
|
||||||
for (const action of actionHandlers) {
|
for (const action of actionHandlers) {
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { BaseAction, Schema } from '../BaseAction'
|
import { BaseAction, Schema } from '../BaseAction'
|
||||||
import { ActionName } from '../types'
|
import { ActionName } from '../types'
|
||||||
|
import { getBuildVersion } from '@/common/utils/misc'
|
||||||
|
|
||||||
interface Payload {
|
interface Payload {
|
||||||
user_id: number | string
|
user_id: number | string
|
||||||
@@ -12,15 +13,13 @@ export class FriendPoke extends BaseAction<Payload, null> {
|
|||||||
})
|
})
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
async _handle(payload: Payload) {
|
||||||
// if (!this.ctx.app.native.checkPlatform()) {
|
if (!this.ctx.app.native.checkPlatform()) {
|
||||||
// throw new Error('当前系统平台或架构不支持')
|
throw new Error('当前系统平台或架构不支持')
|
||||||
// }
|
}
|
||||||
// if (!this.ctx.app.native.checkVersion()) {
|
if (!this.ctx.app.native.checkVersion()) {
|
||||||
// throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 27333—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)
|
||||||
|
|
||||||
await this.ctx.app.packet.sendPokePacket(+payload.user_id)
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { BaseAction, Schema } from '../BaseAction'
|
import { BaseAction, Schema } from '../BaseAction'
|
||||||
import { ActionName } from '../types'
|
import { ActionName } from '../types'
|
||||||
|
import { getBuildVersion } from '@/common/utils/misc'
|
||||||
|
|
||||||
interface Payload {
|
interface Payload {
|
||||||
group_id: number | string
|
group_id: number | string
|
||||||
@@ -14,14 +15,13 @@ export class GroupPoke extends BaseAction<Payload, null> {
|
|||||||
})
|
})
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
async _handle(payload: Payload) {
|
||||||
// if (!this.ctx.app.native.checkPlatform()) {
|
if (!this.ctx.app.native.checkPlatform()) {
|
||||||
// throw new Error('当前系统平台或架构不支持')
|
throw new Error('当前系统平台或架构不支持')
|
||||||
// }
|
}
|
||||||
// if (!this.ctx.app.native.checkVersion()) {
|
if (!this.ctx.app.native.checkVersion()) {
|
||||||
// throw new Error(`当前 QQ 版本 ${getBuildVersion()} 不支持,可尝试其他版本 27333—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)
|
||||||
await this.ctx.app.packet.sendPokePacket(+payload.user_id, +payload.group_id)
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,52 +7,62 @@ import { ChatCacheListItemBasic, CacheFileType } from '@/ntqqapi/types'
|
|||||||
export default class CleanCache extends BaseAction<void, void> {
|
export default class CleanCache extends BaseAction<void, void> {
|
||||||
actionName = ActionName.CleanCache
|
actionName = ActionName.CleanCache
|
||||||
|
|
||||||
protected async _handle(): Promise<void> {
|
protected _handle(): Promise<void> {
|
||||||
const cacheFilePaths: string[] = []
|
return new Promise<void>(async (res, rej) => {
|
||||||
|
try {
|
||||||
|
// dbUtil.clearCache()
|
||||||
|
const cacheFilePaths: string[] = []
|
||||||
|
|
||||||
await this.ctx.ntFileCacheApi.setCacheSilentScan(false)
|
await this.ctx.ntFileCacheApi.setCacheSilentScan(false)
|
||||||
|
|
||||||
cacheFilePaths.push(await this.ctx.ntFileCacheApi.getHotUpdateCachePath())
|
cacheFilePaths.push(await this.ctx.ntFileCacheApi.getHotUpdateCachePath())
|
||||||
cacheFilePaths.push(await this.ctx.ntFileCacheApi.getDesktopTmpPath())
|
cacheFilePaths.push(await this.ctx.ntFileCacheApi.getDesktopTmpPath())
|
||||||
|
|
||||||
const list = await this.ctx.ntFileCacheApi.getCacheSessionPathList()
|
const list = await this.ctx.ntFileCacheApi.getCacheSessionPathList()
|
||||||
list.forEach((e) => cacheFilePaths.push(e.value))
|
list.forEach((e) => cacheFilePaths.push(e.value))
|
||||||
|
|
||||||
// await NTQQApi.addCacheScannedPaths(); // XXX: 调用就崩溃,原因目前还未知
|
// await NTQQApi.addCacheScannedPaths(); // XXX: 调用就崩溃,原因目前还未知
|
||||||
const cacheScanResult = await this.ctx.ntFileCacheApi.scanCache()
|
const cacheScanResult = await this.ctx.ntFileCacheApi.scanCache()
|
||||||
const cacheSize = parseInt(cacheScanResult.size[6])
|
const cacheSize = parseInt(cacheScanResult.size[6])
|
||||||
|
|
||||||
if (cacheScanResult.result !== 0) {
|
if (cacheScanResult.result !== 0) {
|
||||||
throw 'Something went wrong while scanning cache. Code: ' + cacheScanResult.result
|
throw 'Something went wrong while scanning cache. Code: ' + cacheScanResult.result
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.ctx.ntFileCacheApi.setCacheSilentScan(true)
|
await this.ctx.ntFileCacheApi.setCacheSilentScan(true)
|
||||||
if (cacheSize > 0 && cacheFilePaths.length > 2) {
|
if (cacheSize > 0 && cacheFilePaths.length > 2) {
|
||||||
// 存在缓存文件且大小不为 0 时执行清理动作
|
// 存在缓存文件且大小不为 0 时执行清理动作
|
||||||
// await NTQQApi.clearCache([ 'tmp', 'hotUpdate', ...cacheScanResult ]) // XXX: 也是调用就崩溃,调用 fs 删除得了
|
// await NTQQApi.clearCache([ 'tmp', 'hotUpdate', ...cacheScanResult ]) // XXX: 也是调用就崩溃,调用 fs 删除得了
|
||||||
deleteCachePath(cacheFilePaths)
|
deleteCachePath(cacheFilePaths)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取聊天记录列表
|
// 获取聊天记录列表
|
||||||
// NOTE: 以防有人不需要删除聊天记录,暂时先注释掉,日后加个开关
|
// NOTE: 以防有人不需要删除聊天记录,暂时先注释掉,日后加个开关
|
||||||
// const privateChatCache = await getCacheList(ChatType.friend); // 私聊消息
|
// const privateChatCache = await getCacheList(ChatType.friend); // 私聊消息
|
||||||
// const groupChatCache = await getCacheList(ChatType.group); // 群聊消息
|
// const groupChatCache = await getCacheList(ChatType.group); // 群聊消息
|
||||||
// const chatCacheList = [ ...privateChatCache, ...groupChatCache ];
|
// const chatCacheList = [ ...privateChatCache, ...groupChatCache ];
|
||||||
const chatCacheList: ChatCacheListItemBasic[] = []
|
const chatCacheList: ChatCacheListItemBasic[] = []
|
||||||
|
|
||||||
// 获取聊天缓存文件列表
|
// 获取聊天缓存文件列表
|
||||||
const cacheFileList: string[] = []
|
const cacheFileList: string[] = []
|
||||||
|
|
||||||
for (const name in CacheFileType) {
|
for (const name in CacheFileType) {
|
||||||
if (!isNaN(parseInt(name))) continue
|
if (!isNaN(parseInt(name))) continue
|
||||||
|
|
||||||
const fileType = CacheFileType[name] as unknown as CacheFileType
|
const fileTypeAny: any = CacheFileType[name]
|
||||||
|
const fileType: CacheFileType = fileTypeAny
|
||||||
|
|
||||||
cacheFileList.push(...(await this.ctx.ntFileCacheApi.getFileCacheInfo(fileType)).infos.map((file) => file.fileKey))
|
cacheFileList.push(...(await this.ctx.ntFileCacheApi.getFileCacheInfo(fileType)).infos.map((file) => file.fileKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 一并清除
|
// 一并清除
|
||||||
await this.ctx.ntFileCacheApi.clearChatCache(chatCacheList, cacheFileList)
|
await this.ctx.ntFileCacheApi.clearChatCache(chatCacheList, cacheFileList)
|
||||||
|
res()
|
||||||
|
} catch (e) {
|
||||||
|
console.error('清理缓存时发生了错误')
|
||||||
|
rej(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -91,6 +91,4 @@ export enum ActionName {
|
|||||||
GoCQHTTP_DeleteFriend = 'delete_friend',
|
GoCQHTTP_DeleteFriend = 'delete_friend',
|
||||||
GoCQHTTP_OCRImage = 'ocr_image',
|
GoCQHTTP_OCRImage = 'ocr_image',
|
||||||
GoCQHTTP_GetGroupFileSystemInfo = 'get_group_file_system_info',
|
GoCQHTTP_GetGroupFileSystemInfo = 'get_group_file_system_info',
|
||||||
GoCQHTTP_SetGroupSpecialTitle = 'set_group_special_title',
|
|
||||||
GoCQHTTP_SendGroupSign = 'send_group_sign',
|
|
||||||
}
|
}
|
||||||
|
@@ -221,7 +221,7 @@ export class MessageEncoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async generate(content: OB11MessageData[]) {
|
async generate(content: any[]) {
|
||||||
await this.render(content)
|
await this.render(content)
|
||||||
return {
|
return {
|
||||||
multiMsgItems: [{
|
multiMsgItems: [{
|
||||||
|
@@ -11,10 +11,6 @@ function isEmpty(value: unknown) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function onSettingWindowCreated(view: Element) {
|
async function onSettingWindowCreated(view: Element) {
|
||||||
console.log(view)
|
|
||||||
if (!view){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const config = await window.llonebot.getConfig()
|
const config = await window.llonebot.getConfig()
|
||||||
const ob11Config = { ...config.ob11 }
|
const ob11Config = { ...config.ob11 }
|
||||||
|
|
||||||
@@ -251,9 +247,7 @@ async function onSettingWindowCreated(view: Element) {
|
|||||||
} else {
|
} else {
|
||||||
errDom?.classList.add('show')
|
errDom?.classList.add('show')
|
||||||
}
|
}
|
||||||
if (errCodeDom) {
|
errCodeDom!.innerHTML = errMsg
|
||||||
errCodeDom.innerHTML = errMsg
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
showError().then()
|
showError().then()
|
||||||
|
|
||||||
@@ -462,8 +456,8 @@ async function onSettingWindowCreated(view: Element) {
|
|||||||
}
|
}
|
||||||
window.llonebot.checkVersion().then(checkVersionFunc)
|
window.llonebot.checkVersion().then(checkVersionFunc)
|
||||||
window.addEventListener('beforeunload', () => {
|
window.addEventListener('beforeunload', () => {
|
||||||
window.llonebot.getConfig().then(oldConfig => {
|
window.llonebot.getConfig().then(oldConfig=>{
|
||||||
if (JSON.stringify(oldConfig) !== JSON.stringify(config)) {
|
if(JSON.stringify(oldConfig) !== JSON.stringify(config)){
|
||||||
window.llonebot.setConfig(true, config)
|
window.llonebot.setConfig(true, config)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@@ -91,7 +91,7 @@ class SatoriAdapter extends Service {
|
|||||||
input.subMsgType === 12 &&
|
input.subMsgType === 12 &&
|
||||||
input.elements[0]?.grayTipElement?.xmlElement?.templId === '10382'
|
input.elements[0]?.grayTipElement?.xmlElement?.templId === '10382'
|
||||||
) {
|
) {
|
||||||
// 机器人被表情回应
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 普通的消息
|
// 普通的消息
|
||||||
|
@@ -1 +1 @@
|
|||||||
export const version = '4.2.2'
|
export const version = '4.1.4'
|
||||||
|
Reference in New Issue
Block a user