wadsonlucas

Untitled

Dec 17th, 2019
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.12 KB | None | 0 0
  1. MySQL = module("vrp_mysql", "MySQL")
  2.  
  3. local Proxy = module("lib/Proxy")
  4. local Tunnel = module("lib/Tunnel")
  5. local Lang = module("lib/Lang")
  6. Debug = module("lib/Debug")
  7.  
  8. local config = module("cfg/base")
  9. local version = module("version")
  10. Debug.active = config.debug
  11. MySQL.debug = config.debug
  12.  
  13. --[[
  14. SISTEMA TRADUZIDO BY HARNOLD
  15. SISTEMA TRADUZIDO BY HARNOLD
  16. SISTEMA TRADUZIDO BY HARNOLD
  17. --]]
  18.  
  19. -- open MySQL connection
  20. MySQL.createConnection("vRP", config.db.host,config.db.user,config.db.password,config.db.database)
  21.  
  22. -- versioning
  23. print("[SPARTACUS] launch version "..version)
  24. --[[
  25. PerformHttpRequest("https://raw.githubusercontent.com/ImagicTheCat/vRP/master/vrp/version.lua",function(err,text,headers)
  26. if err == 0 then
  27. text = string.gsub(text,"return ","")
  28. local r_version = tonumber(text)
  29. if version ~= r_version then
  30. print("[SPARTACUS] WARNING: A new version of vRP is available here https://github.com/ImagicTheCat/vRP, update to benefit from the last features and to fix exploits/bugs.")
  31. end
  32. else
  33. print("[SPARTACUS] unable to check the remote version")
  34. end
  35. end, "GET", "")
  36. --]]
  37.  
  38. vRP = {}
  39. Proxy.addInterface("vRP",vRP)
  40.  
  41. tvRP = {}
  42. Tunnel.bindInterface("vRP",tvRP) -- listening for client tunnel
  43.  
  44. -- load language
  45. local dict = module("cfg/lang/"..config.lang) or {}
  46. vRP.lang = Lang.new(dict)
  47.  
  48. -- init
  49. vRPclient = Tunnel.getInterface("vRP","vRP") -- server -> client tunnel
  50.  
  51. vRP.users = {} -- will store logged users (id) by first identifier
  52. vRP.rusers = {} -- store the opposite of users
  53. vRP.user_tables = {} -- user data tables (logger storage, saved to database)
  54. vRP.user_tmp_tables = {} -- user tmp data tables (logger storage, not saved)
  55. vRP.user_sources = {} -- user sources
  56.  
  57. -- queries
  58. MySQL.createCommand("vRP/base_tables",[[
  59. CREATE TABLE IF NOT EXISTS vrp_users(
  60. id INTEGER AUTO_INCREMENT,
  61. last_login VARCHAR(255),
  62. whitelisted BOOLEAN,
  63. banned BOOLEAN,
  64. CONSTRAINT pk_user PRIMARY KEY(id)
  65. );
  66.  
  67. CREATE TABLE IF NOT EXISTS vrp_user_ids(
  68. identifier VARCHAR(255),
  69. user_id INTEGER,
  70. CONSTRAINT pk_user_ids PRIMARY KEY(identifier),
  71. CONSTRAINT fk_user_ids_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE
  72. );
  73.  
  74. CREATE TABLE IF NOT EXISTS vrp_user_data(
  75. user_id INTEGER,
  76. dkey VARCHAR(255),
  77. dvalue TEXT,
  78. CONSTRAINT pk_user_data PRIMARY KEY(user_id,dkey),
  79. CONSTRAINT fk_user_data_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE
  80. );
  81.  
  82. CREATE TABLE IF NOT EXISTS vrp_srv_data(
  83. dkey VARCHAR(255),
  84. dvalue TEXT,
  85. CONSTRAINT pk_srv_data PRIMARY KEY(dkey)
  86. );
  87. ]])
  88.  
  89. MySQL.createCommand("vRP/create_user","INSERT INTO vrp_users(whitelisted,banned) VALUES(false,false); SELECT LAST_INSERT_ID() AS id")
  90. MySQL.createCommand("vRP/add_identifier","INSERT INTO vrp_user_ids(identifier,user_id) VALUES(@identifier,@user_id)")
  91. MySQL.createCommand("vRP/userid_byidentifier","SELECT user_id FROM vrp_user_ids WHERE identifier = @identifier")
  92.  
  93. MySQL.createCommand("vRP/set_userdata","REPLACE INTO vrp_user_data(user_id,dkey,dvalue) VALUES(@user_id,@key,@value)")
  94. MySQL.createCommand("vRP/get_userdata","SELECT dvalue FROM vrp_user_data WHERE user_id = @user_id AND dkey = @key")
  95.  
  96. MySQL.createCommand("vRP/set_srvdata","REPLACE INTO vrp_srv_data(dkey,dvalue) VALUES(@key,@value)")
  97. MySQL.createCommand("vRP/get_srvdata","SELECT dvalue FROM vrp_srv_data WHERE dkey = @key")
  98.  
  99. MySQL.createCommand("vRP/get_banned","SELECT banned FROM vrp_users WHERE id = @user_id")
  100. MySQL.createCommand("vRP/set_banned","UPDATE vrp_users SET banned = @banned WHERE id = @user_id")
  101. MySQL.createCommand("vRP/get_whitelisted","SELECT whitelisted FROM vrp_users WHERE id = @user_id")
  102. MySQL.createCommand("vRP/set_whitelisted","UPDATE vrp_users SET whitelisted = @whitelisted WHERE id = @user_id")
  103. MySQL.createCommand("vRP/set_last_login","UPDATE vrp_users SET last_login = @last_login WHERE id = @user_id")
  104. MySQL.createCommand("vRP/get_last_login","SELECT last_login FROM vrp_users WHERE id = @user_id")
  105.  
  106. -- init tables
  107. print("[SPARTACUS] init base tables")
  108. MySQL.execute("vRP/base_tables")
  109.  
  110. -- identification system
  111.  
  112. --- sql.
  113. -- cbreturn user id or nil in case of error (if not found, will create it)
  114. function vRP.getUserIdByIdentifiers(ids, cbr)
  115. local task = Task(cbr)
  116.  
  117. if ids ~= nil and #ids then
  118. local i = 0
  119.  
  120. -- search identifiers
  121. local function search()
  122. i = i+1
  123. if i <= #ids then
  124. if not config.ignore_ip_identifier or (string.find(ids[i], "ip:") == nil) then -- ignore ip identifier
  125. MySQL.query("vRP/userid_byidentifier", {identifier = ids[i]}, function(rows, affected)
  126. if #rows > 0 then -- found
  127. task({rows[1].user_id})
  128. else -- not found
  129. search()
  130. end
  131. end)
  132. else
  133. search()
  134. end
  135. else -- no ids found, create user
  136. MySQL.query("vRP/create_user", {}, function(rows, affected)
  137. if #rows > 0 then
  138. local user_id = rows[1].id
  139. -- add identifiers
  140. for l,w in pairs(ids) do
  141. if not config.ignore_ip_identifier or (string.find(w, "ip:") == nil) then -- ignore ip identifier
  142. MySQL.execute("vRP/add_identifier", {user_id = user_id, identifier = w})
  143. end
  144. end
  145.  
  146. task({user_id})
  147. else
  148. task()
  149. end
  150. end)
  151. end
  152. end
  153.  
  154. search()
  155. else
  156. task()
  157. end
  158. end
  159.  
  160. -- return identification string for the source (used for non vRP identifications, for rejected players)
  161. function vRP.getSourceIdKey(source)
  162. local ids = GetPlayerIdentifiers(source)
  163. local idk = "idk_"
  164. for k,v in pairs(ids) do
  165. idk = idk..v
  166. end
  167.  
  168. return idk
  169. end
  170.  
  171. function vRP.getPlayerEndpoint(player)
  172. return GetPlayerEP(player) or "0.0.0.0"
  173. end
  174.  
  175. function vRP.getPlayerName(player)
  176. return GetPlayerName(player) or "unknown"
  177. end
  178.  
  179. --- sql
  180. function vRP.isBanned(user_id, cbr)
  181. local task = Task(cbr, {false})
  182.  
  183. MySQL.query("vRP/get_banned", {user_id = user_id}, function(rows, affected)
  184. if #rows > 0 then
  185. task({rows[1].banned})
  186. else
  187. task()
  188. end
  189. end)
  190. end
  191.  
  192. --- sql
  193. function vRP.setBanned(user_id,banned)
  194. MySQL.execute("vRP/set_banned", {user_id = user_id, banned = banned})
  195. end
  196.  
  197. --- sql
  198. function vRP.isWhitelisted(user_id, cbr)
  199. local task = Task(cbr, {false})
  200.  
  201. MySQL.query("vRP/get_whitelisted", {user_id = user_id}, function(rows, affected)
  202. if #rows > 0 then
  203. task({rows[1].whitelisted})
  204. else
  205. task()
  206. end
  207. end)
  208. end
  209.  
  210. --- sql
  211. function vRP.setWhitelisted(user_id,whitelisted)
  212. MySQL.execute("vRP/set_whitelisted", {user_id = user_id, whitelisted = whitelisted})
  213. end
  214.  
  215. --- sql
  216. function vRP.getLastLogin(user_id, cbr)
  217. local task = Task(cbr,{""})
  218. MySQL.query("vRP/get_last_login", {user_id = user_id}, function(rows, affected)
  219. if #rows > 0 then
  220. task({rows[1].last_login})
  221. else
  222. task()
  223. end
  224. end)
  225. end
  226.  
  227. function vRP.setUData(user_id,key,value)
  228. MySQL.execute("vRP/set_userdata", {user_id = user_id, key = key, value = value})
  229. end
  230.  
  231. function vRP.getUData(user_id,key,cbr)
  232. local task = Task(cbr,{""})
  233.  
  234. MySQL.query("vRP/get_userdata", {user_id = user_id, key = key}, function(rows, affected)
  235. if #rows > 0 then
  236. task({rows[1].dvalue})
  237. else
  238. task()
  239. end
  240. end)
  241. end
  242.  
  243. function vRP.setSData(key,value)
  244. MySQL.execute("vRP/set_srvdata", {key = key, value = value})
  245. end
  246.  
  247. function vRP.getSData(key, cbr)
  248. local task = Task(cbr,{""})
  249.  
  250. MySQL.query("vRP/get_srvdata", {key = key}, function(rows, affected)
  251. if #rows > 0 then
  252. task({rows[1].dvalue})
  253. else
  254. task()
  255. end
  256. end)
  257. end
  258.  
  259. -- return user data table for vRP internal persistant connected user storage
  260. function vRP.getUserDataTable(user_id)
  261. return vRP.user_tables[user_id]
  262. end
  263.  
  264. function vRP.getUserTmpTable(user_id)
  265. return vRP.user_tmp_tables[user_id]
  266. end
  267.  
  268. function vRP.isConnected(user_id)
  269. return vRP.rusers[user_id] ~= nil
  270. end
  271.  
  272. function vRP.isFirstSpawn(user_id)
  273. local tmp = vRP.getUserTmpTable(user_id)
  274. return tmp and tmp.spawns == 1
  275. end
  276.  
  277. function vRP.getUserId(source)
  278. if source ~= nil then
  279. local ids = GetPlayerIdentifiers(source)
  280. if ids ~= nil and #ids > 0 then
  281. return vRP.users[ids[1]]
  282. end
  283. end
  284.  
  285. return nil
  286. end
  287.  
  288. -- return map of user_id -> player source
  289. function vRP.getUsers()
  290. local users = {}
  291. for k,v in pairs(vRP.user_sources) do
  292. users[k] = v
  293. end
  294.  
  295. return users
  296. end
  297.  
  298. -- return source or nil
  299. function vRP.getUserSource(user_id)
  300. return vRP.user_sources[user_id]
  301. end
  302.  
  303. function vRP.ban(source,reason)
  304. local user_id = vRP.getUserId(source)
  305.  
  306. if user_id ~= nil then
  307. vRP.setBanned(user_id,true)
  308. vRP.kick(source,"[Banned] "..reason)
  309. end
  310. end
  311.  
  312. function vRP.kick(source,reason)
  313. DropPlayer(source,reason)
  314. end
  315.  
  316. -- tasks
  317.  
  318. function task_save_datatables()
  319. TriggerEvent("vRP:save")
  320.  
  321. Debug.pbegin("vRP save datatables")
  322. for k,v in pairs(vRP.user_tables) do
  323. vRP.setUData(k,"vRP:datatable",json.encode(v))
  324. end
  325.  
  326. Debug.pend()
  327. SetTimeout(config.save_interval*1000, task_save_datatables)
  328. end
  329. task_save_datatables()
  330.  
  331. local max_pings = math.ceil(config.ping_timeout*60/30)+1
  332. function task_timeout() -- kick users not sending ping event in 2 minutes
  333. local users = vRP.getUsers()
  334. for k,v in pairs(users) do
  335. local tmpdata = vRP.getUserTmpTable(tonumber(k))
  336. if tmpdata.pings == nil then
  337. tmpdata.pings = 0
  338. end
  339.  
  340. tmpdata.pings = tmpdata.pings+1
  341. if tmpdata.pings >= max_pings then
  342. vRP.kick(v,"[SPARTACUS] Conexão com o servidor perdida.")
  343. end
  344. end
  345.  
  346. SetTimeout(30000, task_timeout)
  347. end
  348. task_timeout()
  349.  
  350. function tvRP.ping()
  351. local user_id = vRP.getUserId(source)
  352. if user_id ~= nil then
  353. local tmpdata = vRP.getUserTmpTable(user_id)
  354. tmpdata.pings = 0 -- reinit ping countdown
  355. end
  356. end
  357.  
  358. -- handlers
  359.  
  360. AddEventHandler("playerConnecting",function(name,setMessage, deferrals)
  361. deferrals.defer()
  362.  
  363. local source = source
  364. Debug.pbegin("playerConnecting")
  365. local ids = GetPlayerIdentifiers(source)
  366.  
  367. if ids ~= nil and #ids > 0 then
  368. deferrals.update("[SPARTACUS] Checking identifiers...")
  369. vRP.getUserIdByIdentifiers(ids, function(user_id)
  370. -- 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)
  371. if user_id ~= nil then -- check user validity
  372. deferrals.update("[SPARTACUS] Checando se você está banido...")
  373. vRP.isBanned(user_id, function(banned)
  374. if not banned then
  375. deferrals.update("[SPARTACUS] Checando se você está na whitelist...")
  376. vRP.isWhitelisted(user_id, function(whitelisted)
  377. if not config.whitelist or whitelisted then
  378. Debug.pbegin("playerConnecting_delayed")
  379. if vRP.rusers[user_id] == nil then -- not present on the server, init
  380. -- init entries
  381. vRP.users[ids[1]] = user_id
  382. vRP.rusers[user_id] = ids[1]
  383. vRP.user_tables[user_id] = {}
  384. vRP.user_tmp_tables[user_id] = {}
  385. vRP.user_sources[user_id] = source
  386.  
  387. -- load user data table
  388. deferrals.update("[SPARTACUS] Carregando datatable...")
  389. vRP.getUData(user_id, "vRP:datatable", function(sdata)
  390. local data = json.decode(sdata)
  391. if type(data) == "table" then vRP.user_tables[user_id] = data end
  392.  
  393. -- init user tmp table
  394. local tmpdata = vRP.getUserTmpTable(user_id)
  395.  
  396. deferrals.update("[SPARTACUS] Verificando ultimo login...")
  397. vRP.getLastLogin(user_id, function(last_login)
  398. tmpdata.last_login = last_login or ""
  399. tmpdata.spawns = 0
  400.  
  401. -- set last login
  402. local ep = vRP.getPlayerEndpoint(source)
  403. local last_login_stamp = ep.." "..os.date("%H:%M:%S %d/%m/%Y")
  404. MySQL.execute("vRP/set_last_login", {user_id = user_id, last_login = last_login_stamp})
  405.  
  406. -- trigger join
  407. print("[SPARTACUS] "..name.." ("..vRP.getPlayerEndpoint(source)..") conectou (ID: = "..user_id..")")
  408. TriggerEvent("vRP:playerJoin", user_id, source, name, tmpdata.last_login)
  409. deferrals.done()
  410. end)
  411. end)
  412. else -- already connected
  413. print("[SPARTACUS] "..name.." ("..vRP.getPlayerEndpoint(source)..") reconectou (ID: = "..user_id..")")
  414. TriggerEvent("vRP:playerRejoin", user_id, source, name)
  415. deferrals.done()
  416.  
  417. -- reset first spawn
  418. local tmpdata = vRP.getUserTmpTable(user_id)
  419. tmpdata.spawns = 0
  420. end
  421.  
  422. Debug.pend()
  423. else
  424. print("[SPARTACUS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: sem whitelist (ID: = "..user_id..")")
  425. deferrals.done("[SPARTACUS] Sem whitelist. Lembre-se de conectar com steam, se não está relogue! (ID = "..user_id..").")
  426. end
  427. end)
  428. else
  429. print("[SPARTACUS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: banido (ID = "..user_id..")")
  430. deferrals.done("[SPARTACUS] Você está banido (ID: = "..user_id..").")
  431. end
  432. end)
  433. else
  434. print("[SPARTACUS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: Error identificado")
  435. deferrals.done("[SPARTACUS] Error identificado")
  436. end
  437. end)
  438. else
  439. print("[SPARTACUS] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: Faltando idenficação")
  440. deferrals.done("[SPARTACUS] Faltando idenficação")
  441. end
  442. Debug.pend()
  443. end)
  444.  
  445. AddEventHandler("playerDropped",function(reason)
  446. local source = source
  447. Debug.pbegin("playerDropped")
  448.  
  449. -- remove player from connected clients
  450. vRPclient.removePlayer(-1,{source})
  451.  
  452.  
  453. local user_id = vRP.getUserId(source)
  454.  
  455. if user_id ~= nil then
  456. TriggerEvent("vRP:playerLeave", user_id, source)
  457.  
  458. -- save user data table
  459. vRP.setUData(user_id,"vRP:datatable",json.encode(vRP.getUserDataTable(user_id)))
  460.  
  461. print("[SPARTACUS] "..vRP.getPlayerEndpoint(source).." desconectou do servidor (ID = "..user_id..")")
  462. vRP.users[vRP.rusers[user_id]] = nil
  463. vRP.rusers[user_id] = nil
  464. vRP.user_tables[user_id] = nil
  465. vRP.user_tmp_tables[user_id] = nil
  466. vRP.user_sources[user_id] = nil
  467. end
  468. Debug.pend()
  469. end)
  470.  
  471. RegisterServerEvent("vRPcli:playerSpawned")
  472. AddEventHandler("vRPcli:playerSpawned", function()
  473. Debug.pbegin("playerSpawned")
  474. -- register user sources and then set first spawn to false
  475. local user_id = vRP.getUserId(source)
  476. local player = source
  477. if user_id ~= nil then
  478. vRP.user_sources[user_id] = source
  479. local tmp = vRP.getUserTmpTable(user_id)
  480. tmp.spawns = tmp.spawns+1
  481. local first_spawn = (tmp.spawns == 1)
  482.  
  483. if first_spawn then
  484. -- first spawn, reference player
  485. -- send players to new player
  486. for k,v in pairs(vRP.user_sources) do
  487. vRPclient.addPlayer(source,{v})
  488. end
  489. -- send new player to all players
  490. vRPclient.addPlayer(-1,{source})
  491. end
  492.  
  493. -- set client tunnel delay at first spawn
  494. Tunnel.setDestDelay(player, config.load_delay)
  495.  
  496. -- show loading
  497. vRPclient.setProgressBar(player,{"vRP:loading", "botright", "[SPARTACUS] Carregando...", 0,0,0, 100})
  498.  
  499. SetTimeout(2000, function() -- trigger spawn event
  500. TriggerEvent("vRP:playerSpawn",user_id,player,first_spawn)
  501.  
  502. SetTimeout(config.load_duration*1000, function() -- set client delay to normal delay
  503. Tunnel.setDestDelay(player, config.global_delay)
  504. vRPclient.removeProgressBar(player,{"vRP:loading"})
  505. end)
  506. end)
  507. end
  508.  
  509. Debug.pend()
  510. end)
  511.  
  512. RegisterServerEvent("vRP:playerDied")
Advertisement
Add Comment
Please, Sign In to add comment