From 840fa459271264063297ef83cc7d005a6372c14f Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 22 Jul 2018 14:27:53 +0200 Subject: [PATCH] Implemented esx_phone:cancelMessage for canceling dispatch messages --- .editorconfig | 4 +- __resource.lua | 6 + client/main.lua | 54 ++++---- esx_phone.sql | 4 +- html/scripts/app.js | 8 +- server/main.lua | 323 ++++++++++++++++++++------------------------ 6 files changed, 188 insertions(+), 211 deletions(-) diff --git a/.editorconfig b/.editorconfig index 41c2aaf2..6866fb40 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,8 +1,8 @@ root = true [*] -indent_size = 2 -indent_style = space +indent_size = 4 +indent_style = tab end_of_line = lf charset = utf-8 trim_trailing_whitespace = true diff --git a/__resource.lua b/__resource.lua index 8069fbc4..b2a39070 100644 --- a/__resource.lua +++ b/__resource.lua @@ -33,11 +33,15 @@ ui_page 'html/ui.html' files { 'html/ui.html', + 'html/bankgothic.ttf', 'html/pdown.ttf', + 'html/css/app.css', + 'html/scripts/mustache.min.js', 'html/scripts/app.js', + 'html/img/cursor.png', 'html/img/keys/enter.png', 'html/img/keys/return.png', @@ -53,3 +57,5 @@ files { 'html/img/icons/edit.png', 'html/img/icons/location.png' } + +dependency 'es_extended' \ No newline at end of file diff --git a/client/main.lua b/client/main.lua index 1b658e73..991e44dd 100644 --- a/client/main.lua +++ b/client/main.lua @@ -10,21 +10,18 @@ local Keys = { ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } -local GUI = {} -local PhoneData = { phoneNumber = 0, contacts = {} } -local RegisteredMessageCallbacks = {} -local ContactJustAdded = false -local CurrentAction = nil -local CurrentActionMsg = '' -local CurrentActionData = {} -local CurrentDispatchRequestId = -1 -local PhoneNumberSources = {} +local GUI = {} +local PhoneData = { phoneNumber = 0, contacts = {} } +local CurrentAction = nil +local CurrentActionMsg = '' +local CurrentActionData = {} +local CurrentDispatchRequestId = -1 +local PhoneNumberSources = {} -ESX = nil -GUI.Time = 0 -GUI.PhoneIsShowed = false -GUI.MessagesIsShowed = false -GUI.AddContactIsShowed = false +ESX = nil +GUI.PhoneIsShowed = false +GUI.MessagesIsShowed = false +GUI.AddContactIsShowed = false Citizen.CreateThread(function() while ESX == nil do @@ -36,7 +33,7 @@ Citizen.CreateThread(function() end) function OpenPhone() - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() TriggerServerEvent('esx_phone:reload', PhoneData.phoneNumber) @@ -51,13 +48,13 @@ function OpenPhone() SetNuiFocus(true, true) end) - if not IsPedInAnyVehicle(playerPed, false) then - TaskStartScenarioInPlace(playerPed, "WORLD_HUMAN_STAND_MOBILE", 0, true); + if not IsPedInAnyVehicle(playerPed, false) then + TaskStartScenarioInPlace(playerPed, 'WORLD_HUMAN_STAND_MOBILE', 0, true) end end function ClosePhone() - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() SendNUIMessage({ showPhone = false @@ -102,7 +99,7 @@ RegisterNetEvent('esx_phone:removeContact') AddEventHandler('esx_phone:removeContact', function(name, phoneNumber) for key, value in pairs(PhoneData.contacts) do if value.name == name and value.number == phoneNumber then - table.remove(PhoneData.contacts,key) + table.remove(PhoneData.contacts, key) break end end @@ -152,7 +149,16 @@ RegisterNUICallback('remove_contact', function(data, cb) end) RegisterNetEvent('esx_phone:onMessage') -AddEventHandler('esx_phone:onMessage', function(phoneNumber, message, position, anon, job, dispatchRequestId) +AddEventHandler('esx_phone:onMessage', function(phoneNumber, message, position, anon, job, dispatchRequestId, dispatchNumber) + + if dispatchNumber then + TriggerEvent('esx_phone:cancelMessage', dispatchNumber) + + if WasEventCanceled() then + return + end + end + if job == 'player' then ESX.ShowNotification(_U('new_message', message)) else @@ -212,7 +218,7 @@ end) RegisterNUICallback('send', function(data) local phoneNumber = data.number - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) if tonumber(phoneNumber) ~= nil then @@ -262,12 +268,11 @@ Citizen.CreateThread(function() else -- open phone -- todo: is player busy (handcuffed, etc) - if IsControlPressed(0, Keys['F1']) and GetLastInputMethod(2) and (GetGameTimer() - GUI.Time) > 150 then + if IsControlJustReleased(0, Keys['F1']) and GetLastInputMethod(2) then if not ESX.UI.Menu.IsOpen('phone', GetCurrentResourceName(), 'main') then ESX.UI.Menu.CloseAll() ESX.UI.Menu.Open('phone', GetCurrentResourceName(), 'main') end - GUI.Time = GetGameTimer() end end end @@ -284,14 +289,13 @@ Citizen.CreateThread(function() AddTextComponentString(CurrentActionMsg) DisplayHelpTextFromStringLabel(0, 0, 1, -1) - if IsControlPressed(0, Keys['E']) and GetLastInputMethod(2) and (GetGameTimer() - GUI.Time) > 300 then + if IsControlJustReleased(0, Keys['E']) and GetLastInputMethod(2) then if CurrentAction == 'dispatch' then TriggerServerEvent('esx_phone:stopDispatch', CurrentDispatchRequestId) SetNewWaypoint(CurrentActionData.position.x, CurrentActionData.position.y) end CurrentAction = nil - GUI.Time = GetGameTimer() end end diff --git a/esx_phone.sql b/esx_phone.sql index 0a47211e..76da439f 100644 --- a/esx_phone.sql +++ b/esx_phone.sql @@ -9,6 +9,4 @@ CREATE TABLE `user_contacts` ( PRIMARY KEY (`id`) ); -ALTER TABLE `users` - ADD COLUMN `phone_number` INT NULL -; +ALTER TABLE `users`ADD COLUMN `phone_number` INT NULL; \ No newline at end of file diff --git a/html/scripts/app.js b/html/scripts/app.js index fd5c4835..151df962 100644 --- a/html/scripts/app.js +++ b/html/scripts/app.js @@ -50,12 +50,12 @@ $('#repertoire').removeClass('active'); } - let showMessages = function(){ + let showMessages = function(){ $('#messages').addClass('active'); isMessagesOpen = true; } - let hideMessages = function(){ + let hideMessages = function(){ $('#messages').removeClass('active'); isMessagesOpen = false; } @@ -80,7 +80,7 @@ $('.screen.active *').removeAttr('disabled'); } - let hideNewMessage = function() { + let hideNewMessage = function() { $('#writer').removeClass('active'); $('#writer_number').val(''); $('#writer_message').val(''); @@ -167,7 +167,7 @@ isPhoneShowed = true; } - let hidePhone = function(){ + let hidePhone = function(){ $('#phone').hide(); isPhoneShowed = false; } diff --git a/server/main.lua b/server/main.lua index e09f17ba..3a8e7745 100644 --- a/server/main.lua +++ b/server/main.lua @@ -7,200 +7,173 @@ TriggerEvent('esx:getSharedObject', function(obj) end) function GenerateUniquePhoneNumber() + local foundNumber = false + local phoneNumber = nil - local foundNumber = false - local phoneNumber = nil + while not foundNumber do + Citizen.Wait(20) + phoneNumber = math.random(10000, 99999) - while not foundNumber do + local result = MySQL.Sync.fetchAll('SELECT COUNT(*) as count FROM users WHERE phone_number = @phoneNumber', + { + ['@phoneNumber'] = phoneNumber + }) - phoneNumber = math.random(10000, 99999) + local count = tonumber(result[1].count) - local result = MySQL.Sync.fetchAll( - 'SELECT COUNT(*) as count FROM users WHERE phone_number = @phoneNumber', - { - ['@phoneNumber'] = phoneNumber - } - ) + -- if the result is empty, aka the phone number is available + if count == 0 then + foundNumber = true + end - local count = tonumber(result[1].count) + end - if count == 0 then - foundNumber = true - end - - end - - return phoneNumber + return phoneNumber end function GetDistpatchRequestId() + local requestId = DisptachRequestId - local requestId = DisptachRequestId - - if DisptachRequestId < 65535 then - DisptachRequestId = DisptachRequestId + 1 - else - DisptachRequestId = 0 - end - - return requestId + if DisptachRequestId < 65535 then + DisptachRequestId = DisptachRequestId + 1 + else + DisptachRequestId = 0 + end + return requestId end AddEventHandler('esx_phone:getDistpatchRequestId', function(cb) - cb(GetDistpatchRequestId()) + cb(GetDistpatchRequestId()) end) AddEventHandler('esx:playerLoaded', function(source) + local xPlayer = ESX.GetPlayerFromId(source) - local xPlayer = ESX.GetPlayerFromId(source) + for num,v in pairs(PhoneNumbers) do + if tonumber(num) == num then -- If phonenumber is a player phone number + for src,_ in pairs(v.sources) do + TriggerClientEvent('esx_phone:setPhoneNumberSource', source, num, tonumber(src)) + end + end + end - for num,v in pairs(PhoneNumbers) do - if tonumber(num) == num then -- If phonenumber is a player phone number - for src,_ in pairs(v.sources) do - TriggerClientEvent('esx_phone:setPhoneNumberSource', source, num, tonumber(src)) - end - end - end + MySQL.Async.fetchAll('SELECT * FROM users WHERE identifier = @identifier', + { + ['@identifier'] = xPlayer.identifier + }, function(result) + local phoneNumber = result[1].phone_number - MySQL.Async.fetchAll( - 'SELECT * FROM users WHERE identifier = @identifier', - { - ['@identifier'] = xPlayer.identifier - }, - function(result) + if phoneNumber == nil then + phoneNumber = GenerateUniquePhoneNumber() - local phoneNumber = result[1].phone_number + MySQL.Async.execute('UPDATE users SET phone_number = @phone_number WHERE identifier = @identifier', + { + ['@identifier'] = xPlayer.identifier, + ['@phone_number'] = phoneNumber + }) + end - if phoneNumber == nil then + TriggerClientEvent('esx_phone:setPhoneNumberSource', -1, phoneNumber, source) - phoneNumber = GenerateUniquePhoneNumber() + PhoneNumbers[phoneNumber] = { + type = 'player', + hashDispatch = false, + sharePos = false, + hideNumber = false, + hidePosIfAnon = false, + sources = {[source] = true} + } - MySQL.Async.execute( - 'UPDATE users SET phone_number = @phone_number WHERE identifier = @identifier', - { - ['@identifier'] = xPlayer.identifier, - ['@phone_number'] = phoneNumber - } - ) - end + xPlayer.set('phoneNumber', phoneNumber) - TriggerClientEvent('esx_phone:setPhoneNumberSource', -1, phoneNumber, source) + if PhoneNumbers[xPlayer.job.name] ~= nil then + TriggerEvent('esx_phone:addSource', xPlayer.job.name, source) + end - PhoneNumbers[phoneNumber] = { - type = 'player', - hashDispatch = false, - sharePos = false, - hideNumber = false, - hidePosIfAnon = false, - sources = {[source] = true} - } + local contacts = {} - xPlayer.set('phoneNumber', phoneNumber) + MySQL.Async.fetchAll('SELECT * FROM user_contacts WHERE identifier = @identifier ORDER BY name ASC', + { + ['@identifier'] = xPlayer.identifier + }, function(result2) - if PhoneNumbers[xPlayer.job.name] ~= nil then - TriggerEvent('esx_phone:addSource', xPlayer.job.name, source) - end + for i=1, #result2, 1 do - local contacts = {} + table.insert(contacts, { + name = result2[i].name, + number = result2[i].number, + }) + end - MySQL.Async.fetchAll( - 'SELECT * FROM user_contacts WHERE identifier = @identifier ORDER BY name ASC', - { - ['@identifier'] = xPlayer.identifier - }, - function(result2) - - for i=1, #result2, 1 do - - table.insert(contacts, { - name = result2[i].name, - number = result2[i].number, - }) - end - - xPlayer.set('contacts', contacts) - - TriggerClientEvent('esx_phone:loaded', source, phoneNumber, contacts) - - end - ) - - end - ) + xPlayer.set('contacts', contacts) + TriggerClientEvent('esx_phone:loaded', source, phoneNumber, contacts) + end) + end) end) AddEventHandler('esx:playerDropped', function(source) + local xPlayer = ESX.GetPlayerFromId(source) - local xPlayer = ESX.GetPlayerFromId(source) - - TriggerClientEvent('esx_phone:setPhoneNumberSource', -1, xPlayer.get('phoneNumber'), -1) - - PhoneNumbers[xPlayer.get('phoneNumber')] = nil - - if PhoneNumbers[xPlayer.job.name] ~= nil then - TriggerEvent('esx_phone:removeSource', xPlayer.job.name, source) - end + TriggerClientEvent('esx_phone:setPhoneNumberSource', -1, xPlayer.get('phoneNumber'), -1) + PhoneNumbers[xPlayer.get('phoneNumber')] = nil + if PhoneNumbers[xPlayer.job.name] ~= nil then + TriggerEvent('esx_phone:removeSource', xPlayer.job.name, source) + end end) AddEventHandler('esx:setJob', function(source, job, lastJob) + if PhoneNumbers[lastJob.name] ~= nil then + TriggerEvent('esx_phone:removeSource', lastJob.name, source) + end - if PhoneNumbers[lastJob.name] ~= nil then - TriggerEvent('esx_phone:removeSource', lastJob.name, source) - end - - if PhoneNumbers[job.name] ~= nil then - TriggerEvent('esx_phone:addSource', job.name, source) - end - + if PhoneNumbers[job.name] ~= nil then + TriggerEvent('esx_phone:addSource', job.name, source) + end end) RegisterServerEvent('esx_phone:reload') AddEventHandler('esx_phone:reload', function(phoneNumber) + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + local contacts = xPlayer.get('contacts') - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - local contacts = xPlayer.get('contacts') - - TriggerClientEvent('esx_phone:loaded', _source, phoneNumber, contacts) - + TriggerClientEvent('esx_phone:loaded', _source, phoneNumber, contacts) end) RegisterServerEvent('esx_phone:send') AddEventHandler('esx_phone:send', function(phoneNumber, message, anon, position) + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) + print('MESSAGE => ' .. xPlayer.name .. '@' .. phoneNumber .. ' : ' .. message) - print('MESSAGE => ' .. xPlayer.name .. '@' .. phoneNumber .. ' : ' .. message) + if PhoneNumbers[phoneNumber] ~= nil then - if PhoneNumbers[phoneNumber] ~= nil then + for k,v in pairs(PhoneNumbers[phoneNumber].sources) do - for k,v in pairs(PhoneNumbers[phoneNumber].sources) do + local numType = PhoneNumbers[phoneNumber].type + local numHasDispatch = PhoneNumbers[phoneNumber].hasDispatch + local numHide = PhoneNumbers[phoneNumber].hideNumber + local numHidePosIfAnon = PhoneNumbers[phoneNumber].hidePosIfAnon + local numPosition = (PhoneNumbers[phoneNumber].sharePos and position or false) + local numSource = tonumber(k) - local numType = PhoneNumbers[phoneNumber].type - local numHasDispatch = PhoneNumbers[phoneNumber].hasDispatch - local numHide = PhoneNumbers[phoneNumber].hideNumber - local numHidePosIfAnon = PhoneNumbers[phoneNumber].hidePosIfAnon - local numPosition = (PhoneNumbers[phoneNumber].sharePos and position or false) - local numSource = tonumber(k) + if numHidePosIfAnon and anon then + numPosition = false + end - if numHidePosIfAnon and anon then - numPosition = false - end + if numHasDispatch then + TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, GetDistpatchRequestId(), phoneNumber) + else + TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, false) + end - if numHasDispatch then - TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, GetDistpatchRequestId()) - else - TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, false) - end - - end - - end + end + end end) AddEventHandler('esx_phone:registerNumber', function(number, type, sharePos, hasDispatch, hideNumber, hidePosIfAnon) @@ -217,6 +190,10 @@ AddEventHandler('esx_phone:registerNumber', function(number, type, sharePos, has } end) +AddEventHandler('esx_phone:removeNumber', function(number) + PhoneNumbers[number] = nil +end) + AddEventHandler('esx_phone:addSource', function(number, source) PhoneNumbers[number].sources[tostring(source)] = true end) @@ -282,57 +259,49 @@ end) RegisterServerEvent('esx_phone:removePlayerContact') AddEventHandler('esx_phone:removePlayerContact', function(phoneNumber, contactName) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - local foundNumber = false + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + local foundNumber = false - MySQL.Async.fetchAll( - 'SELECT phone_number FROM users WHERE phone_number = @number', - { - ['@number'] = phoneNumber - }, - function(result) + MySQL.Async.fetchAll('SELECT phone_number FROM users WHERE phone_number = @number', + { + ['@number'] = phoneNumber + }, function(result) - if result[1] ~= nil then - foundNumber = true - end + if result[1] ~= nil then + foundNumber = true + end - if foundNumber then + if foundNumber then - local contacts = xPlayer.get('contacts') + local contacts = xPlayer.get('contacts') - for key, value in pairs(contacts) do - if value.name == contactName and value.number == phoneNumber then - table.remove(contacts,key) - end - end + for key, value in pairs(contacts) do + if value.name == contactName and value.number == phoneNumber then + table.remove(contacts, key) + end + end - xPlayer.set('contacts', contacts) + xPlayer.set('contacts', contacts) - MySQL.Async.execute( - 'DELETE FROM user_contacts WHERE identifier=@identifier AND name=@name AND number=@number', - { - ['@identifier'] = xPlayer.identifier, - ['@name'] = contactName, - ['@number'] = phoneNumber - }, - function(rowsChanged) + MySQL.Async.execute('DELETE FROM user_contacts WHERE identifier=@identifier AND name=@name AND number=@number', + { + ['@identifier'] = xPlayer.identifier, + ['@name'] = contactName, + ['@number'] = phoneNumber + }, function(rowsChanged) + TriggerClientEvent('esx:showNotification', _source, _U('contact_removed')) + TriggerClientEvent('esx_phone:removeContact', _source, contactName, phoneNumber) + end) + else + TriggerClientEvent('esx:showNotification', source, _U('number_not_assigned')) + end - TriggerClientEvent('esx:showNotification', _source, _U('contact_removed')) - - TriggerClientEvent('esx_phone:removeContact', _source, contactName, phoneNumber) - end - ) - else - TriggerClientEvent('esx:showNotification', source, _U('number_not_assigned')) - end - - end - ) + end) end) RegisterServerEvent('esx_phone:stopDispatch') AddEventHandler('esx_phone:stopDispatch', function(dispatchRequestId) - TriggerClientEvent('esx_phone:stopDispatch', -1, dispatchRequestId, GetPlayerName(source)) + TriggerClientEvent('esx_phone:stopDispatch', -1, dispatchRequestId, GetPlayerName(source)) end)