94 lines
3.3 KiB
Lua
94 lines
3.3 KiB
Lua
local PLUGIN = PLUGIN
|
||
print("[Warn System] Server Side Loaded")
|
||
|
||
-- Load warnings on startup
|
||
function PLUGIN:Initialize()
|
||
self.warns = ix.data.Get("warns", {})
|
||
end
|
||
|
||
-- Save warnings to permanent storage
|
||
function PLUGIN:SaveWarns()
|
||
ix.data.Set("warns", self.warns)
|
||
end
|
||
|
||
net.Receive("ixWarnAdd", function(length, client)
|
||
if (!client:IsSuperAdmin()) then return end
|
||
|
||
local targetSteamID = net.ReadString()
|
||
local reason = net.ReadString() or "No reason provided"
|
||
|
||
PLUGIN.warns = ix.data.Get("warns", {})
|
||
PLUGIN.warns[targetSteamID] = PLUGIN.warns[targetSteamID] or {count = 0, history = {}}
|
||
|
||
local targetData = PLUGIN.warns[targetSteamID]
|
||
targetData.count = targetData.count + 1
|
||
|
||
table.insert(targetData.history, {
|
||
admin = client:Name(),
|
||
adminSteamID = client:SteamID(),
|
||
reason = reason,
|
||
time = os.time(),
|
||
type = "add"
|
||
})
|
||
|
||
local targetPlayer = player.GetBySteamID(targetSteamID)
|
||
if (IsValid(targetPlayer)) then
|
||
targetData.name = targetPlayer:Name()
|
||
targetData.rank = targetPlayer:GetUserGroup()
|
||
|
||
targetPlayer:Notify("Вы получили выговор (" .. targetData.count .. "/3). Причина: " .. reason)
|
||
end
|
||
|
||
-- Automatic demotion (3/3 warnings) - Now works for offline players too
|
||
if (targetData.count >= 3) then
|
||
if (sam) then
|
||
-- Use SAM's Lua API for reliable rank setting (offline or online)
|
||
sam.player.set_rank_id(targetSteamID, "user", 0)
|
||
print("[Warn System] Initiated demotion for " .. targetSteamID .. " via SAM.")
|
||
else
|
||
-- Fallback for other systems
|
||
if (IsValid(targetPlayer)) then
|
||
targetPlayer:SetUserGroup("user")
|
||
else
|
||
-- If offline and not SAM, we attempt console command as last resort
|
||
RunConsoleCommand("ulx", "adduser", targetSteamID, "user")
|
||
end
|
||
end
|
||
|
||
PLUGIN.warns[targetSteamID] = nil -- Remove from system after demotion
|
||
|
||
if (IsValid(targetPlayer)) then
|
||
targetPlayer:Notify("Вы были автоматически сняты с админ-прав за достижение 3 выговоров.")
|
||
end
|
||
|
||
ix.util.Notify((targetData.name or targetSteamID) .. " был автоматически снят с админ-прав (3/3 выговоров).")
|
||
end
|
||
|
||
PLUGIN:SaveWarns()
|
||
ix.util.Notify(client:Name() .. " выдал выговор " .. (targetData.name or targetSteamID) .. ". Причина: " .. reason)
|
||
end)
|
||
|
||
net.Receive("ixWarnRemove", function(length, client)
|
||
if (!client:IsSuperAdmin()) then return end
|
||
|
||
local targetSteamID = net.ReadString()
|
||
local index = net.ReadInt(16)
|
||
|
||
PLUGIN.warns = ix.data.Get("warns", {})
|
||
local targetData = PLUGIN.warns[targetSteamID]
|
||
|
||
if (targetData and targetData.history[index]) then
|
||
targetData.count = math.max(0, targetData.count - 1)
|
||
table.insert(targetData.history, {
|
||
admin = client:Name(),
|
||
adminSteamID = client:SteamID(),
|
||
reason = "Снятие выговора #" .. index,
|
||
time = os.time(),
|
||
type = "remove"
|
||
})
|
||
|
||
PLUGIN:SaveWarns()
|
||
ix.util.Notify(client:Name() .. " снял выговор у " .. (targetData.name or targetSteamID))
|
||
end
|
||
end)
|