· 8 years ago · Mar 10, 2018, 09:50 PM
1MySQL = module("vrp_mysql", "MySQL")
2
3local Proxy = module("lib/Proxy")
4local Tunnel = module("lib/Tunnel")
5local Lang = module("lib/Lang")
6Debug = module("lib/Debug")
7
8local config = module("cfg/base")
9local version = module("version")
10Debug.active = config.debug
11MySQL.debug = config.debug
12
13-- open MySQL connection
14MySQL.createConnection("vRP", config.db.host,config.db.user,config.db.password,config.db.database)
15
16-- versioning
17print("[AdrenalineRP] versao de lancamento "..version)
18--[[
19PerformHttpRequest("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
29end, "GET", "")
30--]]
31
32vRP = {}
33Proxy.addInterface("vRP",vRP)
34
35tvRP = {}
36Tunnel.bindInterface("vRP",tvRP) -- listening for client tunnel
37
38-- load language
39local dict = module("cfg/lang/"..config.lang) or {}
40vRP.lang = Lang.new(dict)
41
42-- init
43vRPclient = Tunnel.getInterface("vRP","vRP") -- server -> client tunnel
44
45vRP.users = {} -- will store logged users (id) by first identifier
46vRP.rusers = {} -- store the opposite of users
47vRP.user_tables = {} -- user data tables (logger storage, saved to database)
48vRP.user_tmp_tables = {} -- user tmp data tables (logger storage, not saved)
49vRP.user_sources = {} -- user sources
50
51-- queries
52MySQL.createCommand("vRP/base_tables",[[
53CREATE TABLE IF NOT EXISTS vrp_users(
54 id INTEGER AUTO_INCREMENT,
55 last_login VARCHAR(255),
56 whitelisted BOOLEAN,
57 banned BOOLEAN,
58 CONSTRAINT pk_user PRIMARY KEY(id)
59);
60
61CREATE TABLE IF NOT EXISTS vrp_user_ids(
62 identifier VARCHAR(255),
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
68CREATE TABLE IF NOT EXISTS vrp_user_data(
69 user_id INTEGER,
70 dkey VARCHAR(255),
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
76CREATE TABLE IF NOT EXISTS vrp_srv_data(
77 dkey VARCHAR(255),
78 dvalue TEXT,
79 CONSTRAINT pk_srv_data PRIMARY KEY(dkey)
80);
81]])
82
83MySQL.createCommand("vRP/create_user","INSERT INTO vrp_users(whitelisted,banned) VALUES(false,false); SELECT LAST_INSERT_ID() AS id")
84MySQL.createCommand("vRP/add_identifier","INSERT INTO vrp_user_ids(identifier,user_id) VALUES(@identifier,@user_id)")
85MySQL.createCommand("vRP/userid_byidentifier","SELECT user_id FROM vrp_user_ids WHERE identifier = @identifier")
86
87MySQL.createCommand("vRP/set_userdata","REPLACE INTO vrp_user_data(user_id,dkey,dvalue) VALUES(@user_id,@key,@value)")
88MySQL.createCommand("vRP/get_userdata","SELECT dvalue FROM vrp_user_data WHERE user_id = @user_id AND dkey = @key")
89
90MySQL.createCommand("vRP/set_srvdata","REPLACE INTO vrp_srv_data(dkey,dvalue) VALUES(@key,@value)")
91MySQL.createCommand("vRP/get_srvdata","SELECT dvalue FROM vrp_srv_data WHERE dkey = @key")
92
93MySQL.createCommand("vRP/get_banned","SELECT banned FROM vrp_users WHERE id = @user_id")
94MySQL.createCommand("vRP/set_banned","UPDATE vrp_users SET banned = @banned WHERE id = @user_id")
95MySQL.createCommand("vRP/get_whitelisted","SELECT whitelisted FROM vrp_users WHERE id = @user_id")
96MySQL.createCommand("vRP/set_whitelisted","UPDATE vrp_users SET whitelisted = @whitelisted WHERE id = @user_id")
97MySQL.createCommand("vRP/set_last_login","UPDATE vrp_users SET last_login = @last_login WHERE id = @user_id")
98MySQL.createCommand("vRP/get_last_login","SELECT last_login FROM vrp_users WHERE id = @user_id")
99
100-- init tables
101print("[AdrenalineRP] init base tables")
102MySQL.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)
108function 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
152end
153
154-- return identification string for the source (used for non vRP identifications, for rejected players)
155function 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
163end
164
165function vRP.getPlayerEndpoint(player)
166 return GetPlayerEP(player) or "0.0.0.0"
167end
168
169function vRP.getPlayerName(player)
170 return GetPlayerName(player) or "unknown"
171end
172
173--- sql
174function 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)
184end
185
186--- sql
187function vRP.setBanned(user_id,banned)
188 MySQL.execute("vRP/set_banned", {user_id = user_id, banned = banned})
189end
190
191--- sql
192function 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)
202end
203
204--- sql
205function vRP.setWhitelisted(user_id,whitelisted)
206 MySQL.execute("vRP/set_whitelisted", {user_id = user_id, whitelisted = whitelisted})
207end
208
209--- sql
210function 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)
219end
220
221function vRP.setUData(user_id,key,value)
222 MySQL.execute("vRP/set_userdata", {user_id = user_id, key = key, value = value})
223end
224
225function 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)
235end
236
237function vRP.setSData(key,value)
238 MySQL.execute("vRP/set_srvdata", {key = key, value = value})
239end
240
241function 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)
251end
252
253-- return user data table for vRP internal persistant connected user storage
254function vRP.getUserDataTable(user_id)
255 return vRP.user_tables[user_id]
256end
257
258function vRP.getUserTmpTable(user_id)
259 return vRP.user_tmp_tables[user_id]
260end
261
262function vRP.isConnected(user_id)
263 return vRP.rusers[user_id] ~= nil
264end
265
266function vRP.isFirstSpawn(user_id)
267 local tmp = vRP.getUserTmpTable(user_id)
268 return tmp and tmp.spawns == 1
269end
270
271function 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
280end
281
282-- return map of user_id -> player source
283function 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
290end
291
292-- return source or nil
293function vRP.getUserSource(user_id)
294 return vRP.user_sources[user_id]
295end
296
297function 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
304end
305
306function vRP.kick(source,reason)
307 DropPlayer(source,reason)
308end
309
310-- tasks
311
312function 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)
322end
323task_save_datatables()
324
325local max_pings = math.ceil(config.ping_timeout*60/30)+1
326function task_timeout() -- kick users not sending ping event in 2 minutes
327 local users = vRP.getUsers()
328 for k,v in pairs(users) do
329 local tmpdata = vRP.getUserTmpTable(tonumber(k))
330 if tmpdata.pings == nil then
331 tmpdata.pings = 0
332 end
333
334 tmpdata.pings = tmpdata.pings+1
335 if tmpdata.pings >= max_pings then
336 vRP.kick(v,"[AdrenalineRP] Ping timeout.")
337 end
338 end
339
340 SetTimeout(30000, task_timeout)
341end
342task_timeout()
343
344function tvRP.ping()
345 local user_id = vRP.getUserId(source)
346 if user_id ~= nil then
347 local tmpdata = vRP.getUserTmpTable(user_id)
348 tmpdata.pings = 0 -- reinit ping countdown
349 end
350end
351
352-- handlers
353
354AddEventHandler("playerConnecting",function(name,setMessage, deferrals)
355 deferrals.defer()
356
357 local source = source
358 Debug.pbegin("playerConnecting")
359 local ids = GetPlayerIdentifiers(source)
360
361 if ids ~= nil and #ids > 0 then
362 deferrals.update("[AdrenalineRP] Checando identificadores...")
363 vRP.getUserIdByIdentifiers(ids, function(user_id)
364 -- 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)
365 if user_id ~= nil then -- check user validity
366 deferrals.update("[AdrenalineRP] Checando lista de banidos...")
367 vRP.isBanned(user_id, function(banned)
368 if not banned then
369 deferrals.update("[AdrenalineRP] Checando lista de aceitos na whitelist...")
370 vRP.isWhitelisted(user_id, function(whitelisted)
371 if not config.whitelist or whitelisted then
372 Debug.pbegin("playerConnecting_delayed")
373 if vRP.rusers[user_id] == nil then -- not present on the server, init
374 -- init entries
375 vRP.users[ids[1]] = user_id
376 vRP.rusers[user_id] = ids[1]
377 vRP.user_tables[user_id] = {}
378 vRP.user_tmp_tables[user_id] = {}
379 vRP.user_sources[user_id] = source
380
381 -- load user data table
382 deferrals.update("[AdrenalineRP] Carregando tabela de dados...")
383 vRP.getUData(user_id, "vRP:datatable", function(sdata)
384 local data = json.decode(sdata)
385 if type(data) == "table" then vRP.user_tables[user_id] = data end
386
387 -- init user tmp table
388 local tmpdata = vRP.getUserTmpTable(user_id)
389
390 deferrals.update("[AdrenalineRP] Obtendo ultimo login...")
391 vRP.getLastLogin(user_id, function(last_login)
392 tmpdata.last_login = last_login or ""
393 tmpdata.spawns = 0
394
395 -- set last login
396 local ep = vRP.getPlayerEndpoint(source)
397 local last_login_stamp = ep.." "..os.date("%H:%M:%S %d/%m/%Y")
398 MySQL.execute("vRP/set_last_login", {user_id = user_id, last_login = last_login_stamp})
399
400 -- trigger join
401 print("[AdrenalineRP] "..name.." ("..vRP.getPlayerEndpoint(source)..") entrou (user_id = "..user_id..")")
402 TriggerEvent("vRP:playerJoin", user_id, source, name, tmpdata.last_login)
403 deferrals.done()
404 end)
405 end)
406 else -- already connected
407 print("[AdrenalineRP] "..name.." ("..vRP.getPlayerEndpoint(source)..") re-entrou (user_id = "..user_id..")")
408 TriggerEvent("vRP:playerRejoin", user_id, source, name)
409 deferrals.done()
410
411 -- reset first spawn
412 local tmpdata = vRP.getUserTmpTable(user_id)
413 tmpdata.spawns = 0
414 end
415
416 Debug.pend()
417 else
418 print("[AdrenalineRP] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: nao esta na whitelist (user_id = "..user_id..")")
419 Citizen.Wait(1000)
420 deferrals.done("Para jogar no nosso servidor voce precisa estar na whitelist... | Por que isso? Para que somente jogadores serios participem e os trolls/chatos não tenham vez :P | Como faço para ser aprovado na tal whitelist? Simples! basta entrar no nosso discord 'https://discord.gg/ZZaCKWg', depois clicar no canal de texto 'whitelist' e seguir os passos. Simples, não? :D | (Anote seu ID pois voce precisa dele para a aplicação) - (ID do Usuário = "..user_id..").")
421 end
422 end)
423 else
424 print("[AdrenalineRP] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: banido (user_id = "..user_id..")")
425 Citizen.Wait(1000)
426 deferrals.done("Você não pode jogar no servidor por que foi banido (ID do Usuário = "..user_id..").")
427 end
428 end)
429 else
430 print("[AdrenalineRP] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: erro de identificacao")
431 deferrals.done("[AdrenalineRP] Erro de identificacao, reporte ao administrador.")
432 end
433 end)
434 else
435 print("[AdrenalineRP] "..name.." ("..vRP.getPlayerEndpoint(source)..") rejeitado: faltando identificadores")
436 deferrals.done("[AdrenalineRP] Identificadores faltando.")
437 end
438 Debug.pend()
439end)
440
441AddEventHandler("playerDropped",function(reason)
442 local source = source
443 Debug.pbegin("playerDropped")
444
445 -- remove player from connected clients
446 vRPclient.removePlayer(-1,{source})
447
448
449 local user_id = vRP.getUserId(source)
450
451 if user_id ~= nil then
452 TriggerEvent("vRP:playerLeave", user_id, source)
453
454 -- save user data table
455 vRP.setUData(user_id,"vRP:datatable",json.encode(vRP.getUserDataTable(user_id)))
456
457 print("[AdrenalineRP] "..vRP.getPlayerEndpoint(source).." disconectou (user_id = "..user_id..")")
458 vRP.users[vRP.rusers[user_id]] = nil
459 vRP.rusers[user_id] = nil
460 vRP.user_tables[user_id] = nil
461 vRP.user_tmp_tables[user_id] = nil
462 vRP.user_sources[user_id] = nil
463 end
464 Debug.pend()
465end)
466
467RegisterServerEvent("vRPcli:playerSpawned")
468AddEventHandler("vRPcli:playerSpawned", function()
469 Debug.pbegin("playerSpawned")
470 -- register user sources and then set first spawn to false
471 local user_id = vRP.getUserId(source)
472 local player = source
473 if user_id ~= nil then
474 vRP.user_sources[user_id] = source
475 local tmp = vRP.getUserTmpTable(user_id)
476 tmp.spawns = tmp.spawns+1
477 local first_spawn = (tmp.spawns == 1)
478
479 if first_spawn then
480 -- first spawn, reference player
481 -- send players to new player
482 for k,v in pairs(vRP.user_sources) do
483 vRPclient.addPlayer(source,{v})
484 end
485 -- send new player to all players
486 vRPclient.addPlayer(-1,{source})
487 end
488
489 -- set client tunnel delay at first spawn
490 Tunnel.setDestDelay(player, config.load_delay)
491
492 -- show loading
493 --vRPclient.setProgressBar(player,{"vRP:loading", "botright", "Carregando...", 0,0,0, 100})
494 TriggerClientEvent("pNotify:SetQueueMax", -1, "global", 5)
495 TriggerClientEvent("pNotify:SendNotification", source, {text = "Carregando...", type = "success", timeout = 3500, queue = "global", layout = "bottomRight",animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}})
496
497
498 SetTimeout(2000, function() -- trigger spawn event
499 TriggerEvent("vRP:playerSpawn",user_id,player,first_spawn)
500
501 SetTimeout(config.load_duration*1000, function() -- set client delay to normal delay
502 Tunnel.setDestDelay(player, config.global_delay)
503 vRPclient.removeProgressBar(player,{"vRP:loading"})
504 end)
505 end)
506 end
507
508 Debug.pend()
509end)
510
511RegisterServerEvent("vRP:playerDied")