123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- local states = {}
- --function load a player's wallet
- function minercantile.wallet.load_wallet(name)
- if minercantile.wallets[name] == nil then
- minercantile.wallets[name] = {}
- end
- local file, _ = io.open(minercantile.path_wallet..name, "r")
- if file then
- local data = minetest.deserialize(file:read("*all"))
- file:close()
- if data and type(data) == "table" then
- if data.money then
- minercantile.wallets[name].money = data.money
- else
- minercantile.wallets[name].money = 0
- end
- if data.transactions then
- minercantile.wallets[name].transactions = table.copy(data.transactions)
- else
- minercantile.wallets[name].transactions = {}
- end
- return
- end
- end
- --if new player then wallet is empty
- minercantile.wallets[name].money = 0
- minercantile.wallets[name].transactions = {}
- end
- function minercantile.wallet.save_wallet(name)
- local input, err = io.open(minercantile.path_wallet..name, "w")
- if input then
- input:write(minetest.serialize(minercantile.wallets[name]))
- input:close()
- minetest.log("info", "saved " .. minercantile.path_wallet..name)
- else
- minetest.log("error", "open(" .. minercantile.path_wallet..name .. ", 'w') failed: " .. err)
- end
- --unload wallet if player offline
- local connected = false
- for _, player in pairs(minetest.get_connected_players()) do
- local player_name = player:get_player_name()
- if player_name and player_name ~= "" and player_name == name then
- connected = true
- break
- end
- end
- if not connected then
- minercantile.wallets[name] = nil
- end
- end
- function minercantile.wallet.get_money(name)
- if minercantile.wallets[name] == nil then
- minercantile.wallet.load_wallet(name)
- end
- return minercantile.wallets[name].money
- end
- function minercantile.wallet.give_money(name, amount, transaction)
- if minercantile.wallets[name] == nil then
- minercantile.wallet.load_wallet(name)
- end
- minercantile.wallets[name].money = minercantile.wallet.get_money(name) + amount
- if transaction then
- local trans = os.date().. ":"..transaction
- minercantile.add_transactions(name, trans)
- end
- minercantile.wallet.save_wallet(name)
- end
- function minercantile.wallet.take_money(name, amount, transaction)
- if minercantile.wallets[name] == nil then
- minercantile.wallet.load_wallet(name)
- end
- minercantile.wallets[name].money = minercantile.wallet.get_money(name) - amount
- if transaction then
- local trans = os.date().. ": "..transaction
- minercantile.add_transactions(name, trans)
- end
- minercantile.wallet.save_wallet(name)
- end
- function minercantile.wallet.get_transactions(name)
- if minercantile.wallets[name] == nil then
- minercantile.wallet.load_wallet(name)
- end
- return minercantile.wallets[name].transactions
- end
- function minercantile.add_transactions(name, new_transaction)
- local old = minercantile.wallet.get_transactions(name)
- minercantile.wallets[name].transactions = {new_transaction}
- for _, trans in pairs(old) do
- table.insert(minercantile.wallets[name].transactions, trans)
- if #minercantile.wallets[name].transactions > 9 then
- break
- end
- end
- end
- function minercantile.send_money(sender, receiver, amount)
- if minercantile.wallet.get_money(sender) < amount then
- return false
- end
- minercantile.wallet.take_money(sender, amount, "Send "..amount.."$ to "..receiver)
- minercantile.wallet.give_money(receiver, amount, "Received "..amount.."$ from "..sender)
- return true
- end
- function minercantile.get_formspec_wallet(name)
- if minercantile.wallets[name] == nil then
- minercantile.wallet.load_wallet(name)
- end
- local formspec = {}
- table.insert(formspec,"size[10,9]bgcolor[#2A2A2A;]label[4.4,0;My Wallet]")
- table.insert(formspec,"label[0.5,1;Sold: ".. tostring(minercantile.wallet.get_money(name)) .."$]")
- table.insert(formspec,"label[4,2.3;10 last transactions]")
- local transactions = minercantile.wallet.get_transactions(name)
- if #transactions < 1 then
- table.insert(formspec,"label[3.5,4;There are no transactions]")
- else
- local y = 3
- for _,transac in pairs(transactions) do
- table.insert(formspec,"label[1.5,"..y..";".. transac .."]")
- y = y+0.4
- end
- end
- table.insert(formspec,"button[0,8.2;1.5,1;page;Transfert]")
- table.insert(formspec,"button_exit[8,8.2;1.5,1;close;Close]")
- return table.concat(formspec)
- end
- function minercantile.get_formspec_wallet_transfert(name)
- local money = minercantile.wallet.get_money(name)
- local formspec = {}
- table.insert(formspec,"size[10,9]bgcolor[#2A2A2A;]label[4.4,0;My Wallet]")
- table.insert(formspec,"label[0.5,1;Sold: ".. tostring(money) .."$]")
- if money < 5 then
- table.insert(formspec, "label[2,4.5;Sorry you can't send money, minimum amount is 5$]")
- else
- if not states[name] then
- states[name] = {}
- end
- if not states[name].players_list or states[name].refresh then
- states[name].refresh = nil
- states[name].players_list = {}
- states[name].selected_id = 0
- for _,player in pairs(minetest.get_connected_players()) do
- local player_name = player:get_player_name()
- if player_name and player_name ~= "" and player_name ~= name then
- table.insert(states[name].players_list, player_name)
- end
- end
- states[name]["receiver"] = nil
- end
- if not states[name].amount then
- states[name].amount = 5
- end
- if #states[name].players_list == 0 then
- table.insert(formspec, "label[2,3.6;There are no player, refresh]")
- table.insert(formspec,"button[6,3.4;2,1;refresh;refresh list]")
- else
- table.insert(formspec, "dropdown[3,3.5;3,1;receiver;"..table.concat(states[name].players_list, ",")..";"..states[name].selected_id.."]")
- table.insert(formspec, "label[3.5,6.4;Send "..states[name]["amount"].."$ to "..(states[name]["receiver"] or "").." ?]")
- table.insert(formspec,"button[4.1,7;1.5,1;send;send]")
- table.insert(formspec,"button[6,3.4;1.5,1;refresh;refresh list]")
- table.insert(formspec, "label[3.5,4.5;Amount to send (minimum 5$)]")
- table.insert(formspec, "button[1.7,5;1,1;amount;-1]")
- table.insert(formspec, "button[2.7,5;1,1;amount;-10]")
- table.insert(formspec, "button[3.7,5;1,1;amount;-100]")
- table.insert(formspec, "label[4.7,5.2;"..tostring(states[name]["amount"]).."]")
- table.insert(formspec, "button[5.4,5;1,1;amount;+100]")
- table.insert(formspec, "button[6.4,5;1,1;amount;+10]")
- table.insert(formspec, "button[7.4,5;1,1;amount;+1]")
- end
- end
- table.insert(formspec,"button[0,8.2;1.5,1;page;wallet]")
- table.insert(formspec,"button_exit[8,8.2;1.5,1;close;Close]")
- return table.concat(formspec)
- end
- function minercantile.get_formspec_wallet_transfert_send(name)
- local formspec = {"size[6,3]bgcolor[#2A2A2A;]label[2,0;Validate sending]"}
- table.insert(formspec, "label[2,1.2;Send "..tostring(states[name]["amount"]).."$ to ".. states[name]["receiver"] .."]")
- table.insert(formspec, "button_exit[1.1,2.1;1.5,1;close;Abort]")
- table.insert(formspec, "button[3.3,2.1;1.5,1;send;Send]")
- return table.concat(formspec)
- end
- minetest.register_on_player_receive_fields(function(player, formname, fields)
- local name = player:get_player_name()
- if not name or name == "" then return end
- if formname == "minercantile:ended" then
- states[name] = nil
- return
- elseif formname == "minercantile:wallet" then
- if fields["quit"] or fields["close"] then
- states[name] = nil
- return
- elseif fields["page"] then
- minetest.show_formspec(name, "minercantile:transfert", minercantile.get_formspec_wallet_transfert(name))
- return
- end
- elseif formname == "minercantile:transfert" then
- if fields["quit"] then
- states[name] = nil
- return
- elseif fields["page"] then
- minetest.show_formspec(name, "minercantile:wallet", minercantile.get_formspec_wallet(name))
- return
- elseif fields["refresh"] then
- states[name].refresh = true
- elseif fields["amount"] then
- local inc = tonumber(fields["amount"])
- if inc ~= nil then
- states[name]["amount"] = states[name]["amount"] + inc
- end
- if states[name]["amount"] > minercantile.wallet.get_money(name) then
- states[name]["amount"] = minercantile.wallet.get_money(name)
- end
- if states[name]["amount"] < 5 then
- states[name]["amount"] = 5
- end
- elseif fields["send"] then
- if states[name]["receiver"] and states[name]["receiver"] ~= "" then
- minetest.show_formspec(name, "minercantile:transfert_send", minercantile.get_formspec_wallet_transfert_send(name))
- return
- end
- elseif fields["receiver"] then
- for i, n in pairs(states[name].players_list) do
- if n == fields["receiver"] then
- states[name]["receiver"] = fields["receiver"]
- states[name].selected_id = i
- break
- end
- end
- end
- minetest.show_formspec(name, "minercantile:transfert", minercantile.get_formspec_wallet_transfert(name))
- elseif formname == "minercantile:transfert_send" then
- if fields["send"] then
- if minercantile.send_money( name, states[name]["receiver"], states[name]["amount"]) then
- minetest.show_formspec(name, "minercantile:ended", "size[5,3]bgcolor[#2A2A2A;]label[1.8,0;Validated]label[1.7,1;Money sent]button_exit[1.8,2.1;1.5,1;close;Close]")
- else
- minetest.show_formspec(name, "minercantile:ended", "size[5,3]bgcolor[#2A2A2A;]label[1.6,0;Error]label[1.6,1;Error occured]button_exit[1.8,2.1;1.5,1;close;Close]")
- end
- elseif fields["quit"] or fields["close"] then
- states[name] = nil
- return
- end
- end
- end)
- if (minetest.get_modpath("unified_inventory")) then
- unified_inventory.register_button("wallet", {
- type = "image",
- image = "minercantile_gold_coin.png",
- tooltip = "My Wallet",
- show_with = "interact",
- action = function(player)
- local name = player:get_player_name()
- if not name then return end
- local formspec = minercantile.get_formspec_wallet(name)
- minetest.show_formspec(name, "minercantile:wallet", formspec)
- end,
- })
- else
- minetest.register_chatcommand("wallet",{
- params = "",
- description = "Shows your money wallet",
- privs = {interact= true},
- func = function (name, params)
- local formspec = minercantile.get_formspec_wallet(name)
- minetest.show_formspec(name, "minercantile:wallet", formspec)
- end,
- })
- end
- minetest.register_on_joinplayer(function(player)
- local name = player:get_player_name()
- if not name or name == "" then return end
- minercantile.wallet.load_wallet(name)
- end)
- minetest.register_on_leaveplayer(function(player)
- local name = player:get_player_name()
- if not name or name == "" then return end
- minercantile.wallets[name] = nil
- end)
|