GagCountry_ExcludeRangeIP, API2 |
Здравствуйте, гость ( Вход | Регистрация )
GagCountry_ExcludeRangeIP, API2 |
22.1.2012, 21:56
Сообщение
#1
|
|
Наруто на аваторке Группа: Пользователи Сообщений: 2 606 Регистрация: 11.10.2008 Из: Харькова Пользователь №: 771 Спасибо сказали: 774 раза |
Название скрипта: GagCountry_ExcludeRangeIP
Автор: Артём Огромное спасибо за помощь с диапазонами: Enyby Описание: Скрипт заглушки Стран с исключениями по профилю, IP и диапазону IP. В таблице tGoodPmUser укажите ник в ЛС которому смогут писать юзеры с гагнутой страны, для добавления в исключения IP "просящего". Внимание!!! Для нормальной работы функций определения страны юзеров, необходимо установить базу данных IP-To-Country. Скачать базу можно здесь. Для установки необходимо копировать файл ip-to-country.csv в папку cfg. GagCountry_ExcludeRangeIP.lua ( 4.05 килобайт ) Кол-во скачиваний: 43 GagCountry_ExcludeRangeIP_version_Enyby.lua ( 3.93 килобайт ) Кол-во скачиваний: 34 |
|
|
26.1.2012, 20:55
Сообщение
#2
|
|
Освоившийся участник Группа: Пользователи Сообщений: 391 Регистрация: 4.11.2009 Из: Дом Пользователь №: 4 923 Спасибо сказали: 239 раз |
Замени одноименные функции на эти:
Код local tExcludeParsed = {} function OnStartup() for k, v in pairs(tExclude) do if v ~= true then tExcludeParsed[iIp(k)] = iIp(v) else tExcludeParsed[k] = v end end end function IsGoodUser(tUser) if tProfile[tUser.iProfile] == 1 then local sCountryCode = IP2Country.GetCountryCode(tUser.sIP) local bDiap = false for iStartIP, iEndIP in pairs(tExcludeParsed) do if iEndIP ~= true then local iIP = iIp(tUser.sIP) if iIP >= iStartIP and iIP <= iEndIP then bDiap = true break end end end return not(tCountryGag[sCountryCode] and tExcludeParsed[tUser.sIP] == nil and not bDiap) end return true end function UserConnected(tUser) if not IsGoodUser(tUser) then Core.SendPmToNick(sAdmin, sBot, "*** Зашёл IP: « "..tUser.sIP.." » с гагнутой страны: « "..IP2Country.GetCountryCode(tUser.sIP).." »") end end RegConnected, OpCoonected = UserConnected, UserConnected function ChatArrival(tUser, sData) if not IsGoodUser(tUser) then local sMsg = sData:match("%b<>%s+(.*)|$") Core.SendToUser(tUser, "<"..sBot.."> Извините, ваша страна заглушена, свяжитесь с администрацией если желаете общаться на хабе".. "/ Sorry, your country is muted, contact the hub to add your IP address or range of IP in the list of exceptions") Core.SendPmToNick(sAdmin, sBot, "*** Засветился IP: « "..tUser.sIP.." » с гагнутой страны: « "..IP2Country.GetCountryCode(tUser.sIP).." » Пытался написать в Чат: "..sMsg) return true end end function ToArrival(tUser, sData) if not IsGoodUser(tUser) then local sTo, sFrom, sMsg = sData:match("$To:%s(%S+)%sFrom:%s(%S+)%s$%S+%s+(.*)|$") if sTo and tGoodPmUser[sTo] then -- Ники которым смогут писать в ЛС return end Core.SendPmToUser(tUser, sBot, "*** Извините, ваша страна заглушена, свяжитесь с администрацией если желаете общаться на хабе".. "/ Sorry, your country is muted, contact the hub to add your IP address or range of IP in the list of exceptions") Core.SendPmToNick(sAdmin, sBot, "*** Засветился IP: « "..tUser.sIP.." » с гагнутой страны: « "..IP2Country.GetCountryCode(tUser.sIP).." » Пытался написать в ЛС: "..sMsg) return true end end Что сделано:
UPD: Исправил один свой баг в OnStartup. UPD: Исправил один свой баг в IsGoodUser. |
|
|
27.1.2012, 19:47
Сообщение
#3
|
|
Наруто на аваторке Группа: Пользователи Сообщений: 2 606 Регистрация: 11.10.2008 Из: Харькова Пользователь №: 771 Спасибо сказали: 774 раза |
Enyby, добавил в первом посту прикрепил.
|
|
|
27.1.2012, 20:08
Сообщение
#4
|
|
Освоившийся участник Группа: Пользователи Сообщений: 391 Регистрация: 4.11.2009 Из: Дом Пользователь №: 4 923 Спасибо сказали: 239 раз |
Код function OnStartup() for k, v in ipairs(tExclude) do tExclude[k][1], tExclude[k][2] = iIp[v[1]], iIp[v[2]] end end Вот что тут делается? Было в таблице два значения: ключ - начало диапазона и значение - конец диапазона. А после выполнения что? По идее, как думал автор, ключ тот же, а уже в значении таблица, в которой два числа - представление обоих IP адресов в виде чисел. А на деле? Переписаны только первый и второй символы строки какой-то чушью. А все потому, что обращение к строке как массиву возможно и дает посимвольный доступ. Чушью потому, что в байтовое значение будет записано неральное по размеру число, которое, к тому же, скорее всего, сконвертируется в строку. Я думаю не стоит говорить, что результат несколько отличен от того, что ожидалось? Теперь окидываем код свежим взглядом и замечаем ipairs для ассоциативного массива. Поэтому тело цикла ни разу не выполнится. Налицо ошибка подавленная другой. Компенсация одной ошибки другой. Код function ToArrival(tUser, sData) if tProfile[tUser.iProfile] == 1 then local value = tCountryGag[IP2Country.GetCountryCode(tUser.sIP)] local bDiap = false for sStartIP, sEndIP in pairs(tExclude) do if sEndIP ~= true then if iIp(tUser.sIP) >= iIp(sStartIP) and iIp(tUser.sIP) <= iIp(sEndIP) then bDiap = true break end end end local sTo,sFrom,sMsg = sData:match"$To:%s(%S+)%sFrom:%s(%S+)%s$%S+%s+(.*)" if sTo and tGoodPmUser[sTo] then return end -- Ники которым смогут писать в ЛС Core.SendPmToUser(tUser, sBot, "*** Извините, ваша страна заглушена, свяжитесь с администрацией если желаете общаться на хабе".. "/ Sorry, your country is muted, contact the hub to add your IP address or range of IP in the list of exceptions") Core.SendPmToNick(sAdmin, sBot, "*** Засветился IP: « "..tUser.sIP.." » с гагнутой страны: « "..IP2Country.GetCountryCode(tUser.sIP).." » Пытался написать в ЛС: "..sMsg) return true end end В коде вычисляется bDiap и ни разу не используется. Налицо отсутствие условие проверки на попадание в список хороших юзеров как и попадание в список гагнутых стран. Т. е. если профиль попал в список гагнутых профилей, то он получит гаг на все лички кроме разрешенных, вне зависимости от нахождения в списке разрешений или своей страны. Посмотрели, что есть, чего не надо. Теперь посмотрим чего нет в коде. При подключении рега или опа, UserConnected не вызывается, а вызывается RegConnected и OpConnected, соответственно. Их в коде нет. Так что главное зарегиться и чат будет доступен даже гагнутым странам. ЛС, как я уже писал, будет гагнут. А моя версия стоит у меня и она кардинально отличается от того, что я писал, это просто фиксы к существующей версии. |
|
|
|
Сейчас: 27.11.2024, 1:36 |