style: lint

This commit is contained in:
手瓜一十雪
2024-06-02 20:49:09 +08:00
parent 94f629585a
commit 0ff6edd546
24 changed files with 1678 additions and 1676 deletions

View File

@@ -1,156 +1,157 @@
import { NodeIKernelMsgListener } from "@/core"; import { NodeIKernelMsgListener } from '@/core';
import { NodeIQQNTWrapperSession } from "@/core/wrapper"; import { NodeIQQNTWrapperSession } from '@/core/wrapper';
import { randomUUID } from "crypto"; import { randomUUID } from 'crypto';
interface Internal_MapKey { interface Internal_MapKey {
timeout: number, timeout: number,
createtime: number, createtime: number,
func: Function func: (...arg: any[]) => any,
} }
export class ListenerClassBase { export class ListenerClassBase {
[key: string]: string; [key: string]: string;
} }
export interface ListenerIBase { export interface ListenerIBase {
// eslint-disable-next-line @typescript-eslint/no-misused-new // eslint-disable-next-line @typescript-eslint/no-misused-new
new(listener: any): ListenerClassBase; new(listener: any): ListenerClassBase;
} }
export class NTEventWrapper { export class NTEventWrapper {
private ListenerMap: { [key: string]: ListenerIBase } | undefined;//ListenerName-Unique -> Listener构造函数 private ListenerMap: { [key: string]: ListenerIBase } | undefined;//ListenerName-Unique -> Listener构造函数
private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession
private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例 private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例
private EventTask = new Map<string, Map<string, Map<string, Internal_MapKey>>>();//tasks ListenerMainName -> ListenerSubName-> uuid -> {timeout,createtime,func} private EventTask = new Map<string, Map<string, Map<string, Internal_MapKey>>>();//tasks ListenerMainName -> ListenerSubName-> uuid -> {timeout,createtime,func}
constructor() { constructor() {
} }
createProxyDispatch(ListenerMainName: string) { createProxyDispatch(ListenerMainName: string) {
let current = this; // eslint-disable-next-line @typescript-eslint/no-this-alias
return new Proxy({}, { const current = this;
get(target: any, prop: any, receiver: any) { return new Proxy({}, {
// console.log('get', prop, typeof target[prop]); get(target: any, prop: any, receiver: any) {
if (typeof target[prop] === 'undefined') { // console.log('get', prop, typeof target[prop]);
// 如果方法不存在返回一个函数这个函数调用existentMethod if (typeof target[prop] === 'undefined') {
return (...args: any[]) => { // 如果方法不存在返回一个函数这个函数调用existentMethod
current.DispatcherListener.apply(current, [ListenerMainName, prop, ...args]).then(); return (...args: any[]) => {
}; current.DispatcherListener.apply(current, [ListenerMainName, prop, ...args]).then();
} };
// 如果方法存在,正常返回
return Reflect.get(target, prop, receiver);
}
});
}
init({ ListenerMap, WrapperSession }: { ListenerMap: { [key: string]: typeof ListenerClassBase }, WrapperSession: NodeIQQNTWrapperSession }) {
this.ListenerMap = ListenerMap;
this.WrapperSession = WrapperSession;
}
CreatEventFunction<T extends (...args: any) => any>(eventName: string): T | undefined {
let eventNameArr = eventName.split('/');
type eventType = {
[key: string]: () => { [key: string]: (...params: Parameters<T>) => Promise<ReturnType<T>> }
} }
if (eventNameArr.length > 1) { // 如果方法存在,正常返回
let serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', ''); return Reflect.get(target, prop, receiver);
let eventName = eventNameArr[1]; }
//getNodeIKernelGroupListener,GroupService });
//console.log('2', eventName); }
let services = (this.WrapperSession as unknown as eventType)[serviceName](); init({ ListenerMap, WrapperSession }: { ListenerMap: { [key: string]: typeof ListenerClassBase }, WrapperSession: NodeIQQNTWrapperSession }) {
let event = services[eventName]; this.ListenerMap = ListenerMap;
//重新绑定this this.WrapperSession = WrapperSession;
event = event.bind(services); }
if (event) { CreatEventFunction<T extends (...args: any) => any>(eventName: string): T | undefined {
return event as T; const eventNameArr = eventName.split('/');
} type eventType = {
return undefined; [key: string]: () => { [key: string]: (...params: Parameters<T>) => Promise<ReturnType<T>> }
}
if (eventNameArr.length > 1) {
const serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', '');
const eventName = eventNameArr[1];
//getNodeIKernelGroupListener,GroupService
//console.log('2', eventName);
const services = (this.WrapperSession as unknown as eventType)[serviceName]();
let event = services[eventName];
//重新绑定this
event = event.bind(services);
if (event) {
return event as T;
}
return undefined;
}
}
CreatListenerFunction<T>(listenerMainName: string, uniqueCode: string = ''): T {
const ListenerType = this.ListenerMap![listenerMainName];
let Listener = this.ListenerManger.get(listenerMainName + uniqueCode);
if (!Listener && ListenerType) {
Listener = new ListenerType(this.createProxyDispatch(listenerMainName));
const ServiceSubName = listenerMainName.match(/^NodeIKernel(.*?)Listener$/)![1];
const Service = 'NodeIKernel' + ServiceSubName + 'Service/addKernel' + ServiceSubName + 'Listener';
const addfunc = this.CreatEventFunction<(listener: T) => number>(Service);
addfunc!(Listener as T);
//console.log(addfunc!(Listener as T));
this.ListenerManger.set(listenerMainName + uniqueCode, Listener);
}
return Listener as T;
}
//统一回调清理事件
async DispatcherListener(ListenerMainName: string, ListenerSubName: string, ...args: any[]) {
//console.log(ListenerMainName, this.EventTask.get(ListenerMainName), ListenerSubName, this.EventTask.get(ListenerMainName)?.get(ListenerSubName));
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.forEach((task, uuid) => {
//console.log(task.func, uuid, task.createtime, task.timeout);
if (task.createtime + task.timeout < Date.now()) {
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.delete(uuid);
return;
}
task.func(...args);
});
}
async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<ReturnType<EventType>>(async (resolve, reject) => {
const EventFunc = this.CreatEventFunction<EventType>(EventName);
let complete = false;
const Timeouter = setTimeout(() => {
if (!complete) {
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
} }
}, timeout);
const retData = await EventFunc!(...args);
complete = true;
resolve(retData);
});
}
async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<[EventRet: Awaited<ReturnType<EventType>>, ...Parameters<ListenerType>]>(async (resolve, reject) => {
const id = randomUUID();
let complete = 0;
let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined;
let retEvent: any = {};
const databack = () => {
if (complete < waitTimes) {
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
} else {
} resolve([retEvent as Awaited<ReturnType<EventType>>, ...(retData as Parameters<ListenerType>)]);
CreatListenerFunction<T>(listenerMainName: string, uniqueCode: string = ""): T {
let ListenerType = this.ListenerMap![listenerMainName];
let Listener = this.ListenerManger.get(listenerMainName + uniqueCode);
if (!Listener && ListenerType) {
Listener = new ListenerType(this.createProxyDispatch(listenerMainName));
let ServiceSubName = listenerMainName.match(/^NodeIKernel(.*?)Listener$/)![1];
let Service = "NodeIKernel" + ServiceSubName + "Service/addKernel" + ServiceSubName + "Listener";
let addfunc = this.CreatEventFunction<(listener: T) => number>(Service);
addfunc!(Listener as T);
//console.log(addfunc!(Listener as T));
this.ListenerManger.set(listenerMainName + uniqueCode, Listener);
} }
return Listener as T; };
} const Timeouter = setTimeout(databack, timeout);
//统一回调清理事件
async DispatcherListener(ListenerMainName: string, ListenerSubName: string, ...args: any[]) {
//console.log(ListenerMainName, this.EventTask.get(ListenerMainName), ListenerSubName, this.EventTask.get(ListenerMainName)?.get(ListenerSubName));
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.forEach((task, uuid) => {
//console.log(task.func, uuid, task.createtime, task.timeout);
if (task.createtime + task.timeout < Date.now()) {
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.delete(uuid);
return;
}
task.func(...args);
})
}
async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<ReturnType<EventType>>(async (resolve, reject) => {
let EventFunc = this.CreatEventFunction<EventType>(EventName);
let complete = false;
let Timeouter = setTimeout(() => {
if (!complete) {
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
}
}, timeout);
let retData = await EventFunc!(...args);
complete = true;
resolve(retData);
});
}
async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<[EventRet: Awaited<ReturnType<EventType>>, ...Parameters<ListenerType>]>(async (resolve, reject) => {
const id = randomUUID();
let complete = 0;
let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined;
let retEvent: any = {};
let databack = () => {
if (complete < waitTimes) {
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
} else {
resolve([retEvent as Awaited<ReturnType<EventType>>, ...(retData as Parameters<ListenerType>)]); const ListenerNameList = ListenerName.split('/');
} const ListenerMainName = ListenerNameList[0];
} const ListenerSubName = ListenerNameList[1];
let Timeouter = setTimeout(databack, timeout); const eventCallbak = {
timeout: timeout,
let ListenerNameList = ListenerName.split('/'); createtime: Date.now(),
let ListenerMainName = ListenerNameList[0]; func: (...args: any[]) => {
let ListenerSubName = ListenerNameList[1]; complete++;
let eventCallbak = { //console.log('func', ...args);
timeout: timeout, retData = args as ArrayLike<Parameters<ListenerType>>;
createtime: Date.now(), if (complete >= waitTimes) {
func: (...args: any[]) => { clearTimeout(Timeouter);
complete++; databack();
//console.log('func', ...args); }
retData = args as ArrayLike<Parameters<ListenerType>>; }
if (complete >= waitTimes) { };
clearTimeout(Timeouter); if (!this.EventTask.get(ListenerMainName)) {
databack(); this.EventTask.set(ListenerMainName, new Map());
} }
} if (!(this.EventTask.get(ListenerMainName)?.get(ListenerSubName))) {
} this.EventTask.get(ListenerMainName)?.set(ListenerSubName, new Map());
if (!this.EventTask.get(ListenerMainName)) { }
this.EventTask.set(ListenerMainName, new Map()); this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak);
} this.CreatListenerFunction(ListenerMainName);
if (!(this.EventTask.get(ListenerMainName)?.get(ListenerSubName))) { const EventFunc = this.CreatEventFunction<EventType>(EventName);
this.EventTask.get(ListenerMainName)?.set(ListenerSubName, new Map()); retEvent = await EventFunc!(...args);
} });
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak); }
this.CreatListenerFunction(ListenerMainName);
let EventFunc = this.CreatEventFunction<EventType>(EventName);
retEvent = await EventFunc!(...args);
});
}
} }
export const NTEventDispatch = new NTEventWrapper(); export const NTEventDispatch = new NTEventWrapper();

