UNPKG

onebots

Version:

基于icqq的多例oneBot实现

315 lines (314 loc) 10.1 kB
"use strict"; 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); }