onebots
Version:
基于icqq的多例oneBot实现
90 lines (89 loc) • 3.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Service = void 0;
const events_1 = require("events");
class Service extends events_1.EventEmitter {
get path() {
return `/${this.oneBot.platform}/${this.oneBot.uin}/${this.version}`;
}
constructor(adapter, config) {
super();
this.adapter = adapter;
this.config = config;
this.filterFn = Service.createFilterFunction(config.filters || {});
}
}
exports.Service = Service;
(function (Service) {
function createFilterFunction(filters) {
const isLogicKey = (key) => {
return [
"$and",
"$or",
"$not",
"$nor",
"$regexp",
"$like",
"$gt",
"$gte",
"$lt",
"$lte",
"$between",
].includes(key);
};
const filterFn = (event, key, value) => {
// 如果 key 为 $and、$or、$not、$nor 则递归调用
if (key === "$and" || key === "$or" || key === "$not" || key === "$nor") {
if (!value || typeof value !== "object")
throw new Error("invalid filter");
switch (key) {
case "$and":
return Array.isArray(value)
? value.every(item => filterFn(event, key, item))
: Object.entries(value).every(([key, value]) => filterFn(event, key, value));
case "$or":
return Array.isArray(value)
? value.some(item => filterFn(event, key, item))
: Object.entries(value).some(([key, value]) => filterFn(event, key, value));
case "$nor":
return !filterFn(event, "$or", value);
case "$not":
return !filterFn(event, "$and", value);
}
}
if (typeof value === "boolean" && typeof event[key] !== "boolean") {
return value;
}
if (typeof value !== "object") {
if (key === "$regex" && typeof value === "string")
return new RegExp(value).test(String(event));
if (key === "$like" && typeof value === "string")
return String(event).includes(value);
if (key === "$gt" && typeof value === "number")
return Number(event) > value;
if (key === "$gte" && typeof value === "number")
return Number(event) >= value;
if (key === "$lt" && typeof value === "number")
return Number(event) < value;
if (key === "$lte" && typeof value === "number")
return Number(event) <= value;
return value === event[key];
}
if (key === "$between" &&
Array.isArray(value) &&
value.length === 2 &&
value.every(item => typeof item === "number")) {
const [start, end] = value;
return Number(event) >= start && Number(event) <= end;
}
if (Array.isArray(value)) {
return value.includes(event[key]);
}
return createFilterFunction(value)(isLogicKey(key) ? event : event[key]);
};
return (event) => {
return Object.entries(filters).every(([key, value]) => filterFn(event, key, value));
};
}
Service.createFilterFunction = createFilterFunction;
})(Service || (exports.Service = Service = {}));