Files
wnsrc/lua/sam/ranks/sv_ranks.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

448 lines
8.3 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if SAM_LOADED then return end
local sam = sam
local SQL, util = sam.SQL, util
local ranks = {}
local ranks_loaded = false
function sam.ranks.sync()
sam.set_global("Ranks", ranks, true)
end
function sam.ranks.add_rank(name, inherit, immunity, ban_limit)
if not sam.isstring(name) then
error("invalid rank name")
end
if not ranks_loaded then
error("loading ranks")
end
if ranks[name] then
return "rank_exists"
end
if not sam.isstring(inherit) and name ~= "user" then
inherit = "user"
end
local data = {
permissions = {},
limits = {}
}
if name ~= "user" then
local inherit_rank = ranks[inherit]
if not inherit_rank then
error("invalid rank to inherit from")
end
if not sam.isnumber(immunity) then
immunity = inherit_rank.immunity
end
if not sam.isnumber(ban_limit) then
ban_limit = inherit_rank.ban_limit
end
end
if name == "superadmin" then
immunity = 100
elseif name == "user" then
immunity = 1
else
immunity = math.Clamp(immunity, 2, 99)
end
ban_limit = math.Clamp(ban_limit, 0, 31536000)
SQL.FQuery([[
INSERT INTO
`sam_ranks`(
`name`,
`inherit`,
`immunity`,
`ban_limit`,
`data`
)
VALUES
({1}, {2}, {3}, {4}, {5})
]], {name, inherit or "NULL", immunity, ban_limit, util.TableToJSON(data)})
local rank = {
name = name,
inherit = inherit,
immunity = immunity,
ban_limit = ban_limit,
data = data
}
ranks[name] = rank
sam.ranks.sync()
sam.hook_call("SAM.AddedRank", name, rank)
end
function sam.ranks.remove_rank(name)
if not sam.isstring(name) then
error("invalid rank")
end
if not ranks_loaded then
error("loading ranks")
end
-- can't just remove default ranks!!
if sam.ranks.is_default_rank(name) then
return "default_rank"
end
// 13271fc0ed1d2e4e36589c40f54f685d96ba64e69b7c5bc70aa14d4bb236ab18
local rank = ranks[name]
if not rank then
error("invalid rank")
end
SQL.FQuery([[
DELETE FROM
`sam_ranks`
WHERE
`name` = {1}
]], {name})
sam.hook_call("SAM.OnRankRemove", name, rank)
ranks[name] = nil
sam.ranks.sync()
sam.hook_call("SAM.RemovedRank", name)
end
function sam.ranks.rename_rank(old, new)
if not sam.isstring(old) then
error("invalid old name")
end
if not sam.isstring(new) then
error("invalid new name")
end
if not ranks_loaded then
error("loading ranks")
end
local old_rank = ranks[old]
if not old_rank then
error("invalid rank")
end
if sam.ranks.is_default_rank(old) then
return "default_rank"
end
if ranks[new] then
error("new rank name exists")
end
old_rank.name = new
ranks[new], ranks[old] = ranks[old], nil
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`name` = {1}
WHERE
`name` = {2}
]], {new, old})
sam.ranks.sync()
sam.hook_call("SAM.RankNameChanged", old, new)
end
function sam.ranks.change_inherit(name, inherit)
if not sam.isstring(name) then
error("invalid rank")
end
if not sam.isstring(inherit) then
error("invalid rank to inherit from")
end
if not ranks_loaded then
error("loading ranks")
end
local rank = ranks[name]
if not rank then
error("invalid rank")
end
if name == "user" or name == "superadmin" then return end
if not ranks[inherit] then
error("invalid rank to inherit from")
end
if name == inherit then
error("you can't inherit from the same rank")
end
if rank.inherit == inherit then return end
local old_inherit = rank.inherit
-- e3a33576750e51364148739225303ca04e922554b5b1b0197a7475aa52cc2634!!!
rank.inherit = inherit
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`inherit` = {1}
WHERE
`name` = {2}
]], {inherit, name})
sam.ranks.sync()
sam.hook_call("SAM.ChangedInheritRank", name, inherit, old_inherit)
end
function sam.ranks.change_immunity(name, new_immunity)
if not sam.isstring(name) then
error("invalid rank")
end
if not sam.isnumber(new_immunity) then
error("invalid immunity")
end
if not ranks_loaded then
error("loading ranks")
end
local rank = ranks[name]
if not rank then
error("invalid rank")
end
if name == "user" or name == "superadmin" then return end
new_immunity = math.Clamp(new_immunity, 2, 99) // 8bc01ecde3d91528be5a061c416d9334bd200f6f3f76a0083468334f18f03063!!!
local old_immunity = rank.immunity
rank.immunity = new_immunity
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`immunity` = {1}
WHERE
`name` = {2}
]], {new_immunity, name})
sam.ranks.sync()
sam.hook_call("SAM.RankImmunityChanged", name, new_immunity, old_immunity)
end
function sam.ranks.change_ban_limit(name, new_limit)
if not sam.isstring(name) then
error("invalid rank")
end
if not sam.isnumber(new_limit) then
error("invalid ban limit")
end
if not ranks_loaded then
error("loading ranks")
end
local rank = ranks[name]
if not rank then
error("invalid rank")
end
if name == "superadmin" then return end
new_limit = math.Clamp(new_limit, 0, 31536000)
local old_limit = rank.ban_limit
rank.ban_limit = new_limit
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`ban_limit` = {1}
WHERE
`name` = {2}
]], {new_limit, name})
sam.ranks.sync()
sam.hook_call("SAM.RankBanLimitChanged", name, new_limit, old_limit)
end
function sam.ranks.give_permission(name, permission)
if not sam.isstring(name) then
error("invalid rank")
end
if not sam.isstring(permission) then
error("invalid permission")
end
if not ranks_loaded then
error("loading ranks")
end
if name == "superadmin" then return end
local rank = ranks[name]
if not rank then
error("invalid rank")
end
local permissions = rank.data.permissions
if permissions[permission] then return end
-- 3db898ddbc4a12ba9980d00541151133f8e09c55bcb7650487608c39edd6c162!!!
permissions[permission] = true
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`data` = {1}
WHERE
`name` = {2}
]], {util.TableToJSON(rank.data), name})
sam.ranks.sync()
sam.hook_call("SAM.RankPermissionGiven", name, permission)
end
function sam.ranks.take_permission(name, permission)
if not sam.isstring(name) then
error("invalid rank")
end
if not sam.isstring(permission) then
error("invalid permission")
end
if not ranks_loaded then
error("loading ranks")
end
if name == "superadmin" then return end
local rank = ranks[name]
if not rank then
error("invalid rank")
end
local permissions = rank.data.permissions
if permissions[permission] == false then return end
permissions[permission] = false
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`data` = {1}
WHERE
`name` = {2}
]], {util.TableToJSON(rank.data), name})
sam.ranks.sync()
sam.hook_call("SAM.RankPermissionTaken", name, permission)
end
function sam.ranks.set_limit(name, type, limit)
if not sam.isstring(name) then
error("invalid rank")
end
if not sam.isstring(type) then
error("invalid limit type")
end
if not sam.isnumber(limit) then
error("invalid limit value")
end
if not ranks_loaded then
error("loading ranks")
end
if name == "superadmin" then return end
local rank = ranks[name]
if not rank then
error("invalid rank")
end
limit = math.Clamp(limit, -1, 1000)
local limits = rank.data.limits
if limits[type] == limit then return end
limits[type] = limit
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`data` = {1}
WHERE
`name` = {2}
]], {util.TableToJSON(rank.data), name})
sam.ranks.sync()
sam.hook_call("SAM.RankChangedLimit", name, type, limit)
end
function sam.ranks.ranks_loaded()
return ranks_loaded
end
sam.ranks.sync()
hook.Add("SAM.DatabaseLoaded", "LoadRanks", function()
SQL.Query([[
SELECT
*
FROM
`sam_ranks`
]], function(sam_ranks)
for _, v in ipairs(sam_ranks) do
local name = v.name
ranks[name] = {
name = name,
inherit = name ~= "user" and v.inherit,
immunity = tonumber(v.immunity),
ban_limit = tonumber(v.ban_limit),
data = util.JSONToTable(v.data)
}
end
ranks_loaded = true
if #ranks < 3 then
sam.ranks.add_rank("user", nil, nil, 0)
sam.ranks.add_rank("admin", "user", SAM_IMMUNITY_ADMIN, 20160 --[[2 weeks]])
sam.ranks.add_rank("superadmin", "admin", SAM_IMMUNITY_SUPERADMIN, 0)
/*a5a6b7626ac8542cad9e421879f6138c874bc3609653dc032c142493caff4203*/
end
sam.ranks.sync()
hook.Call("SAM.LoadedRanks", nil, ranks)
end):wait()
end)