diff --git a/item_atm.lua b/item_atm.lua index d23c809..390a434 100644 --- a/item_atm.lua +++ b/item_atm.lua @@ -1,4 +1,7 @@ - +minetest.register_privilege("developer", { + description=modMinerTrade.translate("Can access evolving ATM functions."), + give_to_singleplayer=false, +}) modMinerTrade.getUrlDatabase = function() --Extensao '.tbl' ou '.db' @@ -160,6 +163,61 @@ modMinerTrade.getStatement = function(playername) end end +modMinerTrade.getSalt_Hash = function() + if modMinerTrade.bank.salt_hash == nil then + modMinerTrade.bank.salt_hash = minetest.encode_base64(os.date("%Y-%B-%d %Hh:%Mm:%Ss")) + end + return modMinerTrade.bank.salt_hash +end + +modMinerTrade.getProofStack = function(playername, accountname, txtBeneficiary, txtValue, txtDescription) + local player = minetest.get_player_by_name(playername) + if player ~= nil and player:is_player() then + local max_text_size = 10000 + local max_title_size = 80 + local short_title_size = 35 + + local invPlayer = player:get_inventory() + local objProof = ItemStack("default:book_written") + --local data = objProof:get_meta():to_table().fields + local data = {} + --data.title = fields.title:sub(1, max_title_size) + data.title = modMinerTrade.translate("TRANSFER PROOF"):sub(1, max_title_size) + data.owner = "Minetest Bank" + local short_title = data.title + -- Don't bother triming the title if the trailing dots would make it longer + if #short_title > short_title_size + 3 then + short_title = short_title:sub(1, short_title_size) .. "..." + end + data.description = S("\"@1\" by @2", short_title, data.owner) + local when = os.date("%Y-%B-%d %Hh:%Mm:%Ss") + local myDocument = "" + .."\nDocument Type: TRANSFER PROOF" + .."\nPlayer: "..playername + .."\nAccount Holder: "..accountname + .."\nBeneficiary: "..txtBeneficiary + .."\nWhen: "..when + .."\nValue: "..txtValue.." minercash" + .."\nDescription: "..txtDescription + + local Auth = minetest.get_password_hash( + modMinerTrade.getSalt_Hash(), + minetest.encode_base64(myDocument) + ) + local data.text = "" + .."\n"..myDocument + .."\n----------------------------------" + .."\n"..Auth + + data.text = data.text:sub(1, max_text_size) + data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n") + data.page = 1 + data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) + objProof:get_meta():from_table({ fields = data }) + return objProof + end +end + modMinerTrade.checkValidStack = function(stack) local cashtypes= modMinerTrade.getCashTypes() for i, item in pairs(cashtypes) do @@ -564,7 +622,7 @@ modMinerTrade.showAccountBank = { minetest.show_formspec(playername, "frmAtmDeposits", formspec) end, - frmTransfer = function(playername, txtBeneficiary, txtValue, msgDetails) --FORMULÁRIO: SAQUE + frmTransfer = function(playername, txtBeneficiary, txtValue, txtDescription, msgDetails) --FORMULÁRIO: SAQUE local accountname = modMinerTrade.bank.player[playername].focused_accountname modMinerTrade.debug("modMinerTrade.showAccountBank.frmGiveCash() >>> playername = "..playername.." | txtValue = "..dump(txtValue).." | msgDetails = "..dump(msgDetails)) @@ -805,21 +863,97 @@ modMinerTrade.onReceiveFields = function(player, formname, fields) end end elseif formname == "frmTransfer" then - if fields.btnWithdrawals ~= nil then - modMinerTrade.doSoundPlayer(playername, "sfx_atm", 5) - modMinerTrade.showAccountBank.frmTransfer(playername) - elseif fields.btnAtmGive ~= nil - and fields.txtBeneficiary ~= nil - and type(fields.txtBeneficiarytxtBeneficiary) == "string" - and fields.txtBeneficiary ~= "" - and fields.txtBeneficiary ~= playername + if fields.btnAtmTransfer ~= nil + local player = minetest.get_player_by_name(playername) + if player ~= nil and player:is_player() then + local accountname = modMinerTrade.bank.player[playername].focused_accountname + if modMinerTrade.isExistAcount(accountname) then + if + fields.txtBeneficiary ~= nil + and type(fields.txtBeneficiarytxtBeneficiary) == "string" + and fields.txtBeneficiary ~= "" - and fields.txtValue ~= nil - and tonumber(fields.txtValue) ~= nil - and type(tonumber(fields.txtValue))=="number" - and tonumber(fields.txtValue) >= 1 - then - + and fields.txtValue ~= nil + and tonumber(fields.txtValue) ~= nil + and type(tonumber(fields.txtValue))=="number" + and tonumber(fields.txtValue) >= 1 + then + local txtBeneficiary = fields.txtBeneficiary + local txtValue = tonumber(fields.txtValue) + local txtDescription = "" + if fields.txtDescription ~= nil + and type(fields.txtDescription))=="string" + and fields.txtDescription:trim() ~= "" + then + --txtDescription = string.format("%-150s",fields.txtDescription:trim()):trim() --max 150 craracters + txtDescription = fields.txtDescription:trim():sub(1, 150) --max 150 craracters + else + txtDescription = modMinerTrade.translate("Transfer for undeclared reason!") + end + if modMinerTrade.isExistAcount(txtBeneficiary) then + if accountname ~= txtBeneficiary then + local thisBalance = modMinerTrade.getBalance(accountname) + if txtValue <= thisBalance then + modMinerTrade.addBalance(txtBeneficiary, txtValue) + modMinerTrade.addStatement(txtBeneficiary, txtValue, txtDescription) + modMinerTrade.addBalance(accountname, 0 - txtValue) + modMinerTrade.addStatement(accountname, 0 - txtValue, txtDescription) + + local objProof = modMinerTrade.getProofStack(playername, accountname, txtBeneficiary, txtValue, txtDescription) + if invPlayer:room_for_item("main", objProof) then-- verifica se compartimento de Recebimento de pagamento do vendedor tem espaço + invPlayer:add_item("main", objProof) + minetest.chat_send_player(playername, + core.colorize("#00FF00", "["..modMinerTrade.translate("ATM").."]: ") + modMinerTrade.translate("Transfer successful!") + ) + else + minetest.add_item(player:get_pos(), objProof) + minetest.chat_send_player(playername, + core.colorize("#00FF00", "["..modMinerTrade.translate("ATM").."]: ") + ..core.colorize("#FF0000", + modMinerTrade.translate("The Transfer Proof was left on the floor because '%s' inventory has no free space."):format(playername) + ) + ) + end + --modMinerTrade.doSoundPlayer(playername, "sfx_atm", 5) + --modMinerTrade.showAccountBank.frmTransfer(playername, txtBeneficiary, txtValue, txtDescription, msgDetails) --FORMULÁRIO: SAQUE + modMinerTrade.doSoundPlayer(playername, "sfx_cash_register", 5) + modMinerTrade.showAccountBank.frmMain(playername) + else + modMinerTrade.doSoundPlayer(playername, "sfx_failure", 5) + modMinerTrade.showAccountBank.frmTransfer( + playername, txtBeneficiary, txtValue, txtDescription, + modMinerTrade.translate("The bank account holder '%s' does not have enough balance to make this requested transfer."):format(accountname) + ) + end + else + modMinerTrade.doSoundPlayer(playername, "sfx_failure", 5) + modMinerTrade.showAccountBank.frmTransfer( + playername, txtBeneficiary, txtValue, txtDescription, + modMinerTrade.translate("Account holder '%s' cannot be a beneficiary of itself."):format(accountname) + ) + end + else + modMinerTrade.doSoundPlayer(playername, "sfx_failure", 5) + modMinerTrade.showAccountBank.frmTransfer( + playername, txtBeneficiary, txtValue, txtDescription, + modMinerTrade.translate("The beneficiary '%s' does not have a current account with this bank."):format(txtBeneficiary) + ) + end + else + modMinerTrade.doSoundPlayer(playername, "sfx_failure", 5) + modMinerTrade.showAccountBank.frmTransfer(playername) + end + else + --modMinerTrade.doSoundPlayer(playername, "sfx_failure", 5) + --modMinerTrade.showAccountBank.frmTransfer(playername) + modMinerTrade.doSoundPlayer(playername, "sfx_failure", 5) + modMinerTrade.showAccountBank.frmTransfer( + playername, nil, nil, nil, + modMinerTrade.translate("There is no account holder '%s' in this bank."):format(accountname) + ) + end + end --Final of: if player ~= nil and player:is_player() then end end end