Minecraft-STC-Modpack/showdown/server/chat-plugins/thecafe.js
2023-08-14 21:45:09 -04:00

204 lines
10 KiB
JavaScript

"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], 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 __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var thecafe_exports = {};
__export(thecafe_exports, {
commands: () => commands,
pages: () => pages
});
module.exports = __toCommonJS(thecafe_exports);
var import_fs = require("../../lib/fs");
var import_utils = require("../../lib/utils");
const DISHES_FILE = "config/chat-plugins/thecafe-foodfight.json";
const FOODFIGHT_COOLDOWN = 5 * 60 * 1e3;
const dishes = JSON.parse((0, import_fs.FS)(DISHES_FILE).readIfExistsSync() || "{}");
function saveDishes() {
void (0, import_fs.FS)(DISHES_FILE).write(JSON.stringify(dishes));
}
function generateTeam(generator = "") {
let potentialPokemon = Object.keys(Dex.data.Pokedex).filter((mon) => {
const species = Dex.species.get(mon);
return species.baseSpecies === species.name;
});
let speciesClause = true;
switch (generator) {
case "ou":
potentialPokemon = potentialPokemon.filter((mon) => {
const species = Dex.species.get(mon);
return species.tier === "OU";
}).concat(potentialPokemon.filter((mon) => {
const species = Dex.species.get(mon);
return species.tier === "OU" || species.tier === "UU";
}));
break;
case "ag":
potentialPokemon = potentialPokemon.filter((mon) => {
const species = Dex.species.get(mon);
const unviable = species.tier === "NFE" || species.tier === "PU" || species.tier === "(PU)" || species.tier.startsWith("LC");
const illegal = species.tier === "Unreleased" || species.tier === "Illegal" || species.tier.startsWith("CAP");
return !(unviable || illegal);
});
speciesClause = false;
break;
default:
potentialPokemon = potentialPokemon.filter((mon) => {
const species = Dex.species.get(mon);
const op = species.tier === "AG" || species.tier === "Uber" || species.tier.slice(1, -1) === "Uber";
const unviable = species.tier === "Illegal" || species.tier.includes("LC");
return !(op || unviable);
});
potentialPokemon.push("miltank", "miltank", "miltank", "miltank");
}
const team = [];
while (team.length < 6) {
const randIndex = Math.floor(Math.random() * potentialPokemon.length);
const potentialMon = potentialPokemon[randIndex];
if (team.includes(potentialMon))
continue;
team.push(potentialMon);
if (speciesClause)
potentialPokemon.splice(randIndex, 1);
}
return team.map((mon) => Dex.species.get(mon).name);
}
function generateDish() {
const keys = Object.keys(dishes);
const entry = dishes[keys[Math.floor(Math.random() * keys.length)]].slice();
const dish = entry.splice(0, 1)[0];
const ingredients = [];
while (ingredients.length < 6) {
ingredients.push(entry.splice(Math.floor(Math.random() * entry.length), 1)[0]);
}
return [dish, ingredients];
}
const commands = {
foodfight(target, room, user) {
room = this.requireRoom("thecafe");
if (!Object.keys(dishes).length)
return this.errorReply("No dishes found. Add some dishes first.");
if (user.foodfight && user.foodfight.timestamp + FOODFIGHT_COOLDOWN > Date.now()) {
return this.errorReply("Please wait a few minutes before using this command again.");
}
target = toID(target);
let team = [];
let importable;
const [newDish, newIngredients] = generateDish();
if (!target) {
const bfTeam = Teams.generate("gen7bssfactory");
for (const [i, name] of newIngredients.entries())
bfTeam[i].name = name;
importable = Teams.export(bfTeam);
team = bfTeam.map((val) => val.species);
} else {
team = generateTeam(target);
}
user.foodfight = { generatedTeam: team, dish: newDish, ingredients: newIngredients, timestamp: Date.now() };
const importStr = importable ? import_utils.Utils.html`<tr><td colspan=7><details><summary style="font-size:13pt;">Importable team:</summary><div style="width:100%;height:400px;overflow:auto;color:black;font-family:monospace;background:white;text-align:left;">${importable}</textarea></details></td></tr>` : "";
return this.sendReplyBox(`<div class="ladder"><table style="text-align:center;"><tr><th colspan="7" style="font-size:10pt;">Your dish is: <u>${newDish}</u></th></tr><tr><th>Team</th>${team.map((mon) => `<td><psicon pokemon="${mon}"/> ${mon}</td>`).join("")}</tr><tr><th>Ingredients</th>${newIngredients.map((ingredient) => `<td>${ingredient}</td>`).join("")}</tr>${importStr}</table></div>`);
},
checkfoodfight(target, room, user) {
room = this.requireRoom("thecafe");
const targetUser = this.getUserOrSelf(target);
if (!targetUser)
return this.errorReply(`User ${target} not found.`);
const self = targetUser === user;
if (!self)
this.checkCan("mute", targetUser, room);
const foodfight = targetUser.foodfight;
if (!foodfight) {
return this.errorReply(`${self ? `You don't` : `This user doesn't`} have an active Foodfight team.`);
}
return this.sendReplyBox(/* @__PURE__ */ Chat.h("div", { class: "ladder" }, /* @__PURE__ */ Chat.h("table", { style: { textAlign: "center" } }, /* @__PURE__ */ Chat.h("tr", null, /* @__PURE__ */ Chat.h("th", { colSpan: 7, style: { fontSize: "10pt" } }, self ? `Your` : `${targetUser.name}'s`, " dish is: ", /* @__PURE__ */ Chat.h("u", null, foodfight.dish))), /* @__PURE__ */ Chat.h("tr", null, /* @__PURE__ */ Chat.h("th", null, "Team"), foodfight.generatedTeam.map((mon) => /* @__PURE__ */ Chat.h("td", null, /* @__PURE__ */ Chat.h("psicon", { pokemon: mon }), " ", mon))), /* @__PURE__ */ Chat.h("tr", null, /* @__PURE__ */ Chat.h("th", null, "Ingredients"), foodfight.ingredients.map((ingredient) => /* @__PURE__ */ Chat.h("td", null, ingredient))))));
},
addingredients: "adddish",
adddish(target, room, user, connection, cmd) {
room = this.requireRoom("thecafe");
this.checkCan("mute", null, room);
let [dish, ...ingredients] = target.split(",");
dish = dish.trim();
if (!dish || !ingredients.length)
return this.parse("/help foodfight");
const id = toID(dish);
if (id === "constructor")
return this.errorReply("Invalid dish name.");
ingredients = ingredients.map((ingredient) => ingredient.trim());
if ([...ingredients.entries()].some(([index, ingredient]) => ingredients.indexOf(ingredient) !== index)) {
return this.errorReply("Please don't enter duplicate ingredients.");
}
if (ingredients.some((ingredient) => ingredient.length > 19)) {
return this.errorReply("Ingredients can only be 19 characters long.");
}
if (cmd === "adddish") {
if (dishes[id])
return this.errorReply("This dish already exists.");
if (ingredients.length < 6)
return this.errorReply("Dishes need at least 6 ingredients.");
dishes[id] = [dish];
} else {
if (!dishes[id])
return this.errorReply(`Dish not found: ${dish}`);
if (ingredients.some((ingredient) => dishes[id].includes(ingredient))) {
return this.errorReply("Please don't enter duplicate ingredients.");
}
}
dishes[id] = dishes[id].concat(ingredients);
saveDishes();
this.sendReply(`${cmd.slice(3)} '${dish}: ${ingredients.join(", ")}' added successfully.`);
},
removedish(target, room, user) {
room = this.requireRoom("thecafe");
this.checkCan("mute", null, room);
const id = toID(target);
if (id === "constructor")
return this.errorReply("Invalid dish.");
if (!dishes[id])
return this.errorReply(`Dish '${target}' not found.`);
delete dishes[id];
saveDishes();
this.sendReply(`Dish '${target}' deleted successfully.`);
},
viewdishes(target, room, user, connection) {
room = this.requireRoom("thecafe");
return this.parse(`/join view-foodfight`);
},
foodfighthelp: [
`/foodfight <generator> - Gives you a randomly generated Foodfight dish, ingredient list and team. Generator can be either 'random', 'ou', 'ag', or left blank. If left blank, uses Battle Factory to generate an importable team.`,
`/checkfoodfight <username> - Gives you the last team and dish generated for the entered user, or your own if left blank. Anyone can check their own info, checking other people requires: % @ # &`,
`/adddish <dish>, <ingredient>, <ingredient>, ... - Adds a dish to the database. Requires: % @ # &`,
`/addingredients <dish>, <ingredient>, <ingredient>, ... - Adds extra ingredients to a dish in the database. Requires: % @ # &`,
`/removedish <dish> - Removes a dish from the database. Requires: % @ # &`,
`/viewdishes - Shows the entire database of dishes. Requires: % @ # &`
]
};
const pages = {
foodfight(query, user, connection) {
if (!user.named)
return Rooms.RETRY_AFTER_LOGIN;
this.title = "Foodfight";
const room = Rooms.get("thecafe");
if (!room)
return this.errorReply(`Room not found.`);
this.checkCan("mute", null, room);
const content = Object.values(dishes).map(
([dish, ...ingredients]) => /* @__PURE__ */ Chat.h("tr", null, /* @__PURE__ */ Chat.h("td", null, dish), /* @__PURE__ */ Chat.h("td", null, ingredients.join(", ")))
).join("");
return /* @__PURE__ */ Chat.h("div", { class: "pad ladder" }, /* @__PURE__ */ Chat.h("h2", null, "Foodfight Dish list"), content ? /* @__PURE__ */ Chat.h("table", null, /* @__PURE__ */ Chat.h("tr", null, /* @__PURE__ */ Chat.h("th", null, /* @__PURE__ */ Chat.h("h3", null, "Dishes")), /* @__PURE__ */ Chat.h("th", null, /* @__PURE__ */ Chat.h("h3", null, "Ingredients"))), content) : /* @__PURE__ */ Chat.h("p", null, "There are no dishes in the database."));
}
};
//# sourceMappingURL=thecafe.js.map