myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 

> GagCountry_ExcludeRangeIP, API2

Рейтинг 5 V
Теги
Нет тегов для показа
Артём
сообщение 22.1.2012, 21:56
Сообщение #1


Наруто на аваторке
***********

Группа: Пользователи
Сообщений: 2 606
Регистрация: 11.10.2008
Из: Харькова
Пользователь №: 771
Спасибо сказали: 773 раза




Название скрипта: 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 килобайт ) Кол-во скачиваний: 31


Спасибо сказали:
Go to the top of the page
+Quote Post
 
Начать новую тему
Ответов
Enyby
сообщение 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

Что сделано:
  • Исправлена ошибка OnStartup.
  • Вынес определение "хорошести" юзера в отдельную функцию.
  • Скрипт теперь работатает с Регами и Опами.
  • Формат кода.
  • Исправлена ошибка в блокировке ЛС.


UPD:
Исправил один свой баг в OnStartup.
UPD:
Исправил один свой баг в IsGoodUser.
Go to the top of the page
+Quote Post
Артём
сообщение 27.1.2012, 19:47
Сообщение #3


Наруто на аваторке
***********

Группа: Пользователи
Сообщений: 2 606
Регистрация: 11.10.2008
Из: Харькова
Пользователь №: 771
Спасибо сказали: 773 раза




Enyby, добавил в первом посту прикрепил.
Go to the top of the page
+Quote Post
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, соответственно. Их в коде нет. Так что главное зарегиться и чат будет доступен даже гагнутым странам. ЛС, как я уже писал, будет гагнут.

А моя версия стоит у меня и она кардинально отличается от того, что я писал, это просто фиксы к существующей версии.
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Сейчас: 29.3.2024, 2:52