mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
246 lines
5.9 KiB
Lua
246 lines
5.9 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) then return end
|
|
|
|
local ix = ix
|
|
|
|
ix.xenforo = ix.xenforo or {}
|
|
ix.xenforo.stored = ix.xenforo.stored or {}
|
|
ix.xenforo.restrictedWhitelists = ix.xenforo.restrictedWhitelists or {}
|
|
|
|
function ix.xenforo:RegisterForumGroup(name, id, data)
|
|
self.stored[id] = {id = id, name = name,
|
|
premiumTier = data.premiumTier or 0,
|
|
camiGroup = data.camiGroup,
|
|
inherits = data.inherits,
|
|
priority = data.priority,
|
|
flags = data.flags,
|
|
whitelists = data.whitelists,
|
|
}
|
|
|
|
if (!self.stored[id].premiumTier) then
|
|
self.stored[id].premiumTier = 0
|
|
end
|
|
|
|
if (!self.stored[id].priority) then
|
|
self.stored[id].priority = -1
|
|
end
|
|
end
|
|
|
|
function ix.xenforo:RegisterRestrictedWhitelist(whitelist)
|
|
self.restrictedWhitelists[whitelist] = true
|
|
end
|
|
|
|
function ix.xenforo:IsValidGroupID(id)
|
|
id = tostring(id)
|
|
return self.stored[id] != nil
|
|
end
|
|
|
|
function ix.xenforo:FindGroup(group)
|
|
local targetGroup
|
|
if (string.find(group, "^%d+$") and self.stored[group]) then
|
|
targetGroup = group
|
|
else
|
|
group = string.lower(group)
|
|
for k, v in pairs(self.stored) do
|
|
if (string.find(string.utf8lower(v.name), group, 1, true) and (!targetGroup or string.utf8len(targetGroup) > string.utf8len(v.name))) then
|
|
targetGroup = k
|
|
end
|
|
end
|
|
end
|
|
|
|
return targetGroup
|
|
end
|
|
|
|
function ix.xenforo:AddGroup(client, id, duration)
|
|
if (!self.stored[id]) then return false end
|
|
|
|
local groups = client:GetData("xenforoGroups", {})
|
|
if (duration) then
|
|
local time = math.Clamp(duration, 30, 2880)
|
|
groups[id] = os.time() + time * 60
|
|
else
|
|
groups[id] = -1
|
|
end
|
|
client:SetData("xenforoGroups", groups)
|
|
|
|
self:ApplyInGameGroups(client)
|
|
|
|
return self.stored[id].name, groups[id] - os.time()
|
|
end
|
|
|
|
function ix.xenforo:RemoveGroup(client, id)
|
|
if (!self.stored[id]) then return false end
|
|
|
|
local groups = client:GetData("xenforoGroups", {})
|
|
groups[id] = nil
|
|
|
|
if (table.IsEmpty(groups)) then
|
|
client:SetData("xenforoGroups", nil)
|
|
else
|
|
client:SetData("xenforoGroups", groups)
|
|
end
|
|
|
|
self:ApplyInGameGroups(client)
|
|
|
|
return self.stored[id].name
|
|
end
|
|
|
|
function ix.xenforo:ClearTempGroups(client)
|
|
local tempGroups = client:GetData("xenforoGroups", {})
|
|
local bRemoved = false
|
|
for k, v in pairs(tempGroups) do
|
|
if (v >= 0 and v < os.time()) then
|
|
tempGroups[k] = nil
|
|
bRemoved = true
|
|
end
|
|
end
|
|
|
|
local bHasTempGroups = !table.IsEmpty(tempGroups)
|
|
if (bRemoved) then
|
|
if (!table.IsEmpty(tempGroups)) then
|
|
client:SetData("xenforoGroups", tempGroups)
|
|
else
|
|
client:SetData("xenforoGroups", nil)
|
|
end
|
|
end
|
|
|
|
return tempGroups, bHasTempGroups
|
|
end
|
|
|
|
local inherits_from = sam.ranks.inherits_from
|
|
function ix.xenforo:ApplyInGameGroups(client)
|
|
local ranks = {}
|
|
local prio = 0
|
|
local primaryRank = "user"
|
|
local flags = ""
|
|
local tier = 0
|
|
local toRemove = table.Copy(self.restrictedWhitelists)
|
|
|
|
if (client.ixXenforoGroups or client:GetData("xenforoGroups")) then
|
|
local tempGroups, bHasTempGroups = self:ClearTempGroups(client)
|
|
|
|
-- copy table so we don't modify it when adding the temp groups
|
|
local forumGroups = table.Copy(client.ixXenforoGroups or {})
|
|
if (bHasTempGroups) then
|
|
forumGroups = table.Add(forumGroups, table.GetKeys(tempGroups))
|
|
end
|
|
|
|
-- Allow other plugins to add xenforo groups manually
|
|
hook.Run("ModifyXenforoGroups", client, forumGroups)
|
|
|
|
for _, v in ipairs(forumGroups) do
|
|
local data = self.stored[tostring(v)]
|
|
if (!data) then continue end
|
|
|
|
if (data.camiGroup) then
|
|
ranks[#ranks + 1] = data.camiGroup
|
|
if (data.priority > prio) then
|
|
prio = data.priority
|
|
primaryRank = data.camiGroup
|
|
end
|
|
end
|
|
|
|
-- Give flags
|
|
if (data.flags) then
|
|
for i = 1, #data.flags do
|
|
local flag = data.flags[i]
|
|
if (!string.find(flags, flag, 1, true)) then
|
|
flags = flags..flag
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Set Premium tier
|
|
if (data.premiumTier > tier) then
|
|
tier = data.premiumTier
|
|
end
|
|
|
|
-- Give whitelists
|
|
if (ix.config.Get("whitelistForumLink") and data.whitelists) then
|
|
for faction in pairs(data.whitelists) do
|
|
toRemove[faction] = nil --don't remove this whitelist
|
|
|
|
if (!client:HasWhitelist(faction)) then
|
|
client:SetWhitelisted(faction, true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Allow other plugins to add CAMI ranks to the list
|
|
hook.Run("ModifyClientCAMIGroups", client, ranks)
|
|
|
|
-- Network ranks
|
|
if (#ranks > 0) then
|
|
client:SetLocalVar("xenforoRanks", ranks)
|
|
else
|
|
client:SetLocalVar("xenforoRanks", nil)
|
|
end
|
|
|
|
-- Network flags
|
|
local oldFlags = client:GetLocalVar("xenforoFlags", "")
|
|
if (flags != "") then
|
|
client:SetLocalVar("xenforoFlags", flags)
|
|
for i = 1, #flags do
|
|
local flag = flags[i]
|
|
local info = ix.flag.list[flag]
|
|
|
|
if (info and info.callback) then
|
|
info.callback(client, true)
|
|
end
|
|
|
|
string.gsub(oldFlags, flag, "")
|
|
end
|
|
else
|
|
client:SetLocalVar("xenforoFlags", nil)
|
|
end
|
|
|
|
-- Remove old flags that haven't been given again
|
|
if (client:GetCharacter() and #oldFlags > 0) then
|
|
for i = 1, #oldFlags do
|
|
local flag = oldFlags[i]
|
|
local info = ix.flag.list[flag]
|
|
|
|
if (!client:GetCharacter():HasFlags(flag) and info and info.callback) then
|
|
info.callback(client, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Network Premium tier
|
|
if (tier > 0) then
|
|
client:SetNetVar("xenforoTier", tier)
|
|
else
|
|
client:SetNetVar("xenforoTier", nil)
|
|
end
|
|
|
|
-- Set primary rank
|
|
if (client:GetUserGroup() == "superadmin" and
|
|
(inherits_from(primaryRank, "admin") or inherits_from(primaryRank, "superadmin"))) then
|
|
primaryRank = "superadmin"
|
|
end
|
|
client:sam_set_rank(primaryRank)
|
|
|
|
-- Remove whitelists
|
|
if (ix.config.Get("whitelistForumLink")) then
|
|
-- remove whitelists
|
|
for k in pairs(toRemove) do
|
|
if (client:HasWhitelist(k)) then
|
|
client:SetWhitelisted(k, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
hook.Run("PostPlayerXenforoGroupsUpdate", client)
|
|
end |