--[[ Chat Commands ------------- This file defines all chat commands for players and admins to interact with the banking system. --]] -- Privilege for seized accounts. minetest.register_privilege("seized", { description = S("Account seized."), give_to_singleplayer = false, }) -- Allows any player to see their own balance, or privileged players to see others'. minetest.register_chatcommand("bank_account", { params = S("[]"), description = S("Shows your account balance or the balance of another player (if you have permission)."), func = function(name, param) local target_name = param if not target_name or target_name == "" then target_name = name end if target_name ~= name and not minetest.check_player_privs(name, {bank_teller=true, server=true}) then minetest.chat_send_player(name, S("You do not have permission to view other players' accounts.")) return end if not bank_accounts.player_has_account(target_name) then minetest.chat_send_player(name, S("Player '@1' not found or has no account.", target_name)) return end local data = bank_accounts.get_account_data(target_name) minetest.chat_send_player(name, S("Balance for @1: @2", target_name, string.format("%.2f", data.balance) .. " MG")) minetest.chat_send_player(name, S("Credit Debt for @1: @2", target_name, string.format("%.2f", data.credit) .. " MG")) end, }) -- Allows any player to set their own PIN. minetest.register_chatcommand("bank_set_pin", { params = S("<4-digit-pin>"), description = S("Set pin for your bank account."), func = function(name, param) if not param or param == "" then minetest.chat_send_player(name, S("[Account] No numbers entered.")) return end if param:match("^[0-9][0-9][0-9][0-9]$") then bank_accounts.set_pin(name, param) minetest.chat_send_player(name, S("[Account] Pin successfully set!")) local player = minetest.get_player_by_name(name) if player and not player:get_inventory():contains_item("main", "bank_accounts:atm_card") then player:get_inventory():add_item("main", "bank_accounts:atm_card") end else minetest.chat_send_player(name, S("[Account] Invalid number entered. Must be exactly 4 digits.")) end end }) -- Helper function to parse admin commands that require an integer amount. local function parse_admin_params_int(params) local parts = params:split(" ", 2) local playername = parts[1] local number_str = parts[2] if not playername or playername=="" then return nil, nil, S("[Bank] Player name missing.") end if not bank_accounts.player_has_account(playername) then return nil, nil, S("[Bank] Invalid player name entered.") end if not number_str or number_str=="" then return playername, nil, S("[Bank] No number entered.") end local number = normalize_and_tonumber(number_str) if not number then return playername, nil, S("[Bank] Invalid number entered.") end if number % 1 ~= 0 then return playername, nil, S("[Bank] Amount must be a whole number.") end return playername, number end -- Helper function to parse admin commands that allow a float amount. local function parse_admin_params_float(params) local parts = params:split(" ", 2) local playername = parts[1] local number_str = parts[2] if not playername or playername=="" then return nil, nil, S("[Bank] Player name missing.") end if not bank_accounts.player_has_account(playername) then return nil, nil, S("[Bank] Invalid player name entered.") end if not number_str or number_str=="" then return playername, nil, S("[Bank] No number entered.") end local number = normalize_and_tonumber(number_str) if not number then return playername, nil, S("[Bank] Invalid number entered.") end return playername, number end -- Adds an integer amount to a player's balance. (Admin only) minetest.register_chatcommand("bank_add", { params = S(" "), description = S("Add to a player's account balance."), privs = {server = true}, func = function(name, params) local target_name, amount, err = parse_admin_params_int(params) if err then minetest.chat_send_player(name, err) return end if not amount or amount <= 0 then minetest.chat_send_player(name, S("[Bank] Number must be greater than 0.")) return end bank_accounts.add_balance(target_name, amount, "Admin Deposit", S("By Admin: @1", name), name) minetest.chat_send_player(name, S("[Bank] @1 successfully added to @2's account.", tostring(amount).." MG", target_name)) end }) -- Subtracts an integer amount from a player's balance. (Admin only) minetest.register_chatcommand("bank_subtract", { params = S(" "), description = S("Subtract from a player's account balance."), privs = {server = true}, func = function(name, params) local target_name, amount, err = parse_admin_params_int(params) if err then minetest.chat_send_player(name, err) return end if not amount or amount <= 0 then minetest.chat_send_player(name, S("[Bank] Number must be greater than 0.")) return end bank_accounts.add_balance(target_name, -amount, "Admin Withdrawal", S("By Admin: @1", name), name) minetest.chat_send_player(name, S("[Bank] @1 successfully subtracted from @2's account.", tostring(amount).." MG", target_name)) end }) -- Sets a player's balance to a specific (float) amount. (Admin only) minetest.register_chatcommand("bank_balance", { params = S(" "), description = S("Set a player's account balance."), privs = {server = true}, func = function(name, params) local target_name, amount, err = parse_admin_params_float(params) if err then minetest.chat_send_player(name, err) return end if amount == nil or amount < 0 then minetest.chat_send_player(name, S("[Bank] Number must be 0 or greater.")) return end bank_accounts.set_balance(target_name, amount, "Admin Set Balance", S("By Admin: @1", name), name) minetest.chat_send_player(name, S("[Bank] Funds successfully set for @1.", target_name)) end }) -- Sets a player's credit debt to a specific (float) amount. (Admin only) minetest.register_chatcommand("bank_credit", { params = S(" "), description = S("Set a player's credit debt."), privs = {server = true}, func = function(name, params) local target_name, amount, err = parse_admin_params_float(params) if err then minetest.chat_send_player(name, err) return end if amount == nil or amount < 0 then minetest.chat_send_player(name, S("[Bank] Number must be 0 or greater.")) return end bank_accounts.set_credit(target_name, amount, "Admin Set Credit", S("By Admin: @1", name), name) minetest.chat_send_player(name, S("[Bank] Credit debt for @1 has been set to @2.", string.format("%.2f", amount).." MG", target_name)) end }) -- Wipes a player's balance to 0. (Admin only) minetest.register_chatcommand("bank_wipe", { params = S(""), description = S("Wipe a player's bank account."), privs = {server = true}, func = function(name, param) if not param or not bank_accounts.player_has_account(param) then minetest.chat_send_player(name, S("[Bank] Invalid player name entered.")) return end bank_accounts.set_balance(param, 0, "Admin Wipe", S("By Admin: @1", name), name) minetest.chat_send_player(name, S("[Bank] Account successfully wiped for @1!", param)) end }) -- Seizes a player's account. (Admin only) minetest.register_chatcommand("bank_seize", { params = S(""), description = S("Seize a player's account."), privs = {server = true}, func = function(name, param) if not param or not bank_accounts.player_has_account(param) then minetest.chat_send_player(name, S("[Bank] Invalid player name entered.")) return end minetest.set_player_privs(param, {seized = true}) minetest.chat_send_player(name, S("[Bank] Account successfully seized for @1!", param)) end }) -- Unseizes a player's account. (Admin only) minetest.register_chatcommand("bank_unseize", { params = S(""), description = S("Unseize a player's account."), privs = {server = true}, func = function(name, param) if not param or not bank_accounts.player_has_account(param) then minetest.chat_send_player(name, S("[Bank] Invalid player name entered.")) return end minetest.set_player_privs(param, {seized = nil}) minetest.chat_send_player(name, S("[Bank] Account successfully unseized for @1!", param)) end })