Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Готовые скрипты для PtokaX _ GagCountry_ExcludeRangeIP

Автор: Артём 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 килобайт ) : 31

Автор: 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

Что сделано:


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, соответственно. Их в коде нет. Так что главное зарегиться и чат будет доступен даже гагнутым странам. ЛС, как я уже писал, будет гагнут.

А моя версия стоит у меня и она кардинально отличается от того, что я писал, это просто фиксы к существующей версии.