bank_accounts/chatcommands.lua

212 lines
9 KiB
Lua

--[[
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("[<playername>]"),
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("<name> <number>"),
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("<name> <number>"),
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("<name> <number>"),
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("<name> <number>"),
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("<name>"),
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("<name>"),
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("<name>"),
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
})