235 lines
8.2 KiB
Lua
235 lines
8.2 KiB
Lua
local spawnedPeds, netIdTable = {}, {}
|
|
|
|
-- get keys utils
|
|
local function get_key(t)
|
|
local key
|
|
for k, _ in pairs(t) do
|
|
key = k
|
|
end
|
|
return key
|
|
end
|
|
|
|
-- Resource starting
|
|
AddEventHandler('onResourceStart', function(resourceName)
|
|
if (GetCurrentResourceName() ~= resourceName) then return end
|
|
if Config.EnablePeds then BANK.CreatePeds() end
|
|
local twoMonthMs = (os.time() - 5259487) * 1000
|
|
MySQL.Sync.fetchScalar('DELETE FROM banking WHERE time < ? ', {twoMonthMs})
|
|
end)
|
|
|
|
AddEventHandler('onResourceStop', function(resourceName)
|
|
if (GetCurrentResourceName() ~= resourceName) then return end
|
|
if Config.EnablePeds then BANK.DeletePeds() end
|
|
end)
|
|
|
|
if Config.EnablePeds then
|
|
AddEventHandler('esx:playerLoaded', function(playerId)
|
|
TriggerClientEvent('esx_banking:pedHandler', playerId, netIdTable)
|
|
end)
|
|
end
|
|
|
|
-- event
|
|
RegisterServerEvent('esx_banking:doingType')
|
|
AddEventHandler('esx_banking:doingType', function(typeData)
|
|
if source == nil then return end
|
|
if (typeData == nil) then return end
|
|
|
|
local source = source
|
|
local xPlayer = ESX.Player(source)
|
|
local identifier = xPlayer.getIdentifier()
|
|
local money = xPlayer.getAccount('money').money
|
|
local bankMoney = xPlayer.getAccount('bank').money
|
|
local amount
|
|
|
|
local key = get_key(typeData)
|
|
if typeData.deposit then
|
|
amount = tonumber(typeData.deposit)
|
|
elseif typeData.withdraw then
|
|
amount = tonumber(typeData.withdraw)
|
|
elseif typeData.transfer and typeData.transfer.moneyAmount then
|
|
amount = tonumber(typeData.transfer.moneyAmount)
|
|
elseif typeData.pincode then
|
|
amount = tonumber(typeData.pincode)
|
|
end
|
|
|
|
if not tonumber(amount) then return end
|
|
amount = ESX.Math.Round(amount)
|
|
|
|
if amount == nil or (not typeData.pincode and amount <= 0) then
|
|
TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_amount'), "error")
|
|
else
|
|
if typeData.deposit and amount <= money then
|
|
-- deposit
|
|
BANK.Deposit(amount, xPlayer)
|
|
elseif typeData.withdraw and bankMoney ~= nil and amount <= bankMoney then
|
|
-- withdraw
|
|
BANK.Withdraw(amount, xPlayer)
|
|
elseif typeData.pincode then
|
|
-- pincode
|
|
BANK.Pincode(amount, identifier)
|
|
elseif typeData.transfer then
|
|
-- transfer
|
|
if tonumber(typeData.transfer.playerId) <= 0 then
|
|
TriggerClientEvent("esx:showNotification", source, TranslateCap("cant_do_it"), "error")
|
|
return
|
|
end
|
|
|
|
if bankMoney < amount then
|
|
TriggerClientEvent("esx:showNotification", source, TranslateCap('not_enough_money', amount), "error")
|
|
return
|
|
end
|
|
|
|
local xTarget = ESX.Player(tonumber(typeData.transfer.playerId))
|
|
if not BANK.Transfer(xTarget, xPlayer, amount, key) then
|
|
return
|
|
end
|
|
else
|
|
TriggerClientEvent("esx:showNotification", source, TranslateCap('not_enough_money', amount), "error")
|
|
return
|
|
end
|
|
|
|
money = xPlayer.getAccount('money').money
|
|
bankMoney = xPlayer.getAccount('bank').money
|
|
if typeData.transfer then
|
|
TriggerClientEvent("esx:showNotification", source,
|
|
TranslateCap(string.format('%s_money', key), amount, typeData.transfer.playerId), "success")
|
|
else
|
|
TriggerClientEvent("esx:showNotification", source, TranslateCap(string.format('%s_money', key), typeData.pincode and (string.format("%04d", amount)) or amount), "success")
|
|
end
|
|
if not typeData.pincode then
|
|
BANK.LogTransaction(source,string.upper(key), string.upper(key), amount, bankMoney)
|
|
end
|
|
|
|
TriggerClientEvent("esx_banking:updateMoneyInUI", source, key, bankMoney, money)
|
|
end
|
|
end)
|
|
|
|
-- register callbacks
|
|
ESX.RegisterServerCallback("esx_banking:getPlayerData", function(source, cb)
|
|
local xPlayer = ESX.Player(source)
|
|
local identifier = xPlayer.getIdentifier()
|
|
local weekAgo = (os.time() - 604800) * 1000
|
|
local transactionHistory = MySQL.Sync.fetchAll(
|
|
'SELECT * FROM banking WHERE identifier = ? AND time > ? ORDER BY time DESC LIMIT 10', {identifier, weekAgo})
|
|
local playerData = {
|
|
playerName = xPlayer.getName(),
|
|
money = xPlayer.getAccount('money').money,
|
|
bankMoney = xPlayer.getAccount('bank').money,
|
|
transactionHistory = transactionHistory
|
|
}
|
|
|
|
cb(playerData)
|
|
end)
|
|
|
|
ESX.RegisterServerCallback("esx_banking:checkPincode", function(source, cb, inputPincode)
|
|
local xPlayer = ESX.Player(source)
|
|
local identifier = xPlayer.getIdentifier()
|
|
local pincode = MySQL.Sync.fetchScalar('SELECT COUNT(1) AS pincode FROM users WHERE identifier = ? AND pincode = ?',
|
|
{identifier, inputPincode})
|
|
cb(pincode > 0)
|
|
end)
|
|
|
|
function logTransaction(targetSource,label, key,amount)
|
|
if targetSource == nil then
|
|
print("ERROR: TargetSource nil!")
|
|
return
|
|
end
|
|
|
|
if key == nil then
|
|
print("ERROR: Do you need use these: WITHDRAW,DEPOSIT,TRANSFER_RECEIVE")
|
|
return
|
|
end
|
|
|
|
if type(key) ~= "string" or key == '' then
|
|
print("ERROR: Do you need use these: WITHDRAW,DEPOSIT,TRANSFER_RECEIVE and can only be string type!")
|
|
return
|
|
end
|
|
|
|
if amount == nil then
|
|
print("ERROR: Amount value is nil! Add some numeric value to the amount!")
|
|
return
|
|
end
|
|
|
|
if label == nil then
|
|
label = "UNKNOW LABEL"
|
|
end
|
|
|
|
local xPlayer = ESX.Player(tonumber(targetSource))
|
|
|
|
if xPlayer ~= nil then
|
|
local bankCurrentMoney = xPlayer.getAccount('bank').money
|
|
BANK.LogTransaction(targetSource, label, string.upper(key), amount, bankCurrentMoney)
|
|
else
|
|
print("ERROR: xPlayer is nil!")
|
|
end
|
|
end
|
|
exports("logTransaction", logTransaction)
|
|
|
|
RegisterServerEvent('esx_banking:logTransaction')
|
|
AddEventHandler('esx_banking:logTransaction', function(label,key,amount)
|
|
logTransaction(source,label,key,amount)
|
|
end)
|
|
|
|
-- bank functions
|
|
BANK = {
|
|
CreatePeds = function()
|
|
for i = 1, #Config.Peds do
|
|
local model = Config.Peds[i].Model
|
|
local coords = Config.Peds[i].Position
|
|
spawnedPeds[i] = CreatePed(0, model, coords.x, coords.y, coords.z, coords.w, true, true)
|
|
netIdTable[i] = NetworkGetNetworkIdFromEntity(spawnedPeds[i])
|
|
while not DoesEntityExist(spawnedPeds[i]) do Wait(50) end
|
|
end
|
|
|
|
Wait(100)
|
|
TriggerClientEvent('esx_banking:pedHandler', -1, netIdTable)
|
|
end,
|
|
DeletePeds = function()
|
|
for i = 1, #spawnedPeds do
|
|
DeleteEntity(spawnedPeds[i])
|
|
spawnedPeds[i] = nil
|
|
end
|
|
end,
|
|
Withdraw = function(amount, xPlayer)
|
|
xPlayer.addAccountMoney('money', amount)
|
|
xPlayer.removeAccountMoney('bank', amount)
|
|
end,
|
|
Deposit = function(amount, xPlayer)
|
|
xPlayer.removeAccountMoney('money', amount)
|
|
xPlayer.addAccountMoney('bank', amount)
|
|
end,
|
|
Transfer = function(xTarget, xPlayer, amount, key)
|
|
if xTarget == nil or xPlayer.src == xTarget.src then
|
|
TriggerClientEvent("esx:showNotification", source, TranslateCap("cant_do_it"), "error")
|
|
return false
|
|
end
|
|
|
|
xPlayer.removeAccountMoney('bank', amount)
|
|
xTarget.addAccountMoney('bank', amount)
|
|
local bankMoney = xTarget.getAccount('bank').money
|
|
BANK.LogTransaction(xTarget.src, "TRANSFER_RECEIVE", amount, bankMoney)
|
|
TriggerClientEvent("esx:showNotification", xTarget.src, TranslateCap('receive_transfer', amount, xPlayer.src),
|
|
"success")
|
|
|
|
return true
|
|
end,
|
|
Pincode = function(amount, identifier)
|
|
MySQL.update('UPDATE users SET pincode = ? WHERE identifier = ? ', {amount, identifier})
|
|
end,
|
|
LogTransaction = function(playerId, label, logType, amount, bankMoney)
|
|
if playerId == nil then
|
|
return
|
|
end
|
|
|
|
if label == nil then
|
|
label = logType
|
|
end
|
|
|
|
local xPlayer = ESX.Player(playerId)
|
|
local identifier = xPlayer.getIdentifier()
|
|
|
|
MySQL.insert('INSERT INTO banking (identifier, label, type, amount, time, balance) VALUES (?, ?, ?, ?, ?, ?)',
|
|
{identifier,label,logType,amount, os.time() * 1000, bankMoney})
|
|
end
|
|
}
|