· 8 years ago · Mar 15, 2018, 08:06 PM
1#include <amxmodx>
2#include <fakemeta>
3#include <sqlx>
4
5static const
6 HOST[]="localhost",
7 USER[]="valiboss",
8 PASS[]="justdapz",
9 DB[]="admins",
10 TABEL[]="",
11 COL_ACC[]="unique",
12 COL_USER[]="auth"
13
14new Handle:g_SqlTuple,query[512]
15
16#define MAX_NAMES 65
17#define TASK_MESS 1000
18#define TASK_KICK 2000
19#define TASK_TIMER 4000
20new g_count,g_logtime,g_player_time[33],bool:is_logged[33],bool:changing_name[33],bool:data_ready = false,password[33][34],g_saytxt,g_sync_hud,
21g_maxplayers,type,sz_time[9],count,col_name,input[32],part_names[MAX_NAMES][32],ending_names[MAX_NAMES][32],starting_names[MAX_NAMES][32],
22Trie:g_full_nmaes,bool:is_registered[33],g_client_data[33][35],check_pass[34],params[2]
23new const separator_1[] = "==============================================================================="
24new const separator_2[] = "-------------------------------------------------------------------------------"
25new const prefix[] = "[LOG-IN SYSTEM]";
26
27public plugin_init()
28{
29 g_count=register_cvar("vjd_logcount", "1")
30 g_logtime=register_cvar("vjd_logtime", "60.0")
31
32 register_concmd("amx_passcode","VERIFY_USER")
33
34 register_forward(FM_ClientUserInfoChanged, "ClientInfoChanged")
35
36 g_full_nmaes = TrieCreate()
37 g_saytxt = get_user_msgid("SayText")
38 g_sync_hud = CreateHudSyncObj()
39 g_maxplayers = get_maxplayers()
40
41 set_task(1.0, "init_mysql")
42}
43
44public init_mysql()
45{
46 g_SqlTuple = SQL_MakeDbTuple(HOST, USER, PASS, DB)
47
48 formatex(query, charsmax(query), "CREATE TABLE IF NOT EXISTS %s (Name VARCHAR(35)) ; CREATE TABLE IF NOT EXISTS %s (Password VARCHAR(34))",COL_ACC,COL_USER)
49 SQL_ThreadQuery(g_SqlTuple, "QueryCreateTable", query)
50}
51public QueryCreateTable(failstate, Handle:query1, error[], errcode, data[], datasize, Float:queuetime)
52{
53 if(failstate == TQUERY_CONNECT_FAILED) set_fail_state("[LOG-IN SYSTEM] Could not connect to database!")
54 else if(failstate == TQUERY_QUERY_FAILED) set_fail_state("[LOG-IN SYSTEM] Query failed!")
55 else if(errcode) server_print("%s Error on query: %s", prefix, error)
56 else
57 {
58 server_print("%s MYSQL connection succesful!", prefix)
59
60 data_ready = true
61
62 for(new i = 1 ; i <= g_maxplayers ; i++)
63 {
64 if(!is_user_connecting(i) && !is_user_connected(i)) continue//da
65
66 CheckClient(i)
67 }
68 }
69}
70public QueryCollectData(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
71{
72 if(failstate == TQUERY_CONNECT_FAILED || failstate == TQUERY_QUERY_FAILED)
73 {
74 log_amx("%s", error)
75 return
76 }
77 else
78 {
79 type = data[0]
80 get_time("%H:%M:%S", sz_time, charsmax(sz_time))
81
82 if(type)
83 {
84 //new count1 = 0, count2 = 0, count3 = 0, count4 = 0
85 count = 0
86 col_name = SQL_FieldNameToNum(query, COL_USER)
87
88 server_print(" ")
89 server_print(separator_1)
90 server_print(prefix)
91 server_print(separator_2)
92 server_print("[%s] > Loading SQL table ^"%s^"", sz_time,COL_USER)
93
94 while(SQL_MoreResults(query))
95 {
96 SQL_ReadResult(query, col_name/*, input, charsmax(input)*/)
97
98 /*if(input[0] == '%')
99 {
100 if(input[strlen(input) - 1] == '%') //Part name
101 {
102 if(count1 >= MAX_NAMES) continue
103
104 replace_all(input, charsmax(input), "%", "")
105 part_names[count1++] = input
106 }
107 else // Starting name
108 {
109 if(count2 >= MAX_NAMES) continue
110
111 replace_all(input, charsmax(input), "%", "")
112 ending_names[count2++] = input
113 }
114 }
115 else
116 {
117 if(input[strlen(input) - 1] == '%') //Ending name
118 {
119 if(count3 >= MAX_NAMES) continue
120
121 replace_all(input, charsmax(input), "%", "")
122 starting_names[count3++] = input
123 }
124 else //Full name
125 {
126 if(++count4 >= MAX_NAMES) continue
127
128 replace_all(input, charsmax(input), "%", "")
129 TrieSetCell(g_full_nmaes, input, 1)
130 }
131 }*/
132
133 count++
134 SQL_NextRow(query)
135 }
136
137
138 if(count)
139 {
140 server_print("[%s] [OK] > %d access%s loaded!", sz_time, count, count > 1 ? "es" : "")
141 server_print("[%s] [OK] > SQL table ^"%s^" loaded successfully!", sz_time,COL_USER)
142 }
143 else
144 {
145 server_print("[%s] [ERROR] > There were no columns in SQL table ^"%s^"", sz_time,COL_USER)
146 server_print("[%s] [WARNING] > Reading some data from the table failed!", sz_time)
147 server_print("> Please check [ERROR] messages above for solving this problem!")
148 }
149
150 server_print(separator_1)
151 server_print(" ")
152
153 data_ready = true
154
155 for(new i = 1 ; i <= g_maxplayers ; i++)
156 {
157 if(!is_user_connecting(i) && !is_user_connected(i)) continue
158
159 CheckClient(i)
160 }
161 }
162 }
163}
164
165public client_putinserver(id)
166{
167 if(!is_user_connected(id)||is_user_bot(id)||is_user_hltv(id)) return
168
169 clear_user(id)
170 remove_tasks(id)
171
172 if(data_ready) CheckClient(id)
173
174 /*new name[32],authid[65],data[1]
175 get_user_name(id,name,charsmax(name))
176 get_user_authid(id,authid,charsmax(authid))
177
178 if(!is_user_steam(id)) formatex(query, charsmax(query), "SELECT `%s` FROM `%s` WHERE %s = ^"%s^";",COL_ACC,TABEL,COL_USER,g_client_data[id])
179 else if(is_user_steam(id)) formatex(query, charsmax(query), "SELECT `%s` FROM `%s` WHERE %s = ^"%s^";",COL_ACC,TABEL,COL_USER,g_client_data[id])
180
181 data[0] = id
182
183 SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", query, data, 1)*/
184}
185public CheckClient(id)
186{
187 if(is_user_bot(id) || is_user_hltv(id) || !data_ready) return PLUGIN_HANDLED
188
189 new name[32],authid[65]
190 get_user_name(id,name,charsmax(name))
191 get_user_authid(id,authid,charsmax(authid))
192
193 remove_tasks(id)
194 is_registered[id] = false
195 is_logged[id] = false
196
197 if(!is_user_steam(id)) formatex(query, charsmax(query), "SELECT `%s` FROM `%s` WHERE %s = ^"%s^";",COL_ACC,TABEL,COL_USER,name)
198 else if(is_user_steam(id)) formatex(query, charsmax(query), "SELECT `%s` FROM `%s` WHERE %s = ^"%s^";",COL_ACC,TABEL,COL_USER,authid)
199
200 new data[1]
201 data[0] = id
202
203 //formatex(query, charsmax(query), "SELECT `%s` FROM `%s` WHERE %s = ^"%s^";",COL_ACC,TABEL,COL_USER,g_client_data[id])
204 SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", query, data, 1)
205
206 return PLUGIN_CONTINUE
207}
208public QuerySelectData(FailState, Handle:Query, error[], errorcode, data[], datasize, Float:fQueueTime)
209{
210 if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
211 {
212 log_amx("%s", error)
213 return
214 }
215 else
216 {
217 new id = data[0];
218 new col_pass = SQL_FieldNameToNum(Query, COL_ACC)
219
220 while(SQL_MoreResults(Query))
221 {
222 SQL_ReadResult(Query, col_pass, check_pass, charsmax(check_pass))
223 is_registered[id] = true
224 password[id] = check_pass
225
226 if(is_user_connected(id))
227 {
228 //user_silentkill(id)
229 //cs_set_user_team(id, CS_TEAM_UNASSIGNED)
230 ShowMsg(id)
231 }
232
233 SQL_NextRow(Query)
234 }
235 }
236}
237public ShowMsg(id)
238{
239 remove_tasks(id)
240
241 set_task(5.0, "Messages", id+TASK_MESS)
242
243 params[0] = id
244
245 if(!is_logged[id])
246 {
247 if(!changing_name[id])
248 {
249 if(get_pcvar_num(g_count))
250 {
251 g_player_time[id] = get_pcvar_num(g_logtime)
252 ShowTimer(id+TASK_TIMER)
253 }
254 params[1] = 2
255 set_task(get_pcvar_float(g_logtime) + 3, "KickPlayer", id+TASK_KICK, params, sizeof params)
256 return PLUGIN_HANDLED
257 }
258 else
259 {
260 g_player_time[id] = -1
261 set_task(1.0, "ShowTimer", id+TASK_TIMER)
262 }
263 }
264 return PLUGIN_CONTINUE
265}
266public KickPlayer(parameters[])
267{
268 new id = parameters[0]
269 new reason = parameters[1]
270
271 if(!is_user_connecting(id) && !is_user_connected(id)) return PLUGIN_HANDLED
272
273 new userid = get_user_userid(id)
274
275 switch(reason)
276 {
277 case 1:
278 {
279 if(is_registered[id]) return PLUGIN_HANDLED
280
281 console_print(id, "^n* Cont invalid!")
282 server_cmd("kick #%i ^"You must register your name. Please, retry and register it.^"", userid)
283 }
284 case 2:
285 {
286 if(is_logged[id]) return PLUGIN_HANDLED
287
288 console_print(id, "^n* Cont invalid!")
289 server_cmd("kick #%i ^"This name is registered. Please, retry and login.^"", userid)
290 }
291 case 3:
292 {
293 console_print(id, "^n* Cont invalid!")
294 server_cmd("kick #%i ^"You have successfully Logged out! Your Auto Login function is currently disabled!^"", userid)
295 }
296 }
297 return PLUGIN_CONTINUE
298}
299public ShowTimer(id)
300{
301 id -= TASK_TIMER
302
303 if(!is_user_connected(id)) return PLUGIN_HANDLED
304
305 switch(g_player_time[id])
306 {
307 case 10..19: set_hudmessage(255, 255, 0, -1.0, -1.0, 0, 0.02, 1.0,_,_, -1)
308 case 0..9: set_hudmessage(255, 0, 0, -1.0, -1.0, 1, 0.02, 1.0,_,_, -1)
309 case -1: set_hudmessage(255, 255, 255, -1.0, -1.0, 1, 0.02, 1.0,_,_, -1)
310 default: set_hudmessage(0, 255, 0, -1.0, -1.0, 0, 0.02, 1.0,_,_, -1)
311 }
312
313 if(g_player_time[id] == 0)
314 {
315 ShowSyncHudMsg(id, g_sync_hud, "You will be kicked!")
316 return PLUGIN_CONTINUE
317 }
318 else if(!is_logged[id])
319 {
320 if(g_player_time[id] == -1)
321 {
322 ShowSyncHudMsg(id, g_sync_hud, "You will can login after the your name is changed!")
323 set_task(1.0, "ShowTimer", id+TASK_TIMER)
324 return PLUGIN_HANDLED
325 }
326
327 ShowSyncHudMsg(id, g_sync_hud, "You have %d second%s to Login!", g_player_time[id] > 1 ? "s" : "", g_player_time[id])
328 }
329 else return PLUGIN_HANDLED
330
331 g_player_time[id]--
332
333 set_task(1.0, "ShowTimer", id+TASK_TIMER)
334
335 return PLUGIN_CONTINUE
336}
337public Messages(id)
338{
339 id -= TASK_MESS
340
341 if(!is_logged[id]) client_printcolor(id, "!g%s!t You have!g %d!t seconds to login!", prefix, get_pcvar_num(g_logtime))
342}
343
344public ClientInfoChanged(id)
345{
346 if(!is_user_connected(id)) return FMRES_IGNORED
347
348 new oldname[32], newname[32];
349 get_user_name(id, oldname, charsmax(oldname))
350 get_user_info(id, "name", newname, charsmax(newname))
351
352 if(!equal(oldname, newname))
353 {
354 replace_all(newname, charsmax(newname), "%", " ")
355
356 changing_name[id] = false
357
358 if(!is_user_alive(id)) changing_name[id] = true
359 else
360 {
361 if(is_logged[id])
362 {
363 set_user_info(id, "name", oldname)
364 client_printcolor(id, "!g%s!t Sorry, but name change is not allowed for Logged players!", prefix)
365 return FMRES_HANDLED
366 }
367
368 set_task(1.0, "CheckClient", id)
369 }
370 }
371 return FMRES_IGNORED
372}
373
374public VERIFY_USER(id)
375{
376 new arg[32]
377 read_argv(1,arg,charsmax(arg))
378 if(!is_logged[id]&&is_registered[id])
379 {
380 if(!(equali(arg,password[id]))) server_cmd("kick #%d ^"Nu te-ai putut autentifica^"",get_user_userid(id))
381 else is_logged[id]=true
382 }
383}
384
385public client_disconnect(id)
386{
387 clear_user(id)
388 remove_tasks(id)
389}
390
391stock clear_user(const id)
392{
393 is_logged[id] = false
394 is_registered[id] = false
395 changing_name[id] = false
396}
397
398stock remove_tasks(const id)
399{
400 remove_task(id+TASK_MESS)
401 remove_task(id+TASK_KICK)
402 remove_task(id+TASK_TIMER)
403 remove_task(id)
404}
405
406stock client_printcolor(const id, const message[], any:...)
407{
408 new g_message[191];
409 new i = 1, players[32];
410
411 vformat(g_message, charsmax(g_message), message, 3)
412
413 replace_all(g_message, charsmax(g_message), "!g", "^4")
414 replace_all(g_message, charsmax(g_message), "!n", "^1")
415 replace_all(g_message, charsmax(g_message), "!t", "^3")
416
417 if(id) players[0] = id
418 else get_players(players, i, "ch")
419
420 for(new j = 0; j < i; j++)
421 {
422 if(is_user_connected(players[j]))
423 {
424 message_begin(MSG_ONE_UNRELIABLE, g_saytxt,_, players[j])
425 write_byte(players[j])
426 write_string(g_message)
427 message_end()
428 }
429 }
430}
431
432stock bool: is_user_steam(id)
433{
434 static dp_pointer
435 if(dp_pointer||(dp_pointer=get_cvar_pointer("dp_r_id_provider")))
436 {
437 server_cmd("dp_clientinfo %d",id)
438 server_exec()
439 return (get_pcvar_num(dp_pointer)==2) ? true : false
440 }
441 return false
442}