Lagrange.RagBot/bot/lagrange-mapping.ts
2024-05-30 22:48:38 +08:00

85 lines
3.1 KiB
TypeScript

import assert from 'assert';
import type * as Lagrange from './type';
type PrivateUserInvoker = (message: Lagrange.PrivateMessage) => void;
type GroupUserInvoker = (message: Lagrange.GroupMessage) => void;
type MessageInvoker = PrivateUserInvoker | GroupUserInvoker;
interface CustomDescriptor<T extends MessageInvoker> {
value?: T;
configurable?: boolean;
enumerable?: boolean;
writable?: boolean;
get?(): any;
set?(v: any): void;
}
interface MessageInvokerStorage<T extends MessageInvoker> {
invoker: T;
config: Partial<Lagrange.CommonMessage>
}
class LagrangeMapper {
private _privateUserStorage: Map<number, MessageInvokerStorage<PrivateUserInvoker>>;
private _groupStorage: Map<number, MessageInvokerStorage<GroupUserInvoker>>;
constructor() {
this._privateUserStorage = new Map<number, MessageInvokerStorage<PrivateUserInvoker>>();
this._groupStorage = new Map<number, MessageInvokerStorage<GroupUserInvoker>>();
}
get privateUserStorage() {
return this._privateUserStorage;
}
get groupStorage() {
return this._groupStorage;
}
public matchPrivateUser(message: Lagrange.PrivateMessage) {
const user_id = message.user_id;
const userStorage = this._privateUserStorage.get(user_id);
if (userStorage) {
userStorage.invoker(message);
}
}
public onPrivateUser(config: Partial<Lagrange.CommonMessage>) {
assert(config.user_id, 'onPrivateUser 中 user_id 不能为空');
const _this = this;
return function(target: any, propertyKey: string, descriptor: CustomDescriptor<PrivateUserInvoker>) {
const user_id = config.user_id;
if (_this.privateUserStorage.has(user_id)) {
console.warn(`${propertyKey} -> 用户 ${user_id} 已经被注册过了,该操作将覆盖原本的!`);
}
const invoker = descriptor.value;
_this.privateUserStorage.set(user_id, { invoker, config });
}
}
public onGroupUser(config: Partial<Lagrange.CommonMessage>) {
assert(config.user_id, 'onGroupUser 中 user_id 不能为空');
assert(config.group_id, 'onGroupUser 中 group_id 不能为空');
const _this = this;
return function(target: any, propertyKey: string, descriptor: CustomDescriptor<GroupUserInvoker>) {
}
}
public onGroup(config: Partial<Lagrange.CommonMessage>) {
assert(config.group_id, 'onGroup 中 group_id 不能为空');
const _this = this;
return function(target: any, propertyKey: string, descriptor: CustomDescriptor<GroupUserInvoker>) {
const group_id = config.group_id;
if (_this.groupStorage.has(group_id)) {
console.warn(`${propertyKey} -> 群 ${group_id} 已经被注册过了,该操作将覆盖原本的!`);
}
const invoker = descriptor.value;
_this.groupStorage.set(group_id, { invoker, config });
}
}
}
const lagMapper = new LagrangeMapper();
export default lagMapper;