diff --git a/lua/bladw_warn/server/sv_function.lua b/lua/bladw_warn/server/sv_function.lua new file mode 100644 index 0000000..a63623e --- /dev/null +++ b/lua/bladw_warn/server/sv_function.lua @@ -0,0 +1,116 @@ +BladW = BladW or {} +BladW.Warn = BladW.Warn or {} + +-- envoie au client la liste des joueurs connectés + leurs warns +local function SyncTo(ply) + if not IsValid(ply) then return end + + local players = player.GetAll() + + net.Start("bladw_warn_sync") + net.WriteUInt(#players, 8) + for _, p in ipairs(players) do + local sid = p:SteamID64() or "" + local warns = BladW.Warn.Get(sid) + local isStaff = p:IsAdmin() or table.HasValue((BladW.Warn.Conf or {}).staff_groups or {}, p:GetUserGroup()) + + net.WriteString(p:Nick()) + net.WriteString(sid) + net.WriteBool(isStaff) + net.WriteUInt(math.min(#warns, 255), 8) + for i = 1, math.min(#warns, 255) do + local w = warns[i] + net.WriteString(w.issuer or "") + net.WriteUInt(w.time or 0, 32) + net.WriteString(w.reason or "") + net.WriteString(w.comment or "") + end + end + net.Send(ply) +end +BladW.Warn.SyncTo = SyncTo + +-- ouvre le menu pour un joueur autorisé +local function OpenFor(ply) + if not IsValid(ply) or not BladW.Warn.HasAccess(ply) then return end + net.Start("bladw_warn_open") + net.Send(ply) + SyncTo(ply) +end + +concommand.Add("bladw_warns", function(ply) OpenFor(ply) end) + +hook.Add("PlayerSay", "BladW:WarnChatCmd", function(ply, text) + local cmd = string.lower(string.Trim(text)) + if cmd ~= "/warns" and cmd ~= "!warns" and cmd ~= "/warn" then return end + OpenFor(ply) + return "" -- on retire la commande du chat +end) + +-- un admin ajoute un warn +net.Receive("bladw_warn_add", function(len, ply) + if not IsValid(ply) or not BladW.Warn.HasAccess(ply) then return end + + local sid = net.ReadString() + local reason = string.sub(net.ReadString(), 1, 100) + local comment = string.sub(net.ReadString(), 1, 300) + if sid == "" or reason == "" then return end + + BladW.Warn.AddWarn(sid, { + issuer = ply:Nick(), + issuerid = ply:SteamID64(), + time = os.time(), + reason = reason, + comment = comment, + }) + + -- annonce le warn dans le chat de base + local Conf = BladW.Warn.Conf or {} + if Conf.chat_announce ~= false then + local target = player.GetBySteamID64(sid) + local targetName = IsValid(target) and target:Nick() or sid + + local recips + local scope = Conf.chat_scope or "all" + if scope == "target" then + recips = IsValid(target) and { target } or {} + elseif scope == "staff" then + recips = {} + for _, p in ipairs(player.GetAll()) do + if BladW.Warn.HasAccess(p) then recips[#recips + 1] = p end + end + end + + -- recips == nil -> tout le monde ; sinon on n'envoie que si la liste n'est pas vide + if not recips or #recips > 0 then + net.Start("bladw_warn_chat") + net.WriteString(targetName) + net.WriteString(ply:Nick()) + net.WriteString(reason) + if recips then net.Send(recips) else net.Broadcast() end + end + end + + SyncTo(ply) +end) + +-- un admin supprime un warn précis +net.Receive("bladw_warn_remove", function(len, ply) + if not IsValid(ply) or not BladW.Warn.HasAccess(ply) then return end + + local sid = net.ReadString() + local index = net.ReadUInt(8) + BladW.Warn.RemoveWarn(sid, index) + + SyncTo(ply) +end) + +-- un admin vide le casier d'un joueur +net.Receive("bladw_warn_clear", function(len, ply) + if not IsValid(ply) or not BladW.Warn.HasAccess(ply) then return end + + local sid = net.ReadString() + BladW.Warn.ClearWarns(sid) + + SyncTo(ply) +end)