// Debt management commands for server operators. // Allows viewing, setting, adding, removing and resetting player debts // stored in server.persistentData.debts. // // Commands: // /debt get - View your own debt (all players) // /debt get - View a player's debt (OP level 2) // /debt reset - Reset a player's debt to 0 (OP level 2) // /debt set - Set a player's debt to amount (OP level 2) // /debt add - Add amount to a player's debt (OP level 2) // /debt remove - Remove amount from a player's debt (OP level 2) console.info("[SOCIETY] debtCommand.js loaded"); ServerEvents.commandRegistry((event) => { const { commands: Commands, arguments: Arguments } = event; // --- Command registration --- event.register( Commands.literal("debt") // /debt get [player] — view debt (own or another player's if OP) .then( Commands.literal("get") .executes((c) => getDebt(c.source, null)) .then( Commands.argument("player", Arguments.PLAYER.create(event)) .requires((source) => source.hasPermission(2)) .executes((c) => getDebt(c.source, Arguments.PLAYER.getResult(c, "player")) ) ) ) // /debt reset — clear all debt .then( Commands.literal("reset") .requires((source) => source.hasPermission(2)) .then( Commands.argument("player", Arguments.PLAYER.create(event)) .executes((c) => modifyDebt(c.source, Arguments.PLAYER.getResult(c, "player"), "reset", 0) ) ) ) // /debt set — set debt to exact value .then( Commands.literal("set") .requires((source) => source.hasPermission(2)) .then( Commands.argument("player", Arguments.PLAYER.create(event)) .then( Commands.argument("amount", Arguments.INTEGER.create(event)) .executes((c) => modifyDebt( c.source, Arguments.PLAYER.getResult(c, "player"), "set", Arguments.INTEGER.getResult(c, "amount") ) ) ) ) ) // /debt add — increase debt .then( Commands.literal("add") .requires((source) => source.hasPermission(2)) .then( Commands.argument("player", Arguments.PLAYER.create(event)) .then( Commands.argument("amount", Arguments.INTEGER.create(event)) .executes((c) => modifyDebt( c.source, Arguments.PLAYER.getResult(c, "player"), "add", Arguments.INTEGER.getResult(c, "amount") ) ) ) ) ) // /debt remove — decrease debt (clamped to 0) .then( Commands.literal("remove") .requires((source) => source.hasPermission(2)) .then( Commands.argument("player", Arguments.PLAYER.create(event)) .then( Commands.argument("amount", Arguments.INTEGER.create(event)) .executes((c) => modifyDebt( c.source, Arguments.PLAYER.getResult(c, "player"), "remove", Arguments.INTEGER.getResult(c, "amount") ) ) ) ) ) ); // Returns the current debt amount for a player UUID, or 0 if no debt entry exists let findDebt = (server, uuid) => { if (!server.persistentData.debts) return 0; for (let index = 0; index < server.persistentData.debts.length; index++) { if (String(uuid) === String(server.persistentData.debts[index].uuid)) { return Number(server.persistentData.debts[index].amount); } } return 0; }; // Creates a debt entry in persistentData.debts if one doesn't exist yet. let ensureDebtEntry = (server, uuid) => { if (!server.persistentData.debts) server.persistentData.debts = []; for (let index = 0; index < server.persistentData.debts.length; index++) { if (String(uuid) === String(server.persistentData.debts[index].uuid)) return; } server.persistentData.debts.push({ uuid: uuid, amount: 0 }); }; // --- Command handlers --- let getDebt = (source, target) => { const server = source.server; if (!target) target = source.player; let debt = findDebt(server, target.getUuid().toString()); if (debt > 0) { source.player.tell( Text.translatable("command.society.debt.has_debt", `${target.username}`, `${global.formatPrice(debt)}`).gold() ); } else { source.player.tell( Text.translatable("command.society.debt.no_debt", `${target.username}`).green() ); } return 1; }; let modifyDebt = (source, target, action, amount) => { const server = source.server; let uuid = target.getUuid().toString(); let currentDebt = findDebt(server, uuid); let newDebt; switch (action) { case "reset": newDebt = 0; break; case "set": if (amount < 0) { source.player.tell(Text.translatable("command.society.debt.invalid_amount_non_negative").red()); return -1; } newDebt = amount; break; case "add": if (amount <= 0) { source.player.tell(Text.translatable("command.society.debt.invalid_amount_positive").red()); return -1; } newDebt = currentDebt + amount; break; case "remove": if (amount <= 0) { source.player.tell(Text.translatable("command.society.debt.invalid_amount_positive").red()); return -1; } newDebt = Math.max(0, currentDebt - amount); break; } ensureDebtEntry(server, uuid); global.setDebt(server, uuid, newDebt); let formattedAmount = `${global.formatPrice(amount)}`; let formattedNewDebt = `${global.formatPrice(newDebt)}`; let name = `${target.username}`; switch (action) { case "reset": source.player.tell(Text.translatable("command.society.debt.reset", name).green()); break; case "set": source.player.tell(Text.translatable("command.society.debt.set", name, formattedNewDebt).green()); break; case "add": source.player.tell(Text.translatable("command.society.debt.add", formattedAmount, name, formattedNewDebt).green()); break; case "remove": source.player.tell(Text.translatable("command.society.debt.remove", formattedAmount, name, formattedNewDebt).green()); break; } return 1; }; });