· 6 years ago · Jan 31, 2020, 10:20 PM
1--## Old bWhitelist Data ##--
2
3include("gmodadminsuite/modules/jobwhitelist/sv_old_data_conversion.lua")
4
5--## Notifications ##--
6
7GAS:netInit("jobwhitelist:notifywhitelisted")
8GAS:netInit("jobwhitelist:notifyunwhitelisted")
9GAS:netInit("jobwhitelist:notifyblacklisted")
10GAS:netInit("jobwhitelist:notifyunblacklisted")
11
12--## Debug ##--
13
14GAS.JobWhitelist.Debug = false
15function GAS.JobWhitelist:PrintDebug(str)
16 if (not GAS.JobWhitelist.Debug) then return end
17 GAS:print("[JobWhitelist] " .. str, GAS_PRINT_TYPE_DEBUG)
18end
19
20--## Cache Data ##--
21
22local template = {
23 [GAS.JobWhitelist.LIST_TYPE_STEAMID] = {},
24 [GAS.JobWhitelist.LIST_TYPE_USERGROUP] = {},
25 [GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION] = {}
26}
27
28function GAS.JobWhitelist:CachePlayerAccessData(ply)
29 if (GAS.JobWhitelist.EnabledWhitelists == nil) then return end
30
31 GAS.Database:Query("SELECT `faction` FROM " .. GAS.Database:ServerTable("gas_jobwhitelist_factions") .. " WHERE `account_id`=" .. ply:AccountID(), function(rows)
32 if (not rows or #rows == 0) then return end
33 for index,faction in ipairs(GAS.JobWhitelist.Factions.Config.Factions) do
34 if (faction.ID == tonumber(rows[1].faction)) then
35 GAS.JobWhitelist.PlayerFactions[ply] = index
36 break
37 end
38 end
39 end)
40 GAS.Database:Query("SELECT * FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `account_id`=" .. ply:AccountID(), function(rows)
41 if (not rows) then return end
42 for _,v in ipairs(rows) do
43 if (not tonumber(v.job_id)) then continue end
44 local job_index = OpenPermissions:GetTeamFromIdentifier(tonumber(v.job_id))
45 if (not job_index) then continue end
46 if (tostring(v.blacklist) == "1") then
47 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()] = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()] or {}
48 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()][job_index] = true
49 else
50 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()] or {}
51 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()][job_index] = true
52 end
53 end
54 end)
55end
56
57function GAS.JobWhitelist:CacheListData()
58 GAS.JobWhitelist.EnabledWhitelists = {}
59 GAS.JobWhitelist.EnabledBlacklists = {}
60
61 GAS.JobWhitelist.Whitelists = table.Copy(template)
62 GAS.JobWhitelist.Blacklists = table.Copy(template)
63
64 GAS.JobWhitelist.PlayerFactions = {}
65
66 GAS.Database:Query("SELECT * FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists`", function(rows)
67 if (not rows) then return end
68 for _,v in ipairs(rows) do
69 if (not tonumber(v.job_id)) then continue end
70 local job_index = OpenPermissions:GetTeamFromIdentifier(tonumber(v.job_id))
71 if (not job_index) then continue end
72 if (tostring(v.blacklist) == "1") then
73 GAS.JobWhitelist.EnabledBlacklists[job_index] = true
74 else
75 GAS.JobWhitelist.EnabledWhitelists[job_index] = true
76 end
77 end
78 end)
79 GAS.Database:Query("SELECT * FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `usergroup` IS NOT NULL OR `lua_function` IS NOT NULL", function(rows)
80 if (not rows) then return end
81 for _,v in ipairs(rows) do
82 if (not tonumber(v.job_id)) then continue end
83 local job_index = OpenPermissions:GetTeamFromIdentifier(tonumber(v.job_id))
84 if (not job_index) then continue end
85 if (tostring(v.blacklist) == "1") then
86 if (v.usergroup ~= nil) then
87 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v.usergroup] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v.usergroup] or {}
88 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v.usergroup][job_index] = true
89 elseif (v.lua_function ~= nil) then
90 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] or {}
91 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][v.lua_function] = true
92 end
93 else
94 if (v.usergroup ~= nil) then
95 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v.usergroup] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v.usergroup] or {}
96 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v.usergroup][job_index] = true
97 elseif (v.lua_function ~= nil) then
98 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] or {}
99 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][v.lua_function] = true
100 end
101 end
102 end
103 end)
104
105 for _,ply in pairs(player.GetHumans()) do
106 GAS.JobWhitelist:CachePlayerAccessData(ply)
107 end
108end
109
110GAS:hook("PlayerInitialSpawn", "jobwhitelist:CachePlayerAccessData", function(ply)
111 GAS.JobWhitelist:CachePlayerAccessData(ply)
112
113 if (cookie.GetNumber("gmodadminsuite:jobwhitelist:DefaultWhitelisted:" .. ply:AccountID(), 0) == 0) then
114 cookie.Set("gmodadminsuite:jobwhitelist:DefaultWhitelisted:" .. ply:AccountID(), 1)
115 for job_id, enabled in pairs(GAS.JobWhitelist.Config.DefaultWhitelisted) do
116 local job_index = OpenPermissions:GetTeamFromIdentifier(job_id)
117 if (job_index) then
118 GAS.JobWhitelist:AddToWhitelist(job_index, GAS.JobWhitelist.LIST_TYPE_STEAMID, ply:AccountID())
119 end
120 end
121 end
122 if (cookie.GetNumber("gmodadminsuite:jobwhitelist:DefaultBlacklisted:" .. ply:AccountID(), 0) == 0) then
123 cookie.Set("gmodadminsuite:jobwhitelist:DefaultBlacklisted:" .. ply:AccountID(), 1)
124 for job_id, enabled in pairs(GAS.JobWhitelist.Config.DefaultBlacklisted) do
125 local job_index = OpenPermissions:GetTeamFromIdentifier(job_id)
126 if (job_index) then
127 GAS.JobWhitelist:AddToBlacklist(job_index, GAS.JobWhitelist.LIST_TYPE_STEAMID, ply:AccountID())
128 end
129 end
130 end
131end)
132GAS:hook("PlayerDisconnected", "jobwhitelist:ClearPlayerAccessDataCache", function(ply)
133 for job_index,data in pairs(GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID]) do
134 if (data[ply:AccountID()] ~= nil) then
135 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()][job_index] = nil
136 end
137 end
138 for job_index,data in pairs(GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID]) do
139 if (data[ply:AccountID()] ~= nil) then
140 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()][job_index] = nil
141 end
142 end
143end)
144
145--## Setup Tables ##--
146
147local function sql_init()
148 GAS.JobWhitelist:CacheListData()
149end
150if (GAS.Database.MySQLDatabase) then
151 GAS.Database:Query([[
152
153 CREATE TABLE IF NOT EXISTS ]] .. GAS.Database:ServerTable("gas_jobwhitelist_enabled_lists") .. [[ (
154 `job_id` smallint(5) unsigned NOT NULL,
155 `blacklist` tinyint(1) NOT NULL,
156 PRIMARY KEY (`job_id`,`blacklist`),
157 CONSTRAINT `jobwhitelist_enabled_lists_team_persistence` FOREIGN KEY (`job_id`) REFERENCES `gas_teams` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
158 );
159
160 CREATE TABLE IF NOT EXISTS ]] .. GAS.Database:ServerTable("gas_jobwhitelist_listing") .. [[ (
161 `blacklist` tinyint(1) unsigned NOT NULL,
162 `job_id` smallint(5) unsigned NOT NULL,
163 `account_id` int(11) unsigned DEFAULT NULL,
164 `usergroup` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
165 `lua_function` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
166 `added_by` int(11) unsigned DEFAULT NULL,
167 UNIQUE KEY `job_id` (`job_id`,`account_id`),
168 UNIQUE KEY `job_id_2` (`job_id`,`usergroup`),
169 UNIQUE KEY `job_id_3` (`job_id`,`lua_function`),
170 CONSTRAINT `jobwhitelist_listing_team_persistence` FOREIGN KEY (`job_id`) REFERENCES `gas_teams` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
171 );
172
173 CREATE TABLE IF NOT EXISTS ]] .. GAS.Database:ServerTable("gas_jobwhitelist_factions") .. [[ (
174 `account_id` int(11) unsigned NOT NULL,
175 `faction` smallint(5) unsigned NOT NULL,
176 PRIMARY KEY (`account_id`)
177 );
178
179 ]], sql_init)
180else
181 GAS.Database:Query([[
182
183 CREATE TABLE IF NOT EXISTS ]] .. GAS.Database:ServerTable("gas_jobwhitelist_enabled_lists") .. [[ (
184 "job_id" INTEGER NOT NULL,
185 "blacklist" INTEGER NOT NULL,
186 PRIMARY KEY ("job_id","blacklist"),
187 FOREIGN KEY ("job_id") REFERENCES "gas_teams" ("id") ON DELETE NO ACTION ON UPDATE CASCADE
188 );
189
190 CREATE TABLE IF NOT EXISTS ]] .. GAS.Database:ServerTable("gas_jobwhitelist_listing") .. [[ (
191 "blacklist" INTEGER NOT NULL,
192 "job_id" INTEGER NOT NULL,
193 "account_id" INTEGER DEFAULT NULL,
194 "usergroup" TEXT DEFAULT NULL,
195 "lua_function" TEXT DEFAULT NULL,
196 "added_by" INTEGER DEFAULT NULL,
197 UNIQUE ("job_id","account_id"),
198 UNIQUE ("job_id","usergroup"),
199 UNIQUE ("job_id","lua_function"),
200 FOREIGN KEY ("job_id") REFERENCES "gas_teams" ("id") ON DELETE NO ACTION ON UPDATE CASCADE
201 );
202
203 CREATE TABLE IF NOT EXISTS ]] .. GAS.Database:ServerTable("gas_jobwhitelist_factions") .. [[ (
204 "account_id" INTEGER NOT NULL,
205 "faction" INTEGER NOT NULL,
206 PRIMARY KEY ("account_id")
207 );
208
209 ]], sql_init)
210end
211
212--## IsWhitelistEnabled, IsBlacklistEnabled ##--
213
214function GAS.JobWhitelist:IsWhitelistEnabled(job_index)
215 return (GM or GAMEMODE).DefaultTeam ~= job_index and GAS.JobWhitelist.EnabledWhitelists[job_index] == true
216end
217
218function GAS.JobWhitelist:IsBlacklistEnabled(job_index)
219 return (GM or GAMEMODE).DefaultTeam ~= job_index and GAS.JobWhitelist.EnabledBlacklists[job_index] == true
220end
221
222--## EnableWhitelist, DisableWhitelist ##--
223
224function GAS.JobWhitelist:EnableWhitelist(job_index, ply)
225 if ((GM or GAMEMODE).DefaultTeam == job_index) then return end
226
227 GAS.JobWhitelist.EnabledWhitelists[job_index] = true
228 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists` (`blacklist`, `job_id`) VALUES(0, ?)", {OpenPermissions:GetTeamIdentifier(job_index)})
229
230 for _,ply in ipairs(player.GetHumans()) do
231 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
232 net.WriteUInt(job_index, 16)
233 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
234 net.Send(ply)
235 end
236
237 local by_account_id
238 if (IsValid(ply)) then
239 by_account_id = ply:AccountID()
240 end
241 hook.Run("bWhitelist:WhitelistEnabled", job_index, by_account_id)
242end
243
244function GAS.JobWhitelist:DisableWhitelist(job_index, ply)
245 GAS.JobWhitelist.EnabledWhitelists[job_index] = nil
246 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists` WHERE `blacklist`=0 AND `job_id`=?", {OpenPermissions:GetTeamIdentifier(job_index)})
247
248 if (GAS.JobWhitelist:IsBlacklistEnabled(job_index)) then
249 for _,ply in ipairs(player.GetHumans()) do
250 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
251 net.WriteUInt(job_index, 16)
252 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
253 net.Send(ply)
254 end
255 else
256 GAS:netStart("jobwhitelist:RemovePlayerAccessibleJob")
257 net.WriteUInt(job_index, 16)
258 net.Broadcast()
259 end
260
261 local by_account_id
262 if (IsValid(ply)) then
263 by_account_id = ply:AccountID()
264 end
265 hook.Run("bWhitelist:WhitelistDisabled", job_index, by_account_id)
266end
267
268--## EnableBlacklist, DisableBlacklist ##--
269
270function GAS.JobWhitelist:EnableBlacklist(job_index, ply)
271 if ((GM or GAMEMODE).DefaultTeam == job_index) then return end
272
273 GAS.JobWhitelist.EnabledBlacklists[job_index] = true
274 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists` (`blacklist`, `job_id`) VALUES(1, ?)", {OpenPermissions:GetTeamIdentifier(job_index)})
275
276 if (GAS.JobWhitelist.Config.ShowUnjoinableJobs ~= true) then
277 for _,ply in ipairs(player.GetHumans()) do
278 if (GAS.JobWhitelist.Config.OperatorsSkipBlacklists and GAS.JobWhitelist.Config.OperatorsSkipWhitelists and OpenPermissions:IsOperator(ply)) then
279 GAS:netStart("jobwhitelist:CanAccessAllJobs")
280 net.Send(ply)
281 else
282 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
283 net.WriteUInt(job_index, 16)
284 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
285 net.Send(ply)
286 end
287 end
288 end
289
290 local by_account_id
291 if (IsValid(ply)) then
292 by_account_id = ply:AccountID()
293 end
294 hook.Run("bWhitelist:BlacklistEnabled", job_index, by_account_id)
295end
296
297function GAS.JobWhitelist:DisableBlacklist(job_index, ply)
298 GAS.JobWhitelist.EnabledBlacklists[job_index] = nil
299 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists` WHERE `blacklist`=1 AND `job_id`=?", {OpenPermissions:GetTeamIdentifier(job_index)})
300
301 if (GAS.JobWhitelist.Config.ShowUnjoinableJobs ~= true) then
302 if (GAS.JobWhitelist:IsWhitelistEnabled(job_index)) then
303 for _,ply in ipairs(player.GetHumans()) do
304 if (GAS.JobWhitelist.Config.OperatorsSkipBlacklists and GAS.JobWhitelist.Config.OperatorsSkipWhitelists and OpenPermissions:IsOperator(ply)) then
305 GAS:netStart("jobwhitelist:CanAccessAllJobs")
306 net.Send(ply)
307 else
308 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
309 net.WriteUInt(job_index, 16)
310 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
311 net.Send(ply)
312 end
313 end
314 else
315 GAS:netStart("jobwhitelist:RemovePlayerAccessibleJob")
316 net.WriteUInt(job_index, 16)
317 net.Broadcast()
318 end
319 end
320
321 local by_account_id
322 if (IsValid(ply)) then
323 by_account_id = ply:AccountID()
324 end
325 hook.Run("bWhitelist:BlacklistDisabled", job_index, by_account_id)
326end
327
328--## AddToWhitelist, AddToBlacklist ##--
329
330function GAS.JobWhitelist:AddToWhitelist(job_index, list_type, value, ply)
331 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID and type(value) == "string") then
332 if (value:find("^STEAM_%d:%d:%d+$")) then
333 value = GAS:SteamIDToAccountID(value)
334 elseif (value:find("^7656119%d+$")) then
335 value = GAS:SteamID64ToAccountID(value)
336 elseif (value == "BOT" or (tonumber(value) and tonumber(value) >= 90071996842377216)) then
337 return
338 elseif (tonumber(value)) then
339 value = tonumber(value)
340 end
341 end
342
343 local added_by_account_id = NULL
344 local added_by_account_id_hook
345 if (IsValid(ply)) then
346 added_by_account_id, added_by_account_id_hook = ply:AccountID(), ply:AccountID()
347 end
348 local job_id = OpenPermissions:GetTeamIdentifier(job_index)
349 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID) then
350
351 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value] or {}
352 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value][job_index] = true
353 if (GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value]) then
354 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value][job_index] = nil
355 end
356
357 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` (`blacklist`,`job_id`,`account_id`,`added_by`) VALUES(0,?,?,?)", {job_id, value, added_by_account_id})
358
359 local affected_ply = player.GetByAccountID(value)
360 if (IsValid(affected_ply)) then
361 if (GAS.JobWhitelist.Config.AutoSwitch == true and GAS.JobWhitelist.Config.AutoSwitch_Disabled[job_id] ~= true) then
362 affected_ply:changeTeam(job_index)
363 end
364 if (GAS.JobWhitelist.Config.NotifyWhitelisted == true) then
365 GAS:netStart("jobwhitelist:notifywhitelisted")
366 net.WriteUInt(job_index, 12)
367 net.Send(affected_ply)
368 end
369 end
370
371 hook.Run("bWhitelist:SteamIDAddedToWhitelist", value, job_index, added_by_account_id_hook)
372
373 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_USERGROUP) then
374
375 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value] or {}
376 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value][job_index] = true
377 if (GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value]) then
378 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value][job_index] = nil
379 end
380
381 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` (`blacklist`,`job_id`,`usergroup`,`added_by`) VALUES(0,?,?,?)", {job_id, value, added_by_account_id})
382
383 hook.Run("bWhitelist:UsergroupAddedToWhitelist", value, job_index, added_by_account_id_hook)
384
385 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION and GAS.LuaFunctions[value] ~= nil) then
386
387 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] or {}
388 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][value] = true
389 if (GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index]) then
390 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][value] = nil
391 end
392
393 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` (`blacklist`,`job_id`,`lua_function`,`added_by`) VALUES(0,?,?,?)", {job_id, value, added_by_account_id})
394
395 hook.Run("bWhitelist:LuaFunctionAddedToWhitelist", value, job_index, added_by_account_id_hook)
396
397 end
398
399 if (GAS.JobWhitelist.Config.ShowUnjoinableJobs ~= true) then
400 for _,ply in ipairs(player.GetHumans()) do
401 if (GAS.JobWhitelist.Config.OperatorsSkipBlacklists and GAS.JobWhitelist.Config.OperatorsSkipWhitelists and OpenPermissions:IsOperator(ply)) then
402 GAS:netStart("jobwhitelist:CanAccessAllJobs")
403 net.Send(ply)
404 else
405 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
406 net.WriteUInt(job_index, 16)
407 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
408 net.Send(ply)
409 end
410 end
411 end
412end
413
414function GAS.JobWhitelist:AddToBlacklist(job_index, list_type, value, ply)
415 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID and type(value) == "string") then
416 if (value:find("^STEAM_%d:%d:%d+$")) then
417 value = GAS:SteamIDToAccountID(value)
418 elseif (value:find("^7656119%d+$")) then
419 value = GAS:SteamID64ToAccountID(value)
420 elseif (value == "BOT" or (tonumber(value) and tonumber(value) >= 90071996842377216)) then
421 return
422 elseif (tonumber(value)) then
423 value = tonumber(value)
424 end
425 end
426
427 local added_by_account_id = NULL
428 local added_by_account_id_hook
429 if (IsValid(ply)) then
430 added_by_account_id, added_by_account_id_hook = ply:AccountID(), ply:AccountID()
431 end
432 local job_id = OpenPermissions:GetTeamIdentifier(job_index)
433 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID) then
434
435 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value] = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value] or {}
436 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value][job_index] = true
437 if (GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value]) then
438 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value][job_index] = nil
439 end
440
441 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` (`blacklist`,`job_id`,`account_id`,`added_by`) VALUES(1,?,?,?)", {job_id, value, added_by_account_id})
442
443 local affected_ply = player.GetByAccountID(value)
444 if (IsValid(affected_ply)) then
445 if (GAS.JobWhitelist.Config.SwitchJobOnBlacklist == true and affected_ply:Team() == job_index) then
446 affected_ply:changeTeam((GM or GAMEMODE).DefaultTeam, true)
447 end
448 if (GAS.JobWhitelist.Config.NotifyBlacklisted == true) then
449 GAS:netStart("jobwhitelist:notifyblacklisted")
450 net.WriteUInt(job_index, 12)
451 net.Send(affected_ply)
452 end
453 end
454
455 hook.Run("bWhitelist:SteamIDAddedToBlacklist", value, job_index, added_by_account_id_hook)
456
457 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_USERGROUP) then
458
459 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value] = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value] or {}
460 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value][job_index] = true
461 if (GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value]) then
462 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value][job_index] = nil
463 end
464
465 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` (`blacklist`,`job_id`,`usergroup`,`added_by`) VALUES(1,?,?,?)", {job_id, value, added_by_account_id})
466
467 hook.Run("bWhitelist:UsergroupAddedToBlacklist", value, job_index, added_by_account_id_hook)
468
469 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION and GAS.LuaFunctions[value] ~= nil) then
470
471 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index] or {}
472 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][value] = true
473 if (GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index]) then
474 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][value] = nil
475 end
476
477 GAS.Database:Prepare("REPLACE INTO `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` (`blacklist`,`job_id`,`lua_function`,`added_by`) VALUES(1,?,?,?)", {job_id, value, added_by_account_id})
478
479 hook.Run("bWhitelist:LuaFunctionAddedToBlacklist", value, job_index, added_by_account_id_hook)
480
481 end
482
483 if (GAS.JobWhitelist.Config.ShowUnjoinableJobs ~= true) then
484 for _,ply in ipairs(player.GetHumans()) do
485 if (GAS.JobWhitelist.Config.OperatorsSkipBlacklists and GAS.JobWhitelist.Config.OperatorsSkipWhitelists and OpenPermissions:IsOperator(ply)) then
486 GAS:netStart("jobwhitelist:CanAccessAllJobs")
487 net.Send(ply)
488 else
489 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
490 net.WriteUInt(job_index, 16)
491 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
492 net.Send(ply)
493 end
494 end
495 end
496end
497
498--## RemoveFromWhitelist, RemoveFromBlacklist ##--
499
500function GAS.JobWhitelist:RemoveFromWhitelist(job_index, list_type, value, ply)
501 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID and type(value) == "string") then
502 if (value:find("^STEAM_%d:%d:%d+$")) then
503 value = GAS:SteamIDToAccountID(value)
504 elseif (value:find("^7656119%d+$")) then
505 value = GAS:SteamID64ToAccountID(value)
506 elseif (value == "BOT" or (tonumber(value) and tonumber(value) >= 90071996842377216)) then
507 return
508 elseif (tonumber(value)) then
509 value = tonumber(value)
510 end
511 end
512
513 local removed_by_account_id_hook
514 if (IsValid(ply)) then
515 removed_by_account_id_hook = ply:AccountID()
516 end
517 local job_id = OpenPermissions:GetTeamIdentifier(job_index)
518 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID) then
519
520 if (GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value]) then
521 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value][job_index] = nil
522 end
523 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `blacklist`=0 AND `job_id`=? AND `account_id`=?", {job_id, value})
524
525 local affected_ply = player.GetByAccountID(value)
526 if (IsValid(affected_ply)) then
527 if (GAS.JobWhitelist.Config.SwitchJobOnUnwhitelist == true and affected_ply:Team() == job_index and (hook.Run("playerCanChangeTeam", affected_ply, job_index) or true) ~= true) then
528 affected_ply:changeTeam((GM or GAMEMODE).DefaultTeam, true)
529 end
530 if (GAS.JobWhitelist.Config.NotifyUnwhitelisted == true) then
531 GAS:netStart("jobwhitelist:notifyunwhitelisted")
532 net.WriteUInt(job_index, 12)
533 net.Send(affected_ply)
534 end
535 end
536
537 hook.Run("bWhitelist:SteamIDRemovedFromWhitelist", value, job_index, removed_by_account_id_hook)
538
539 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_USERGROUP) then
540
541 if (GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value]) then
542 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value][job_index] = nil
543 end
544 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `blacklist`=0 AND `job_id`=? AND `usergroup`=?", {job_id, value})
545
546 hook.Run("bWhitelist:UsergroupRemovedFromWhitelist", value, job_index, removed_by_account_id_hook)
547
548 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION and GAS.LuaFunctions[value] ~= nil) then
549
550 if (GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index]) then
551 GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][value] = nil
552 end
553 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `blacklist`=0 AND `job_id`=? AND `lua_function`=?", {job_id, value})
554
555 hook.Run("bWhitelist:LuaFunctionRemovedFromWhitelist", value, job_index, removed_by_account_id_hook)
556
557 end
558
559 if (GAS.JobWhitelist.Config.ShowUnjoinableJobs ~= true) then
560 for _,ply in ipairs(player.GetHumans()) do
561 if (GAS.JobWhitelist.Config.OperatorsSkipBlacklists and GAS.JobWhitelist.Config.OperatorsSkipWhitelists and OpenPermissions:IsOperator(ply)) then
562 GAS:netStart("jobwhitelist:CanAccessAllJobs")
563 net.Send(ply)
564 else
565 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
566 net.WriteUInt(job_index, 16)
567 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
568 net.Send(ply)
569 end
570 end
571 end
572end
573
574function GAS.JobWhitelist:RemoveFromBlacklist(job_index, list_type, value, ply)
575 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID and type(value) == "string") then
576 if (value:find("^STEAM_%d:%d:%d+$")) then
577 value = GAS:SteamIDToAccountID(value)
578 elseif (value:find("^7656119%d+$")) then
579 value = GAS:SteamID64ToAccountID(value)
580 elseif (value == "BOT" or (tonumber(value) and tonumber(value) >= 90071996842377216)) then
581 return
582 elseif (tonumber(value)) then
583 value = tonumber(value)
584 end
585 end
586
587 local removed_by_account_id_hook
588 if (IsValid(ply)) then
589 removed_by_account_id_hook = ply:AccountID()
590 end
591 local job_id = OpenPermissions:GetTeamIdentifier(job_index)
592 if (list_type == GAS.JobWhitelist.LIST_TYPE_STEAMID) then
593
594 if (GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value]) then
595 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][value][job_index] = nil
596 end
597 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `blacklist`=1 AND `job_id`=? AND `account_id`=?", {job_id, value})
598
599 local affected_ply = player.GetByAccountID(value)
600 if (IsValid(affected_ply)) then
601 if (GAS.JobWhitelist.Config.NotifyUnblacklisted == true) then
602 GAS:netStart("jobwhitelist:notifyunblacklisted")
603 net.WriteUInt(job_index, 12)
604 net.Send(affected_ply)
605 end
606 end
607
608 hook.Run("bWhitelist:SteamIDRemovedFromBlacklist", value, job_index, removed_by_account_id_hook)
609
610 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_USERGROUP) then
611
612 if (GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value]) then
613 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][value][job_index] = nil
614 end
615 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `blacklist`=1 AND `job_id`=? AND `usergroup`=?", {job_id, value})
616
617 hook.Run("bWhitelist:UsergroupRemovedFromBlacklist", value, job_index, removed_by_account_id_hook)
618
619 elseif (list_type == GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION and GAS.LuaFunctions[value] ~= nil) then
620
621 if (GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index]) then
622 GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index][value] = nil
623 end
624 GAS.Database:Prepare("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing` WHERE `blacklist`=1 AND `job_id`=? AND `lua_function`=?", {job_id, value})
625
626 hook.Run("bWhitelist:LuaFunctionRemovedFromBlacklist", value, job_index, removed_by_account_id_hook)
627
628 end
629
630 if (GAS.JobWhitelist.Config.ShowUnjoinableJobs ~= true) then
631 for _,ply in ipairs(player.GetHumans()) do
632 if (GAS.JobWhitelist.Config.OperatorsSkipBlacklists and GAS.JobWhitelist.Config.OperatorsSkipWhitelists and OpenPermissions:IsOperator(ply)) then
633 GAS:netStart("jobwhitelist:CanAccessAllJobs")
634 net.Send(ply)
635 else
636 GAS:netStart("jobwhitelist:GetPlayerAccessibleJob")
637 net.WriteUInt(job_index, 16)
638 net.WriteBool(GAS.JobWhitelist:CanAccessJob(ply, job_index))
639 net.Send(ply)
640 end
641 end
642 end
643end
644
645--## IsWhitelisted, IsBlacklisted ##--
646
647function GAS.JobWhitelist:IsWhitelisted(ply, job_index, faction_insensitive)
648 GAS.JobWhitelist:PrintDebug("Checking if " .. ply:Nick() .. " [" .. ply:SteamID() .. "] is whitelisted for job " .. RPExtraTeams[job_index].name .. " [" .. OpenPermissions:GetTeamIdentifier(job_index) .. "]...")
649
650 if (not GAS.JobWhitelist:IsWhitelistEnabled(job_index)) then
651 GAS.JobWhitelist:PrintDebug("Whitelist is disabled!")
652 return false
653 end
654 if (faction_insensitive ~= true and GAS.JobWhitelist.Factions.Config.Enabled) then
655 local faction_index = GAS.JobWhitelist.PlayerFactions[ply]
656 if (faction_index ~= nil) then
657 local faction = GAS.JobWhitelist.Factions.Config.Factions[faction_index]
658 if (faction ~= nil and not GAS:table_IsEmpty(faction.WhitelistTo)) then
659 local job_id = OpenPermissions:GetTeamIdentifier(job_index)
660 if (faction.WhitelistTo[job_id]) then
661 GAS.JobWhitelist:PrintDebug("User is WHITELISTED by faction: " .. faction.Name)
662 return true
663 end
664 end
665 end
666 end
667 local account_id_data = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()]
668 if (account_id_data and account_id_data[job_index]) then
669 GAS.JobWhitelist:PrintDebug("User is WHITELISTED by SteamID")
670 return true
671 end
672 for v in pairs(OpenPermissions:GetUserGroups(ply)) do
673 local usergroup_data = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v]
674 if (usergroup_data and usergroup_data[job_index]) then
675 GAS.JobWhitelist:PrintDebug("User is WHITELISTED by usergroup")
676 return true
677 end
678 end
679 local lua_function_data = GAS.JobWhitelist.Whitelists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index]
680 if (lua_function_data) then
681 for lua_function_name,_ in pairs(lua_function_data) do
682 local lua_function = GAS.LuaFunctions[lua_function_name]
683 if (lua_function) then
684 if (lua_function(ply, job_index) == true) then
685 GAS.JobWhitelist:PrintDebug("User is WHITELISTED by Lua function: " .. lua_function_name)
686 return true
687 end
688 end
689 end
690 end
691 GAS.JobWhitelist:PrintDebug("User is not whitelisted.")
692 return false
693end
694
695function GAS.JobWhitelist:IsBlacklisted(ply, job_index, faction_insensitive)
696 GAS.JobWhitelist:PrintDebug("Checking if " .. ply:Nick() .. " [" .. ply:SteamID() .. "] is blacklisted for job " .. RPExtraTeams[job_index].name .. " [" .. OpenPermissions:GetTeamIdentifier(job_index) .. "]...")
697
698 if (not GAS.JobWhitelist:IsBlacklistEnabled(job_index)) then
699 GAS.JobWhitelist:PrintDebug("Blacklist is disabled!")
700 return false
701 end
702 if (faction_insensitive ~= true and GAS.JobWhitelist.Factions.Config.Enabled) then
703 local faction_index = GAS.JobWhitelist.PlayerFactions[ply]
704 if (faction_index ~= nil) then
705 local faction = GAS.JobWhitelist.Factions.Config.Factions[faction_index]
706 if (faction ~= nil and not GAS:table_IsEmpty(faction.BlacklistFrom)) then
707 local job_id = OpenPermissions:GetTeamIdentifier(job_index)
708 if (faction.BlacklistFrom[job_id]) then
709 GAS.JobWhitelist:PrintDebug("User is BLACKLISTED by faction: " .. faction.Name)
710 return true
711 end
712 end
713 end
714 end
715 local account_id_data = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_STEAMID][ply:AccountID()]
716 if (account_id_data and account_id_data[job_index]) then
717 GAS.JobWhitelist:PrintDebug("User is BLACKLISTED by SteamID")
718 return true
719 end
720 for v in pairs(OpenPermissions:GetUserGroups(ply)) do
721 local usergroup_data = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_USERGROUP][v]
722 if (usergroup_data and usergroup_data[job_index]) then
723 GAS.JobWhitelist:PrintDebug("User is BLACKLISTED by usergroup")
724 return true
725 end
726 end
727 local lua_function_data = GAS.JobWhitelist.Blacklists[GAS.JobWhitelist.LIST_TYPE_LUA_FUNCTION][job_index]
728 if (lua_function_data) then
729 for lua_function_name,_ in pairs(lua_function_data) do
730 local lua_function = GAS.LuaFunctions[lua_function_name]
731 if (lua_function) then
732 if (lua_function(ply, job_index) == true) then
733 GAS.JobWhitelist:PrintDebug("User is BLACKLISTED by Lua function: " .. lua_function_name)
734 return true
735 end
736 end
737 end
738 end
739 GAS.JobWhitelist:PrintDebug("User is not blacklisted.")
740 return false
741end
742
743--## CanAccessJob ##--
744
745function GAS.JobWhitelist:CanAccessJob(ply, job_index, _is_operator)
746 GAS.JobWhitelist:PrintDebug("CanAccessJob function called")
747
748 local operators_skip_blacklists = GAS.JobWhitelist.Config.OperatorsSkipBlacklists
749 local operators_skip_whitelists = GAS.JobWhitelist.Config.OperatorsSkipWhitelists
750 local is_operator = _is_operator
751 if (is_operator == nil and (operators_skip_blacklists or operators_skip_whitelists)) then
752 is_operator = OpenPermissions:IsOperator(ply)
753 end
754
755 if (GAS.JobWhitelist:IsBlacklistEnabled(job_index)) then
756 if (is_operator and operators_skip_blacklists) then
757 GAS.JobWhitelist:PrintDebug("Player is an OPERATOR and OperatorsSkipBlacklists is ON. Skipping blacklist!")
758 elseif (GAS.JobWhitelist:IsBlacklisted(ply, job_index) == true) then
759 GAS.JobWhitelist:PrintDebug("Player is blacklisted from this job!")
760 return false, GAS.JobWhitelist.Config.BlacklistedMsg
761 else
762 GAS.JobWhitelist:PrintDebug("Player is NOT blacklisted from this job")
763 end
764 else
765 GAS.JobWhitelist:PrintDebug("Blacklist not enabled!")
766 end
767 if (GAS.JobWhitelist:IsWhitelistEnabled(job_index)) then
768 if (is_operator and operators_skip_whitelists) then
769 GAS.JobWhitelist:PrintDebug("Player is an OPERATOR and OperatorsSkipWhitelists is ON. Skipping whitelist!")
770 elseif (GAS.JobWhitelist:IsWhitelisted(ply, job_index) == false) then
771 GAS.JobWhitelist:PrintDebug("Player is not whitelisted to this job!")
772 return false, GAS.JobWhitelist.Config.NotWhitelistedMsg
773 else
774 GAS.JobWhitelist:PrintDebug("Player is whitelisted to this job")
775 end
776 else
777 GAS.JobWhitelist:PrintDebug("Whitelist not enabled!")
778 end
779
780 return true
781end
782
783--## playerCanChangeTeam ##--
784
785GAS:hook("playerCanChangeTeam", "jobwhitelist:playerCanChangeTeam", function(ply, job_index, force)
786 GAS.JobWhitelist:PrintDebug("playerCanChangeTeam hook called")
787 if (force) then
788 GAS.JobWhitelist:PrintDebug("Skipping because team change was FORCED.")
789 return
790 end
791
792 GAS.JobWhitelist:PrintDebug("Calling CanAccessJob")
793 local allow, msg = GAS.JobWhitelist:CanAccessJob(ply, job_index)
794 if (allow == false) then
795 GAS.JobWhitelist:PrintDebug("CanAccessJob returned false and " .. (msg or "no reason message"))
796 return false, msg
797 else
798 GAS.JobWhitelist:PrintDebug("CanAccessJob returned true")
799 end
800 GAS.JobWhitelist:PrintDebug("Running other playerCanChangeTeam hooks...")
801end)
802
803--# Command #--
804
805GAS:RegisterCommand("!bwhitelist", "jobwhitelist")
806
807--## FunctionMenuKey ##--
808
809GAS:hook("ShowHelp", "jobwhitelist:FunctionMenuKey:F1", function(ply)
810 if (GAS.JobWhitelist.Config.FunctionMenuKey == "F1") then
811 ply:ConCommand("gmodadminsuite jobwhitelist")
812 end
813end)
814GAS:hook("ShowTeam", "jobwhitelist:FunctionMenuKey:F2", function(ply)
815 if (GAS.JobWhitelist.Config.FunctionMenuKey == "F2") then
816 ply:ConCommand("gmodadminsuite jobwhitelist")
817 end
818end)
819GAS:hook("ShowSpare1", "jobwhitelist:FunctionMenuKey:F3", function(ply)
820 if (GAS.JobWhitelist.Config.FunctionMenuKey == "F3") then
821 ply:ConCommand("gmodadminsuite jobwhitelist")
822 end
823end)
824GAS:hook("ShowSpare2", "jobwhitelist:FunctionMenuKey:F4", function(ply)
825 if (GAS.JobWhitelist.Config.FunctionMenuKey == "F4") then
826 ply:ConCommand("gmodadminsuite jobwhitelist")
827 end
828end)
829
830--## Get player's relevant whitelisted and blacklisted jobs ##--
831
832function GAS.JobWhitelist:GetPlayerAccessibleJobs(ply)
833 local operators_skip_whitelists = GAS.JobWhitelist.Config.OperatorsSkipWhitelists
834 local operators_skip_blacklists = GAS.JobWhitelist.Config.OperatorsSkipBlacklists
835 local is_operator
836 if (operators_skip_whitelists or operators_skip_blacklists) then
837 is_operator = OpenPermissions:IsOperator(ply)
838 end
839 local accessible = {}
840 local count = 0
841 for job_index,job in ipairs(RPExtraTeams) do
842 if (GAS.JobWhitelist:CanAccessJob(ply, job_index, is_operator)) then
843 accessible[job_index] = true
844 count = count + 1
845 end
846 end
847 return accessible, count
848end
849
850--## Resets ##--
851
852GAS:netInit("jobwhitelist:reset_config")
853GAS:netInit("jobwhitelist:reset_factions_config")
854GAS:netInit("jobwhitelist:disable_all_whitelists")
855GAS:netInit("jobwhitelist:disable_all_blacklists")
856GAS:netInit("jobwhitelist:destroy_all_data")
857GAS:netInit("jobwhitelist:destroy_faction_data")
858GAS:netInit("jobwhitelist:reset_everything")
859
860GAS:netInit("jobwhitelist:CloseMenu")
861
862local kicked_msg = "Kicked by GmodAdminSuite: you are not permitted to perform this dangerous operation"
863
864GAS:netReceive("jobwhitelist:reset_config", function(ply)
865 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
866 GAS:DeleteConfig("jobwhitelist")
867 GAS.JobWhitelist.Config = GAS:GetConfig("jobwhitelist", GAS.JobWhitelist.DefaultConfig)
868
869 GAS:netStart("jobwhitelist:CloseMenu")
870 net.Broadcast()
871end)
872
873GAS:netReceive("jobwhitelist:reset_factions_config", function(ply)
874 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
875 GAS:DeleteConfig("jobwhitelist_factions")
876 GAS.JobWhitelist.Factions.Config = GAS:GetConfig("jobwhitelist_factions", GAS.JobWhitelist.Factions.DefaultConfig)
877 GAS.JobWhitelist.Factions:ConfigRefresh()
878
879 GAS:netStart("jobwhitelist:CloseMenu")
880 net.Broadcast()
881end)
882
883GAS:netReceive("jobwhitelist:disable_all_whitelists", function(ply)
884 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
885 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists` WHERE `blacklist`=0")
886
887 GAS.JobWhitelist:CacheListData()
888end)
889GAS:netReceive("jobwhitelist:disable_all_blacklists", function(ply)
890 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
891 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists` WHERE `blacklist`=1")
892
893 GAS.JobWhitelist:CacheListData()
894end)
895
896GAS:netReceive("jobwhitelist:destroy_all_data", function(ply)
897 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
898 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing`")
899 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists`")
900
901 GAS.JobWhitelist:CacheListData()
902end)
903
904GAS:netReceive("jobwhitelist:destroy_faction_data", function(ply)
905 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
906 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_factions`")
907
908 GAS.JobWhitelist:CacheListData()
909end)
910
911GAS:netReceive("jobwhitelist:reset_everything", function(ply)
912 if (not OpenPermissions:IsOperator(ply)) then ply:Kick(kicked_msg) return end
913 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_listing`")
914 GAS.Database:Query("DELETE FROM `" .. GAS.Database.ServerTablePrefix .. "gas_jobwhitelist_enabled_lists`")
915
916 GAS:DeleteConfig("jobwhitelist")
917 GAS.JobWhitelist.Config = GAS:GetConfig("jobwhitelist", GAS.JobWhitelist.DefaultConfig)
918
919 GAS:netStart("jobwhitelist:CloseMenu")
920 net.Broadcast()
921
922 GAS.JobWhitelist:CacheListData()
923end)
924
925--## Concommands ##--
926
927concommand.Add("gas_jobwhitelist", function(ply, cmd, args)
928 if (IsValid(ply)) then return end
929 if (#args == 0) then
930 GAS:print("[JobWhitelist] gas_jobwhitelist debug 1/0 - turns on verbose debugging information about who can/can't join jobs and why")
931 GAS:print("[JobWhitelist] gas_jobwhitelist add/remove steamid32/64 whitelist/blacklist TEAM_VARIABLE")
932 GAS:print("[JobWhitelist] gas_jobwhitelist enable/disable whitelist/blacklist TEAM_VARIABLE")
933 elseif (args[1] == "debug") then
934 if (not args[2]) then
935 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
936 elseif (args[2] == "0") then
937 GAS:print("[JobWhitelist] Debug turned off")
938 GAS.JobWhitelist.Debug = false
939 elseif (args[2] == "1") then
940 GAS:print("[JobWhitelist] Debug turned on")
941 GAS.JobWhitelist.Debug = true
942 end
943 elseif (args[1] == "enable" or args[1] == "disable") then
944 local is_blacklist
945 if (args[2] == "whitelist") then
946 is_blacklist = false
947 elseif (args[2] == "blacklist") then
948 is_blacklist = true
949 end
950 if (is_blacklist ~= nil) then
951 local job_index
952 if (not args[3]) then
953 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (invalid TEAM_VARIABLE)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
954 elseif (_G[args[3]] ~= nil and tonumber(_G[args[3]]) ~= nil and RPExtraTeams[tonumber(_G[args[3]])]) then
955 job_index = tonumber(_G[args[3]])
956 else
957 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (TEAM_VARIABLE not found)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
958 end
959 if (job_index ~= nil) then
960 if (is_blacklist) then
961 if (args[1] == "enable") then
962 if (GAS.JobWhitelist:IsBlacklistEnabled(job_index)) then
963 GAS:print("[JobWhitelist] The blacklist for this job is already enabled", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
964 else
965 GAS.JobWhitelist:EnableBlacklist(job_index)
966 GAS:print("[JobWhitelist] Enabled blacklist successfully", GAS_PRINT_COLOR_GOOD)
967 end
968 else
969 if (GAS.JobWhitelist:IsBlacklistEnabled(job_index)) then
970 GAS.JobWhitelist:DisableBlacklist(job_index)
971 GAS:print("[JobWhitelist] Disabled blacklist successfully", GAS_PRINT_COLOR_GOOD)
972 else
973 GAS:print("[JobWhitelist] The blacklist for this job is already disabled", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
974 end
975 end
976 else
977 if (args[1] == "enable") then
978 if (GAS.JobWhitelist:IsWhitelistEnabled(job_index)) then
979 GAS:print("[JobWhitelist] The whitelist for this job is already enabled", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
980 else
981 GAS.JobWhitelist:EnableWhitelist(job_index)
982 GAS:print("[JobWhitelist] Enabled whitelist successfully", GAS_PRINT_COLOR_GOOD)
983 end
984 else
985 if (GAS.JobWhitelist:IsWhitelistEnabled(job_index)) then
986 GAS.JobWhitelist:DisableWhitelist(job_index)
987 GAS:print("[JobWhitelist] Disabled whitelist successfully", GAS_PRINT_COLOR_GOOD)
988 else
989 GAS:print("[JobWhitelist] The whitelist for this job is already disabled", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
990 end
991 end
992 end
993 end
994 else
995 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
996 end
997 elseif (args[1] == "add" or args[1] == "remove") then
998 local account_id
999 if (args[2] ~= nil) then
1000 if (args[2]:find("^STEAM_%d:%d:%d+$")) then
1001 account_id = GAS:SteamIDToAccountID(args[2])
1002 elseif (args[2]:find("^7656119%d+$")) then
1003 account_id = GAS:SteamID64ToAccountID(args[2])
1004 end
1005 end
1006 if (not account_id) then
1007 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (invalid SteamID32/64)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1008 else
1009 local is_blacklist
1010 if (not args[3]) then
1011 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (invalid whitelist/blacklist)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1012 elseif (args[3] == "whitelist") then
1013 is_blacklist = false
1014 elseif (args[3] == "blacklist") then
1015 is_blacklist = true
1016 else
1017 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (invalid whitelist/blacklist)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1018 end
1019 if (is_blacklist ~= nil) then
1020 local job_index
1021 if (not args[4]) then
1022 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (invalid TEAM_VARIABLE)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1023 elseif (_G[args[4]] ~= nil and tonumber(_G[args[4]]) ~= nil and RPExtraTeams[tonumber(_G[args[4]])]) then
1024 job_index = tonumber(_G[args[4]])
1025 else
1026 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help (TEAM_VARIABLE not found)", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1027 end
1028 if (job_index ~= nil) then
1029 if (is_blacklist) then
1030 if (not GAS.JobWhitelist:IsBlacklistEnabled(job_index)) then
1031 GAS:print("[JobWhitelist] The blacklist for this job is not enabled", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1032 else
1033 GAS.JobWhitelist:AddToBlacklist(job_index, GAS.JobWhitelist.LIST_TYPE_STEAMID, account_id)
1034 GAS:print("[JobWhitelist] Added to blacklist successfully", GAS_PRINT_COLOR_GOOD)
1035 end
1036 else
1037 if (not GAS.JobWhitelist:IsWhitelistEnabled(job_index)) then
1038 GAS:print("[JobWhitelist] The whitelist for this job is not enabled", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1039 else
1040 GAS.JobWhitelist:AddToWhitelist(job_index, GAS.JobWhitelist.LIST_TYPE_STEAMID, account_id)
1041 GAS:print("[JobWhitelist] Added to whitelist successfully", GAS_PRINT_COLOR_GOOD)
1042 end
1043 end
1044 end
1045 end
1046 end
1047 else
1048 GAS:print("[JobWhitelist] Invalid arguments, type \"gas_jobwhitelist\" for help", GAS_PRINT_COLOR_BAD, GAS_PRINT_TYPE_ERROR)
1049 end
1050end)
1051
1052hook.Run("bWhitelist:Init")