Hey einfach die qb-phone/server/main.lua hiermit überschreiben.
local QBCore = exports['qb-core']:GetCoreObject()
local QBPhone = {}
local Tweets = {}
local AppAlerts = {}
local MentionedTweets = {}
local Hashtags = {}
local Calls = {}
local Adverts = {}
local GeneratedPlates = {}
local WebHook = ""
local bannedCharacters = {'%','$',';'}
-- Functions
local function GetOnlineStatus(number)
local Target = QBCore.Functions.GetPlayerByPhone(number)
local retval = false
if Target ~= nil then
retval = true
end
return retval
end
local function GenerateMailId()
return math.random(111111, 999999)
end
local function escape_sqli(source)
local replacements = {
['"'] = '\\"',
["'"] = "\\'"
}
return source:gsub("['\"]", replacements)
end
local function round(num, numDecimalPlaces)
if numDecimalPlaces and numDecimalPlaces > 0 then
local mult = 10 ^ numDecimalPlaces
return math.floor(num * mult + 0.5) / mult
end
return math.floor(num + 0.5)
end
function QBPhone.AddMentionedTweet(citizenid, TweetData)
if MentionedTweets[citizenid] == nil then
MentionedTweets[citizenid] = {}
end
MentionedTweets[citizenid][#MentionedTweets[citizenid]+1] = TweetData
end
function QBPhone.SetPhoneAlerts(citizenid, app, alerts)
if citizenid ~= nil and app ~= nil then
if AppAlerts[citizenid] == nil then
AppAlerts[citizenid] = {}
if AppAlerts[citizenid][app] == nil then
if alerts == nil then
AppAlerts[citizenid][app] = 1
else
AppAlerts[citizenid][app] = alerts
end
end
else
if AppAlerts[citizenid][app] == nil then
if alerts == nil then
AppAlerts[citizenid][app] = 1
else
AppAlerts[citizenid][app] = 0
end
else
if alerts == nil then
AppAlerts[citizenid][app] = AppAlerts[citizenid][app] + 1
else
AppAlerts[citizenid][app] = AppAlerts[citizenid][app] + 0
end
end
end
end
end
local function SplitStringToArray(string)
local retval = {}
for i in string.gmatch(string, "%S+") do
retval[#retval+1] = i
end
return retval
end
local function GenerateOwnerName()
local names = {
[1] = { name = "Bailey Sykes", citizenid = "DSH091G93" },
[2] = { name = "Aroush Goodwin", citizenid = "AVH09M193" },
[3] = { name = "Tom Warren", citizenid = "DVH091T93" },
[4] = { name = "Abdallah Friedman", citizenid = "GZP091G93" },
[5] = { name = "Lavinia Powell", citizenid = "DRH09Z193" },
[6] = { name = "Andrew Delarosa", citizenid = "KGV091J93" },
[7] = { name = "Skye Cardenas", citizenid = "ODF09S193" },
[8] = { name = "Amelia-Mae Walter", citizenid = "KSD0919H3" },
[9] = { name = "Elisha Cote", citizenid = "NDX091D93" },
[10] = { name = "Janice Rhodes", citizenid = "ZAL0919X3" },
[11] = { name = "Justin Harris", citizenid = "ZAK09D193" },
[12] = { name = "Montel Graves", citizenid = "POL09F193" },
[13] = { name = "Benjamin Zavala", citizenid = "TEW0J9193" },
[14] = { name = "Mia Willis", citizenid = "YOO09H193" },
[15] = { name = "Jacques Schmitt", citizenid = "QBC091H93" },
[16] = { name = "Mert Simmonds", citizenid = "YDN091H93" },
[17] = { name = "Rickie Browne", citizenid = "PJD09D193" },
[18] = { name = "Deacon Stanley", citizenid = "RND091D93" },
[19] = { name = "Daisy Fraser", citizenid = "QWE091A93" },
[20] = { name = "Kitty Walters", citizenid = "KJH0919M3" },
[21] = { name = "Jareth Fernandez", citizenid = "ZXC09D193" },
[22] = { name = "Meredith Calhoun", citizenid = "XYZ0919C3" },
[23] = { name = "Teagan Mckay", citizenid = "ZYX0919F3" },
[24] = { name = "Kurt Bain", citizenid = "IOP091O93" },
[25] = { name = "Burt Kain", citizenid = "PIO091R93" },
[26] = { name = "Joanna Huff", citizenid = "LEK091X93" },
[27] = { name = "Carrie-Ann Pineda", citizenid = "ALG091Y93" },
[28] = { name = "Gracie-Mai Mcghee", citizenid = "YUR09E193" },
[29] = { name = "Robyn Boone", citizenid = "SOM091W93" },
[30] = { name = "Aliya William", citizenid = "KAS009193" },
[31] = { name = "Rohit West", citizenid = "SOK091093" },
[32] = { name = "Skylar Archer", citizenid = "LOK091093" },
[33] = { name = "Jake Kumar", citizenid = "AKA420609" },
}
return names[math.random(1, #names)]
end
-- Callbacks
QBCore.Functions.CreateCallback('qb-phone:server:GetCallState', function(source, cb, ContactData)
local Target = QBCore.Functions.GetPlayerByPhone(ContactData.number)
if Target ~= nil then
if Calls[Target.PlayerData.citizenid] ~= nil then
if Calls[Target.PlayerData.citizenid].inCall then
cb(false, true)
else
cb(true, true)
end
else
cb(true, true)
end
else
cb(false, false)
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:GetPhoneData', function(source, cb)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if Player ~= nil then
local PhoneData = {
Applications = {},
PlayerContacts = {},
MentionedTweets = {},
Chats = {},
Hashtags = {},
Invoices = {},
Garage = {},
Mails = {},
Adverts = {},
CryptoTransactions = {},
Tweets = {},
Images = {},
InstalledApps = Player.PlayerData.metadata["phonedata"].InstalledApps
}
PhoneData.Adverts = Adverts
local result = MySQL.Sync.fetchAll('SELECT * FROM player_contacts WHERE citizenid = ? ORDER BY name ASC', {Player.PlayerData.citizenid})
local Contacts = {}
if result[1] ~= nil then
for k, v in pairs(result) do
v.status = GetOnlineStatus(v.number)
end
PhoneData.PlayerContacts = result
end
local invoices = MySQL.Sync.fetchAll('SELECT * FROM phone_invoices WHERE citizenid = ?', {Player.PlayerData.citizenid})
if invoices[1] ~= nil then
for k, v in pairs(invoices) do
local Ply = QBCore.Functions.GetPlayerByCitizenId(v.sender)
if Ply ~= nil then
v.number = Ply.PlayerData.charinfo.phone
else
local res = MySQL.Sync.fetchAll('SELECT * FROM players WHERE citizenid = ?', {v.sender})
if res[1] ~= nil then
res[1].charinfo = json.decode(res[1].charinfo)
v.number = res[1].charinfo.phone
else
v.number = nil
end
end
end
PhoneData.Invoices = invoices
end
local garageresult = MySQL.Sync.fetchAll('SELECT * FROM player_vehicles WHERE citizenid = ?', {Player.PlayerData.citizenid})
if garageresult[1] ~= nil then
for k, v in pairs(garageresult) do
local vehicleModel = v.vehicle
if (QBCore.Shared.Vehicles[vehicleModel] ~= nil) and (Garages[v.garage] ~= nil) then
v.garage = Garages[v.garage].label
v.vehicle = QBCore.Shared.Vehicles[vehicleModel].name
v.brand = QBCore.Shared.Vehicles[vehicleModel].brand
end
end
PhoneData.Garage = garageresult
end
local messages = MySQL.Sync.fetchAll('SELECT * FROM phone_messages WHERE citizenid = ?', {Player.PlayerData.citizenid})
if messages ~= nil and next(messages) ~= nil then
PhoneData.Chats = messages
end
if AppAlerts[Player.PlayerData.citizenid] ~= nil then
PhoneData.Applications = AppAlerts[Player.PlayerData.citizenid]
end
if MentionedTweets[Player.PlayerData.citizenid] ~= nil then
PhoneData.MentionedTweets = MentionedTweets[Player.PlayerData.citizenid]
end
if Hashtags ~= nil and next(Hashtags) ~= nil then
PhoneData.Hashtags = Hashtags
end
local Tweets = MySQL.Sync.fetchAll('SELECT * FROM phone_tweets WHERE `date` > NOW() - INTERVAL ? hour', {Config.TweetDuration})
if Tweets ~= nil and next(Tweets) ~= nil then
PhoneData.Tweets = Tweets
TWData = Tweets
end
local mails = MySQL.Sync.fetchAll('SELECT * FROM player_mails WHERE citizenid = ? ORDER BY `date` ASC', {Player.PlayerData.citizenid})
if mails[1] ~= nil then
for k, v in pairs(mails) do
if mails[k].button ~= nil then
mails[k].button = json.decode(mails[k].button)
end
end
PhoneData.Mails = mails
end
local transactions = MySQL.Sync.fetchAll('SELECT * FROM crypto_transactions WHERE citizenid = ? ORDER BY `date` ASC', {Player.PlayerData.citizenid})
if transactions[1] ~= nil then
for _, v in pairs(transactions) do
PhoneData.CryptoTransactions[#PhoneData.CryptoTransactions+1] = {
TransactionTitle = v.title,
TransactionMessage = v.message
}
end
end
local images = MySQL.Sync.fetchAll('SELECT * FROM phone_gallery WHERE citizenid = ? ORDER BY `date` DESC',{Player.PlayerData.citizenid})
if images ~= nil and next(images) ~= nil then
PhoneData.Images = images
end
cb(PhoneData)
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:PayInvoice', function(source, cb, society, amount, invoiceId, sendercitizenid)
local Invoices = {}
local Ply = QBCore.Functions.GetPlayer(source)
local SenderPly = QBCore.Functions.GetPlayerByCitizenId(sendercitizenid)
local invoiceMailData = {}
if SenderPly and Config.BillingCommissions[society] then
local commission = round(amount * Config.BillingCommissions[society])
SenderPly.Functions.AddMoney('bank', commission)
invoiceMailData = {
sender = 'Billing Department',
subject = 'Commission Received',
message = string.format('You received a commission check of $%s when %s %s paid a bill of $%s.', commission, Ply.PlayerData.charinfo.firstname, Ply.PlayerData.charinfo.lastname, amount)
}
elseif not SenderPly and Config.BillingCommissions[society] then
invoiceMailData = {
sender = 'Billing Department',
subject = 'Bill Paid',
message = string.format('%s %s paid a bill of $%s', Ply.PlayerData.charinfo.firstname, Ply.PlayerData.charinfo.lastname, amount)
}
end
Ply.Functions.RemoveMoney('bank', amount, "paid-invoice")
TriggerEvent('qb-phone:server:sendNewMailToOffline', sendercitizenid, invoiceMailData)
TriggerEvent("qb-bossmenu:server:addAccountMoney", society, amount)
MySQL.Async.execute('DELETE FROM phone_invoices WHERE id = ?', {invoiceId})
local invoices = MySQL.Sync.fetchAll('SELECT * FROM phone_invoices WHERE citizenid = ?', {Ply.PlayerData.citizenid})
if invoices[1] ~= nil then
Invoices = invoices
end
cb(true, Invoices)
end)
QBCore.Functions.CreateCallback('qb-phone:server:DeclineInvoice', function(source, cb, sender, amount, invoiceId)
local Invoices = {}
local Ply = QBCore.Functions.GetPlayer(source)
MySQL.Async.execute('DELETE FROM phone_invoices WHERE id = ?', {invoiceId})
local invoices = MySQL.Sync.fetchAll('SELECT * FROM phone_invoices WHERE citizenid = ?', {Ply.PlayerData.citizenid})
if invoices[1] ~= nil then
Invoices = invoices
end
cb(true, Invoices)
end)
QBCore.Functions.CreateCallback('qb-phone:server:GetContactPictures', function(source, cb, Chats)
for k, v in pairs(Chats) do
local Player = QBCore.Functions.GetPlayerByPhone(v.number)
local query = '%' .. v.number .. '%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local MetaData = json.decode(result[1].metadata)
if MetaData.phone.profilepicture ~= nil then
v.picture = MetaData.phone.profilepicture
else
v.picture = "default"
end
end
end
SetTimeout(100, function()
cb(Chats)
end)
end)
QBCore.Functions.CreateCallback('qb-phone:server:GetContactPicture', function(source, cb, Chat)
local query = '%' .. Chat.number .. '%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
local MetaData = json.decode(result[1].metadata)
if MetaData.phone.profilepicture ~= nil then
Chat.picture = MetaData.phone.profilepicture
else
Chat.picture = "default"
end
SetTimeout(100, function()
cb(Chat)
end)
end)
QBCore.Functions.CreateCallback('qb-phone:server:GetPicture', function(source, cb, number)
local Picture = nil
local query = '%' .. number .. '%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local MetaData = json.decode(result[1].metadata)
if MetaData.phone.profilepicture ~= nil then
Picture = MetaData.phone.profilepicture
else
Picture = "default"
end
cb(Picture)
else
cb(nil)
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:FetchResult', function(source, cb, search)
local search = escape_sqli(search)
local searchData = {}
local ApaData = {}
local query = 'SELECT * FROM `players` WHERE `citizenid` = "' .. search .. '"'
-- Split on " " and check each var individual
local searchParameters = SplitStringToArray(search)
-- Construct query dynamicly for individual parm check
if #searchParameters > 1 then
query = query .. ' OR `charinfo` LIKE "%' .. searchParameters[1] .. '%"'
for i = 2, #searchParameters do
query = query .. ' AND `charinfo` LIKE "%' .. searchParameters[i] .. '%"'
end
else
query = query .. ' OR `charinfo` LIKE "%' .. search .. '%"'
end
local ApartmentData = MySQL.Sync.fetchAll('SELECT * FROM apartments', {})
for k, v in pairs(ApartmentData) do
ApaData[v.citizenid] = ApartmentData[k]
end
local result = MySQL.Sync.fetchAll(query)
if result[1] ~= nil then
for k, v in pairs(result) do
local charinfo = json.decode(v.charinfo)
local metadata = json.decode(v.metadata)
local appiepappie = {}
if ApaData[v.citizenid] ~= nil and next(ApaData[v.citizenid]) ~= nil then
appiepappie = ApaData[v.citizenid]
end
searchData[#searchData+1] = {
citizenid = v.citizenid,
firstname = charinfo.firstname,
lastname = charinfo.lastname,
birthdate = charinfo.birthdate,
phone = charinfo.phone,
nationality = charinfo.nationality,
gender = charinfo.gender,
warrant = false,
driverlicense = metadata["licences"]["driver"],
appartmentdata = appiepappie
}
end
cb(searchData)
else
cb(nil)
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:GetVehicleSearchResults', function(source, cb, search)
local search = escape_sqli(search)
local searchData = {}
local query = '%' .. search .. '%'
local result = MySQL.Sync.fetchAll('SELECT * FROM player_vehicles WHERE plate LIKE ? OR citizenid = ?',
{query, search})
if result[1] ~= nil then
for k, v in pairs(result) do
local player = MySQL.Sync.fetchAll('SELECT * FROM players WHERE citizenid = ?', {result[k].citizenid})
if player[1] ~= nil then
local charinfo = json.decode(player[1].charinfo)
local vehicleInfo = QBCore.Shared.Vehicles[result[k].vehicle]
if vehicleInfo ~= nil then
searchData[#searchData+1] = {
plate = result[k].plate,
status = true,
owner = charinfo.firstname .. " " .. charinfo.lastname,
citizenid = result[k].citizenid,
label = vehicleInfo["name"]
}
else
searchData[#searchData+1] = {
plate = result[k].plate,
status = true,
owner = charinfo.firstname .. " " .. charinfo.lastname,
citizenid = result[k].citizenid,
label = "Name not found.."
}
end
end
end
else
if GeneratedPlates[search] ~= nil then
searchData[#searchData+1] = {
plate = GeneratedPlates[search].plate,
status = GeneratedPlates[search].status,
owner = GeneratedPlates[search].owner,
citizenid = GeneratedPlates[search].citizenid,
label = "Brand unknown.."
}
else
local ownerInfo = GenerateOwnerName()
GeneratedPlates[search] = {
plate = search,
status = true,
owner = ownerInfo.name,
citizenid = ownerInfo.citizenid
}
searchData[#searchData+1] = {
plate = search,
status = true,
owner = ownerInfo.name,
citizenid = ownerInfo.citizenid,
label = "Brand unknown.."
}
end
end
cb(searchData)
end)
QBCore.Functions.CreateCallback('qb-phone:server:ScanPlate', function(source, cb, plate)
local src = source
local vehicleData = {}
if plate ~= nil then
local result = MySQL.Sync.fetchAll('SELECT * FROM player_vehicles WHERE plate = ?', {plate})
if result[1] ~= nil then
local player = MySQL.Sync.fetchAll('SELECT * FROM players WHERE citizenid = ?', {result[1].citizenid})
local charinfo = json.decode(player[1].charinfo)
vehicleData = {
plate = plate,
status = true,
owner = charinfo.firstname .. " " .. charinfo.lastname,
citizenid = result[1].citizenid
}
elseif GeneratedPlates ~= nil and GeneratedPlates[plate] ~= nil then
vehicleData = GeneratedPlates[plate]
else
local ownerInfo = GenerateOwnerName()
GeneratedPlates[plate] = {
plate = plate,
status = true,
owner = ownerInfo.name,
citizenid = ownerInfo.citizenid
}
vehicleData = {
plate = plate,
status = true,
owner = ownerInfo.name,
citizenid = ownerInfo.citizenid
}
end
cb(vehicleData)
else
TriggerClientEvent('QBCore:Notify', src, 'No Vehicle Nearby', 'error')
cb(nil)
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:HasPhone', function(source, cb)
local Player = QBCore.Functions.GetPlayer(source)
if Player ~= nil then
local HasPhone = Player.Functions.GetItemByName("phone")
if HasPhone ~= nil then
cb(true)
else
cb(false)
end
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:CanTransferMoney', function(source, cb, amount, iban)
-- strip bad characters from bank transfers
local newAmount = tostring(amount)
local newiban = tostring(iban)
for k, v in pairs(bannedCharacters) do
newAmount = string.gsub(newAmount, '%' .. v, '')
newiban = string.gsub(newiban, '%' .. v, '')
end
iban = newiban
amount = tonumber(newAmount)
local Player = QBCore.Functions.GetPlayer(source)
if (Player.PlayerData.money.bank - amount) >= 0 then
local query = '%"account":"' .. iban .. '"%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
Player.Functions.RemoveMoney('bank', amount)
if Reciever ~= nil then
Reciever.Functions.AddMoney('bank', amount)
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount)
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
cb(true)
else
cb(false)
end
end
end)
QBCore.Functions.CreateCallback('qb-phone:server:GetCurrentLawyers', function(source, cb)
local Lawyers = {}
for k, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil then
if (Player.PlayerData.job.name == "lawyer" or Player.PlayerData.job.name == "realestate" or
Player.PlayerData.job.name == "mechanic" or Player.PlayerData.job.name == "taxi" or
Player.PlayerData.job.name == "police" or Player.PlayerData.job.name == "ambulance") and
Player.PlayerData.job.onduty then
Lawyers[#Lawyers+1] = {
name = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname,
phone = Player.PlayerData.charinfo.phone,
typejob = Player.PlayerData.job.name
}
end
end
end
cb(Lawyers)
end)
QBCore.Functions.CreateCallback("qb-phone:server:GetWebhook",function(source,cb)
if WebHook ~= "" then
cb(WebHook)
else
print('Set your webhook to ensure that your camera will work!!!!!! Set this on line 10 of the server sided script!!!!!')
cb(nil)
end
end)
-- Events
RegisterNetEvent('qb-phone:server:AddAdvert', function(msg, url)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local CitizenId = Player.PlayerData.citizenid
if Adverts[CitizenId] ~= nil then
Adverts[CitizenId].message = msg
Adverts[CitizenId].name = "@" .. Player.PlayerData.charinfo.firstname .. "" .. Player.PlayerData.charinfo.lastname
Adverts[CitizenId].number = Player.PlayerData.charinfo.phone
Adverts[CitizenId].url = url
else
Adverts[CitizenId] = {
message = msg,
name = "@" .. Player.PlayerData.charinfo.firstname .. "" .. Player.PlayerData.charinfo.lastname,
number = Player.PlayerData.charinfo.phone,
url = url
}
end
TriggerClientEvent('qb-phone:client:UpdateAdverts', -1, Adverts, "@" .. Player.PlayerData.charinfo.firstname .. "" .. Player.PlayerData.charinfo.lastname)
end)
RegisterNetEvent('qb-phone:server:DeleteAdvert', function()
local Player = QBCore.Functions.GetPlayer(source)
local citizenid = Player.PlayerData.citizenid
Adverts[citizenid] = nil
TriggerClientEvent('qb-phone:client:UpdateAdvertsDel', -1, Adverts)
end)
RegisterNetEvent('qb-phone:server:SetCallState', function(bool)
local src = source
local Ply = QBCore.Functions.GetPlayer(src)
if Calls[Ply.PlayerData.citizenid] ~= nil then
Calls[Ply.PlayerData.citizenid].inCall = bool
else
Calls[Ply.PlayerData.citizenid] = {}
Calls[Ply.PlayerData.citizenid].inCall = bool
end
end)
RegisterNetEvent('qb-phone:server:RemoveMail', function(MailId)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.execute('DELETE FROM player_mails WHERE mailid = ? AND citizenid = ?', {MailId, Player.PlayerData.citizenid})
SetTimeout(100, function()
local mails = MySQL.Sync.fetchAll('SELECT * FROM player_mails WHERE citizenid = ? ORDER BY `date` ASC', {Player.PlayerData.citizenid})
if mails[1] ~= nil then
for k, v in pairs(mails) do
if mails[k].button ~= nil then
mails[k].button = json.decode(mails[k].button)
end
end
end
TriggerClientEvent('qb-phone:client:UpdateMails', src, mails)
end)
end)
RegisterNetEvent('qb-phone:server:sendNewMail', function(mailData)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if mailData.button == nil then
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`) VALUES (?, ?, ?, ?, ?, ?)', {Player.PlayerData.citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0})
else
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`, `button`) VALUES (?, ?, ?, ?, ?, ?, ?)', {Player.PlayerData.citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0, json.encode(mailData.button)})
end
TriggerClientEvent('qb-phone:client:NewMailNotify', src, mailData)
SetTimeout(200, function()
local mails = MySQL.Sync.fetchAll('SELECT * FROM player_mails WHERE citizenid = ? ORDER BY `date` DESC',
{Player.PlayerData.citizenid})
if mails[1] ~= nil then
for k, v in pairs(mails) do
if mails[k].button ~= nil then
mails[k].button = json.decode(mails[k].button)
end
end
end
TriggerClientEvent('qb-phone:client:UpdateMails', src, mails)
end)
end)
RegisterNetEvent('qb-phone:server:sendNewMailToOffline', function(citizenid, mailData)
local Player = QBCore.Functions.GetPlayerByCitizenId(citizenid)
if Player then
local src = Player.PlayerData.source
if mailData.button == nil then
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`) VALUES (?, ?, ?, ?, ?, ?)', {Player.PlayerData.citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0})
TriggerClientEvent('qb-phone:client:NewMailNotify', src, mailData)
else
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`, `button`) VALUES (?, ?, ?, ?, ?, ?, ?)', {Player.PlayerData.citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0, json.encode(mailData.button)})
TriggerClientEvent('qb-phone:client:NewMailNotify', src, mailData)
end
SetTimeout(200, function()
local mails = MySQL.Sync.fetchAll(
'SELECT * FROM player_mails WHERE citizenid = ? ORDER BY `date` ASC', {Player.PlayerData.citizenid})
if mails[1] ~= nil then
for k, v in pairs(mails) do
if mails[k].button ~= nil then
mails[k].button = json.decode(mails[k].button)
end
end
end
TriggerClientEvent('qb-phone:client:UpdateMails', src, mails)
end)
else
if mailData.button == nil then
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`) VALUES (?, ?, ?, ?, ?, ?)', {citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0})
else
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`, `button`) VALUES (?, ?, ?, ?, ?, ?, ?)', {citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0, json.encode(mailData.button)})
end
end
end)
RegisterNetEvent('qb-phone:server:sendNewEventMail', function(citizenid, mailData)
local Player = QBCore.Functions.GetPlayerByCitizenId(citizenid)
if mailData.button == nil then
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`) VALUES (?, ?, ?, ?, ?, ?)', {citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0})
else
MySQL.Async.insert('INSERT INTO player_mails (`citizenid`, `sender`, `subject`, `message`, `mailid`, `read`, `button`) VALUES (?, ?, ?, ?, ?, ?, ?)', {citizenid, mailData.sender, mailData.subject, mailData.message, GenerateMailId(), 0, json.encode(mailData.button)})
end
SetTimeout(200, function()
local mails = MySQL.Sync.fetchAll('SELECT * FROM player_mails WHERE citizenid = ? ORDER BY `date` ASC', {citizenid})
if mails[1] ~= nil then
for k, v in pairs(mails) do
if mails[k].button ~= nil then
mails[k].button = json.decode(mails[k].button)
end
end
end
TriggerClientEvent('qb-phone:client:UpdateMails', Player.PlayerData.source, mails)
end)
end)
RegisterNetEvent('qb-phone:server:ClearButtonData', function(mailId)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.execute('UPDATE player_mails SET button = ? WHERE mailid = ? AND citizenid = ?', {'', mailId, Player.PlayerData.citizenid})
SetTimeout(200, function()
local mails = MySQL.Sync.fetchAll('SELECT * FROM player_mails WHERE citizenid = ? ORDER BY `date` ASC', {Player.PlayerData.citizenid})
if mails[1] ~= nil then
for k, v in pairs(mails) do
if mails[k].button ~= nil then
mails[k].button = json.decode(mails[k].button)
end
end
end
TriggerClientEvent('qb-phone:client:UpdateMails', src, mails)
end)
end)
RegisterNetEvent('qb-phone:server:MentionedPlayer', function(firstName, lastName, TweetMessage)
for k, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil then
if (Player.PlayerData.charinfo.firstname == firstName and Player.PlayerData.charinfo.lastname == lastName) then
QBPhone.SetPhoneAlerts(Player.PlayerData.citizenid, "twitter")
QBPhone.AddMentionedTweet(Player.PlayerData.citizenid, TweetMessage)
TriggerClientEvent('qb-phone:client:GetMentioned', Player.PlayerData.source, TweetMessage, AppAlerts[Player.PlayerData.citizenid]["twitter"])
else
local query1 = '%' .. firstName .. '%'
local query2 = '%' .. lastName .. '%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ? AND charinfo LIKE ?', {query1, query2})
if result[1] ~= nil then
local MentionedTarget = result[1].citizenid
QBPhone.SetPhoneAlerts(MentionedTarget, "twitter")
QBPhone.AddMentionedTweet(MentionedTarget, TweetMessage)
end
end
end
end
end)
RegisterNetEvent('qb-phone:server:CallContact', function(TargetData, CallId, AnonymousCall)
local src = source
local Ply = QBCore.Functions.GetPlayer(src)
local Target = QBCore.Functions.GetPlayerByPhone(TargetData.number)
if Target ~= nil then
TriggerClientEvent('qb-phone:client:GetCalled', Target.PlayerData.source, Ply.PlayerData.charinfo.phone, CallId, AnonymousCall)
end
end)
RegisterNetEvent('qb-phone:server:BillingEmail', function(data, paid)
for k, v in pairs(QBCore.Functions.GetPlayers()) do
local target = QBCore.Functions.GetPlayer(v)
if target.PlayerData.job.name == data.society then
if paid then
local name = '' .. QBCore.Functions.GetPlayer(source).PlayerData.charinfo.firstname .. ' ' .. QBCore.Functions.GetPlayer(source).PlayerData.charinfo.lastname .. ''
TriggerClientEvent('qb-phone:client:BillingEmail', target.PlayerData.source, data, true, name)
else
local name = '' .. QBCore.Functions.GetPlayer(source).PlayerData.charinfo.firstname .. ' ' .. QBCore.Functions.GetPlayer(source).PlayerData.charinfo.lastname .. ''
TriggerClientEvent('qb-phone:client:BillingEmail', target.PlayerData.source, data, false, name)
end
end
end
end)
RegisterNetEvent('qb-phone:server:UpdateHashtags', function(Handle, messageData)
if Hashtags[Handle] ~= nil and next(Hashtags[Handle]) ~= nil then
Hashtags[Handle].messages[#Hashtags[Handle].messages+1] = messageData
else
Hashtags[Handle] = {
hashtag = Handle,
messages = {}
}
Hashtags[Handle].messages[#Hashtags[Handle].messages+1] = messageData
end
TriggerClientEvent('qb-phone:client:UpdateHashtags', -1, Handle, messageData)
end)
RegisterNetEvent('qb-phone:server:SetPhoneAlerts', function(app, alerts)
local src = source
local CitizenId = QBCore.Functions.GetPlayer(src).citizenid
QBPhone.SetPhoneAlerts(CitizenId, app, alerts)
end)
RegisterNetEvent('qb-phone:server:DeleteTweet', function(tweetId)
local Player = QBCore.Functions.GetPlayer(source)
local delete = false
local TID = tweetId
local Data = MySQL.Sync.fetchScalar('SELECT citizenid FROM phone_tweets WHERE tweetId = ?', {id})
if Data == Player.PlayerData.citizenid then
local Data2 = MySQL.Sync.fetchAll('DELETE FROM phone_tweets WHERE tweetId = ?', {TID})
delete = true
end
if delete then
delete = not delete
for k, v in pairs(TWData) do
if TWData[k].tweetId == TID then
TWData = nil
end
end
TriggerClientEvent('qb-phone:client:UpdateTweets', -1, TWData)
end
end)
RegisterNetEvent('qb-phone:server:UpdateTweets', function(NewTweets, TweetData)
local src = source
if Config.Linux then
local InsertTweet = MySQL.Async.insert('INSERT INTO phone_tweets (citizenid, firstName, lastName, message, date, url, picture, tweetid) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', {
TweetData.citizenid,
TweetData.firstName,
TweetData.lastName,
TweetData.message,
TweetData.date,
TweetData.url:gsub("[%<>\"()\' $]",""),
TweetData.picture,
TweetData.tweetId
})
TriggerClientEvent('qb-phone:client:UpdateTweets', -1, src, NewTweets, TweetData, false)
else
local InsertTweet = MySQL.Async.insert('INSERT INTO phone_tweets (citizenid, firstName, lastName, message, date, url, picture, tweetid) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', {
TweetData.citizenid,
TweetData.firstName,
TweetData.lastName,
TweetData.message,
TweetData.time,
TweetData.url,
TweetData.picture,
TweetData.tweetId
})
TriggerClientEvent('qb-phone:client:UpdateTweets', -1, src, NewTweets, TweetData, false)
end
end)
RegisterNetEvent('qb-phone:server:TransferMoney', function(iban, amount)
local src = source
local sender = QBCore.Functions.GetPlayer(src)
local query = '%' .. iban .. '%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
if reciever ~= nil then
local PhoneItem = reciever.Functions.GetItemByName("phone")
reciever.Functions.AddMoney('bank', amount, "phone-transfered-from-" .. sender.PlayerData.citizenid)
sender.Functions.RemoveMoney('bank', amount, "phone-transfered-to-" .. reciever.PlayerData.citizenid)
if PhoneItem ~= nil then
TriggerClientEvent('qb-phone:client:TransferMoney', reciever.PlayerData.source, amount,
reciever.PlayerData.money.bank)
end
else
local moneyInfo = json.decode(result[1].money)
moneyInfo.bank = round((moneyInfo.bank + amount))
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?',
{json.encode(moneyInfo), result[1].citizenid})
sender.Functions.RemoveMoney('bank', amount, "phone-transfered")
end
else
TriggerClientEvent('QBCore:Notify', src, "This account number doesn't exist!", "error")
end
end)
RegisterNetEvent('qb-phone:server:EditContact', function(newName, newNumber, newIban, oldName, oldNumber, oldIban)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.execute(
'UPDATE player_contacts SET name = ?, number = ?, iban = ? WHERE citizenid = ? AND name = ? AND number = ?',
{newName, newNumber, newIban, Player.PlayerData.citizenid, oldName, oldNumber})
end)
RegisterNetEvent('qb-phone:server:RemoveContact', function(Name, Number)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.execute('DELETE FROM player_contacts WHERE name = ? AND number = ? AND citizenid = ?',
{Name, Number, Player.PlayerData.citizenid})
end)
RegisterNetEvent('qb-phone:server:AddNewContact', function(name, number, iban)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.insert('INSERT INTO player_contacts (citizenid, name, number, iban) VALUES (?, ?, ?, ?)', {Player.PlayerData.citizenid, tostring(name), tostring(number), tostring(iban)})
end)
RegisterNetEvent('qb-phone:server:UpdateMessages', function(ChatMessages, ChatNumber, New)
local src = source
local SenderData = QBCore.Functions.GetPlayer(src)
local query = '%' .. ChatNumber .. '%'
local Player = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if Player[1] ~= nil then
local TargetData = QBCore.Functions.GetPlayerByCitizenId(Player[1].citizenid)
if TargetData ~= nil then
local Chat = MySQL.Sync.fetchAll('SELECT * FROM phone_messages WHERE citizenid = ? AND number = ?', {SenderData.PlayerData.citizenid, ChatNumber})
if Chat[1] ~= nil then
-- Update for target
MySQL.Async.execute('UPDATE phone_messages SET messages = ? WHERE citizenid = ? AND number = ?', {json.encode(ChatMessages), TargetData.PlayerData.citizenid, SenderData.PlayerData.charinfo.phone})
-- Update for sender
MySQL.Async.execute('UPDATE phone_messages SET messages = ? WHERE citizenid = ? AND number = ?', {json.encode(ChatMessages), SenderData.PlayerData.citizenid, TargetData.PlayerData.charinfo.phone})
-- Send notification & Update messages for target
TriggerClientEvent('qb-phone:client:UpdateMessages', TargetData.PlayerData.source, ChatMessages, SenderData.PlayerData.charinfo.phone, false)
else
-- Insert for target
MySQL.Async.insert('INSERT INTO phone_messages (citizenid, number, messages) VALUES (?, ?, ?)', {TargetData.PlayerData.citizenid, SenderData.PlayerData.charinfo.phone, json.encode(ChatMessages)})
-- Insert for sender
MySQL.Async.insert('INSERT INTO phone_messages (citizenid, number, messages) VALUES (?, ?, ?)', {SenderData.PlayerData.citizenid, TargetData.PlayerData.charinfo.phone, json.encode(ChatMessages)})
-- Send notification & Update messages for target
TriggerClientEvent('qb-phone:client:UpdateMessages', TargetData.PlayerData.source, ChatMessages, SenderData.PlayerData.charinfo.phone, true)
end
else
local Chat = MySQL.Sync.fetchAll('SELECT * FROM phone_messages WHERE citizenid = ? AND number = ?', {SenderData.PlayerData.citizenid, ChatNumber})
if Chat[1] ~= nil then
-- Update for target
MySQL.Async.execute('UPDATE phone_messages SET messages = ? WHERE citizenid = ? AND number = ?', {json.encode(ChatMessages), Player[1].citizenid, SenderData.PlayerData.charinfo.phone})
-- Update for sender
Player[1].charinfo = json.decode(Player[1].charinfo)
MySQL.Async.execute('UPDATE phone_messages SET messages = ? WHERE citizenid = ? AND number = ?', {json.encode(ChatMessages), SenderData.PlayerData.citizenid, Player[1].charinfo.phone})
else
-- Insert for target
MySQL.Async.insert('INSERT INTO phone_messages (citizenid, number, messages) VALUES (?, ?, ?)', {Player[1].citizenid, SenderData.PlayerData.charinfo.phone, json.encode(ChatMessages)})
-- Insert for sender
Player[1].charinfo = json.decode(Player[1].charinfo)
MySQL.Async.insert('INSERT INTO phone_messages (citizenid, number, messages) VALUES (?, ?, ?)', {SenderData.PlayerData.citizenid, Player[1].charinfo.phone, json.encode(ChatMessages)})
end
end
end
end)
RegisterNetEvent('qb-phone:server:AddRecentCall', function(type, data)
local src = source
local Ply = QBCore.Functions.GetPlayer(src)
local Hour = os.date("%H")
local Minute = os.date("%M")
local label = Hour .. ":" .. Minute
TriggerClientEvent('qb-phone:client:AddRecentCall', src, data, label, type)
local Trgt = QBCore.Functions.GetPlayerByPhone(data.number)
if Trgt ~= nil then
TriggerClientEvent('qb-phone:client:AddRecentCall', Trgt.PlayerData.source, {
name = Ply.PlayerData.charinfo.firstname .. " " .. Ply.PlayerData.charinfo.lastname,
number = Ply.PlayerData.charinfo.phone,
anonymous = data.anonymous
}, label, "outgoing")
end
end)
RegisterNetEvent('qb-phone:server:CancelCall', function(ContactData)
local src = source
local Play = QBCore.Functions.GetPlayer(src)
local Ply = QBCore.Functions.GetPlayerByPhone(ContactData.TargetData.number)
if Ply ~= nil then
TriggerClientEvent('qb-phone:client:CancelCall', Ply.PlayerData.source)
exports['saltychat']:EndCall(Play.PlayerData.source, Ply.PlayerData.source)
exports['saltychat']:EndCall(Ply.PlayerData.source, Play.PlayerData.source)
end
end)
RegisterNetEvent('qb-phone:server:AnswerCall', function(CallData, TargetData)
local src = source
local Play = QBCore.Functions.GetPlayer(src)
local Ply = QBCore.Functions.GetPlayerByPhone(CallData.TargetData.number)
if Ply ~= nil then
TriggerClientEvent('qb-phone:client:AnswerCall', Ply.PlayerData.source)
exports['saltychat']:EstablishCall(Play.PlayerData.source, Ply.PlayerData.source)
exports['saltychat']:EstablishCall(Ply.PlayerData.source, Play.PlayerData.source)
end
end)
RegisterNetEvent('qb-phone:server:SaveMetaData', function(MData)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE citizenid = ?', {Player.PlayerData.citizenid})
local MetaData = json.decode(result[1].metadata)
MetaData.phone = MData
MySQL.Async.execute('UPDATE players SET metadata = ? WHERE citizenid = ?',
{json.encode(MetaData), Player.PlayerData.citizenid})
Player.Functions.SetMetaData("phone", MData)
end)
RegisterNetEvent('qb-phone:server:GiveContactDetails', function(PlayerId)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local SuggestionData = {
name = {
[1] = Player.PlayerData.charinfo.firstname,
[2] = Player.PlayerData.charinfo.lastname
},
number = Player.PlayerData.charinfo.phone,
bank = Player.PlayerData.charinfo.account
}
TriggerClientEvent('qb-phone:client:AddNewSuggestion', PlayerId, SuggestionData)
end)
RegisterNetEvent('qb-phone:server:AddTransaction', function(data)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.insert('INSERT INTO crypto_transactions (citizenid, title, message) VALUES (?, ?, ?)', {
Player.PlayerData.citizenid,
data.TransactionTitle,
data.TransactionMessage
})
end)
RegisterNetEvent('qb-phone:server:InstallApplication', function(ApplicationData)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
Player.PlayerData.metadata["phonedata"].InstalledApps[ApplicationData.app] = ApplicationData
Player.Functions.SetMetaData("phonedata", Player.PlayerData.metadata["phonedata"])
-- TriggerClientEvent('qb-phone:RefreshPhone', src)
end)
RegisterNetEvent('qb-phone:server:RemoveInstallation', function(App)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
Player.PlayerData.metadata["phonedata"].InstalledApps[App] = nil
Player.Functions.SetMetaData("phonedata", Player.PlayerData.metadata["phonedata"])
-- TriggerClientEvent('qb-phone:RefreshPhone', src)
end)
RegisterNetEvent('qb-phone:server:addImageToGallery', function(image)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.Async.insert('INSERT INTO phone_gallery (`citizenid`, `image`) VALUES (?, ?)',{Player.PlayerData.citizenid,image})
end)
RegisterNetEvent('qb-phone:server:getImageFromGallery', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local images = MySQL.Sync.fetchAll('SELECT * FROM phone_gallery WHERE citizenid = ? ORDER BY `date` DESC',{Player.PlayerData.citizenid})
TriggerClientEvent('qb-phone:refreshImages', src, images)
end)
RegisterNetEvent('qb-phone:server:RemoveImageFromGallery', function(data)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local image = data.image
MySQL.Async.execute('DELETE FROM phone_gallery WHERE citizenid = ? AND image = ?',{Player.PlayerData.citizenid,image})
end)
RegisterNetEvent('qb-phone:server:sendPing', function(data)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
print(src, data)
if src ~= data then
else
TriggerClientEvent("QBCore:Notify", src, "You cannot ping yourself", "error")
end
end)
-- Command
QBCore.Commands.Add("setmetadata", "Set Player Metadata (God Only)", {}, false, function(source, args)
local Player = QBCore.Functions.GetPlayer(source)
if args[1] then
if args[1] == "trucker" then
if args[2] then
local newrep = Player.PlayerData.metadata["jobrep"]
newrep.trucker = tonumber(args[2])
Player.Functions.SetMetaData("jobrep", newrep)
end
end
end
end, "god")
QBCore.Commands.Add('bill', 'Bill A Player', {{name = 'id', help = 'Player ID'}, {name = 'amount', help = 'Fine Amount'}}, false, function(source, args)
local biller = QBCore.Functions.GetPlayer(source)
local billed = QBCore.Functions.GetPlayer(tonumber(args[1]))
local amount = tonumber(args[2])
if biller.PlayerData.job.name == "police" or biller.PlayerData.job.name == 'ambulance' or biller.PlayerData.job.name == 'mechanic' then
if billed ~= nil then
if biller.PlayerData.citizenid ~= billed.PlayerData.citizenid then
if amount and amount > 0 then
MySQL.Async.insert(
'INSERT INTO phone_invoices (citizenid, amount, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?)',
{billed.PlayerData.citizenid, amount, biller.PlayerData.job.name,
biller.PlayerData.charinfo.firstname, biller.PlayerData.citizenid})
TriggerClientEvent('qb-phone:RefreshPhone', billed.PlayerData.source)
TriggerClientEvent('QBCore:Notify', source, 'Invoice Successfully Sent', 'success')
TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, 'New Invoice Received')
else
TriggerClientEvent('QBCore:Notify', source, 'Must Be A Valid Amount Above 0', 'error')
end
else
TriggerClientEvent('QBCore:Notify', source, 'You Cannot Bill Yourself', 'error')
end
else
TriggerClientEvent('QBCore:Notify', source, 'Player Not Online', 'error')
end
else
TriggerClientEvent('QBCore:Notify', source, 'No Access', 'error')
end
end)