· 5 years ago · Mar 14, 2020, 06:48 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
16vRP = {}
17Proxy.addInterface("vRP",vRP)
18
19tvRP = {}
20Tunnel.bindInterface("vRP",tvRP) -- listening for client tunnel
21
22-- load language
23local dict = module("cfg/lang/"..config.lang) or {}
24vRP.lang = Lang.new(dict)
25
26-- init
27vRPclient = Tunnel.getInterface("vRP","vRP") -- server -> client tunnel
28
29vRP.users = {} -- will store logged users (id) by first identifier
30vRP.rusers = {} -- store the opposite of users
31vRP.user_tables = {} -- user data tables (logger storage, saved to database)
32vRP.user_tmp_tables = {} -- user tmp data tables (logger storage, not saved)
33vRP.user_sources = {} -- user sources
34
35-- queries
36MySQL.createCommand("vRP/base_tables",[[
37CREATE TABLE IF NOT EXISTS vrp_users(
38 id INTEGER AUTO_INCREMENT,
39 last_login VARCHAR(255),
40 whitelisted BOOLEAN,
41 banned BOOLEAN,
42 CONSTRAINT pk_user PRIMARY KEY(id)
43);
44
45CREATE TABLE IF NOT EXISTS vrp_user_ids(
46 identifier VARCHAR(255),
47 user_id INTEGER,
48 CONSTRAINT pk_user_ids PRIMARY KEY(identifier),
49 CONSTRAINT fk_user_ids_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE
50);
51
52CREATE TABLE IF NOT EXISTS vrp_user_data(
53 user_id INTEGER,
54 dkey VARCHAR(255),
55 dvalue TEXT,
56 CONSTRAINT pk_user_data PRIMARY KEY(user_id,dkey),
57 CONSTRAINT fk_user_data_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE
58);
59
60CREATE TABLE IF NOT EXISTS vrp_srv_data(
61 dkey VARCHAR(255),
62 dvalue TEXT,
63 CONSTRAINT pk_srv_data PRIMARY KEY(dkey)
64);
65]])
66
67MySQL.createCommand("vRP/create_user","INSERT INTO vrp_users(whitelisted,banned) VALUES(false,false); SELECT LAST_INSERT_ID() AS id")
68MySQL.createCommand("vRP/add_identifier","INSERT INTO vrp_user_ids(identifier,user_id) VALUES(@identifier,@user_id)")
69MySQL.createCommand("vRP/userid_byidentifier","SELECT user_id FROM vrp_user_ids WHERE identifier = @identifier")
70
71MySQL.createCommand("vRP/set_userdata","REPLACE INTO vrp_user_data(user_id,dkey,dvalue) VALUES(@user_id,@key,@value)")
72MySQL.createCommand("vRP/get_userdata","SELECT dvalue FROM vrp_user_data WHERE user_id = @user_id AND dkey = @key")
73
74MySQL.createCommand("vRP/set_srvdata","REPLACE INTO vrp_srv_data(dkey,dvalue) VALUES(@key,@value)")
75MySQL.createCommand("vRP/get_srvdata","SELECT dvalue FROM vrp_srv_data WHERE dkey = @key")
76
77MySQL.createCommand("vRP/get_banned","SELECT banned FROM vrp_users WHERE id = @user_id")
78MySQL.createCommand("vRP/set_banned","UPDATE vrp_users SET banned = @banned, reason = @reason WHERE id = @user_id")
79MySQL.createCommand("vRP/get_whitelisted","SELECT whitelisted FROM vrp_users WHERE id = @user_id")
80MySQL.createCommand("vRP/set_whitelisted","UPDATE vrp_users SET whitelisted = @whitelisted WHERE id = @user_id")
81MySQL.createCommand("vRP/set_last_login","UPDATE vrp_users SET last_login = @last_login, last_date = @last_date WHERE id = @user_id")
82MySQL.createCommand("vRP/get_last_login","SELECT last_login FROM vrp_users WHERE id = @user_id")
83
84-- init tables
85print("[vRP] init base tables")
86MySQL.execute("vRP/base_tables")
87
88-- identification system
89
90--- sql.
91-- cbreturn user id or nil in case of error (if not found, will create it)
92function vRP.getUserIdByIdentifiers(ids, cbr)
93 local task = Task(cbr)
94
95 if ids ~= nil and #ids then
96 local i = 0
97 local validids = 0
98
99 -- search identifiers
100 local function search()
101 i = i+1
102 if i <= #ids then
103 if (not config.ignore_ip_identifier or (string.find(ids[i], "ip:") == nil)) and (not config.ignore_license_identifier or (string.find(ids[i], "license:") == nil)) then -- ignore ip & license
104 validids = validids + 1
105 MySQL.query("vRP/userid_byidentifier", {identifier = ids[i]}, function(rows, affected)
106 if #rows > 0 then -- found
107 task({rows[1].user_id})
108 else -- not found
109 search()
110 end
111 end)
112 else
113 search()
114 end
115 elseif validids > 0 then -- no ids found, create user
116 MySQL.query("vRP/create_user", {}, function(rows, affected)
117 if #rows > 0 then
118 local user_id = rows[1].id
119 -- add identifiers
120 for l,w in pairs(ids) do
121 if (not config.ignore_ip_identifier or (string.find(w, "ip:") == nil)) and (not config.ignore_license_identifier or (string.find(w, "license:") == nil)) then -- ignore ip & license identifier
122 MySQL.execute("vRP/add_identifier", {user_id = user_id, identifier = w})
123 end
124 end
125 task({user_id})
126 else
127 task()
128 end
129 end)
130 end
131 end
132
133 search()
134 else
135 task()
136 end
137end
138
139-- return identification string for the source (used for non vRP identifications, for rejected players)
140function vRP.getSourceIdKey(source)
141 local ids = GetPlayerIdentifiers(source)
142 local idk = "idk_"
143 for k,v in pairs(ids) do
144 idk = idk..v
145 end
146
147 return idk
148end
149
150function vRP.getPlayerEndpoint(player)
151 return GetPlayerEP(player) or "0.0.0.0"
152end
153
154function vRP.getPlayerName(player)
155 return GetPlayerName(player) or "ukendt"
156end
157
158--- sql
159function vRP.isBanned(user_id, cbr)
160 local task = Task(cbr, {false})
161
162 MySQL.query("vRP/get_banned", {user_id = user_id}, function(rows, affected)
163 if #rows > 0 then
164 task({rows[1].banned})
165 else
166 task()
167 end
168 end)
169end
170
171--- BANS
172function vRP.setBanned(user_id,banned,reason)
173 MySQL.execute("vRP/set_banned", {user_id = user_id, banned = banned, reason = reason})
174end
175
176function vRP.setUnbanned(user_id,banned,reason)
177 MySQL.execute("vRP/set_banned", {user_id = user_id, banned = banned, reason = reason})
178end
179
180--- sql
181function vRP.isWhitelisted(user_id, cbr)
182 local task = Task(cbr, {false})
183
184 MySQL.query("vRP/get_whitelisted", {user_id = user_id}, function(rows, affected)
185 if #rows > 0 then
186 task({rows[1].whitelisted})
187 else
188 task()
189 end
190 end)
191end
192
193--- sql
194function vRP.setWhitelisted(user_id,whitelisted)
195 MySQL.execute("vRP/set_whitelisted", {user_id = user_id, whitelisted = whitelisted})
196end
197
198--- sql
199function vRP.getLastLogin(user_id, cbr)
200 local task = Task(cbr,{""})
201 MySQL.query("vRP/get_last_login", {user_id = user_id}, function(rows, affected)
202 if #rows > 0 then
203 task({rows[1].last_login})
204 else
205 task()
206 end
207 end)
208end
209
210function vRP.setUData(user_id,key,value)
211 MySQL.execute("vRP/set_userdata", {user_id = user_id, key = key, value = value})
212end
213
214function vRP.getUData(user_id,key,cbr)
215 local task = Task(cbr,{""})
216
217 MySQL.query("vRP/get_userdata", {user_id = user_id, key = key}, function(rows, affected)
218 if #rows > 0 then
219 task({rows[1].dvalue})
220 else
221 task()
222 end
223 end)
224end
225
226function vRP.setSData(key,value)
227 MySQL.execute("vRP/set_srvdata", {key = key, value = value})
228end
229
230function vRP.getSData(key, cbr)
231 local task = Task(cbr,{""})
232
233 MySQL.query("vRP/get_srvdata", {key = key}, function(rows, affected)
234 if #rows > 0 then
235 task({rows[1].dvalue})
236 else
237 task()
238 end
239 end)
240end
241
242-- return user data table for vRP internal persistant connected user storage
243function vRP.getUserDataTable(user_id)
244 return vRP.user_tables[user_id]
245end
246
247function vRP.getUserTmpTable(user_id)
248 return vRP.user_tmp_tables[user_id]
249end
250
251function vRP.isConnected(user_id)
252 return vRP.rusers[user_id] ~= nil
253end
254
255function vRP.isFirstSpawn(user_id)
256 local tmp = vRP.getUserTmpTable(user_id)
257 return tmp and tmp.spawns == 1
258end
259
260function vRP.getUserId(source)
261 if source ~= nil then
262 local ids = GetPlayerIdentifiers(source)
263 if ids ~= nil and #ids > 0 then
264 return vRP.users[ids[1]]
265 end
266 end
267
268 return nil
269end
270
271-- return map of user_id -> player source
272function vRP.getUsers()
273 local users = {}
274 for k,v in pairs(vRP.user_sources) do
275 users[k] = v
276 end
277
278 return users
279end
280
281-- return source or nil
282function vRP.getUserSource(user_id)
283 return vRP.user_sources[user_id]
284end
285
286function vRP.ban(source,reason)
287 local user_id = vRP.getUserId(source)
288
289 if user_id ~= nil then
290 vRP.setBanned(user_id,true,reason)
291 vRP.kick(source,"[Banned] "..reason)
292 end
293end
294
295function vRP.unban(source,reason)
296 local user_id = vRP.getUserId(source)
297
298 if user_id ~= nil then
299 vRP.setBanned(user_id,false,reason)
300 end
301end
302
303function vRP.kick(source,reason)
304 DropPlayer(source,reason)
305end
306
307-- tasks
308
309function task_save_datatables()
310 TriggerEvent("vRP:save")
311
312 Debug.pbegin("vRP save datatables")
313 for k,v in pairs(vRP.user_tables) do
314 vRP.setUData(k,"vRP:datatable",json.encode(v))
315 end
316
317 Debug.pend()
318 SetTimeout(config.save_interval*1000, task_save_datatables)
319end
320task_save_datatables()
321
322function tvRP.ping()
323 local user_id = vRP.getUserId(source)
324 if user_id ~= nil then
325 local tmpdata = vRP.getUserTmpTable(user_id)
326 tmpdata.pings = 0 -- reinit ping countdown
327 end
328end
329
330-- handlers
331
332AddEventHandler("playerConnecting",function(name,setMessage, deferrals)
333 deferrals.defer()
334
335 local source = source
336 Debug.pbegin("playerConnecting")
337 local ids = GetPlayerIdentifiers(source)
338 local playerip = vRP.getPlayerEndpoint(source)
339
340 if ids ~= nil and #ids > 0 then
341 deferrals.update("[vRP] Tjekker identitet...")
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("[vRP] Tjekker om du er banned...")
346 vRP.isBanned(user_id, function(banned)
347 if not banned then
348 deferrals.update("[vRP] Tjekker om du er whitelisted...")
349 vRP.isWhitelisted(user_id, function(whitelisted)
350 if not config.whitelist or whitelisted then
351 Debug.pbegin("playerConnecting_delayed")
352 if vRP.rusers[user_id] == nil then -- not present on the server, init
353 -- init entries
354 vRP.users[ids[1]] = user_id
355 vRP.rusers[user_id] = ids[1]
356 vRP.user_tables[user_id] = {}
357 vRP.user_tmp_tables[user_id] = {}
358 vRP.user_sources[user_id] = source
359
360 -- load user data table
361 deferrals.update("[vRP] Indlæser dine data...")
362 vRP.getUData(user_id, "vRP:datatable", function(sdata)
363 local data = json.decode(sdata)
364 if type(data) == "table" then vRP.user_tables[user_id] = data end
365
366 -- init user tmp table
367 local tmpdata = vRP.getUserTmpTable(user_id)
368
369 deferrals.update("[vRP] Tjekker seneste login...")
370 vRP.getLastLogin(user_id, function(last_login)
371 tmpdata.last_login = last_login or ""
372 tmpdata.spawns = 0
373
374 -- set last login
375 local ep = vRP.getPlayerEndpoint(source)
376 local last_login_stamp = ep
377 local last_login_date = os.date("%H:%M:%S %d/%m/%Y")
378 MySQL.execute("vRP/set_last_login", {user_id = user_id, last_login = last_login_stamp, last_date = last_login_date})
379
380 -- trigger join
381 print(name.." ("..vRP.getPlayerEndpoint(source)..") tilsluttede ("..user_id.."/"..source..")")
382 TriggerEvent("vRP:playerJoin", user_id, source, name, tmpdata.last_login)
383 deferrals.done()
384 end)
385 end)
386 else -- already connected
387 print(name.." ("..vRP.getPlayerEndpoint(source)..") tilsluttede igen ("..user_id.."/"..source..")")
388 TriggerEvent("vRP:playerRejoin", user_id, source, name)
389 deferrals.done()
390
391 -- reset first spawn
392 local tmpdata = vRP.getUserTmpTable(user_id)
393 tmpdata.spawns = 0
394 end
395
396 Debug.pend()
397 else
398 print(name.." ("..vRP.getPlayerEndpoint(source)..") afvist: ikke whitelisted ("..user_id.."/"..source..")")
399 deferrals.done("Du ikke whitelisted, ("..user_id..")")
400 end
401 end)
402 else
403 print(name.." ("..vRP.getPlayerEndpoint(source)..") afvist: banned ("..user_id.."/"..source..")")
404 deferrals.done("Du har ikke adgang ("..user_id..")")
405 end
406 end)
407 else
408 print(name.." ("..vRP.getPlayerEndpoint(source)..") afvist: identifikationsfejl")
409 deferrals.done("Kunne ikke hente dit SteamID.")
410 end
411 end)
412 else
413 print(name.." ("..vRP.getPlayerEndpoint(source)..") afvist: mangler steamid")
414 deferrals.done("Manglende SteamID, åben Steam og prøv igen.")
415 end
416 Debug.pend()
417end)
418
419AddEventHandler("playerDropped",function(reason)
420 local source = source
421 Debug.pbegin("playerDropped")
422
423 -- remove player from connected clients
424 vRPclient.removePlayer(-1,{source})
425
426
427 local user_id = vRP.getUserId(source)
428
429 if user_id ~= nil then
430 TriggerEvent("vRP:playerLeave", user_id, source)
431
432 -- save user data table
433 vRP.setUData(user_id,"vRP:datatable",json.encode(vRP.getUserDataTable(user_id)))
434
435 print("[vRP] "..vRP.getPlayerEndpoint(source).." forlod (ID: "..user_id..")")
436 vRP.users[vRP.rusers[user_id]] = nil
437 vRP.rusers[user_id] = nil
438 vRP.user_tables[user_id] = nil
439 vRP.user_tmp_tables[user_id] = nil
440 vRP.user_sources[user_id] = nil
441 end
442 Debug.pend()
443end)
444
445RegisterServerEvent("vRPcli:playerSpawned")
446AddEventHandler("vRPcli:playerSpawned", function()
447 Debug.pbegin("playerSpawned")
448 -- register user sources and then set first spawn to false
449 local user_id = vRP.getUserId(source)
450 local player = source
451 if user_id ~= nil then
452 vRP.user_sources[user_id] = source
453 local tmp = vRP.getUserTmpTable(user_id)
454 tmp.spawns = tmp.spawns+1
455 local first_spawn = (tmp.spawns == 1)
456
457 if first_spawn then
458 -- first spawn, reference player
459 -- send players to new player
460 for k,v in pairs(vRP.user_sources) do
461 vRPclient.addPlayer(source,{v})
462 end
463 -- send new player to all players
464 vRPclient.addPlayer(-1,{source})
465 end
466
467 -- set client tunnel delay at first spawn
468 Tunnel.setDestDelay(player, config.load_delay)
469
470 -- show loading
471 vRPclient.setProgressBar(player,{"vRP:loading", "botright", "Indlæser din karakter...", 0,0,0, 100})
472
473 SetTimeout(2000, function() -- trigger spawn event
474 TriggerEvent("vRP:playerSpawn",user_id,player,first_spawn)
475
476 SetTimeout(config.load_duration*1000, function() -- set client delay to normal delay
477 Tunnel.setDestDelay(player, config.global_delay)
478 vRPclient.removeProgressBar(player,{"vRP:loading"})
479 end)
480 end)
481 end
482
483 Debug.pend()
484end)
485
486RegisterServerEvent("vRP:playerDied")