Files
wnsrc/gamemodes/helix/plugins/xenforolink/libs/sv_xenforo.lua
lifestorm ba1fc01b16 Upload
2024-08-04 23:12:27 +03:00

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