UNPKG

onebots

Version:

基于icqq的多例oneBot实现

90 lines (89 loc) 3.76 kB
"use strict"; 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 = {}));