UNPKG

koishi-plugin-toram

Version:
683 lines (668 loc) 26.8 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { Config: () => Config, apply: () => apply, inject: () => inject, name: () => name }); module.exports = __toCommonJS(src_exports); var import_koishi = require("koishi"); // src/script/dish/dishClass.ts var DishType = /* @__PURE__ */ ((DishType2) => { DishType2[DishType2["null"] = 0] = "null"; DishType2[DishType2["起司吐司"] = 1] = "起司吐司"; DishType2[DishType2["布丁吐司"] = 2] = "布丁吐司"; DishType2[DishType2["鲔鱼吐司"] = 3] = "鲔鱼吐司"; DishType2[DishType2["煎蛋吐司"] = 4] = "煎蛋吐司"; DishType2[DishType2["蜂蜜吐司"] = 5] = "蜂蜜吐司"; DishType2[DishType2["香蒜吐司"] = 6] = "香蒜吐司"; DishType2[DishType2["香草吐司"] = 7] = "香草吐司"; DishType2[DishType2["那不勒斯意大利面"] = 8] = "那不勒斯意大利面"; DishType2[DishType2["蛤蜊意大利面"] = 9] = "蛤蜊意大利面"; DishType2[DishType2["肉酱意大利面"] = 10] = "肉酱意大利面"; DishType2[DishType2["青酱意大利面"] = 11] = "青酱意大利面"; DishType2[DishType2["奶油培根意大利面"] = 12] = "奶油培根意大利面"; DishType2[DishType2["墨鱼意大利面"] = 13] = "墨鱼意大利面"; DishType2[DishType2["香蒜辣椒意大利面"] = 14] = "香蒜辣椒意大利面"; DishType2[DishType2["烩炒饭"] = 15] = "烩炒饭"; DishType2[DishType2["黄金炒饭"] = 16] = "黄金炒饭"; DishType2[DishType2["玛格丽特披萨"] = 17] = "玛格丽特披萨"; DishType2[DishType2["辣香肠披萨"] = 18] = "辣香肠披萨"; DishType2[DishType2["海鲜披萨"] = 19] = "海鲜披萨"; DishType2[DishType2["鱼排汉堡"] = 20] = "鱼排汉堡"; DishType2[DishType2["牛肉汉堡"] = 21] = "牛肉汉堡"; DishType2[DishType2["鲣鱼饭团"] = 22] = "鲣鱼饭团"; DishType2[DishType2["梅干饭团"] = 23] = "梅干饭团"; DishType2[DishType2["鲑鱼饭团"] = 24] = "鲑鱼饭团"; DishType2[DishType2["明太子饭团"] = 25] = "明太子饭团"; DishType2[DishType2["金枪鱼蛋黄酱饭团"] = 26] = "金枪鱼蛋黄酱饭团"; DishType2[DishType2["酱油拉面"] = 27] = "酱油拉面"; DishType2[DishType2["盐味拉面"] = 28] = "盐味拉面"; DishType2[DishType2["豚骨拉面"] = 29] = "豚骨拉面"; DishType2[DishType2["味增拉面"] = 30] = "味增拉面"; DishType2[DishType2["水果百汇"] = 31] = "水果百汇"; DishType2[DishType2["巧克力百汇"] = 32] = "巧克力百汇"; DishType2[DishType2["巧克力蛋糕"] = 33] = "巧克力蛋糕"; DishType2[DishType2["起司蛋糕"] = 34] = "起司蛋糕"; DishType2[DishType2["美式松饼"] = 35] = "美式松饼"; DishType2[DishType2["奶油炖菜"] = 36] = "奶油炖菜"; DishType2[DishType2["炖牛肉"] = 37] = "炖牛肉"; DishType2[DishType2["日式炒面"] = 38] = "日式炒面"; DishType2[DishType2["章鱼烧"] = 39] = "章鱼烧"; return DishType2; })(DishType || {}); var DishUse = /* @__PURE__ */ ((DishUse2) => { DishUse2[DishUse2["null"] = 0] = "null"; DishUse2[DishUse2["风属性抗性"] = 1] = "风属性抗性"; DishUse2[DishUse2["地属性抗性"] = 2] = "地属性抗性"; DishUse2[DishUse2["水属性抗性"] = 3] = "水属性抗性"; DishUse2[DishUse2["火属性抗性"] = 4] = "火属性抗性"; DishUse2[DishUse2["光属性抗性"] = 5] = "光属性抗性"; DishUse2[DishUse2["暗属性抗性"] = 6] = "暗属性抗性"; DishUse2[DishUse2["无属性抗性"] = 7] = "无属性抗性"; DishUse2[DishUse2["对风属性伤害"] = 8] = "对风属性伤害"; DishUse2[DishUse2["对水属性伤害"] = 9] = "对水属性伤害"; DishUse2[DishUse2["对火属性伤害"] = 10] = "对火属性伤害"; DishUse2[DishUse2["对地属性伤害"] = 11] = "对地属性伤害"; DishUse2[DishUse2["对光属性伤害"] = 12] = "对光属性伤害"; DishUse2[DishUse2["对暗属性伤害"] = 13] = "对暗属性伤害"; DishUse2[DishUse2["对无属性伤害"] = 14] = "对无属性伤害"; DishUse2[DishUse2["魔法值上限"] = 15] = "魔法值上限"; DishUse2[DishUse2["体力值上限"] = 16] = "体力值上限"; DishUse2[DishUse2["武器物理攻击"] = 17] = "武器物理攻击"; DishUse2[DishUse2["物理攻击"] = 18] = "物理攻击"; DishUse2[DishUse2["魔法攻击"] = 19] = "魔法攻击"; DishUse2[DishUse2["魔法抗性"] = 20] = "魔法抗性"; DishUse2[DishUse2["物理抗性"] = 21] = "物理抗性"; DishUse2[DishUse2["力量"] = 22] = "力量"; DishUse2[DishUse2["智力"] = 23] = "智力"; DishUse2[DishUse2["灵巧"] = 24] = "灵巧"; DishUse2[DishUse2["敏捷"] = 25] = "敏捷"; DishUse2[DishUse2["耐力"] = 26] = "耐力"; DishUse2[DishUse2["命中"] = 27] = "命中"; DishUse2[DishUse2["回避"] = 28] = "回避"; DishUse2[DishUse2["物理防御"] = 29] = "物理防御"; DishUse2[DishUse2["魔法防御"] = 30] = "魔法防御"; DishUse2[DishUse2["掉宝率加成"] = 31] = "掉宝率加成"; DishUse2[DishUse2["经验值加成"] = 32] = "经验值加成"; DishUse2[DishUse2["物理屏障"] = 33] = "物理屏障"; DishUse2[DishUse2["魔法屏障"] = 34] = "魔法屏障"; DishUse2[DishUse2["百分比屏障"] = 35] = "百分比屏障"; DishUse2[DishUse2["仇恨值减少"] = 36] = "仇恨值减少"; DishUse2[DishUse2["仇恨值增加"] = 37] = "仇恨值增加"; DishUse2[DishUse2["攻击魔法回复"] = 38] = "攻击魔法回复"; DishUse2[DishUse2["暴击率"] = 39] = "暴击率"; return DishUse2; })(DishUse || {}); // src/script/JsonMgr.ts var import_promises = __toESM(require("fs/promises")); var import_path = __toESM(require("path")); var _JsonMgr = class _JsonMgr { constructor() { this._json = /* @__PURE__ */ new Map(); this._logger = null; } static Inst() { if (!_JsonMgr.instance) { _JsonMgr.instance = new _JsonMgr(); } return _JsonMgr.instance; } /** * 异步获取 ./external/toram/src/json 目录下的所有JSON文件,并将其内容解析后存储到内部的Map对象中。 * 该方法会遍历指定目录下的所有文件,筛选出扩展名为.json的文件,然后读取每个文件的内容, * 将其解析为JavaScript对象,并以文件名作为键,解析后的对象作为值存储在内部的Map对象中。 * 如果在读取文件或解析JSON时发生错误,将在控制台输出错误信息。 */ async loadJson() { const arr = __dirname.split("\\"); if (arr[arr.length - 1] !== "lib") arr.pop(); arr.push("json"); const pathWay = arr.join("\\"); this._logger.info(pathWay); try { const files = await import_promises.default.readdir(pathWay); const jsonFiles = files.filter((file) => import_path.default.extname(file).toLowerCase() === ".json"); for (const file of jsonFiles) { const filePath = import_path.default.join(pathWay, file); try { const data = await import_promises.default.readFile(filePath, "utf-8"); this._json.set(file, JSON.parse(data)); } catch (readErr) { console.error(`Error reading file ${filePath}:`, readErr); } } } catch (err) { console.error(`Error reading directory ${pathWay}:`, err); } } /** * 根据指定的名称从内部的Map对象中获取对应的JSON数据。 * 该方法会在内部的Map对象中查找与给定名称匹配的键,并返回对应的值。 * 如果找不到匹配的键,则返回undefined。 * @param name - 要获取的JSON数据的名称,通常是文件名(不包括扩展名)。 * @returns 返回与指定名称对应的JSON数据,如果找不到则打印log并返回null。 */ getJson(name2) { const result = this._json.get(name2); if (result) { return result; } else { this._logger.error(`未找到${name2}`); return null; } } /** * 设置日志记录器实例,用于记录JsonMgr类的操作日志。 * 该方法允许外部传入一个Logger实例,以便在JsonMgr类的各个方法中使用该实例进行日志记录。 * @param logger - 一个Logger实例,用于记录日志。 */ setLogger(logger) { this._logger = logger; } /** 保存json */ async saveJson(name2, data) { if (!data) data = this._json.get(name2); const arr = __dirname.split("\\"); if (arr[arr.length - 1] !== "lib") arr.pop(); arr.push("json"); const pathWay = arr.join("\\"); const filePath = import_path.default.join(pathWay, "", name2); const jsonString = JSON.stringify(data, null, 2); try { import_promises.default.writeFile(filePath, jsonString, "utf8"); console.log("JSON 文件已保存!"); } catch (err) { console.error("保存文件时出错:", err); } } }; __name(_JsonMgr, "JsonMgr"); _JsonMgr.instance = null; var JsonMgr = _JsonMgr; // src/script/ReplyMgr.ts var _ReplyMgr = class _ReplyMgr { constructor() { this._replys = /* @__PURE__ */ new Map(); } static Inst() { if (!_ReplyMgr.instance) { _ReplyMgr.instance = new _ReplyMgr(); } return _ReplyMgr.instance; } setReplys() { const data = JsonMgr.Inst().getJson("replys.json"); Object.keys(data).forEach((key) => { this._replys.set(key, data[key]); }); } reply(event, replyType, args) { const replyList = this._replys.get(replyType); let reply = replyList[Math.floor(Math.random() * replyList.length)]; if (args) Object.keys(args).forEach((key) => reply = reply.replace(`@_${key}_@`, args[key])); event.session.send(reply); } }; __name(_ReplyMgr, "ReplyMgr"); _ReplyMgr.instance = null; var ReplyMgr = _ReplyMgr; // src/script/ResultClass.ts var _Result = class _Result { constructor(code, result) { this.code = 1001 /* 通过 */; this.code = code; if (result !== void 0) this.result = result; } }; __name(_Result, "Result"); var Result = _Result; // src/script/player/PlayerMgr.ts var _PlayerMgr = class _PlayerMgr { static Inst() { if (!_PlayerMgr.instance) { _PlayerMgr.instance = new _PlayerMgr(); } return _PlayerMgr.instance; } async setConfigs(ctx) { this._ctx = ctx; } async getPlayerListByPartName(name2) { const playerList = await this._ctx.database.get("player", { nickname: { $regex: name2 } }); if (playerList.length === 0) return new Result(3001 /* 未找到玩家 */); return new Result(1001 /* 通过 */, playerList); } }; __name(_PlayerMgr, "PlayerMgr"); _PlayerMgr.instance = null; var PlayerMgr = _PlayerMgr; // src/script/dish/DishMgr.ts var _DishMgr = class _DishMgr { constructor() { this._dishNameConfigs = /* @__PURE__ */ new Map(); this.setDishNameConfigs(); } static Inst() { if (!_DishMgr.instance) { _DishMgr.instance = new _DishMgr(); } return _DishMgr.instance; } async setConfigs(ctx) { this._ctx = ctx; } setDishNameConfigs() { const json = JsonMgr.Inst().getJson("dishesTypeNames.json"); for (const dishType in json) { if (json.hasOwnProperty(dishType)) { json[dishType].forEach((name2) => this._dishNameConfigs.set(name2, DishType[dishType])); } } } getDishTypeByName(name2) { const dishType = this._dishNameConfigs.get(name2); if (dishType === void 0) return 0 /* null */; return dishType; } async getDishDatasByType(type, dishes) { let fDishes = []; if (dishes) { fDishes = dishes.filter((v) => v.type == type); } else { const dishList = await this._ctx.database.get("dish", { type }); fDishes = [...dishList]; } if (fDishes.length === 0) return new Result(3002 /* 未找到料理 */); return new Result(1001 /* 通过 */, fDishes); } async getDishDatasByLevel(level, dishes) { let fDishes = []; if (dishes) { fDishes = dishes.filter((v) => v.level === level); } else { const dishList = await this._ctx.database.get("dish", { level }); fDishes = [...dishList]; } if (fDishes.length === 0) return new Result(3002 /* 未找到料理 */); return new Result(1001 /* 通过 */, fDishes); } }; __name(_DishMgr, "DishMgr"); _DishMgr.instance = null; var DishMgr = _DishMgr; // src/script/command/dishCommand.ts async function command_dishes(event, args) { const checkResult = checkArgs(args); switch (checkResult.code) { case 2001 /* 参数缺失 */: ReplyMgr.Inst().reply(event, "料理命令_参数缺失"); return; case 2002 /* 等级不正确 */: ReplyMgr.Inst().reply(event, "料理命令_等级错误"); return; } let title = ""; let result = ""; let tips = ""; const { name: name2, type, level } = checkResult.result; if (name2) { title = "你在找下面这些玩家的料理吗?"; const getPlayerList = await PlayerMgr.Inst().getPlayerListByPartName(name2); if (getPlayerList.code === 3001 /* 未找到玩家 */) { ReplyMgr.Inst().reply(event, "料理命令_未找到玩家"); return; } let playerList = getPlayerList.result; playerList = playerList.filter((player) => JSON.parse(player.dishes).length > 0); if (playerList.length > 10) { playerList = playerList.slice(0, 10); tips = ` ...... 名字带有"${name2}"的玩家有很多呢?需要仔细想想你想找的玩家叫什么吗?`; } result = "\n" + playerList.map((data, i) => { const dishes = JSON.parse(data.dishes); return `${i + 1}.${data.nickname}${dishes.map((dish) => `${DishUse[DishType[dish.type]]}(${dish.level}级)`).join("、")}`; }).join("\n"); } else { let getDishList = await DishMgr.Inst().getDishDatasByType(type); if (getDishList.code === 3002 /* 未找到料理 */) { ReplyMgr.Inst().reply(event, "料理命令_未找到料理"); return; } let dishList = getDishList.result.sort((a, b) => a.player.localeCompare(b.player)); const dishTypeName = DishType[type]; if (level) { title = `${level}${args[0]}(${dishTypeName})的料理名单如下:`; getDishList = await DishMgr.Inst().getDishDatasByLevel(level, dishList); if (getDishList.code === 3002 /* 未找到料理 */) { ReplyMgr.Inst().reply(event, "料理命令_未找到料理"); return; } dishList = getDishList.result; result = ` ${dishList.map((data) => data.player).join("、")}`; } else { title = `高级${args[0]}(${dishTypeName})的料理名单如下:`; let count = 0; const results = []; for (let i = 10; i > 0; i--) { getDishList = await DishMgr.Inst().getDishDatasByLevel(i, dishList); if (getDishList.code === 3002 /* 未找到料理 */) continue; count += getDishList.result.length; results.push(`${i}级: ${getDishList.result.map((data) => data.player).join("、")}`); if (count >= event.config.dishes_return) break; } result = ` ${results.join("\n")}`; } } ReplyMgr.Inst().reply(event, "正常回复", { title, result, tips }); } __name(command_dishes, "command_dishes"); function checkArgs(args) { const name2 = args[0], levelCN = args[1]; if (name2 === void 0) return new Result(2001 /* 参数缺失 */); const type = DishMgr.Inst().getDishTypeByName(name2); if (type === 0 /* null */) return new Result(1001 /* 通过 */, { name: name2 }); if (levelCN !== void 0) { const level = toDishLevel(levelCN); if (!level) return new Result(2002 /* 等级不正确 */); return new Result(1001 /* 通过 */, { type, level }); } return new Result(1001 /* 通过 */, { type }); } __name(checkArgs, "checkArgs"); function toDishLevel(level) { if (!/^([1-9]|10|一|二|三|四|五|六|七|八|九|十)级?$/.test(level)) return void 0; level = level.replace("级", ""); if (Number(level)) { return Number(level); } else { return ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"].indexOf(level) + 1; } } __name(toDishLevel, "toDishLevel"); // src/script/monster/monsterClass.ts var ElementType = /* @__PURE__ */ ((ElementType2) => { ElementType2[ElementType2["无"] = 0] = "无"; ElementType2[ElementType2["风"] = 1] = "风"; ElementType2[ElementType2["地"] = 2] = "地"; ElementType2[ElementType2["水"] = 3] = "水"; ElementType2[ElementType2["火"] = 4] = "火"; ElementType2[ElementType2["光"] = 5] = "光"; ElementType2[ElementType2["暗"] = 6] = "暗"; return ElementType2; })(ElementType || {}); var _Monster = class _Monster { // 推荐系数 constructor(monsterData, star) { this.type = monsterData.type; this.name = monsterData.name; this.level = monsterData.baseLevel; this.baseExp = monsterData.baseExp; this.map = monsterData.map; this.element = monsterData.element; const starLevel = [-10, 0, 10, 20, 40]; const starExp = [0.1, 1, 2, 5, 10]; if (star !== void 0) { this.name = `${star}${this.name}`; this.star = star; this.level = Math.max(1, this.level + starLevel[star]); this.baseExp *= starExp[star]; } if (monsterData.recommend) this.recommend = monsterData.recommend; } getPlayerExp(level) { const playerExpRate = [11, 11, 11, 11, 11, 11, 10, 9, 7, 3, 1]; return this.baseExp * playerExpRate[Math.abs(level - this.level)] || 0; } cmdPlayerLevelUP(level) { return `${this.name} 等级${this.level} 经验值${this.getPlayerExp(level)} ${this.map} ${ElementType[this.element]}属性`; } }; __name(_Monster, "Monster"); var Monster = _Monster; // src/script/command/levelUpCommand.ts async function command_levelUP(event, args) { const checkResult = checkArgs2(args, event.config.maxLevel); switch (checkResult.code) { case 2001 /* 参数缺失 */: ReplyMgr.Inst().reply(event, "升级命令_参数缺失"); return; case 2002 /* 等级不正确 */: ReplyMgr.Inst().reply(event, `升级命令_等级不正确`, { maxLevel: event.config.maxLevel.toString() }); return; } let title = ""; let result = ""; let tips = ""; const { level } = checkResult.result; title = getUpgradeExp(level, event.config.maxLevel); switch (true) { case level < 38: result = "\n亲亲,建议去尼塞尔山刷布兰达哦?"; break; case level < 55: result = "\n去上古女帝陵墓打机骨龙吧~"; break; case level < event.config.maxLevel: let fixBossList = []; const fixBossDataList = await event.ctx.database.get("monster", { type: 2 /* 定点王 */, baseLevel: { $gte: level - 50, $lte: level + 20 } }); fixBossDataList.forEach((data) => { for (let i = 0; i <= 4; i++) { fixBossList.push(new Monster(data, i)); } }); fixBossList = fixBossList.sort((a, b) => b.getPlayerExp(level) * (100 + b.recommend * 30) - a.getPlayerExp(level) * (100 + a.recommend * 30)).slice(0, event.config.levelUP_player_fixedBossReturn); let wildBossList = []; const wildBossDataList = await event.ctx.database.get("monster", { type: 1 /* 野王 */, baseLevel: { $gte: level - 10, $lte: level + 10 } }); wildBossDataList.forEach((data) => { wildBossList.push(new Monster(data)); }); wildBossList = wildBossList.sort((a, b) => b.getPlayerExp(level) * (100 + b.recommend * 30) - a.getPlayerExp(level) * (100 + a.recommend * 30)).slice(0, event.config.levelUP_player_wildBossReturn); const fixBossResult = fixBossList.map((monster, i) => { return `${i + 1}.${monster.cmdPlayerLevelUP(level)}`; }); result += ` 定点王: ${fixBossResult.join("\n")}`; const wildBossResult = wildBossList.map((monster, i) => { return `${i + 1}.${monster.cmdPlayerLevelUP(level)}`; }); result += ` 野王: ${wildBossResult.join("\n")}`; const rand = Math.floor(Math.random() * (fixBossList.length + wildBossList.length)); let suggestion = rand < fixBossList.length ? fixBossList[rand] : wildBossList[rand - fixBossList.length]; tips = ` 去打${suggestion.name}怎么样?`; break; case level === event.config.maxLevel: result = ` 你已经升到满级啦!`; break; } ReplyMgr.Inst().reply(event, "正常回复", { title, result, tips }); } __name(command_levelUP, "command_levelUP"); function checkArgs2(args, maxLevel) { let levelCN = args[0]; if (levelCN === void 0) return new Result(2001 /* 参数缺失 */); if (/级$/.test(levelCN)) levelCN = levelCN.replace(/级/g, ""); const level = Number(levelCN); if (isNaN(level) || level < 1 || level > maxLevel || Math.floor(level) !== level) return new Result(2002 /* 等级不正确 */); return new Result(1001 /* 通过 */, { level }); } __name(checkArgs2, "checkArgs"); function getUpgradeExp(level, maxLevel) { const exp = Math.floor(level ** 4 / 40) + level * 2; return level !== maxLevel ? `${level}级升级所需经验为${exp}` : ""; } __name(getUpgradeExp, "getUpgradeExp"); // src/index.ts var name = "toram"; var inject = ["database"]; var Config = import_koishi.Schema.intersect([ import_koishi.Schema.object({ allowLoadJson: import_koishi.Schema.boolean().description("是否允许载入json内容").default(false) }).description("状态配置"), import_koishi.Schema.object({ maxLevel: import_koishi.Schema.number().description("当前版本的最大等级").default(280) }).description("游戏信息"), import_koishi.Schema.object({ dishes_return: import_koishi.Schema.number().description("使用料理指令且不指定等级时最少返回的玩家昵称数量").min(1).step(1).default(15), levelUP_player_recommend: import_koishi.Schema.number().description("使用升级指令时推荐系数的影响幅度").min(0).step(5).default(30), levelUP_player_fixedBossReturn: import_koishi.Schema.number().description("使用升级指令时返回的定点王数量").min(1).step(1).default(6), levelUP_player_wildBossReturn: import_koishi.Schema.number().description("使用升级指令时返回的野王数量").min(1).step(1).default(4) }).description("指令管理") ]); async function apply(ctx, config) { const logger = ctx.logger("toram"); JsonMgr.Inst().setLogger(logger); await JsonMgr.Inst().loadJson(); await DishMgr.Inst().setConfigs(ctx); await PlayerMgr.Inst().setConfigs(ctx); ReplyMgr.Inst().setReplys(); ctx.model.extend("monster", { id: "integer", // 唯一标识 type: "integer", // 0:小怪,1:野王,2:定点王 name: "string", // 名称 baseLevel: "integer", // 等级 baseExp: "integer", // 基础经验 map: "string", // 所在地图 element: "integer", // 属性 recommend: "integer" // 推荐 }, { primary: "id" }); ctx.model.extend("player", { id: "integer", // 唯一标识 nickname: "string", // 名称 dishes: "string", // 料理JSON path: "integer" // 等级 }, { primary: "id" }); ctx.model.extend("dish", { id: "integer", // 唯一标识 player: "string", type: "integer", level: "integer" }, { primary: "id" }); ctx.middleware(async (session, next) => { logger.info(session); const event = newEvent(ctx, session, config, logger); ReplyMgr.Inst().reply(event, "被@"); return next(); }); ctx.command("料理 <料理种类> <料理等级>").action(async ({ session }, ...args) => { const event = newEvent(ctx, session, config, logger); await command_dishes(event, args); }); ctx.command("升级 <等级数>").action(async ({ session }, ...args) => { const event = newEvent(ctx, session, config, logger); await command_levelUP(event, args); }); ctx.command("loadJson").action(async ({ session }) => { if (!config.allowLoadJson) { session.send("不允许加载json内容"); return; } await ctx.database.remove("monster", { id: { $gt: 0 } }); const monsterList = JsonMgr.Inst().getJson("monster.json").map((monster) => { delete monster._id; return monster; }); await ctx.database.upsert("monster", (row) => monsterList); await ctx.database.remove("player", { id: { $gt: 0 } }); const playerList = JsonMgr.Inst().getJson("player.json").map((player) => { return { id: player.id, nickname: player.name, dishes: player.dishes, path: player.path }; }); await ctx.database.upsert("player", (row) => playerList); await ctx.database.remove("dish", { id: { $gt: 0 } }); const dishList = []; playerList.forEach((player) => { const dishes = JSON.parse(player.dishes); dishes.forEach((dish) => { dishList.push({ id: dishList.length + 1, player: player.nickname, type: DishType[dish.type], level: dish.level }); }); }); await ctx.database.upsert("dish", (row) => dishList); session.send("加载完成"); }); } __name(apply, "apply"); function newEvent(ctx, session, config, logger) { const event = { ctx, session, config, logger }; return event; } __name(newEvent, "newEvent"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Config, apply, inject, name });