--[[ [F12P-scripts] *LUA 5.1.3 PX 0.4.1.1 hub fix 05.12.2008 от Foreteller12 Скрипт блокировки главного чата и лички до ввода разблокирующего кода Скрипт блокировки главного чата и лички содержащие запрещённые слова(через редактирование скрипта) Скрипт блокировки главного чата и лички по ип/нику(через редактирование скрипта) Версия: 1.1 Автор: Foreteller12 18.12.2007 Awesome morfed by on Nov 2009 ]]-- --------------------------------------- Конфигурация --------------------------------------- -------------------------------------------------------------------------------------------- local sBotName = "ChatGuard" -- Имя бота local BotIsOp = 1 -- Бот будет с ключиком или нет? local BotDesc = "ChatGuard" -- Описание бота local BotEmail = "http://hub.selfip.com" -- Email бота local sVer = "1.1" -- Версия скрипта local sWarn = " *** Чтобы иметь возможность писать в чате и ".. "приватах БЕЗ РЕГИСТРАЦИИ НА ХАБЕ, напишите ЦИФРАМИ : " local sAdminNick = "ТиGRрр" local bRptFbdWords = true -- Посылать ли в личку админ-нику сообщения о запрещенных словах -- Режим блокировки: Чтоб будем блокировать local BlockPM = 1 --Блокировка приватов (0: Не блокировать 1: Блокировать 2: Блокировать приват на каждый ник) local BlockMC = 1 --Блокирвока общего чата (0: Не блокировать 1: Блокировать) local bSendOnEntry = 0 -- Посылать ли юзеру уведомление сразу при входе на хаб local bKeepCheckedNicks = 0 -- Хранить ли проверенные ники до перезапуска скрипта (хаба) или очищать при выходе юзера -- Профили, освобождённые от блокировки главного чата и приватов : local tNoChatBlock = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 1, -- VIP [3] = 1, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер } -- Профили, освобождённые от действия антирекламы local tNoAdvCheck = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 0, -- VIP [3] = 0, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер } -- IP и ники, которым запрещен чат и приват : local tBlockedAttributes = { ["127.0.0.1"] = false, --- тест } -- Слова, расцениваемые как реклама в личках и общем чате : local tFbdWords = { [1] = { tWords = {"dchub:","adc:", }, tProfiles = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 1, -- VIP [3] = 0, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер }, }, [2] = { tWords = {"www","http:","http", }, tProfiles = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 1, -- VIP [3] = 1, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер }, }, [3] = { tWords = { }, tProfiles = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 0, -- VIP [3] = 0, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер }, }, } -- Таблица ников, не освобожденных от блокировки чата и приватов : local tUsers={} local tX1 ={ [0]="ноль",[1]="один",[2]="два",[3]="три",[4]="четыре",[5]="пять",[6]="шесть",[7]="семь",[8]="восемь", [9]="девять",[10]="десять",[11]="одиннадцать",[12]="двенадцать",[13]="тринадцать",[14]="четырнадцать", [15]="пятнадцать",[16]="шестнадцать",[17]="семнадцать",[18]="восемнадцать",[19]="девятнадцать", } local tX2 ={ [2]="двадцать",[3]="тридцать",[4]="сорок",[5]="пятьдесят",[6]="шестьдесят",[7]="семьдесят",[8]="восемьдесят", [9]="девяносто", } local tX3 ={ [1]="сто",[2]="двести",[3]="триста",[4]="четыреста",[5]="пятьсот",[6]="шестьсот",[7]="семьсот",[8]="восемьсот", [9]="девятьсот", } function OnStartup() Core.RegBot(sBotName,BotDesc,BotEmail,BotIsOp == 1 and true) end function UserConnected(tUser) SetUserState(tUser) -- Если в настройках указано посылать уведомление при входе : if bSendOnEntry == 1 and tUsers[tUser.sNick] and (tUsers[tUser.sNick].bBlockMC or tUsers[tUser.sNick].bBlockPM) then Core.SendToNick(tUser.sNick,"<"..sBotName.."> "..sWarn..tUsers[tUser.sNick].sRequest) end end function UserDisconnected(tUser) if bKeepCheckedNicks ~= 1 then tUsers[tUser.sNick] = nil end end OpConnected,RegConnected = UserConnected,UserConnected RegDisconnected,OpDisconnected = UserDisconnected,UserDisconnected function ChatArrival(tUser, sData) local sData = string.sub(sData, 1, -2) -- Проверка на заблокированный ник или IP : if tBlockedAttributes[tUser.sIP] or tBlockedAttributes[tUser.sNick] then Core.SendToNick(tUser.sNick,"<"..sBotName.."> *** Для вас отключена возможность писать в чате и приватах.") return true end SetUserState(tUser) -- Проверка на блокировку главного чата для этого юзера и контрольный вопрос : if tUsers[tUser.sNick] and tUsers[tUser.sNick].bBlockMC then local _,e = string.find(sData, "%b<>%s+") local sText = string.sub(sData, e+1) -- Если посылаемый текст соответствует ответу на контрольный вопрос : if sText==tUsers[tUser.sNick].sAnswer then tUsers[tUser.sNick].bBlockMC,tUsers[tUser.sNick].bBlockPM = nil,nil Core.SendToNick(tUser.sNick,"<"..sBotName.."> *** Вы правильно ответили (Ответ: "..sText.. "), теперь вы можете писать в чате и приватах.") return true else Core.SendToNick(tUser.sNick,"<"..sBotName.."> "..sWarn..tUsers[tUser.sNick].sRequest) return true end end -- Если не освобожден от проверки - поиск запрещенных слов : local sFbdWord = FbdWordsExist(tUser.iProfile,sData) if sFbdWord then Core.SendToNick(tUser.sNick,"<"..sBotName.."> *** Сообщение содержит запрещенное для ".. "вашего профиля слово : "..sFbdWord..".") if bRptFbdWords then Core.SendPmToNick(sAdminNick, "Стукачок", " *** Юзер с ником < "..tUser.sNick.. " > пытался написать в главном чате запрещенное слово : "..sFbdWord) end return true end end function ToArrival(tUser, sData) local sData = sData:sub(1,-2) local sTo,sFrom,sText = sData:match("%$To:%s+(%S+)%s+From:%s+(%S+)%s+%$<%S+>%s(.*)") -- Проверка на заблокированный ник или IP : if tBlockedAttributes[tUser.sIP] or tBlockedAttributes[tUser.sNick] then Core.SendPmToNick(tUser.sNick, sTo, "<"..sBotName.."> *** Для вас отключена возможность писать ".. "в чате и приватах, приватное сообщение не доставлено") return true end SetUserState(tUser) -- Проверка на блокировку привата для этого юзера и контрольный вопрос : if tUsers[tUser.sNick] and tUsers[tUser.sNick].bBlockPM then -- Если посылаемый текст соответствует ответу на контрольный вопрос : if sText==tUsers[tUser.sNick].sAnswer then tUsers[tUser.sNick].bBlockMC,tUsers[tUser.sNick].bBlockPM = nil,nil Core.SendPmToNick(tUser.sNick, sTo,"<"..sBotName.."> *** Вы правильно ответили (Ответ: "..sText.. "), теперь вы можете писать в чате и приватах.") return true else Core.SendPmToNick(tUser.sNick, sTo, "<"..sBotName.."> "..sWarn..tUsers[tUser.sNick].sRequest) return true end end -- Если не освобожден от проверки - поиск запрещенных слов : local sFbdWord = FbdWordsExist(tUser.iProfile,sText) if sFbdWord then Core.SendPmToNick(tUser.sNick, sTo, "<"..sBotName.."> *** Приватное сообщение не доставлено, ".. "т.к. содержит запрещенное для вашего профиля слово : "..sFbdWord..".") if bRptFbdWords then Core.SendPmToNick(sAdminNick, "Стукачок", " *** Юзер с ником < "..tUser.sNick.. " > пытался написать в личку юзеру с ником < "..sTo.." > запрещенное слово : "..sFbdWord) end return true end end function FbdWordsExist(iProf,s) for i,v in ipairs(tFbdWords) do for _,sWord in ipairs(v.tWords) do if s:find(sWord,1,true) and tFbdWords[i].tProfiles[iProf] ~= 1 then return sWord ; end end end end function SetUserState(tUser) -- Если профиль юзера не освобожден от блокировки чата и привата : if tNoChatBlock[tUser.iProfile] ~= 1 then if not tUsers[tUser.sNick] then -- Установка блокировки на чат и приват, и выработка вопроса и ответа для этого юзера : local x3,x2,x1=math.random(1,9),math.random(1,9),math.random(1,9) local x0=x3*100+x2*10+x1 local st="" ; st=tX3[x3].." " ; if x2==1 then x1=10+x1 else st=st..tX2[x2].." " ; end ; st=st..tX1[x1] tUsers[tUser.sNick] = { bBlockMC = BlockMC==1 and true, bBlockPM = BlockPM==1 and true, sAnswer= tostring(x0), sRequest=st, } end else tUsers[tUser.sNick] = nil end end