Автор: Артём 22.1.2012, 21:56
Название скрипта: GagCountry_ExcludeRangeIP
Автор: Артём
Огромное спасибо за помощь с диапазонами: Enyby
Описание: Скрипт заглушки Стран с исключениями по профилю, IP и диапазону IP. В таблице tGoodPmUser укажите ник в ЛС которому смогут писать юзеры с гагнутой страны, для добавления в исключения IP "просящего".
Внимание!!! Для нормальной работы функций определения страны юзеров, необходимо установить базу данных IP-To-Country. Скачать базу можно http://mydc.ru/topic5036.html. Для установки необходимо копировать файл ip-to-country.csv в папку cfg.
GagCountry_ExcludeRangeIP.lua ( 4.05 килобайт )
: 43
GagCountry_ExcludeRangeIP_version_Enyby.lua ( 3.93 килобайт )
: 34
Автор: Enyby 26.1.2012, 20:55
Замени одноименные функции на эти:
Код
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
Что сделано:
- Исправлена ошибка OnStartup.
- Вынес определение "хорошести" юзера в отдельную функцию.
- Скрипт теперь работатает с Регами и Опами.
- Формат кода.
- Исправлена ошибка в блокировке ЛС.
UPD:Исправил один свой баг в OnStartup.
UPD:Исправил один свой баг в IsGoodUser.
Автор: Артём 27.1.2012, 19:47
Enyby, добавил в первом посту прикрепил.
Автор: Enyby 27.1.2012, 20:08
Код
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, соответственно. Их в коде нет. Так что главное зарегиться и чат будет доступен даже гагнутым странам. ЛС, как я уже писал, будет гагнут.
А моя версия стоит у меня и она кардинально отличается от того, что я писал, это просто фиксы к существующей версии.