Загрузка данных


-- RanksChat_kdm1eHvH.lua
-- Чат-команды и префиксы рангов

-- ============================================================
-- Префиксы в чате (правильные, через chat.AddText)
-- ============================================================
hook.Add("PlayerSay", "Ranks_kdm1eHvH_ChatPrefix", function(ply, text, team)
    if not IsValid(ply) then return end
    if string.sub(text, 1, 1) == "/" or string.sub(text, 1, 1) == "!" then return end

    local rank = RANKS.GetRank(ply)
    local rankData = RANKS.list[rank] or RANKS.list["user"]
    local rankName = rankData.name
    local rankColor = rankData.color

    -- Для user — без префикса
    if rank == "user" then
        for _, p in ipairs(player.GetAll()) do
            if IsValid(p) then
                chat.AddText(
                    Color(200, 200, 200), ply:Nick(),
                    Color(255, 255, 255), ": " .. text
                )
            end
        end
    else
        for _, p in ipairs(player.GetAll()) do
            if IsValid(p) then
                chat.AddText(
                    rankColor, "[" .. rankName .. "] ",
                    rankColor, ply:Nick(),
                    Color(255, 255, 255), ": " .. text
                )
            end
        end
    end

    return ""
end)

-- ============================================================
-- Команды (через серверную консоль)
-- ============================================================
concommand.Add("kdm1e_rank", function(ply)
    if not IsValid(ply) then return end
    local rank = RANKS.GetRank(ply)
    local rankData = RANKS.list[rank] or RANKS.list["user"]
    ply:PrintMessage(HUD_PRINTTALK, "Твой ранг: " .. rankData.name)
end)

concommand.Add("kdm1e_ranks", function(ply)
    if not IsValid(ply) then return end
    ply:PrintMessage(HUD_PRINTTALK, "=== РАНГИ СЕРВЕРА ===")
    for _, rank in ipairs(RANKS.order) do
        local r = RANKS.list[rank]
        ply:PrintMessage(HUD_PRINTTALK, "  " .. rank .. " — " .. r.name)
    end
    ply:PrintMessage(HUD_PRINTTALK, "=====================")
end)

concommand.Add("kdm1e_setrank", function(ply, cmd, args)
    if IsValid(ply) then
        if not RANKS.HasPerm(ply, "canSetRank") then
            ply:PrintMessage(HUD_PRINTTALK, "У тебя нет прав выдавать ранги!")
            return
        end
    end

    if #args < 2 then
        if IsValid(ply) then
            ply:PrintMessage(HUD_PRINTTALK, "Использование: !setrank <ник> <ранг>")
        else
            print("Использование: kdm1e_setrank <ник> <ранг>")
        end
        return
    end

    local targetNick = args[1]
    local newRank = string.lower(args[2])

    if not RANKS.list[newRank] then
        local msg = "Неизвестный ранг: " .. newRank
        if IsValid(ply) then ply:PrintMessage(HUD_PRINTTALK, msg) else print(msg) end
        return
    end

    local target = nil
    for _, p in ipairs(player.GetAll()) do
        if string.find(string.lower(p:Nick()), string.lower(targetNick), 1, true) then
            target = p
            break
        end
    end

    if not IsValid(target) then
        local msg = "Игрок не найден: " .. targetNick
        if IsValid(ply) then ply:PrintMessage(HUD_PRINTTALK, msg) else print(msg) end
        return
    end

    if IsValid(ply) and not RANKS.HasPerm(ply, "canEverything") then
        if RANKS.GetLevel(newRank) >= RANKS.GetLevel(RANKS.GetRank(ply)) then
            ply:PrintMessage(HUD_PRINTTALK, "Ты не можешь выдать ранг выше или равный своему!")
            return
        end
    end

    local assignedBy = IsValid(ply) and ply:Nick() or "Console"
    RANKS.SetRank(target, newRank, assignedBy)

    local successMsg = target:Nick() .. " получил ранг " .. RANKS.list[newRank].name .. " (выдал: " .. assignedBy .. ")"

    for _, p in ipairs(player.GetAll()) do
        if IsValid(p) and RANKS.HasPerm(p, "canSetRank") then
            p:PrintMessage(HUD_PRINTTALK, successMsg)
        end
    end
end)

concommand.Add("kdm1e_removerank", function(ply, cmd, args)
    if IsValid(ply) and not RANKS.HasPerm(ply, "canSetRank") then
        ply:PrintMessage(HUD_PRINTTALK, "У тебя нет прав снимать ранги!")
        return
    end

    if #args < 1 then
        if IsValid(ply) then ply:PrintMessage(HUD_PRINTTALK, "Использование: !removerank <ник>") end
        return
    end

    local target = nil
    for _, p in ipairs(player.GetAll()) do
        if string.find(string.lower(p:Nick()), string.lower(args[1]), 1, true) then
            target = p
            break
        end
    end

    if not IsValid(target) then
        if IsValid(ply) then ply:PrintMessage(HUD_PRINTTALK, "Игрок не найден") end
        return
    end

    local assignedBy = IsValid(ply) and ply:Nick() or "Console"
    RANKS.SetRank(target, "user", assignedBy)

    local msg = target:Nick() .. " лишён ранга (снял: " .. assignedBy .. ")"
    for _, p in ipairs(player.GetAll()) do
        if IsValid(p) and RANKS.HasPerm(p, "canSetRank") then
            p:PrintMessage(HUD_PRINTTALK, msg)
        end
    end
end)

-- ============================================================
-- Чат-команды с ! и /
-- ============================================================
hook.Add("PlayerSay", "Ranks_kdm1eHvH_Commands", function(ply, text, team)
    if not IsValid(ply) then return end
    local lower = string.lower(text)

    if lower == "!rank" or lower == "/rank" then
        ply:ConCommand("kdm1e_rank")
        return ""
    end

    if lower == "!ranks" or lower == "/ranks" then
        ply:ConCommand("kdm1e_ranks")
        return ""
    end

    if string.StartWith(lower, "!setrank ") or string.StartWith(lower, "/setrank ") then
        local args = string.Explode(" ", text)
        table.remove(args, 1)
        ply:ConCommand("kdm1e_setrank " .. table.concat(args, " "))
        return ""
    end

    if string.StartWith(lower, "!removerank ") or string.StartWith(lower, "/removerank ") then
        local args = string.Explode(" ", text)
        table.remove(args, 1)
        ply:ConCommand("kdm1e_removerank " .. table.concat(args, " "))
        return ""
    end
end)

print("[RanksChat] Чат-команды загружены")