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

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

MyDC.ru _ Помощь по скриптам для PtokaX _ Отправка сообщений в диапазон IP

Автор: SAG 10.4.2010, 21:03

Что надо сделать, чтобы скрипт отсылал сообщения только определённному IP диапазону?
Конкретнее, нужно в скриптах http://mydc.ru/topic2981s20.html и http://mydc.ru/topic111s40.html?start=40 сделать так, чтобы сообщения приходили только юзерам с локальным адресом, а тем, кто заходит с внешним IPом сообщения не приходили (так как это новости локального ресурса).

Автор: Артём 10.4.2010, 23:20

Зачем третий раз один и тот же вопрос писать?

Автор: SAG 11.4.2010, 7:16

Цитата(Артём @ 10.4.2010, 23:20) *
Зачем третий раз один и тот же вопрос писать?


А там никто не ответил. Да и вообще, как это делается в скриптах?

Автор: Артём 11.4.2010, 7:44

Цитата(SAG @ 11.4.2010, 7:16) *
А там никто не ответил.

Ну так и что, нада наплодить вопросов?

Автор: alex82 11.4.2010, 9:48

Цитата(SAG @ 11.4.2010, 7:16) *
Да и вообще, как это делается в скриптах?

Создаем таблицу с диапазонами:
Код
tLocal = {
    {"10.0.0.0","10.255.255.255",},
    {"172.16.0.0","172.31.255.255"},
    {"192.168.0.0","192.168.255.255"},
}

При запуске скрипта преобразовываем адреса в числовой формат:
Код
function OnStartup()
    for i in ipairs(tLocal) do
        tLocal[i][1] = tLocal[i][1]:iptonumber()
        tLocal[i][2] = tLocal[i][2]:iptonumber()
    end
end

Ну а дальше остается проверить принадлежность IP-адреса к одному из диапазонов:
Код
for _,range in ipairs(tLocal) do
    if range[1] <= ip and ip <= range[2] then
        -- Здесь выполняются действия, необходимые только для указанных диапазонов
        break
    end
end

Ну и, разумеется, нужна функция преобразования адреса в числовой формат:
Код
function string.iptonumber(ip)
    local i1, i2, i3, i4 = ip:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
    if i1 then
        return i1*16777216+i2*65536+i3*256+i4
    end
end


Автор: SAG 11.4.2010, 14:14

alex82 покажи пожалуйста на примере одного из этих скриптов, как это сделать, а то у меня ничего не получается.

Автор: alex82 11.4.2010, 18:42

http://mydc.ru/topic3167.html
http://mydc.ru/topic2816.html

PS. Совсем забыл - проверяемый айпи тоже нужно перевести в числовой формат

Код
local ip = user.sIP:iptonumber()
for _,range in ipairs(tLocal) do
    if range[1] <= ip and ip <= range[2] then
        -- Здесь выполняются действия, необходимые только для указанных диапазонов
        break
    end
end

Автор: SAG 11.4.2010, 22:13

что-то я подзапутался .
ошибка: - \scripts\RSSFeed.lua:136: attempt to index global 'user' (a nil value)
вот кусок" -

Раскрывающийся текст

if next(New) then
local reply,cnt = "",0
for key,val in ipairs(New) do
local bool = true
for i,v in ipairs(Old) do if v[2] == val[2] then bool = false break end end
if bool then
cnt = cnt + 1
for i,v in ipairs(val) do reply = reply..v.."\n" end
reply = reply.."------------------------------------------------------------------------------------------------------------------------------------\n"
end
end
if reply:len() > 0 then
local plural = ""
if cnt > 1 then plural = "" end
Old = New
SaveFile(File,Old,"Old")
local s = tostring(cnt).." новых цитат"..plural.." с: "..Feed.."\n\n"..reply.."\n\n"
s = s:gsub("|", "&#".."124;")
local ip = user.sIP:iptonumber() -- вот 136 строка
for _,range in ipairs(tLocal) do
if range[1] <= ip and ip <= range[2] then
if DoMotd and Motd ~= "" then SetMan.SetMOTD(Motd.."\n\n\t"..s) end
return s

end
end
end
end
end

GetFeed = function()
local st = socket.gettime()

local s,fd,sz,hd = "",http.request(Feed)
if fd and sz then
local td,plural = socket.gettime()-st,"секунды."
if td > 1 then plural = "секунд." end
local time = string.format("%.2f "..plural,td)
local msg = ParseFeed(Decode(fd))
local Send = function(str)
local ip = user.sIP:iptonumber() -- 158 строка
for _,range in ipairs(tLocal) do
if range[1] <= ip and ip <= range[2] then
if OnlyPm then
Core.SendPmToAll(FeedNick,str.."|")
else
Core.SendToAll("<"..FeedNick.."> "..str.."|")
end

break
end
end
end
if msg and msg:len() > 0 then Send(msg.."\t\t\tОбработано за: "..time.."\n\n") end
Mem()
end
end



а в 158 строке до этого не выдавал ошибки, хотя я там тоже самое сделал.

Автор: alex82 12.4.2010, 10:50

SAG

То, что ты выложил, невозможно читать. Для кода используй тег [code], или прикрепи весь скрипт.

Автор: SAG 12.4.2010, 16:18

Вот рабочий мой скрипт -

 Newssety.lua ( 7.37 килобайт ) : 5


а вот что я начудил -

 Newssety1.lua ( 8.34 килобайт ) : 6

Автор: alex82 12.4.2010, 19:29

Угу, начудил...

Зачем было пихать проверку диапазона в функцию обработки rss? В ней нету таблицы user, да и результат работы она засовывает в сообщение дня птоки. А оно глобальное, т.е одинаковое для всех, вне зависимости от диапазона.

Как я понимаю, ты хочешь отправлять данные, полученные из rss-потока, юзерам из локалки при входе? Если да, то так делать нельзя:

Код
            local ip = user.sIP:iptonumber()
            for _,range in ipairs(tLocal) do
            if range[1] <= ip and ip <= range[2] then
            if DoMotd and Motd ~= "" then SetMan.SetMOTD(Motd.."\n\n\t"..s) end

Почему нельзя - написано одним абзацем выше.


Автор: SAG 12.4.2010, 20:18

вот этот -
 FeedLogon.lua ( 12.37 килобайт ) : 7


ошибок не выдает, но ...
... и не фильтрует, сообщения идут и в локалку и во внешку .

Автор: SAG 15.4.2010, 16:05

Теперь скрипт, благодаря alex82, работает, как надо!
Отсылает сообщения определённому диапазону IP (указанному в tLocal), и может по времени отправлять сообщения (надо только раскомментировать строки с 248 по 257).
Вот работающий скрипт -  FeedLogon.lua ( 12.23 килобайт ) : 12