onebots
Version:
基于icqq的多例oneBot实现
315 lines (314 loc) • 10.1 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = void 0;
exports.readLine = readLine;
exports.deepMerge = deepMerge;
exports.transformObj = transformObj;
exports.deepClone = deepClone;
exports.pick = pick;
exports.omit = omit;
exports.toLine = toLine;
exports.Mixin = Mixin;
exports.toHump = toHump;
exports.remove = remove;
exports.toBool = toBool;
exports.uuid = uuid;
exports.randomInt = randomInt;
exports.protectedFields = protectedFields;
exports.getProperties = getProperties;
exports.setValueToObj = setValueToObj;
exports.getValueOfObj = getValueOfObj;
exports.getDataKeyOfObj = getDataKeyOfObj;
exports.parseObjFromStr = parseObjFromStr;
exports.stringifyObj = stringifyObj;
const crypto = __importStar(require("crypto"));
const fs = __importStar(require("fs"));
const readline = __importStar(require("readline"));
const packageJson = require("../package.json");
exports.version = packageJson.version;
function readLine(maxLen, ...params) {
return new Promise((resolve, reject) => {
const result = [];
const rl = readline.createInterface({
input: fs.createReadStream(...params),
crlfDelay: Infinity,
});
rl.on("line", line => {
result.push(line);
if (result.length > maxLen)
result.shift();
});
rl.on("close", () => {
resolve(result.join("\n"));
});
rl.on("error", reject);
});
}
// 合并对象/数组
function deepMerge(base, ...from) {
if (base === null || base === undefined)
base = from.shift();
if (from.length === 0) {
return base;
}
if (typeof base !== "object") {
return base;
}
if (Array.isArray(base)) {
return Array.from(new Set(base.concat(...from)));
}
for (const item of from) {
for (const key in item) {
if (base.hasOwnProperty(key)) {
if (typeof base[key] === "object") {
base[key] = deepMerge(base[key], item[key]);
}
else {
base[key] = item[key];
}
}
else {
base[key] = item[key];
}
}
}
return base;
}
function transformObj(obj, callback) {
if (!obj)
return obj;
if (Array.isArray(obj))
return obj.map(item => transformObj(item, callback));
if (typeof obj !== "object")
return obj;
return Object.fromEntries(Object.keys(obj).map(key => {
return [key, callback(key, obj[key])];
}));
}
// 深拷贝
function deepClone(obj) {
if (typeof obj !== "object")
return obj;
if (!obj)
return obj;
//判断拷贝的obj是对象还是数组
if (Array.isArray(obj))
return obj.map(item => deepClone(item));
const objClone = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
}
else {
objClone[key] = obj[key];
}
}
}
return objClone;
}
function pick(source, keys, forced) {
if (!keys)
return { ...source };
const result = {};
for (const key of keys) {
if (forced || key in source)
result[key] = source[key];
}
return result;
}
function omit(source, keys) {
if (!keys)
return { ...source };
const result = { ...source };
for (const key of keys) {
Reflect.deleteProperty(result, key);
}
return result;
}
/**
* 将驼峰命名替换为下划线分割命名
* @param name
* @returns
* @todo 是否应该改名 ToUnderLine()?
*/
function toLine(name) {
return name.replace(/([A-Z])/g, "_$1").toLowerCase();
}
function Mixin(base, ...classes) {
classes.forEach(ctr => {
Object.getOwnPropertyNames(ctr.prototype).forEach(name => {
if (name === "constructor")
return;
base.prototype[name] = ctr.prototype[name];
});
});
return base;
}
function toHump(action) {
return action.replace(/_[\w]/g, s => {
return s[1].toUpperCase();
});
}
function remove(list, item) {
const idx = list.indexOf(item);
if (idx !== -1)
list.splice(idx, 1);
}
function toBool(v) {
if (v === "0" || v === "false")
v = false;
return Boolean(v);
}
function uuid() {
let hex = crypto.randomBytes(16).toString("hex");
return (hex.substr(0, 8) +
"-" +
hex.substr(8, 4) +
"-" +
hex.substr(12, 4) +
"-" +
hex.substr(16, 4) +
"-" +
hex.substr(20));
}
function randomInt(...args) {
let min = args[0] || 0, max = args[1];
if (args.length === 1)
(max = min), (min = 0);
return Math.floor(Math.random() * (max - min) + min);
}
function protectedFields(source, ...keys) {
const protocolValue = value => {
if (value && typeof value === "object")
return Object.fromEntries(Object.entries(value).map(([key, value]) => {
return [key, protocolValue(value)];
}));
return `${value}`
.split("")
.map(() => "*")
.join("");
};
if (!source || typeof source !== "object")
throw new Error("source must is object");
return Object.fromEntries(Object.entries(source).map(([key, value]) => {
return [key, keys.includes(key) ? protocolValue(value) : value];
}));
}
function getProperties(obj) {
if (obj.__proto__ === null) {
//说明该对象已经是最顶层的对象
return [];
}
return Object.getOwnPropertyNames(obj).concat(getProperties(obj.__proto__));
}
function setValueToObj(obj, key, value) {
const keys = Array.isArray(key) ? key : key.split(".").filter(Boolean);
const lastKey = keys.pop();
if (!lastKey)
throw new SyntaxError(`key is empty`);
while (keys.length) {
const k = keys.shift();
obj = Reflect.get(obj, k);
if (!obj)
throw new SyntaxError(`can't set ${lastKey} to undefined`);
}
return Reflect.set(obj, lastKey, value);
}
function getValueOfObj(obj, key) {
const keys = Array.isArray(key) ? key : key.split(".").filter(Boolean);
const lastKey = keys.pop();
if (!lastKey)
throw new SyntaxError(`key is empty`);
while (keys.length) {
const k = keys.shift();
obj = Reflect.get(obj, k);
if (!obj)
throw new SyntaxError(`can't set ${lastKey} to undefined`);
}
return Reflect.get(obj, lastKey);
}
function getDataKeyOfObj(data, obj) {
const _get = (data, obj, prefix) => {
for (const [key, value] of Object.entries(obj)) {
if (value === data)
return [...prefix, key].join(".");
if (!value || typeof value !== "object")
continue;
const result = _get(data, value, prefix);
if (result)
return result;
}
};
return _get(data, obj, []);
}
function parseObjFromStr(str) {
const result = JSON.parse(str);
const format = (data, keys) => {
if (!data)
return;
if (typeof data !== "object" && typeof data !== "string")
return;
if (typeof data === "object")
return Object.entries(data).map(([k, v]) => format(v, [...keys, k]));
if (/\[Function:.+]/.test(data))
return setValueToObj(result, [...keys], new Function(`return (${data.slice(10, -1)})`)());
if (/\[Circular:.+]/.test(data))
setValueToObj(result, [...keys], getValueOfObj(result, data.slice(10, -1)));
};
format(result, []);
return result;
}
function stringifyObj(value) {
if (!value || typeof value !== "object")
return value;
if (Array.isArray(value))
return `[${value.map(stringifyObj).join()}]`;
let result = { ...value }, cache = new WeakMap();
const _stringify = (obj, prefix) => {
for (const key of Reflect.ownKeys(obj)) {
if (typeof key === "symbol")
continue;
const val = Reflect.get(obj, key);
if (!val || typeof val !== "object") {
if (typeof val === "function") {
setValueToObj(result, [...prefix, String(key)], `[Function:${(val + "").replace(/\n/g, "")}]`);
continue;
}
setValueToObj(result, [...prefix, String(key)], val);
continue;
}
if (cache.has(val)) {
setValueToObj(result, [...prefix, String(key)], `[Circular:${getDataKeyOfObj(val, value)}]`);
continue;
}
cache.set(val, getValueOfObj(value, [...prefix, String(key)]));
_stringify(val, [...prefix, String(key)]);
}
};
_stringify(value, []);
return JSON.stringify(result, (_, v) => (typeof v === "bigint" ? v.toString() : v), 2);
}