Advertisement
Guest User

Untitled

a guest
Feb 16th, 2020
647
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.08 KB | None | 0 0
  1. local Proxy = module("lib/Proxy")
  2. local Tunnel = module("lib/Tunnel")
  3. local Lang = module("lib/Lang")
  4. Debug = module("lib/Debug")
  5.  
  6. local config = module("cfg/base")
  7. local version = module("version")
  8. Debug.active = config.debug
  9.  
  10. -- versioning
  11. print("[vRP] launch version "..version)
  12.  
  13. vRP = {}
  14. Proxy.addInterface("vRP",vRP)
  15.  
  16. tvRP = {}
  17. Tunnel.bindInterface("vRP",tvRP) -- listening for client tunnel
  18.  
  19. -- load language
  20. local dict = module("cfg/lang/"..config.lang) or {}
  21. vRP.lang = Lang.new(dict)
  22.  
  23. -- init
  24. vRPclient = Tunnel.getInterface("vRP","vRP") -- server -> client tunnel
  25.  
  26. vRPlogs = Proxy.getInterface("vRP_logs")
  27. vRPteleRing = Proxy.getInterface("vRP_teleportRing")
  28. vRPsb = Proxy.getInterface("vRP_scoreboard")
  29. vRPbiz = Proxy.getInterface("vRP_biz")
  30. vRPjobs = Proxy.getInterface("vRP_jobs")
  31.  
  32. vRP.users = {} -- will store logged users (id) by first identifier
  33. vRP.rusers = {} -- store the opposite of users
  34. vRP.user_tables = {} -- user data tables (logger storage, saved to database)
  35. vRP.user_tmp_tables = {} -- user tmp data tables (logger storage, not saved)
  36. vRP.user_sources = {} -- user sources
  37.  
  38. hoursPlayed = {}
  39.  
  40. -- identification system
  41.  
  42. Citizen.CreateThread(function()
  43. local uptimeMinute, uptimeHour = 0, 0
  44.  
  45. while true do
  46. Citizen.Wait(1000 * 60) -- every minute
  47. uptimeMinute = uptimeMinute + 1
  48.  
  49. if uptimeMinute == 60 then
  50. uptimeMinute = 0
  51. uptimeHour = uptimeHour + 1
  52. end
  53.  
  54. ExecuteCommand(string.format("sets UpTime \"%02dh %02dm\"", uptimeHour, uptimeMinute))
  55. end
  56. end)
  57.  
  58. --- sql.
  59. -- cbreturn user id or nil in case of error (if not found, will create it)
  60. function vRP.getUserIdByIdentifiers(ids, cbr)
  61. local task = Task(cbr)
  62.  
  63. if ids ~= nil and #ids then
  64. local i = 0
  65.  
  66. -- search identifiers
  67. local function search()
  68. i = i+1
  69. if i <= #ids then
  70. if not config.ignore_ip_identifier or (string.find(ids[i], "ip:") == nil) then -- ignore ip identifier
  71. local rows = MySQL.Sync.fetchAll("SELECT user_id FROM vrp_user_ids WHERE identifier = @identifier", {['@identifier'] = ids[i]})
  72. Citizen.Wait(75)
  73. if #rows > 0 then -- found
  74. task({rows[1].user_id})
  75. else -- not found
  76. search()
  77. end
  78. else
  79. search()
  80. end
  81. else -- no ids found, create user
  82. local rows = MySQL.Sync.fetchAll("INSERT INTO vrp_users(whitelisted,banned,faction,isFactionLeader,factionRank,username) VALUES(false,false,'user',0,'none','Username'); SELECT LAST_INSERT_ID() AS id")
  83. Citizen.Wait(75)
  84. if #rows > 0 then
  85. local user_id = rows[1].id
  86. -- add identifiers
  87. for l,w in pairs(ids) do
  88. if not config.ignore_ip_identifier or (string.find(w, "ip:") == nil) then -- ignore ip identifier
  89. MySQL.Async.execute("INSERT INTO vrp_user_ids(identifier,user_id) VALUES(@identifier,@user_id)", {['@user_id'] = user_id, ['@identifier'] = w}, function()end)
  90. end
  91. end
  92.  
  93. task({user_id})
  94. else
  95. task()
  96. end
  97. end
  98. end
  99.  
  100. search()
  101. else
  102. task()
  103. end
  104. end
  105.  
  106. -- return identification string for the source (used for non vRP identifications, for rejected players)
  107. function vRP.getSourceIdKey(source)
  108. local ids = GetPlayerIdentifiers(source)
  109. local idk = "idk_"
  110. for k,v in pairs(ids) do
  111. idk = idk..v
  112. end
  113.  
  114. return idk
  115. end
  116.  
  117. function vRP.getPlayerEndpoint(player)
  118. return GetPlayerEP(player) or "0.0.0.0"
  119. end
  120.  
  121. function vRP.getPlayerName(player)
  122. return GetPlayerName(player) or "unknown"
  123. end
  124.  
  125. function vRP.formatMoney(amount)
  126. local left,num,right = string.match(tostring(amount),'^([^%d]*%d)(%d*)(.-)$')
  127. return left..(num:reverse():gsub('(%d%d%d)','%1.'):reverse())..right
  128. end
  129.  
  130. --- sql
  131. function vRP.isBanned(user_id, cbr)
  132. local task = Task(cbr, {false})
  133. local rows = MySQL.Sync.fetchAll("SELECT banned FROM vrp_users WHERE id = @user_id", {['@user_id'] = user_id})
  134. Citizen.Wait(50)
  135. if #rows > 0 then
  136. task({rows[1].banned})
  137. else
  138. task()
  139. end
  140. end
  141.  
  142. --- sql
  143. function vRP.setBanned(user_id,banned,reason,by)
  144. if(banned == false)then
  145. reason = ""
  146. end
  147. if(tostring(by) ~= "Consola")then
  148. theAdmin = vRP.getUserId(by)
  149. adminName = GetPlayerName(by)
  150. banBy = adminName.." ["..theAdmin.."]"
  151. else
  152. banBy = "Consola"
  153. end
  154. MySQL.Async.execute("UPDATE vrp_users SET banned = @banned, bannedReason = @reason, bannedBy = @bannedBy WHERE id = @user_id", {['@user_id'] = user_id, ['@banned'] = banned, ['@reason'] = reason, ['@bannedBy'] = banBy}, function()end)
  155. end
  156.  
  157. --- sql
  158. function vRP.isWhitelisted(user_id, cbr)
  159. local task = Task(cbr, {false})
  160. local rows = MySQL.Sync.fetchAll("SELECT whitelisted FROM vrp_users WHERE id = @user_id", {['@user_id'] = user_id})
  161. Citizen.Wait(50)
  162. if #rows > 0 then
  163. task({rows[1].whitelisted})
  164. else
  165. task()
  166. end
  167. end
  168.  
  169. --- sql
  170. function vRP.setWhitelisted(user_id,whitelisted)
  171. MySQL.Async.execute("UPDATE vrp_users SET whitelisted = @whitelisted WHERE id = @user_id", {['@user_id'] = user_id, ['@whitelisted'] = whitelisted}, function()end)
  172. end
  173.  
  174. --- sql
  175. function vRP.getLastLogin(user_id, cbr)
  176. local task = Task(cbr,{""})
  177. local rows = MySQL.Sync.fetchAll("SELECT last_login FROM vrp_users WHERE id = @user_id", {['@user_id'] = user_id})
  178. if #rows > 0 then
  179. task({rows[1].last_login})
  180. else
  181. task()
  182. end
  183. end
  184.  
  185. function vRP.setUData(user_id,key,value)
  186. MySQL.Async.execute("REPLACE INTO vrp_user_data(user_id,dkey,dvalue) VALUES(@user_id,@key,@value)", {['@user_id'] = user_id, ['@key'] = key, ['@value'] = value}, function()end)
  187. end
  188.  
  189. function vRP.getUData(user_id,key,cbr)
  190. local task = Task(cbr,{""})
  191.  
  192. local rows = MySQL.Sync.fetchAll("SELECT dvalue FROM vrp_user_data WHERE user_id = @user_id AND dkey = @key", {['@user_id'] = user_id, ['@key'] = key})
  193. Citizen.Wait(100)
  194. if #rows > 0 then
  195. task({rows[1].dvalue})
  196. else
  197. task()
  198. end
  199. end
  200.  
  201. function vRP.setSData(key,value)
  202. MySQL.Async.execute("REPLACE INTO vrp_srv_data(dkey,dvalue) VALUES(@key,@value)", {['@key'] = key, ['@value'] = value}, function()end)
  203. end
  204.  
  205. function vRP.getSData(key, cbr)
  206. local task = Task(cbr,{""})
  207.  
  208. local rows = MySQL.Sync.fetchAll("SELECT dvalue FROM vrp_srv_data WHERE dkey = @key", {['@key'] = key})
  209. Citizen.Wait(100)
  210. if #rows > 0 then
  211. task({rows[1].dvalue})
  212. else
  213. task()
  214. end
  215. end
  216. -- return user data table for vRP internal persistant connected user storage
  217. function vRP.getUserDataTable(user_id)
  218. return vRP.user_tables[user_id]
  219. end
  220.  
  221. function vRP.getUserTmpTable(user_id)
  222. return vRP.user_tmp_tables[user_id]
  223. end
  224.  
  225. function vRP.isConnected(user_id)
  226. return vRP.rusers[user_id] ~= nil
  227. end
  228.  
  229. function vRP.isFirstSpawn(user_id)
  230. local tmp = vRP.getUserTmpTable(user_id)
  231. return tmp and tmp.spawns == 1
  232. end
  233.  
  234. function vRP.getUserId(source)
  235. if source ~= nil then
  236. local ids = GetPlayerIdentifiers(source)
  237. if ids ~= nil and #ids > 0 then
  238. return vRP.users[ids[1]]
  239. end
  240. end
  241.  
  242. return nil
  243. end
  244.  
  245. -- return map of user_id -> player source
  246. function vRP.getUsers()
  247. local users = {}
  248. for k,v in pairs(vRP.user_sources) do
  249. users[k] = v
  250. end
  251.  
  252. return users
  253. end
  254.  
  255. -- return source or nil
  256. function vRP.getUserSource(user_id)
  257. return vRP.user_sources[user_id]
  258. end
  259.  
  260. function vRP.ban(source,reason,admin)
  261. local user_id = vRP.getUserId(source)
  262.  
  263. if user_id ~= nil then
  264. vRP.setBanned(user_id,1,reason,admin)
  265. motiv = "De: "..admin.."\nMotiv: "..reason.."\nID-ul Tau: ["..user_id.."]\n\nPentru unban intra pe Discord: https://discord.gg/hcuMnfn"
  266. vRP.kick(source,"[Banned] "..motiv)
  267. end
  268. end
  269.  
  270. function vRP.kick(source,reason)
  271. DropPlayer(source,reason)
  272. end
  273.  
  274. -- tasks
  275.  
  276. function task_save_datatables()
  277. TriggerEvent("vRP:save")
  278.  
  279. Debug.pbegin("vRP save datatables")
  280. for k,v in pairs(vRP.user_tables) do
  281. vRP.setUData(k,"vRP:datatable",json.encode(v))
  282. end
  283.  
  284. Debug.pend()
  285. SetTimeout(config.save_interval*1000, task_save_datatables)
  286. end
  287. task_save_datatables()
  288.  
  289. --[[local max_pings = math.ceil(config.ping_timeout*60/30)+1
  290. function task_timeout() -- kick users not sending ping event in 2 minutes
  291. local users = vRP.getUsers()
  292. for k,v in pairs(users) do
  293. local tmpdata = vRP.getUserTmpTable(tonumber(k))
  294. if tmpdata.pings == nil then
  295. tmpdata.pings = 0
  296. end
  297.  
  298. tmpdata.pings = tmpdata.pings+1
  299. if tmpdata.pings >= max_pings then
  300. vRP.kick(v,"[vRP] Ping timeout.")
  301. end
  302. end
  303.  
  304. SetTimeout(30000, task_timeout)
  305. end
  306. task_timeout()]]
  307.  
  308. function tvRP.ping()
  309. local user_id = vRP.getUserId(source)
  310. if user_id ~= nil then
  311. local tmpdata = vRP.getUserTmpTable(user_id)
  312. tmpdata.pings = 0 -- reinit ping countdown
  313. end
  314. end
  315.  
  316. function vRP.getUserHoursPlayed(user_id)
  317. if(hoursPlayed[user_id] ~= nil)then
  318. return math.floor(hoursPlayed[user_id])
  319. else
  320. return 0
  321. end
  322. end
  323.  
  324. function tvRP.updateHoursPlayed(hours)
  325. user_id = vRP.getUserId(source)
  326. MySQL.Async.execute("UPDATE vrp_users SET hoursPlayed = hoursPlayed + @hours WHERE id = @user_id", {['@hours'] = hours, ['@user_id'] = user_id}, function()end)
  327. hoursPlayed[user_id] = hoursPlayed[user_id] + hours
  328. vRPsb.updateScoreboardPlayer({user_id, hours})
  329. end
  330.  
  331. -- handlers
  332.  
  333. AddEventHandler("playerConnecting",function(name,setMessage, deferrals)
  334. deferrals.defer()
  335.  
  336. local source = source
  337. Debug.pbegin("playerConnecting")
  338. local ids = GetPlayerIdentifiers(source)
  339.  
  340. if ids ~= nil and #ids > 0 then
  341. deferrals.update("[KRONOS] Checking identifiers...")
  342. vRP.getUserIdByIdentifiers(ids, function(user_id)
  343. -- if user_id ~= nil and vRP.rusers[user_id] == nil then -- check user validity and if not already connected (old way, disabled until playerDropped is sure to be called)
  344. if user_id ~= nil then -- check user validity
  345. deferrals.update("[KRONOS] Checking banned...")
  346. vRP.isBanned(user_id, function(banned)
  347. local rows = MySQL.Sync.fetchAll("SELECT * FROM vrp_users WHERE id = @user_id", {['@user_id'] = user_id})
  348. bannedBy = rows[1].bannedBy or ""
  349. banReason = rows[1].bannedReason or ""
  350.  
  351. if not banned then
  352. deferrals.update("[KRONOS] Checking whitelisted...")
  353. vRP.isWhitelisted(user_id, function(whitelisted)
  354. if not config.whitelist or whitelisted then
  355. Debug.pbegin("playerConnecting_delayed")
  356. if vRP.rusers[user_id] == nil then -- not present on the server, init
  357. -- init entries
  358. vRP.users[ids[1]] = user_id
  359. vRP.rusers[user_id] = ids[1]
  360. vRP.user_tables[user_id] = {}
  361. vRP.user_tmp_tables[user_id] = {}
  362. vRP.user_sources[user_id] = source
  363.  
  364. -- load user data table
  365. deferrals.update("[KRONOS] Loading datatable...")
  366. vRP.getUData(user_id, "vRP:datatable", function(sdata)
  367. local data = json.decode(sdata)
  368. if type(data) == "table" then vRP.user_tables[user_id] = data end
  369.  
  370. -- init user tmp table
  371. local tmpdata = vRP.getUserTmpTable(user_id)
  372.  
  373. deferrals.update("[KRONOS] Getting last login...")
  374. vRP.getLastLogin(user_id, function(last_login)
  375. tmpdata.last_login = last_login or ""
  376. tmpdata.spawns = 0
  377.  
  378. -- set last login
  379. local ep = vRP.getPlayerEndpoint(source)
  380. local last_login_stamp = ep.." "..os.date("%H:%M:%S %d/%m/%Y")
  381. MySQL.Async.execute("UPDATE vrp_users SET last_login = @last_login WHERE id = @user_id", {['@user_id'] = user_id, ['@last_login'] = last_login_stamp}, function()end)
  382.  
  383. -- trigger join
  384. print("[KRONOS] "..name.." ("..vRP.getPlayerEndpoint(source)..") joined (user_id = "..user_id..")")
  385. TriggerEvent("vRP:playerJoin", user_id, source, name, tmpdata.last_login)
  386. deferrals.done()
  387. end)
  388. end)
  389. else -- already connected
  390. print("[KRONOS] "..name.." ("..vRP.getPlayerEndpoint(source)..") re-joined (user_id = "..user_id..")")
  391. TriggerEvent("vRP:playerRejoin", user_id, source, name)
  392. deferrals.done()
  393.  
  394. -- reset first spawn
  395. local tmpdata = vRP.getUserTmpTable(user_id)
  396. tmpdata.spawns = 0
  397. end
  398.  
  399. Debug.pend()
  400. else
  401. print("[KRONOS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejected: not whitelisted (user_id = "..user_id..")")
  402. deferrals.done("Nu te poti conecta pe serverul de teste...")
  403. end
  404. end)
  405. else
  406. print("[KRONOS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejected: banned (user_id = "..user_id..")")
  407. deferrals.done("[KRONOS] Esti banat pe acest server!\nBanat De: "..bannedBy.."\nMotiv: "..banReason.."\nID-ul Tau: ["..user_id.."]\n\nPentru unban intra pe Discord: https://discord.gg/hcuMnfn")
  408. end
  409. end)
  410. else
  411. print("[KRONOS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejected: identification error")
  412. deferrals.done("[KRONOS] Identification error.")
  413. end
  414. end)
  415. else
  416. print("[KRONOS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejected: missing identifiers")
  417. deferrals.done("[KRONOS] Missing identifiers.")
  418. end
  419. Debug.pend()
  420. end)
  421.  
  422. AddEventHandler("playerDropped",function(reason)
  423. local source = source
  424. Debug.pbegin("playerDropped")
  425.  
  426. -- remove player from connected clients
  427. vRPclient.removePlayer(-1,{source})
  428.  
  429.  
  430. local user_id = vRP.getUserId(source)
  431.  
  432. if user_id ~= nil then
  433. TriggerEvent("vRP:playerLeave", user_id, source)
  434.  
  435. -- save user data table
  436. vRP.setUData(user_id,"vRP:datatable",json.encode(vRP.getUserDataTable(user_id)))
  437.  
  438. print("[vRP] "..vRP.getPlayerEndpoint(source).." disconnected (user_id = "..user_id..")")
  439. vRP.users[vRP.rusers[user_id]] = nil
  440. vRP.rusers[user_id] = nil
  441. vRP.user_tables[user_id] = nil
  442. vRP.user_tmp_tables[user_id] = nil
  443. vRP.user_sources[user_id] = nil
  444. end
  445. Debug.pend()
  446. end)
  447.  
  448. RegisterServerEvent("vRPcli:playerSpawned")
  449. AddEventHandler("vRPcli:playerSpawned", function()
  450. Debug.pbegin("playerSpawned")
  451. -- register user sources and then set first spawn to false
  452. local user_id = vRP.getUserId(source)
  453. local player = source
  454. if user_id ~= nil then
  455. vRP.user_sources[user_id] = source
  456. local tmp = vRP.getUserTmpTable(user_id)
  457. tmp.spawns = tmp.spawns+1
  458. local first_spawn = (tmp.spawns == 1)
  459.  
  460. if first_spawn then
  461. -- first spawn, reference player
  462. -- send players to new player
  463. for k,v in pairs(vRP.user_sources) do
  464. vRPclient.addPlayer(source,{v})
  465. end
  466. -- send new player to all players
  467. vRPclient.addPlayer(-1,{source})
  468. local theHours = MySQL.Sync.fetchAll("SELECT hoursPlayed FROM vrp_users WHERE id = @user_id", {['@user_id'] = user_id})
  469. hoursPlayed[user_id] = tonumber(theHours[1].hoursPlayed)
  470. end
  471.  
  472. -- set client tunnel delay at first spawn
  473. Tunnel.setDestDelay(player, config.load_delay)
  474.  
  475. -- show loading
  476. vRPclient.setProgressBar(player,{"vRP:loading", "botright", "Loading...", 0,0,0, 100})
  477. MySQL.Async.execute("UPDATE vrp_users SET username = @username WHERE id = @user_id", {['@user_id'] = user_id, ['@username'] = GetPlayerName(player)}, function()end)
  478. SetTimeout(2000, function() -- trigger spawn event
  479. TriggerEvent("vRP:playerSpawn",user_id,player,first_spawn)
  480. SetTimeout(config.load_duration*1000, function() -- set client delay to normal delay
  481. Tunnel.setDestDelay(player, config.global_delay)
  482. vRPclient.removeProgressBar(player,{"vRP:loading"})
  483. end)
  484. end)
  485. end
  486.  
  487. Debug.pend()
  488. end)
  489.  
  490. RegisterServerEvent("vRP:playerDied")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement