· 8 years ago · Mar 13, 2018, 01:44 PM
1local htmlEntities = module("lib/htmlEntities")
2
3local cfg = module("cfg/identity")
4local lang = vRP.lang
5
6local sanitizes = module("cfg/sanitizes")
7
8-- this module describe the identity system
9
10-- init sql
11MySQL.createCommand("vRP/identity_tables", [[
12CREATE TABLE IF NOT EXISTS vrp_user_identities(
13 user_id INTEGER,
14 registration VARCHAR(20),
15 phone VARCHAR(20),
16 firstname VARCHAR(50),
17 name VARCHAR(50),
18 age INTEGER,
19 CONSTRAINT pk_user_identities PRIMARY KEY(user_id),
20 CONSTRAINT fk_user_identities_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE,
21 INDEX(registration),
22 INDEX(phone)
23);
24]])
25
26MySQL.createCommand("vRP/get_user_identity","SELECT * FROM vrp_user_identities WHERE user_id = @user_id")
27MySQL.createCommand("vRP/init_user_identity","INSERT IGNORE INTO vrp_user_identities(user_id,registration,phone,firstname,name,age) VALUES(@user_id,@registration,@phone,@firstname,@name,@age)")
28MySQL.createCommand("vRP/update_user_identity","UPDATE vrp_user_identities SET firstname = @firstname, name = @name, age = @age, registration = @registration, phone = @phone WHERE user_id = @user_id")
29MySQL.createCommand("vRP/get_userbyreg","SELECT user_id FROM vrp_user_identities WHERE registration = @registration")
30MySQL.createCommand("vRP/get_userbyphone","SELECT user_id FROM vrp_user_identities WHERE phone = @phone")
31MySQL.createCommand("vRP/update_test","UPDATE `vrp_user_vehicles` inner join `vrp_user_identities` on `vrp_user_vehicles`.`user_id` = `vrp_user_identities`.`user_id` set `vrp_user_vehicles`.`vehicle_plate`= concat("P ",`vrp_user_identities`.`registration`")
32
33-- init
34MySQL.query("vRP/identity_tables")
35
36-- api
37
38-- cbreturn user identity
39function vRP.getUserIdentity(user_id, cbr)
40 local task = Task(cbr)
41
42 MySQL.query("vRP/get_user_identity", {user_id = user_id}, function(rows, affected)
43 task({rows[1]})
44 end)
45end
46
47-- cbreturn user_id by registration or nil
48function vRP.getUserByRegistration(registration, cbr)
49 local task = Task(cbr)
50
51 MySQL.query("vRP/get_userbyreg", {registration = registration or ""}, function(rows, affected)
52 if #rows > 0 then
53 task({rows[1].user_id})
54 else
55 task()
56 end
57 end)
58end
59
60-- cbreturn user_id by phone or nil
61function vRP.getUserByPhone(phone, cbr)
62 local task = Task(cbr)
63
64 MySQL.query("vRP/get_userbyphone", {phone = phone or ""}, function(rows, affected)
65 if #rows > 0 then
66 task({rows[1].user_id})
67 else
68 task()
69 end
70 end)
71end
72
73function vRP.generateStringNumber(format) -- (ex: DDDLLL, D => digit, L => letter)
74 local abyte = string.byte("A")
75 local zbyte = string.byte("0")
76
77 local number = ""
78 for i=1,#format do
79 local char = string.sub(format, i,i)
80 if char == "D" then number = number..string.char(zbyte+math.random(0,9))
81 elseif char == "L" then number = number..string.char(abyte+math.random(0,25))
82 else number = number..char end
83 end
84
85 return number
86end
87
88-- cbreturn a unique registration number
89function vRP.generateRegistrationNumber(cbr)
90 local task = Task(cbr)
91
92 local function search()
93 -- generate registration number
94 local registration = vRP.generateStringNumber("DDDLLL")
95 vRP.getUserByRegistration(registration, function(user_id)
96 if user_id ~= nil then
97 search() -- continue generation
98 else
99 task({registration})
100 end
101 end)
102 end
103
104 search()
105end
106
107-- cbreturn a unique phone number (0DDDDD, D => digit)
108function vRP.generatePhoneNumber(cbr)
109 local task = Task(cbr)
110
111 local function search()
112 -- generate phone number
113 local phone = vRP.generateStringNumber(cfg.phone_format)
114 vRP.getUserByPhone(phone, function(user_id)
115 if user_id ~= nil then
116 search() -- continue generation
117 else
118 task({phone})
119 end
120 end)
121 end
122
123 search()
124end
125
126-- events, init user identity at connection
127AddEventHandler("vRP:playerJoin",function(user_id,source,name,last_login)
128 vRP.getUserIdentity(user_id, function(identity)
129 if identity == nil then
130 vRP.generateRegistrationNumber(function(registration)
131 vRP.generatePhoneNumber(function(phone)
132 MySQL.query("vRP/init_user_identity", {
133 user_id = user_id,
134 registration = registration,
135 phone = phone,
136 firstname = cfg.random_first_names[math.random(1,#cfg.random_first_names)],
137 name = cfg.random_last_names[math.random(1,#cfg.random_last_names)],
138 age = math.random(25,40)
139 })
140 end)
141 end)
142 end
143 end)
144end)
145
146-- city hall menu
147
148local cityhall_menu = {name=lang.cityhall.title(),css={top="75px", header_color="rgba(0,125,255,0.75)"}}
149
150local function ch_identity(player,choice)
151 local user_id = vRP.getUserId(player)
152 if user_id ~= nil then
153 vRP.prompt(player,lang.cityhall.identity.prompt_firstname(),"",function(player,firstname)
154 if string.len(firstname) >= 2 and string.len(firstname) < 50 then
155 firstname = sanitizeString(firstname, sanitizes.name[1], sanitizes.name[2])
156 vRP.prompt(player,lang.cityhall.identity.prompt_name(),"",function(player,name)
157 if string.len(name) >= 2 and string.len(name) < 50 then
158 name = sanitizeString(name, sanitizes.name[1], sanitizes.name[2])
159 vRP.prompt(player,lang.cityhall.identity.prompt_age(),"",function(player,age)
160 age = parseInt(age)
161 if age >= 16 and age <= 150 then
162 if vRP.tryPayment(user_id,cfg.new_identity_cost) then
163 vRP.generateRegistrationNumber(function(registration)
164 vRP.generatePhoneNumber(function(phone)
165
166 MySQL.query("vRP/update_user_identity", {
167 user_id = user_id,
168 firstname = firstname,
169 name = name,
170 age = age,
171 registration = registration,
172 phone = phone
173 })
174
175 MySQL.query("vRP/update_test")
176
177 -- update client registration
178 vRPclient.setRegistrationNumber(player,{registration})
179 vRPclient.notify(player,{lang.money.paid({cfg.new_identity_cost})})
180 end)
181 end)
182 else
183 vRPclient.notify(player,{lang.money.not_enough()})
184 end
185 else
186 vRPclient.notify(player,{lang.common.invalid_value()})
187 end
188 end)
189 else
190 vRPclient.notify(player,{lang.common.invalid_value()})
191 end
192 end)
193 else
194 vRPclient.notify(player,{lang.common.invalid_value()})
195 end
196 end)
197 end
198end
199
200cityhall_menu[lang.cityhall.identity.title()] = {ch_identity,lang.cityhall.identity.description({cfg.new_identity_cost})}
201
202local function cityhall_enter()
203 local user_id = vRP.getUserId(source)
204 if user_id ~= nil then
205 vRP.openMenu(source,cityhall_menu)
206 end
207end
208
209local function cityhall_leave()
210 vRP.closeMenu(source)
211end
212
213local function build_client_cityhall(source) -- build the city hall area/marker/blip
214 local user_id = vRP.getUserId(source)
215 if user_id ~= nil then
216 local x,y,z = table.unpack(cfg.city_hall)
217
218 vRPclient.addBlip(source,{x,y,z,cfg.blip[1],cfg.blip[2],lang.cityhall.title()})
219 vRPclient.addMarker(source,{x,y,z-1,0.7,0.7,0.5,0,255,125,125,150})
220
221 vRP.setArea(source,"vRP:cityhall",x,y,z,1,1.5,cityhall_enter,cityhall_leave)
222 end
223end
224
225AddEventHandler("vRP:playerSpawn",function(user_id, source, first_spawn)
226 -- send registration number to client at spawn
227 vRP.getUserIdentity(user_id, function(identity)
228 if identity then
229 vRPclient.setRegistrationNumber(source,{identity.registration or "000AAA"})
230 end
231 end)
232
233 -- first spawn, build city hall
234 if first_spawn then
235 build_client_cityhall(source)
236 end
237end)
238
239-- player identity menu
240
241-- add identity to main menu
242vRP.registerMenuBuilder("main", function(add, data)
243 local player = data.player
244
245 local user_id = vRP.getUserId(player)
246 if user_id ~= nil then
247 vRP.getUserIdentity(user_id, function(identity)
248
249 if identity then
250 -- generate identity content
251 -- get address
252 vRP.getUserAddress(user_id, function(address)
253 local home = ""
254 local number = ""
255 if address then
256 home = address.home
257 number = address.number
258 end
259
260 local content = lang.cityhall.menu.info({htmlEntities.encode(identity.name),htmlEntities.encode(identity.firstname),identity.age,identity.registration,identity.phone,home,number})
261 local choices = {}
262 choices[lang.cityhall.menu.title()] = {function()end, content}
263
264 add(choices)
265 end)
266 end
267 end)
268 end
269end)