--[[ Скрипт блокировки главного чата и лички до ввода разблокирующего кода Проверена работа на LUA 5.1.2 Версия: 1.1 Автор: Foreteller12 18.12.2007 ]]-- --------------------------------------- Конфигурация --------------------------------------- -------------------------------------------------------------------------------------------- BotName = "ChatGuard" -- Имя бота bot = BotName BotIsOp = 1 -- Бот будет с ключиком или нет? BotDesc = "ChatGuard" -- Описание бота BotEmail = "http://files.f12p.ru" -- Email бота sVer = "1.1" -- Версия скрипта chatguardf = "ChatGuardF12\\chatguard.tbl" function WriteFile(table, tablename, file) local handle = io.open(file, "w") Serialize(table, tablename, handle) handle:close() end function Serialize(tTable, sTableName, hFile, sTab) sTab = sTab or ""; hFile:write(sTab..sTableName.." = {\n" ); for key, value in pairs(tTable) do local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key); if(type(value) == "table") then Serialize(value, sKey, hFile, sTab.."\t"); else local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value); hFile:write(sTab.."\t"..sKey.." = "..sValue); end hFile:write(",\n"); end hFile:write(sTab.."}"); end function loadlua(file,msg) local f = assert(loadfile(file), msg) return f() end loadlua(chatguardf,chatguardf.." для "..bot.." не найдены") -- Режим блокировки: Чтоб будем блокировать BlockPM = 1 --Блокировка приватов (0: Не блокировать 1: Блокировать 2: Блокировать приват на каждый ник) BlockMC = 1 --Блокирвока общего чата (0: Не блокировать 1: Блокировать) -- Профили освобождённые от блокировки tNoBlock = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 1, -- VIP [3] = 1, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер } -- Профили c правами бана tProfiles = { [0] = 1, -- Мастер [1] = 1, -- ОП [2] = 0, -- VIP [3] = 0, -- Зарегистрированный юзер [-1] = 0, -- Незарегистрированный юзер } -- IP в бане для чата и привата tBanIP = { ["127.0.0.1"] = 1, --тест } US={}; tX1 ={ [0]="ноль", [1]="один", [2]="два", [3]="три", [4]="четыре", [5]="пять", [6]="шесть", [7]="семь", [8]="восемь", [9]="девять", [10]="десять", [11]="одиннадцать", [12]="двенадцать", [13]="тринадцать", [14]="четырнадцать", [15]="пятнадцать", [16]="шестнадцать", [17]="семнадцать", [18]="восемнадцать", [19]="девятнадцать", } tX2 ={ [2]="двадцать", [3]="тридцать", [4]="сорок", [5]="пятьдесят", [6]="шестьдесят", [7]="семьдесят", [8]="восемьдесят", [9]="девяносто", } tX3 ={ [1]="сто", [2]="двести", [3]="триста", [4]="четыреста", [5]="пятьсот", [6]="шестьсот", [7]="семьсот", [8]="восемьсот", [9]="девятьсот", } function Main() frmHub:RegBot(BotName,BotIsOp,BotDesc,BotEmail); end function NewUserConnected(sUser) US[sUser.sName]={}; if tBanIP[sUser.sIP]==1 then sUser:SendData(BotName, "Для вас отключена возможность писать в чате и приватах.") return 1 else if tNoBlock[sUser.iProfile] ~= 1 then if BlockMC==1 then US[sUser.sName].MC="0" else US[sUser.sName].MC="1" end; if BlockPM==1 then US[sUser.sName].PM="0" else US[sUser.sName].PM="1" end; local x3=math.random(1,9); local x2=math.random(1,9); local x1=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]; US[sUser.sName].intn=x0..""; US[sUser.sName].strn=st; sUser:SendData(BotName, "Для того чтобы писать в чате и приватах, напишите цифрами: "..US[sUser.sName].strn) else US[sUser.sName].MC="1"; US[sUser.sName].PM="1"; end end end OpConnected = NewUserConnected function ChatArrival(sUser, sData) if US[sUser.sName]==nil then US[sUser.sName]={}; if tNoBlock[sUser.iProfile] ~= 1 then if BlockMC==1 then US[sUser.sName].MC="0" else US[sUser.sName].MC="1" end; if BlockPM==1 then US[sUser.sName].PM="0" else US[sUser.sName].PM="1" end; local x3=math.random(1,9); local x2=math.random(1,9); local x1=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]; US[sUser.sName].intn=x0..""; US[sUser.sName].strn=st; else US[sUser.sName].MC="1"; US[sUser.sName].PM="1"; end end local sData = string.sub(sData, 1, -2) local s,e = string.find(sData, "%b<>%s+") local sData = string.sub(sData, e+1, -1) if tBanIP[sUser.sIP]==1 then sUser:SendData(BotName, "Для вас отключена возможность писать в чате и приватах.") return 1 else if (US[sUser.sName].MC=="0") then if sData==US[sUser.sName].intn then US[sUser.sName].MC="1"; US[sUser.sName].PM="1"; sUser:SendData(BotName, "Вы правильно ответили (Ответ: "..sData.."), теперь вы можете писать в чате и приватах.") return 1 else sUser:SendData(BotName, "Для того чтобы писать в чате и приватах, напишите цифрами: "..US[sUser.sName].strn) return 1 end end end -- блок команд if tProfiles[sUser.iProfile] and tProfiles[sUser.iProfile] == 1 then data = string.sub(sData,1,string.len(sData)-1) cmd = string.match(data,"%b<>%s+(%S+)") if cmd then if string.lower(cmd) == "!cgbanipr" then local temp1,temp2,temp3=string.match(data,"%b<>%s+(%S+)%s+(%S+)%s+(.*)$") curUser:SendData(bot,"[command] "..temp1.." "..temp2.." "..temp3) if tBanIP[temp2]==nil then tBanIP[temp2]={} tBanIP[temp2]["ip"]=temp2 tBanIP[temp2]["fromuser"]=sUser.sName tBanIP[temp2]["time"]=os.date("%c") tBanIP[temp2]["itime"]=os.date() tBanIP[temp2]["r"]=temp3 tBanIP["banlistc"]=tBanIP["banlistc"]+1 tBanIP[tBanIP["banlistc"]]=temp2 WriteFile(tBanIP, "tBanIP", chatguardf) WriteFile(tBanIP, "tBanIP", chatguardf) sUser:SendData(bot,"Для IP:"..tBanIP[temp2]["ip"].." отключён чат и приваты по причине: "..tBanIP[ntext]["r"]) end return 1 end end cmd="" end end function ToArrival(sUser, sData) if US[sUser.sName]==nil then US[sUser.sName]={}; if tNoBlock[sUser.iProfile] ~= 1 then if BlockMC==1 then US[sUser.sName].MC="0" else US[sUser.sName].MC="1" end; if BlockPM==1 then US[sUser.sName].PM="0" else US[sUser.sName].PM="1" end; local x3=math.random(1,9); local x2=math.random(1,9); local x1=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]; US[sUser.sName].intn=x0..""; US[sUser.sName].strn=st; else US[sUser.sName].MC="1"; US[sUser.sName].PM="1"; end end local s,e,whoTo,from,arg = string.find(sData,"%$To:%s+(%S+)%s+From:%s+(%S+)%s+(.*)"); arg=string.sub(arg, 2, -2); local s,e = string.find(arg, "%b<>%s+"); arg = string.sub(arg, e+1, -1); if tBanIP[sUser.sIP]==1 then sUser:SendData("$To: "..sUser.sName.." From: "..whoTo.." $<"..BotName.."> Приватное сообщение не доставлено"); sUser:SendData("$To: "..sUser.sName.." From: "..whoTo.." $<"..BotName.."> Для вас отключена возможность писать в чате и приватах.") return 1 else if (US[sUser.sName].PM=="0") then if US[sUser.sName].intn==arg then US[sUser.sName].MC="1"; US[sUser.sName].PM="1"; sUser:SendData("$To: "..sUser.sName.." From: "..whoTo.." $<"..BotName.."> Вы правильно ответили (Ответ: "..arg.."), теперь вы можете писать в чате и приватах.") return 1 else sUser:SendData("$To: "..sUser.sName.." From: "..whoTo.." $<"..BotName.."> Приватное сообщение не доставлено"); sUser:SendData("$To: "..sUser.sName.." From: "..whoTo.." $<"..BotName.."> Для того чтобы писать в чате и приватах, напишите цифрами: "..US[sUser.sName].strn) return 1 end end end end function OnExit(sUser) US[sUser.sName]={}; end;