View File

@@ -1,4 +1,4 @@
import { logError, logDebug } from "@/common/utils/log"; import { logError, logDebug } from '@/common/utils/log';
type group_id = number; type group_id = number;
type user_id = number; type user_id = number;
@@ -44,7 +44,7 @@ class LRU<T> {
// 移除LRU节点 // 移除LRU节点
private removeLRUNode(node: cacheNode<T>) { private removeLRUNode(node: cacheNode<T>) {
logDebug( logDebug(
"removeLRUNode", 'removeLRUNode',
node.groupId, node.groupId,
node.userId, node.userId,
node.value, node.value,

View File

@@ -3,7 +3,7 @@ import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElem
import sqlite3 from 'sqlite3'; import sqlite3 from 'sqlite3';
import { log, logDebug, logError } from '@/common/utils/log'; import { log, logDebug, logError } from '@/common/utils/log';
import { NTQQMsgApi } from '@/core'; import { NTQQMsgApi } from '@/core';
import LRU from "@/common/utils/LRUCache"; import LRU from '@/common/utils/LRUCache';
export interface IRember { export interface IRember {
last_sent_time: number; last_sent_time: number;
@@ -111,7 +111,7 @@ class DBUtil extends DBUtilBase {
// 初始化群缓存列表 // 初始化群缓存列表
this.db!.serialize(() => { this.db!.serialize(() => {
const sql = `SELECT * FROM sqlite_master WHERE type='table'`; const sql = 'SELECT * FROM sqlite_master WHERE type=\'table\'';
this.db!.all(sql, [], (err, rows: { name: string }[]) => { this.db!.all(sql, [], (err, rows: { name: string }[]) => {
if (err) return logError(err); if (err) return logError(err);
rows.forEach((row) => this.groupIds.push(parseInt(row.name))); rows.forEach((row) => this.groupIds.push(parseInt(row.name)));
@@ -123,22 +123,22 @@ class DBUtil extends DBUtilBase {
this.LURCache.on(async (node) => { this.LURCache.on(async (node) => {
const { value: time, groupId, userId } = node; const { value: time, groupId, userId } = node;
logDebug("插入发言时间", userId, groupId); logDebug('插入发言时间', userId, groupId);
await this.createGroupInfoTimeTableIfNotExist(groupId); await this.createGroupInfoTimeTableIfNotExist(groupId);
const method = await this.getDataSetMethod(groupId, userId); const method = await this.getDataSetMethod(groupId, userId);
logDebug("插入发言时间方法判断", userId, groupId, method); logDebug('插入发言时间方法判断', userId, groupId, method);
const sql = const sql =
method == "update" method == 'update'
? `UPDATE "${groupId}" SET last_sent_time = ? WHERE user_id = ?` ? `UPDATE "${groupId}" SET last_sent_time = ? WHERE user_id = ?`
: `INSERT INTO "${groupId}" (last_sent_time, user_id) VALUES (?, ?)`; : `INSERT INTO "${groupId}" (last_sent_time, user_id) VALUES (?, ?)`;
this.db!.all(sql, [time, userId], (err) => { this.db!.all(sql, [time, userId], (err) => {
if (err) { if (err) {
return logError("插入/更新发言时间失败", userId, groupId); return logError('插入/更新发言时间失败', userId, groupId);
} }
logDebug("插入/更新发言时间成功", userId, groupId); logDebug('插入/更新发言时间成功', userId, groupId);
}); });
}); });
@@ -146,28 +146,28 @@ class DBUtil extends DBUtilBase {
async getDataSetMethod(groupId: number, userId: number) { async getDataSetMethod(groupId: number, userId: number) {
// 缓存记录 // 缓存记录
if (this.LastSentCache.get(groupId, userId)) { if (this.LastSentCache.get(groupId, userId)) {
logDebug("缓存命中", userId, groupId); logDebug('缓存命中', userId, groupId);
return "update"; return 'update';
} }
// 数据库判断 // 数据库判断
return new Promise<"insert" | "update">((resolve, reject) => { return new Promise<'insert' | 'update'>((resolve, reject) => {
this.db!.all( this.db!.all(
`SELECT * FROM "${groupId}" WHERE user_id = ?`, `SELECT * FROM "${groupId}" WHERE user_id = ?`,
[userId], [userId],
(err, rows) => { (err, rows) => {
if (err) { if (err) {
logError("查询发言时间存在失败", userId, groupId, err); logError('查询发言时间存在失败', userId, groupId, err);
return logError("插入发言时间失败", userId, groupId, err); return logError('插入发言时间失败', userId, groupId, err);
} }
if (rows.length === 0) { if (rows.length === 0) {
logDebug("查询发言时间不存在", userId, groupId); logDebug('查询发言时间不存在', userId, groupId);
return resolve("insert"); return resolve('insert');
} }
logDebug("查询发言时间存在", userId, groupId); logDebug('查询发言时间存在', userId, groupId);
resolve("update"); resolve('update');
} }
); );
}); });
@@ -465,14 +465,14 @@ class DBUtil extends DBUtilBase {
async getLastSentTimeAndJoinTime( async getLastSentTimeAndJoinTime(
groupId: number groupId: number
): Promise<IRember[]> { ): Promise<IRember[]> {
logDebug("读取发言时间", groupId); logDebug('读取发言时间', groupId);
return new Promise<IRember[]>((resolve, reject) => { return new Promise<IRember[]>((resolve, reject) => {
this.db!.all(`SELECT * FROM "${groupId}" `, (err, rows: IRember[]) => { this.db!.all(`SELECT * FROM "${groupId}" `, (err, rows: IRember[]) => {
if (err) { if (err) {
logError("查询发言时间失败", groupId); logError('查询发言时间失败', groupId);
return resolve([]); return resolve([]);
} }
logDebug("查询发言时间成功", groupId, rows); logDebug('查询发言时间成功', groupId, rows);
resolve(rows); resolve(rows);
}); });
}); });
@@ -483,7 +483,7 @@ class DBUtil extends DBUtilBase {
userId: number, userId: number,
time: number time: number
) { ) {
this.LURCache.set(groupId, userId, time) this.LURCache.set(groupId, userId, time);
} }
async insertJoinTime( async insertJoinTime(
groupId: number, groupId: number,
@@ -497,8 +497,8 @@ class DBUtil extends DBUtilBase {
(err) => { (err) => {
if (err) if (err)
logError(err), logError(err),
Promise.reject(), Promise.reject(),
console.log("插入入群时间失败", userId, groupId); console.log('插入入群时间失败', userId, groupId);
} }
); );

View File

@@ -21,6 +21,7 @@ const invalidMacAddresses = new Set([
]); ]);
function validateMacAddress(candidate: string): boolean { function validateMacAddress(candidate: string): boolean {
// eslint-disable-next-line no-useless-escape
const tempCandidate = candidate.replace(/\-/g, ':').toLowerCase(); const tempCandidate = candidate.replace(/\-/g, ':').toLowerCase();
return !invalidMacAddresses.has(tempCandidate); return !invalidMacAddresses.has(tempCandidate);
} }

View File

@@ -14,7 +14,7 @@ export async function checkVersion(): Promise<string> {
try { try {
version = (await RequestUtil.HttpGetJson<{ version: string }>(url)).version; version = (await RequestUtil.HttpGetJson<{ version: string }>(url)).version;
} catch (e) { } catch (e) {
logDebug("检测更新异常",e); logDebug('检测更新异常',e);
} }
if (version) { if (version) {
resolve(version); resolve(version);

View File

@@ -4,20 +4,20 @@ import { ActionName } from '../types';
import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis'; import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
properties: { properties: {
group_id: { type: ['string', 'number'] }, group_id: { type: ['string', 'number'] },
file_id: { type: 'string' }, file_id: { type: 'string' },
}, },
required: ['group_id', 'file_id'] required: ['group_id', 'file_id']
} as const satisfies JSONSchema; } as const satisfies JSONSchema;
type Payload = FromSchema<typeof SchemaData>; type Payload = FromSchema<typeof SchemaData>;
export class DelGroupFile extends BaseAction<Payload, any> { export class DelGroupFile extends BaseAction<Payload, any> {
actionName = ActionName.DelGroupFile; actionName = ActionName.DelGroupFile;
PayloadSchema = SchemaData; PayloadSchema = SchemaData;
protected async _handle(payload: Payload) { protected async _handle(payload: Payload) {
return await NTQQGroupApi.DelGroupFile(payload.group_id.toString(), [payload.file_id]); return await NTQQGroupApi.DelGroupFile(payload.group_id.toString(), [payload.file_id]);
} }
} }

View File

@@ -4,20 +4,20 @@ import { ActionName } from '../types';
import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis'; import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
properties: { properties: {
group_id: { type: ['string', 'number'] }, group_id: { type: ['string', 'number'] },
folder_id: { type: 'string' }, folder_id: { type: 'string' },
}, },
required: ['group_id', 'folder_id'] required: ['group_id', 'folder_id']
} as const satisfies JSONSchema; } as const satisfies JSONSchema;
type Payload = FromSchema<typeof SchemaData>; type Payload = FromSchema<typeof SchemaData>;
export class DelGroupFileFolder extends BaseAction<Payload, any> { export class DelGroupFileFolder extends BaseAction<Payload, any> {
actionName = ActionName.DelGroupFileFolder; actionName = ActionName.DelGroupFileFolder;
PayloadSchema = SchemaData; PayloadSchema = SchemaData;
protected async _handle(payload: Payload) { protected async _handle(payload: Payload) {
return (await NTQQGroupApi.DelGroupFileFolder(payload.group_id.toString(), payload.folder_id)).groupFileCommonResult; return (await NTQQGroupApi.DelGroupFileFolder(payload.group_id.toString(), payload.folder_id)).groupFileCommonResult;
} }
} }

View File

@@ -4,20 +4,20 @@ import { ActionName } from '../types';
import { NTQQGroupApi, NTQQUserApi } from '@/core/apis'; import { NTQQGroupApi, NTQQUserApi } from '@/core/apis';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
properties: { properties: {
group_id: { type: ['string', 'number'] }, group_id: { type: ['string', 'number'] },
}, },
required: ['group_id'] required: ['group_id']
} as const satisfies JSONSchema; } as const satisfies JSONSchema;
type Payload = FromSchema<typeof SchemaData>; type Payload = FromSchema<typeof SchemaData>;
export class GetGroupFileCount extends BaseAction<Payload, { count: number }> { export class GetGroupFileCount extends BaseAction<Payload, { count: number }> {
actionName = ActionName.GetGroupFileCount; actionName = ActionName.GetGroupFileCount;
PayloadSchema = SchemaData; PayloadSchema = SchemaData;
protected async _handle(payload: Payload) { protected async _handle(payload: Payload) {
const ret = await NTQQGroupApi.GetGroupFileCount([payload.group_id?.toString()]); const ret = await NTQQGroupApi.GetGroupFileCount([payload.group_id?.toString()]);
return { count: ret.groupFileCounts[0] }; return { count: ret.groupFileCounts[0] };
} }
} }

View File

@@ -4,28 +4,28 @@ import { ActionName } from '../types';
import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis'; import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
properties: { properties: {
group_id: { type: ['string', 'number'] }, group_id: { type: ['string', 'number'] },
start_index: { type: 'number' }, start_index: { type: 'number' },
file_count: { type: 'number' }, file_count: { type: 'number' },
}, },
required: ['group_id', 'start_index', 'file_count'] required: ['group_id', 'start_index', 'file_count']
} as const satisfies JSONSchema; } as const satisfies JSONSchema;
type Payload = FromSchema<typeof SchemaData>; type Payload = FromSchema<typeof SchemaData>;
export class GetGroupFileList extends BaseAction<Payload, { FileList: Array<any> }> { export class GetGroupFileList extends BaseAction<Payload, { FileList: Array<any> }> {
actionName = ActionName.GetGroupFileList; actionName = ActionName.GetGroupFileList;
PayloadSchema = SchemaData; PayloadSchema = SchemaData;
protected async _handle(payload: Payload) { protected async _handle(payload: Payload) {
let ret = await NTQQMsgApi.getGroupFileList(payload.group_id.toString(), { const ret = await NTQQMsgApi.getGroupFileList(payload.group_id.toString(), {
sortType: 1, sortType: 1,
fileCount: payload.file_count, fileCount: payload.file_count,
startIndex: payload.start_index, startIndex: payload.start_index,
sortOrder: 2, sortOrder: 2,
showOnlinedocFolder: 0 showOnlinedocFolder: 0
}).catch((e) => { return []; }); }).catch((e) => { return []; });
return { FileList: ret }; return { FileList: ret };
} }
} }

View File

@@ -4,20 +4,20 @@ import { ActionName } from '../types';
import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis'; import { NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
properties: { properties: {
group_id: { type: ['string', 'number'] }, group_id: { type: ['string', 'number'] },
folder_name: { type: 'string' }, folder_name: { type: 'string' },
}, },
required: ['group_id', 'folder_name'] required: ['group_id', 'folder_name']
} as const satisfies JSONSchema; } as const satisfies JSONSchema;
type Payload = FromSchema<typeof SchemaData>; type Payload = FromSchema<typeof SchemaData>;
export class SetGroupFileFolder extends BaseAction<Payload, any> { export class SetGroupFileFolder extends BaseAction<Payload, any> {
actionName = ActionName.SetGroupFileFolder; actionName = ActionName.SetGroupFileFolder;
PayloadSchema = SchemaData; PayloadSchema = SchemaData;
protected async _handle(payload: Payload) { protected async _handle(payload: Payload) {
return (await NTQQGroupApi.CreatGroupFileFolder(payload.group_id.toString(), payload.folder_name)).resultWithGroupItem; return (await NTQQGroupApi.CreatGroupFileFolder(payload.group_id.toString(), payload.folder_name)).resultWithGroupItem;
} }
} }

View File

@@ -66,7 +66,7 @@ class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
} else if (ob11Config.GroupLocalTime.Record && ob11Config.GroupLocalTime.RecordList[0] === '-1' || ob11Config.GroupLocalTime.RecordList.includes(payload.group_id.toString())) { } else if (ob11Config.GroupLocalTime.Record && ob11Config.GroupLocalTime.RecordList[0] === '-1' || ob11Config.GroupLocalTime.RecordList.includes(payload.group_id.toString())) {
const _sendAndJoinRember = await dbUtil.getLastSentTimeAndJoinTime(TypeConvert.toNumber(payload.group_id)); const _sendAndJoinRember = await dbUtil.getLastSentTimeAndJoinTime(TypeConvert.toNumber(payload.group_id));
_sendAndJoinRember.forEach((element) => { _sendAndJoinRember.forEach((element) => {
let MemberData = MemberMap.get(element.user_id); const MemberData = MemberMap.get(element.user_id);
if (MemberData) { if (MemberData) {
MemberData.join_time = element.join_time; MemberData.join_time = element.join_time;
MemberData.last_sent_time = element.last_sent_time; MemberData.last_sent_time = element.last_sent_time;

View File

@@ -14,7 +14,7 @@ async function cloneMsg(msg: RawMessage): Promise<RawMessage | undefined> {
peerUid: selfInfo.uid peerUid: selfInfo.uid
}; };
// logDebug('克隆的目标消息', msg); // logDebug('克隆的目标消息', msg);
const sendElements: SendMessageElement[] = []; const sendElements: SendMessageElement[] = [];

View File

@@ -27,12 +27,12 @@ export enum ActionName {
GetFile = 'get_file', GetFile = 'get_file',
ForwardFriendSingleMsg = 'forward_friend_single_msg', ForwardFriendSingleMsg = 'forward_friend_single_msg',
ForwardGroupSingleMsg = 'forward_group_single_msg', ForwardGroupSingleMsg = 'forward_group_single_msg',
TranslateEnWordToZn = "translate_en2zh", TranslateEnWordToZn = 'translate_en2zh',
GetGroupFileCount = "get_group_file_count", GetGroupFileCount = 'get_group_file_count',
GetGroupFileList = "get_group_file_list", GetGroupFileList = 'get_group_file_list',
SetGroupFileFolder = "set_group_file_folder", SetGroupFileFolder = 'set_group_file_folder',
DelGroupFile = "del_group_file", DelGroupFile = 'del_group_file',
DelGroupFileFolder = "del_group_file_folder", DelGroupFileFolder = 'del_group_file_folder',
// onebot 11 // onebot 11
Reboot = 'set_restart', Reboot = 'set_restart',
SendLike = 'send_like', SendLike = 'send_like',
@@ -85,7 +85,7 @@ export enum ActionName {
GoCQHTTP_GetForwardMsg = 'get_forward_msg', GoCQHTTP_GetForwardMsg = 'get_forward_msg',
GetFriendMsgHistory = 'get_friend_msg_history', GetFriendMsgHistory = 'get_friend_msg_history',
GetGroupSystemMsg = 'get_group_system_msg', GetGroupSystemMsg = 'get_group_system_msg',
GetOnlineClient = "get_online_clients", GetOnlineClient = 'get_online_clients',
OCRImage = "ocr_image", OCRImage = 'ocr_image',
IOCRImage = ".ocr_image" IOCRImage = '.ocr_image'
} }

View File

@@ -25,10 +25,10 @@ export class GetCookies extends BaseAction<Payload, Response> {
if (!payload.domain) { if (!payload.domain) {
throw new Error('缺少参数 domain'); throw new Error('缺少参数 domain');
} }
if (payload.domain.endsWith("qzone.qq.com")) { if (payload.domain.endsWith('qzone.qq.com')) {
const _Skey = await NTQQUserApi.getSkey() as string; const _Skey = await NTQQUserApi.getSkey() as string;
// 兼容整个 *.qzone.qq.com // 兼容整个 *.qzone.qq.com
let data = (await NTQQUserApi.getQzoneCookies()); const data = (await NTQQUserApi.getQzoneCookies());
const Bkn = WebApi.genBkn(data.p_skey); const Bkn = WebApi.genBkn(data.p_skey);
const CookieValue = 'p_skey=' + data.p_skey + '; skey=' + data.skey + '; p_uin=o' + selfInfo.uin + '; uin=o' + selfInfo.uin; const CookieValue = 'p_skey=' + data.p_skey + '; skey=' + data.skey + '; p_uin=o' + selfInfo.uin + '; uin=o' + selfInfo.uin;
return { cookies: CookieValue }; return { cookies: CookieValue };

View File

@@ -15,6 +15,6 @@ export class OB11GroupIncreaseEvent extends OB11GroupNoticeEvent {
this.sub_type = subType; this.sub_type = subType;
if(ob11Config.GroupLocalTime.Record && (ob11Config.GroupLocalTime.RecordList[0] == '-1' || ob11Config.GroupLocalTime.RecordList.includes(groupId.toString()))) if(ob11Config.GroupLocalTime.Record && (ob11Config.GroupLocalTime.RecordList[0] == '-1' || ob11Config.GroupLocalTime.RecordList.includes(groupId.toString())))
dbUtil.insertJoinTime(groupId, userId, Math.floor(Date.now() / 1000)) dbUtil.insertJoinTime(groupId, userId, Math.floor(Date.now() / 1000));
} }
} }

View File

@@ -152,7 +152,7 @@ export class NapCatOnebot11 {
app_id: '0', app_id: '0',
device_name: device.deviceName, device_name: device.deviceName,
device_kind: 'none' device_kind: 'none'
}) });
// log('[设备列表] 设备名称: ' + device.deviceName); // log('[设备列表] 设备名称: ' + device.deviceName);
}); });
} }

View File

@@ -69,7 +69,7 @@ async function onSettingWindowCreated(view: Element) {
</div> </div>
<div class="q-input"> <div class="q-input">
<input id="config-ob11-http-secret" class="q-input__inner" data-config-key="ob11.http.secret" type="text" value="${ob11Config.http.secret <input id="config-ob11-http-secret" class="q-input__inner" data-config-key="ob11.http.secret" type="text" value="${ob11Config.http.secret
}" placeholder="未设置" /> }" placeholder="未设置" />
</div> </div>
</setting-item> </setting-item>
<setting-item data-direction="row"> <setting-item data-direction="row">