[SAM] Помогите пожалуйста

Решил сделать такую фишку, когда кто-то пишет какую либо ссылку ему давался мут на 30 минут, если повторно кидает ссылку то мут на 2 часа, а если 3 раз кидает ссылку то пермамент, но сталкнулся с такой проблемой что когда пишу в коде причину бана админка считает это ошибкой. Я проверял если я вписываю 1 раз ссылку мут на 30 минут, 2 ссылку мут на 2 часа, 3 раз ссылку нечего не происходит. Вот код:

local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'IP', 'discord'}
local playerViolations = {}

local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'IP', 'discord'}
local playerViolations = {}

local function PlayerSay(pl, text)
	if not IsValid(pl) then
		return
	end

	if pl:IsSuperAdmin() or pl:Nick() == "Osnovatel" then
		return
	end

	local playerName = pl:Nick()

	
	if not playerViolations[playerName] then
		playerViolations[playerName] = 0
	end

	for _, pattern in ipairs(urlPatterns) do
		if string.match(text:lower(), pattern) then
			
			playerViolations[playerName] = playerViolations[playerName] + 1
			
			local duration = 0
			local reason = "2.3: Предупреждение"
			
			
			if playerViolations[playerName] == 1 then
				duration = 30  
			elseif playerViolations[playerName] == 2 then
				duration = 120 
			elseif playerViolations[playerName] == 3 then
				duration = 0 
				reason = "2.3"
				playerViolations[playerName] = 0
			end
			
			if duration > 0 then
				RunConsoleCommand('sam', 'mute', playerName, tostring(duration), reason)
			elseif duration == 0 then
				RunConsoleCommand('sam', 'ban', playerName, reason)
			end
			
			return true
		end
	end
end

hook.Add('PlayerSay', 'PlayerSay_sv', PlayerSay)

Что касается твоего кода - в перме ты не указал время:

local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'IP', 'discord'}
local playerViolations = {}

local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'IP', 'discord'}
local playerViolations = {}

local function PlayerSay(pl, text)
	if not IsValid(pl) then
		return
	end

	if pl:IsSuperAdmin() or pl:Nick() == "Osnovatel" then
		return
	end

	local playerName = pl:Nick()

	
	if not playerViolations[playerName] then
		playerViolations[playerName] = 0
	end

	for _, pattern in ipairs(urlPatterns) do
		if string.match(text:lower(), pattern) then
			
			playerViolations[playerName] = playerViolations[playerName] + 1
			
			local duration = 0
			local reason = "2.3: Предупреждение"
			
			
			if playerViolations[playerName] == 1 then
				duration = 30  
			elseif playerViolations[playerName] == 2 then
				duration = 120 
			elseif playerViolations[playerName] == 3 then
				duration = 0 
				reason = "2.3"
				playerViolations[playerName] = 0
			end
			
			if duration > 0 then
				RunConsoleCommand('sam', 'mute', playerName, tostring(duration), reason)
			elseif duration == 0 then
				RunConsoleCommand('sam', 'ban', playerName, '0', reason)
			end
			
			return true
		end
	end
end

hook.Add('PlayerSay', 'PlayerSay_sv', PlayerSay)

Так же советую идентифицировать игрока по steamid:

local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'IP', 'discord'}
local playerViolations = {}

local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'IP', 'discord'}
local playerViolations = {}

local function PlayerSay(pl, text)
	if not IsValid(pl) then
		return
	end

	if pl:IsSuperAdmin() or pl:SteamID() == "STEAM_0:0:01234567" then
		return
	end

	local playerSteamID= pl:SteamID)

	
	if not playerViolations[playerSteamID] then
		playerViolations[playerSteamID] = 0
	end

	for _, pattern in ipairs(urlPatterns) do
		if string.match(text:lower(), pattern) then
			
			playerViolations[playerSteamID] = playerViolations[playerSteamID] + 1
			
			local duration = 0
			local reason = "2.3: Предупреждение"
			
			
			if playerViolations[playerSteamID] == 1 then
				duration = 30  
			elseif playerViolations[playerSteamID] == 2 then
				duration = 120 
			elseif playerViolations[playerSteamID] == 3 then
				duration = 0 
				reason = "2.3"
				playerViolations[playerSteamID] = 0
			end
			
			if duration > 0 then
				RunConsoleCommand('sam', 'mute', playerSteamID, tostring(duration), reason)
			elseif duration == 0 then
				RunConsoleCommand('sam', 'banid', playerSteamID, '0', reason)
			end
			
			return true
		end
	end
end

hook.Add('PlayerSay', 'PlayerSay_sv', PlayerSay)

PS: так же советую тебе сделать исключение для ссылок на правила ТВОЕГО сервера, Дискорда и прочего что относится к твоему проекту (никто ведь не хочет за помощь найти дс получить мут, так?)

И как сделать исключение?

с индефикацией по steamid не работает нечего а по нику работает так что спасибо тебе, а я голову себе ломал весь день ))

вот тут пишут исключения

if pl:IsSuperAdmin() or pl:Nick() == "Osnovatel" then
		return
	end

у меня все нужные ссылки находятся в F4 или Tab так что вот так вот))

Хорошо. Не проверял, поэтому придумал ещё и по steamid. Тут плюс в том что если у людей будут одинаковые ники, или нечитаемые - то ВОЗМОЖНО sam не сможет их наказать.

да я об этом же подумал но по steamid кож не работает

У человека выше ошибка в SteamID()
image
так же в таблице urlpatterns было слово IP скапсом но в коде мы текст игрока делаем с маленьким текстом
image

по этому IP свободно обходило огр.

local IsValid = IsValid
local string_match = string.match
local RunConsoleCommand = RunConsoleCommand
local tostring = tostring
local playerViolations = {}
local urlPatterns = {'http', 'https', 't.me', 'vk%.', 'www%.', 'urw%.', 'ip', 'discord'}
local white_list = {
    ["STEAM_0:0:01234567"] = true
}

local function PlayerSay(pl, text)
    if not IsValid(pl) then return end
    local playerSteamID = pl:SteamID()
    if pl:IsSuperAdmin() or white_list[playerSteamID] then return end
    if not playerViolations[playerSteamID] then playerViolations[playerSteamID] = 0 end
    for i = 1, #urlPatterns do
        if not string_match(text:lower(), urlPatterns[i]) then continue end
        playerViolations[playerSteamID] = playerViolations[playerSteamID] + 1
        local duration = 0
        local reason = "2.3: Предупреждение"
        if playerViolations[playerSteamID] == 1 then
            duration = 30
        elseif playerViolations[playerSteamID] == 2 then
            duration = 120
        elseif playerViolations[playerSteamID] == 3 then
            duration = 0
            reason = "2.3"
            playerViolations[playerSteamID] = 0
        end

        if duration > 0 then
            RunConsoleCommand('sam', 'mute', playerSteamID, tostring(duration), reason)
        elseif duration == 0 then
            RunConsoleCommand('sam', 'banid', playerSteamID, '0', reason)
        end
        return true
    end
end

hook.Add('PlayerSay', 'PlayerSay_sv', PlayerSay)

Спасибо, не заметил недочёт

1 лайк