212 lines
9 KiB
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
|
|
})
|