gradio

Untitled

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