Files
2026-07-31 10:34:32 +09:00

198 lines
6.9 KiB
JavaScript

// 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 <player> - View a player's debt (OP level 2)
// /debt reset <player> - Reset a player's debt to 0 (OP level 2)
// /debt set <player> <amount> - Set a player's debt to amount (OP level 2)
// /debt add <player> <amount> - Add amount to a player's debt (OP level 2)
// /debt remove <player> <amount> - 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 <player> — 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 <player> <amount> — 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 <player> <amount> — 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 <player> <amount> — 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;
};
});