fork(4) download
  1. ESX = nil
  2. local DisptachRequestId = 0
  3. local PhoneNumbers = {}
  4.  
  5. TriggerEvent('esx:getSharedObject', function(obj)
  6. ESX = obj
  7. end)
  8.  
  9. function GenerateUniquePhoneNumber()
  10.  
  11. local foundNumber = false
  12. local phoneNumber = nil
  13.  
  14. while not foundNumber do
  15.  
  16. phoneNumber = math.random(10000, 99999)
  17.  
  18. local result = MySQL.Sync.fetchAll(
  19. 'SELECT COUNT(*) as count FROM users WHERE phone_number = @phoneNumber',
  20. {
  21. ['@phoneNumber'] = phoneNumber
  22. }
  23. )
  24.  
  25. local count = tonumber(result[1].count)
  26.  
  27. if count == 0 then
  28. foundNumber = true
  29. end
  30.  
  31. end
  32.  
  33. return phoneNumber
  34. end
  35.  
  36. function GetDistpatchRequestId()
  37.  
  38. local requestId = DisptachRequestId
  39.  
  40. if DisptachRequestId < 65535 then
  41. DisptachRequestId = DisptachRequestId + 1
  42. else
  43. DisptachRequestId = 0
  44. end
  45.  
  46. return requestId
  47.  
  48. end
  49.  
  50. function EndCall(source, channel, target)
  51.  
  52. local xPlayer = ESX.GetPlayerFromId(source)
  53.  
  54. print('PHONE CALL END => ' .. channel)
  55.  
  56. xPlayer.set('onCall', nil)
  57.  
  58. TriggerClientEvent('esx_phone:endCall', source)
  59.  
  60. if target ~= nil then
  61.  
  62. local targetXPlayer = ESX.GetPlayerFromId(target)
  63.  
  64. if targetXPlayer ~= nil then
  65. targetXPlayer.set('onCall', nil)
  66. TriggerClientEvent('esx_phone:endCall', target)
  67. end
  68.  
  69. end
  70.  
  71. end
  72.  
  73. RegisterServerEvent('esx_phone:startCall')
  74. AddEventHandler('esx_phone:startCall', function(number)
  75.  
  76. local _source = source
  77. local xPlayer = ESX.GetPlayerFromId(_source)
  78. local xPlayers = ESX.GetPlayers()
  79. local channel = _source + 1000
  80. local foundPlayer = false
  81.  
  82. for i=1, #xPlayers, 1 do
  83.  
  84. local targetXPlayer = ESX.GetPlayerFromId(xPlayers[i])
  85.  
  86. if targetXPlayer.get('phoneNumber') == tonumber(number) then
  87. foundPlayer = targetXPlayer
  88. break
  89. end
  90.  
  91. end
  92.  
  93. if foundPlayer ~= false then
  94.  
  95. xPlayer .set('onCall', {channel = channel, target = foundPlayer.source})
  96. foundPlayer.set('onCall', {channel = channel, target = xPlayer.source})
  97.  
  98. print('PHONE CALL START => ' .. xPlayer.name .. '@' .. foundPlayer.name .. ' => ' .. channel)
  99.  
  100. TriggerClientEvent('esx_phone:incomingCall', foundPlayer.source, xPlayer.source, channel, xPlayer.get('phoneNumber'))
  101.  
  102. else
  103. TriggerClientEvent('esx_phone:endCall', _source, 'De persoon is niet online')
  104. end
  105.  
  106.  
  107. end)
  108.  
  109. RegisterServerEvent('esx_phone:acceptCall')
  110. AddEventHandler('esx_phone:acceptCall', function(target, channel)
  111.  
  112. local _source = source
  113.  
  114. print('PHONE CALL ACCEPT => ' .. channel)
  115.  
  116. TriggerClientEvent('esx_phone:onAcceptCall', target, channel, _source)
  117.  
  118. end)
  119.  
  120. RegisterServerEvent('esx_phone:endCall')
  121. AddEventHandler('esx_phone:endCall', function(channel, target)
  122. EndCall(source, channel, target)
  123. end)
  124.  
  125. AddEventHandler('esx_phone:getDistpatchRequestId', function(cb)
  126. cb(GetDistpatchRequestId())
  127. end)
  128.  
  129. AddEventHandler('onResourceStart', function(ressource)
  130. if ressource == 'DDFoon' then
  131. TriggerEvent('esx_phone:ready')
  132. end
  133. end)
  134.  
  135. AddEventHandler('esx:playerLoaded', function(source)
  136.  
  137. local xPlayer = ESX.GetPlayerFromId(source)
  138.  
  139. for num,v in pairs(PhoneNumbers) do
  140. if tonumber(num) == num then -- If phonenumber is a player phone number
  141. for src,_ in pairs(v.sources) do
  142. TriggerClientEvent('esx_phone:setPhoneNumberSource', source, num, tonumber(src))
  143. end
  144. end
  145. end
  146.  
  147. MySQL.Async.fetchAll(
  148. 'SELECT * FROM users WHERE identifier = @identifier',
  149. {
  150. ['@identifier'] = xPlayer.identifier
  151. },
  152. function(result)
  153.  
  154. local phoneNumber = result[1].phone_number
  155.  
  156. if phoneNumber == nil then
  157.  
  158. phoneNumber = GenerateUniquePhoneNumber()
  159.  
  160. MySQL.Async.execute(
  161. 'UPDATE users SET phone_number = @phone_number WHERE identifier = @identifier',
  162. {
  163. ['@identifier'] = xPlayer.identifier,
  164. ['@phone_number'] = phoneNumber
  165. }
  166. )
  167. end
  168.  
  169. TriggerClientEvent('esx_phone:setPhoneNumberSource', -1, phoneNumber, source)
  170.  
  171. PhoneNumbers[phoneNumber] = {
  172. type = 'player',
  173. hashDispatch = false,
  174. sharePos = false,
  175. hideNumber = false,
  176. hidePosIfAnon = false,
  177. sources = {[source] = true}
  178. }
  179.  
  180. xPlayer.set('phoneNumber', phoneNumber)
  181.  
  182. if PhoneNumbers[xPlayer.job.name] ~= nil then
  183. TriggerEvent('esx_phone:addSource', xPlayer.job.name, source)
  184. end
  185.  
  186. local contacts = {}
  187.  
  188. MySQL.Async.fetchAll(
  189. 'SELECT * FROM user_contacts WHERE identifier = @identifier ORDER BY name ASC',
  190. {
  191. ['@identifier'] = xPlayer.identifier
  192. },
  193. function(result2)
  194.  
  195. for i=1, #result2, 1 do
  196.  
  197. table.insert(contacts, {
  198. name = result2[i].name,
  199. number = result2[i].number,
  200. })
  201. end
  202.  
  203. xPlayer.set('contacts', contacts)
  204.  
  205. TriggerClientEvent('esx_phone:loaded', source, phoneNumber, contacts)
  206.  
  207. end
  208. )
  209.  
  210. end
  211. )
  212.  
  213. end)
  214.  
  215. AddEventHandler('esx:playerDropped', function(source)
  216.  
  217. local xPlayer = ESX.GetPlayerFromId(source)
  218. local onCall = xPlayer.get('onCall')
  219.  
  220. TriggerClientEvent('esx_phone:setPhoneNumberSource', -1, xPlayer.get('phoneNumber'), -1)
  221.  
  222. PhoneNumbers[xPlayer.get('phoneNumber')] = nil
  223.  
  224. if PhoneNumbers[xPlayer.job.name] ~= nil then
  225. TriggerEvent('esx_phone:removeSource', xPlayer.job.name, source)
  226. end
  227.  
  228. if onCall ~= nil then
  229. EndCall(source, onCall.channel, onCall.target)
  230. end
  231.  
  232. end)
  233.  
  234. AddEventHandler('esx:setJob', function(source, job, lastJob)
  235.  
  236. if PhoneNumbers[lastJob.name] ~= nil then
  237. TriggerEvent('esx_phone:removeSource', lastJob.name, source)
  238. end
  239.  
  240. if PhoneNumbers[job.name] ~= nil then
  241. TriggerEvent('esx_phone:addSource', job.name, source)
  242. end
  243.  
  244. end)
  245.  
  246. RegisterServerEvent('esx_phone:reload')
  247. AddEventHandler('esx_phone:reload', function(phoneNumber)
  248.  
  249. local _source = source
  250. local xPlayer = ESX.GetPlayerFromId(_source)
  251. local contacts = xPlayer.get('contacts') or {}
  252.  
  253. TriggerClientEvent('esx_phone:loaded', _source, phoneNumber, contacts)
  254.  
  255. end)
  256.  
  257. RegisterServerEvent('esx_phone:send')
  258. AddEventHandler('esx_phone:send', function(phoneNumber, message, anon, position)
  259. local _source = source
  260. local xPlayer = ESX.GetPlayerFromId(_source)
  261.  
  262. print('MESSAGE => ' .. xPlayer.name .. '@' .. phoneNumber .. ' : ' .. message)
  263.  
  264. if PhoneNumbers[phoneNumber] ~= nil then
  265. for k,v in pairs(PhoneNumbers[phoneNumber].sources) do
  266.  
  267. local numType = PhoneNumbers[phoneNumber].type
  268. local numHasDispatch = PhoneNumbers[phoneNumber].hasDispatch
  269. local numHide = PhoneNumbers[phoneNumber].hideNumber
  270. local numHidePosIfAnon = PhoneNumbers[phoneNumber].hidePosIfAnon
  271. local numPosition = (PhoneNumbers[phoneNumber].sharePos and position or false)
  272. local numSource = tonumber(k)
  273.  
  274. if numHidePosIfAnon and anon then
  275. numPosition = false
  276. end
  277. if (phoneNumber == "police") or (phoneNumber == "mecano") or (phoneNumber == "ambulance") or (phoneNumber == "walid") then
  278. TriggerEvent('Inklokken:GetKlok', function(Klokdienst)
  279. if (Klokdienst[numSource] ~= nil) and (Klokdienst[numSource]) then
  280. if numHasDispatch then
  281. TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, GetDistpatchRequestId())
  282. else
  283. TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, false)
  284. end
  285. end
  286. end)
  287. else
  288. if numHasDispatch then
  289. TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, GetDistpatchRequestId())
  290. else
  291. TriggerClientEvent('esx_phone:onMessage', numSource, xPlayer.get('phoneNumber'), message, numPosition, (numHide and true or anon), numType, false)
  292. end
  293. end
  294. end
  295. end
  296. end)
  297.  
  298. AddEventHandler('esx_phone:registerNumber', function(number, type, sharePos, hasDispatch, hideNumber, hidePosIfAnon)
  299.  
  300. local hideNumber = hideNumber or false
  301. local hidePosIfAnon = hidePosIfAnon or false
  302.  
  303. PhoneNumbers[number] = {
  304. type = type,
  305. sharePos = sharePos,
  306. hasDispatch = (hasDispatch or false),
  307. hideNumber = hideNumber,
  308. hidePosIfAnon = hidePosIfAnon,
  309. sources = {}
  310. }
  311.  
  312. end)
  313.  
  314. AddEventHandler('esx_phone:addSource', function(number, source)
  315. PhoneNumbers[number].sources[tostring(source)] = true
  316. end)
  317.  
  318. AddEventHandler('esx_phone:removeSource', function(number, source)
  319. PhoneNumbers[number].sources[tostring(source)] = nil
  320. end)
  321.  
  322. RegisterServerEvent('esx_phone:addPlayerContact')
  323. AddEventHandler('esx_phone:addPlayerContact', function(phoneNumber, contactName)
  324.  
  325. local _source = source
  326. local xPlayer = ESX.GetPlayerFromId(_source)
  327. local foundNumber = false
  328. local foundPlayer = nil
  329.  
  330. MySQL.Async.fetchAll(
  331. 'SELECT phone_number FROM users WHERE phone_number = @number',
  332. {
  333. ['@number'] = phoneNumber
  334. },
  335. function(result)
  336.  
  337. if result[1] ~= nil then
  338. foundNumber = true
  339. end
  340.  
  341. if foundNumber then
  342.  
  343. if phoneNumber == xPlayer.get('phoneNumber') then
  344. TriggerClientEvent('esx:showNotification', _source, 'Je kunt jezelf niet toevoegen')
  345. else
  346.  
  347. local hasAlreadyAdded = false
  348. local contacts = xPlayer.get('contacts')
  349.  
  350. for i=1, #contacts, 1 do
  351. if contacts[i].number == phoneNumber then
  352. hasAlreadyAdded = true
  353. end
  354. end
  355.  
  356. if hasAlreadyAdded then
  357. TriggerClientEvent('esx:showNotification', _source, 'Dit contact staat al in je contacten')
  358. else
  359.  
  360. table.insert(contacts, {
  361. name = contactName,
  362. number = phoneNumber,
  363. })
  364.  
  365. xPlayer.set('contacts', contacts)
  366.  
  367. MySQL.Async.execute(
  368. 'INSERT INTO user_contacts (identifier, name, number) VALUES (@identifier, @name, @number)',
  369. {
  370. ['@identifier'] = xPlayer.identifier,
  371. ['@name'] = contactName,
  372. ['@number'] = phoneNumber
  373. },
  374. function(rowsChanged)
  375.  
  376. TriggerClientEvent('esx:showNotification', _source, 'Contact toegevoegd')
  377.  
  378. TriggerClientEvent('esx_phone:addContact', _source, contactName, phoneNumber)
  379. end
  380. )
  381.  
  382. end
  383. end
  384.  
  385. else
  386. TriggerClientEvent('esx:showNotification', source, 'Dit nummer bestaat niet')
  387. end
  388.  
  389. end
  390. )
  391.  
  392. end)
  393. RegisterServerEvent('esx_phone:removePlayerContact')
  394. AddEventHandler('esx_phone:removePlayerContact', function(phoneNumber)
  395. local _source = source
  396. local xPlayer = ESX.GetPlayerFromId(_source)
  397. local foundNumber = false
  398. local foundPlayer = nil
  399. MySQL.Async.fetchAll(
  400. 'SELECT phone_number FROM users WHERE phone_number = @number',
  401. {
  402. ['@number'] = phoneNumber
  403. },
  404. function(result)
  405. if result[1] ~= nil then
  406. foundNumber = true
  407. end
  408. if foundNumber then
  409. if phoneNumber == xPlayer.get('phoneNumber') then
  410. TriggerClientEvent('esx:showNotification', _source, 'Je kunt jezelf niet verwijderen')
  411. else
  412. local hasAlreadyAdded = false
  413. local contacts = xPlayer.get('contacts')
  414. local added = nil
  415. for i=1, #contacts, 1 do
  416. if contacts[i].number == phoneNumber then
  417. hasAlreadyAdded = true
  418. added = i
  419. end
  420. end
  421. if hasAlreadyAdded then
  422. -- TriggerClientEvent('esx:showNotification', _source, 'Dit contact staat al in je contacten')
  423. table.remove(contacts, added)
  424. xPlayer.set('contacts', contacts)
  425. MySQL,Async.execute('DELETE FROM `user_contacts` WHERE `identifier`="'..xPlayer.identifier..'" AND `number`="'..phoneNumber..'" ', { },
  426. function(rowsChanged)
  427. TriggerClientEvent('esx:showNotification', _source, 'Contact ververwijderd')
  428. TriggerClientEvent('esx_phone:removedContact', _source, phoneNumber)
  429. end
  430. )
  431. else
  432. TriggerClientEvent('esx:showNotification', _source, 'Hij stond niet in je contacten')
  433. end
  434. end
  435. else
  436. TriggerClientEvent('esx:showNotification', source, 'Dit nummer bestaat niet')
  437. end
  438. end
  439. )
  440. end)
  441.  
  442.  
  443.  
  444. RegisterServerEvent('esx_phone:stopDispatch')
  445. AddEventHandler('esx_phone:stopDispatch', function(dispatchRequestId)
  446. TriggerClientEvent('esx_phone:stopDispatch', -1, dispatchRequestId, GetPlayerName(source))
  447. end)
  448.  
  449. RegisterServerEvent('esx_phone:billCall')
  450. AddEventHandler('esx_phone:billCall', function(duration)
  451.  
  452. local _source = source
  453. local xPlayer = ESX.GetPlayerFromId(_source)
  454. local amount = math.floor(duration * 0.34)
  455.  
  456. xPlayer.removeAccountMoney('bank', amount)
  457.  
  458. TriggerClientEvent('esx:showNotification', _source, 'Deze oproep heeft ~r~€' .. amount .. '~s~ gekost')
  459.  
  460. end)
  461.  
  462. RegisterServerEvent('esx_phone:bankTransfer')
  463. AddEventHandler('esx_phone:bankTransfer', function(target, amount)
  464.  
  465. local _source = source
  466. local xPlayer = ESX.GetPlayerFromId(_source)
  467. local targetXPlayer = ESX.GetPlayerFromId(target)
  468.  
  469. if amount > 0 and amount <= xPlayer.getAccount('bank').money then
  470.  
  471. xPlayer .removeAccountMoney('bank', amount)
  472. targetXPlayer.addAccountMoney ('bank', amount)
  473.  
  474. TriggerClientEvent('esx:showNotification', _source, 'Je hebt ~g~€' .. amount .. '~s~ overgemaakt aan ' .. targetXPlayer.name)
  475. TriggerEvent("LOGGER:SimpleEmbedHook", "LegaleLogs", "wit", xPlayer.name, xPlayer.name..'Heeft ' .. amount .. ' overgemaakt aan ' .. targetXPlayer.name)
  476.  
  477. else
  478. TriggerClientEvent('esx:showNotification', _source, 'Ongeldige hoeveelheid')
  479. end
  480.  
  481. end)
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
luac5.3: prog.lua:431: syntax error near 'else'
stdout
Standard output is empty