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

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

MyDC.ru _ Помощь по скриптам для PtokaX _ Переделка скриптов

Автор: Fe(one)X 11.8.2011, 0:40

Всем привет. Прошу помочь мне с двумя скриптами, т. к. сам я не силён в этом деле.
В общем имеется на хабе 2 скрипта, первый показывает время в чате по запросу пользователя, второй блокирует рекламу с хабами. Сделать нужно следующее:

Раскрыть!
sBot = SetMan.GetString(21)

RutSubs={ -- Описания раннего утра
[1] = "Спать ещё надо)",
[2] = "На работу проснулись?)",
[3] = "Раннее утро.",
[4] = "Петухи поют за окном)",
[5] = "В школу пора?)",
[6] = "Солнце встаёт)",
}

UtrSubs={ -- Описания утра
[1] = "Утро.",
[2] = "Утро на дворе)",
[3] = "Школота учится)",
[4] = "Скоро день)",
[5] = "Утро за окном.",
[6] = "На работу пора, чё в DC сидим?)",
}

DaySubs={ -- Описания дня
[1] = "День)",
[2] = "Сейчас день.",
[3] = "Светлое время суток.",
[4] = "Город как большой муравейник)",
[5] = "Работа в городе кипит)",
}

SkveSubs={ -- Описания предвечернего времени суток
[1] = "Скоро вечер.",
[2] = "Люди возращаются с работы.",
[3] = "Час пик в автобусах)",
[4] = "Заканчивается рабочий день...",
[5] = "Наступает вечер.",
}

VeSubs={ -- Описания вечера
[1] = "Вечер.",
[2] = "Молодёжь гуляет по паркам)",
[3] = "Город зажигает фонари...)",
[4] = "Рабочий день закончен!",
[5] = "Затихает городская суета...",
}

PozdveSubs={ -- Описания позднего вечера
[1] = "Поздний вечер)",
[2] = "Спокойной ночи малыши уже кончились big_smile1.gif",
[3] = "Спать пора)",
[4] = "Идущим спать, спокойной ночи)",
[5] = "Город постепенно засыпает...",
[6] = "Скоро ночь)",
}

NoSubs={ -- Описания ночи
[1] = "Чё не спим?)",
[2] = "Ночь, бегом спать!)",
[3] = "Не спится?)",
[4] = "Ночь.",
[5] = "Тёмное время суток.",
[6] = "Бессонница?)",
[7] = "Тёёёёёмная ночь.....",
[8] = "Шо не спим, хлопчик?big_smile1.gif",
}

function ChatArrival(tUser, sData)
local cmd = sData:match"%b<>%s+(%S+).*|"
if cmd == "!сегодня" or cmd == "!date" or cmd == "!дата" or cmd == "!today" then
local iHour, sMsg = tonumber(os.date"%H"), " Точное время "..os.date("%X").." "
if iHour >= 4 and iHour < 7 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. RutSubs[math.random(#RutSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 7 and iHour < 12 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. UtrSubs[math.random(#UtrSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 12 and iHour < 17 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. DaySubs[math.random(#DaySubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 17 and iHour < 18 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. SkveSubs[math.random(#SkveSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 18 and iHour <= 22 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. VeSubs[math.random(#VeSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 22 and iHour <= 24 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. PozdveSubs[math.random(#PozdveSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 00 and iHour <= 4 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. NoSubs[math.random(#NoSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
end
return true
end
end
function UserConnected(tUser)
Core.SendToUser(tUser,"$UserCommand 1 3 Ресурсы\\Время\\Сегодня...$<%[mynick]> !дата|")
end
RegConnected,OpConnected=UserConnected,UserConnected

Нужно чтобы в топике хаба отображалось время с датой. Как это сделать в данном скрипте?

И здесь:
Раскрыть!
--[[
Скрипт антирекламы 1.1 на основе скрипта ChatFilter V1.02 by KoYoT
Совместимость: ptokax 0.4.0.0, lua 5.13
by [fwx]Diver
Переделано и дополнено [VHZ]ZmuriK
]]--

sBot = "Антиреклама" -- имя бота
BotReg = 0 --показывать бота в списке пользователей
BanMode = 1
-- 0 - перманентный бан по нику и IP
-- 1 - временный бан по нику и IP. время задается в BanTime
-- 2 - кик
-- 3 - только предупреждение

BanTime = 120 -- время бана в минутах, для режима 1
UserSay = 0 -- заменять фразу с рекламой на случайное выражение из MessageToAll

text = "\r\n\t\tПредупреждение: Вы нарушили правилa хаба и будете забанены, если продолжите испытывать терпение администрации хаба.\r\nЕсли вы открыли свой хаб - это, конечно, просто замечательно. Но то, что вы своими сообщениями об этом пытаетесь изнасиловать мозг всех посетителей хаба одновременно - это уже перебор. Нужно заявить миру о своём детище, пишите на форумах. Если кто-то попросил дать ссылку - добро пожаловать к нему в приват."
text_to_op = " пытался сообщить в общий чат следующую фразу:"
sByByText = "Вы были забанены за рекламу!"
sReason = "Нарушение правил хаба. Реклама ресурсов запрещена!"

-- Кого нужно проверять (1 - да, 0 - нет) --
CanDo = {
[-1] = 1, -- Незарегестрированный
[0] = 0, -- Мастер
[1] = 0, -- ОП
[2] = 1, -- Вип
[3] = 1, -- Зарегестрированный
[4] = 1, -- Модератор
}

-- Что запрещаем
adverTable = {
"dchub","DCHUB","DChub","DcHub","DchUb",
"DchuB","dCHub","dChUb","dChuB","dcHUb",
"dcHuB","dchUB","DCHub","DChUb","DChuB",
"DcHUb","DchUB","dCHUb","dCHuB","dChUB",
"dcHUB","DCHUb","DCHuB","DChUB","DcHUB",
"dCHUB","adc","d c h u b://","dchub://",
"d*c*h*u*b://","d-c-h-u-b://","d/c/h/u/b://",
"d`c`h`u`b://","d!c!h!u!b://","d@c@h@u@b://",
"d#c#h#u#b://","d$c$h$u$b://","d%c%h%u%b://",
"d^c^h^u^b://","d&c&h&u&b://","d(c(h(u(b://",
"d)c)h)u)b://","d_c_h_u_b://","d=c=h=u=b://","d+c+h+u+b://",
"d\c\h\u\b://","d?c?h?u?b://","d.c.h.u.b://",
"d>c>h>u>b://","d,c,h,u,b://","d<c<h<u<b://",
"d~c~h~u~b://","d№c№h№u№b://","d;c;h;u;b://",
"d:c:h:u:b://","d|c|h|u|b://","d]c]h]u]b://",
"d[c[h[u[b://","d{c{h{u{b://","d}c}h}u}b://",
"adc","Adc","aDc","adC","ADc","aDC","AdC",
"a d c://","adc://","a*d*cb://","a-d-c://",
"a/d/c://","a`d`c://","a!d!c://","a@d@c://",
"a#d#c://","a$d$c://","a%d%c://","a^d^c://",
"a&d&c://","a(d(c://","a)d)c://","a_d_c://",
"a=d=c://","a+d+c://","a\d\c://","a?d?c://",
"a.d.c://","a>d>c://","a,d,c://","a<d<c://",
"a~d~c://","a№d№c://","a;d;c://","a:d:c://",
"a/d/c://","a|d|c://","a]d]c://","a[d[c://",
"a{d{c://","a}d}c://","a d c://"," adc://",
"f-h.sytes.net",
}

-- Что разрешаем
safeTable = {
"dchub://vlz.e-telecom.ru","dchub://10.50.48.12","dchub://vlz.sytes.net",
}

MessageToAll = {
"Народ, кто хочет выпить пива? Угощаю.",
"У меня сегодня праздник! Проставляюсь всем!",
"Постучите мне по голове, чтобы я проснулся.",
"Ау, где я?",
"Народ. Ау. Где я?",
"Что здесь происходит?",
"Больше так пить не буду.",
"Хочу быть взрослым.",
"Хочу быть умным.",
"Почему у меня усы не растут?",
"На какую кнопку нужно нажимать чтобы выключить комп?",
"абыРвалГ",
"Народ. Какое сегодня число?",
"Народ. Какой сегодня месяц?",
"Не понял.",
"Мои мысли, мои скакуны.",
"Раздолбай я, раздолбай.",
"Пора менять клавиатуру.",
}

------------------------------[ Code Section ]------------------------------
function OnStartup()
if BotReg == 1 then
Core.RegBot(sBot, "", "", true)
end
PhrasLen = table.maxn(MessageToAll)
end

function ChatArrival(tUser,sData)
if CanDo[tUser.iProfile] == 0 then
return false
end
local s,e,msg = string.find(sData,"%b<>%s(.*)")
if checkForAdvertising(msg) then
if checkForSafe(msg) then
return false
end
Core.SendPmToOps(sBot, "*** "..tUser.sNick.." "..text_to_op.." "..msg)
if UserSay == 1 then
Core.SendToAll("<"..tUser.sNick.."> "..MessageToAll[math.random(PhrasLen)])
end
if BanMode == 0 then
Core.SendToUser(tUser,"<"..sBot.."> "..sByByText)
BanMan.Ban(tUser,sReason,sBot,true)
end
if BanMode == 1 then
Core.SendToUser(tUser,"<"..sBot.."> "..sByByText)
BanMan.TempBan(tUser,BanTime,sReason,sBot,true)
end
if BanMode == 2 then
Core.SendToUser(tUser,"<"..sBot.."> "..sByByText)
Core.Kick(tUser,sBot,sReason)
end
if BanMode == 3 then
Core.SendToUser(tUser,"<"..sBot.."> *** "..text)
end
collectgarbage("collect")
return true
end
end

function ToArrival(tUser,sData)
if CanDo[tUser.iProfile] == 0 then
return false
end
local s,e,msg = string.find(sData,"%b<>%s(.*)")
if checkForAdvertising(msg) then
if checkForSafe(msg) then
return false
end
Core.SendPmToOps(sBot, "*** "..tUser.sNick.." "..text_to_op.." "..msg)
if UserSay == 1 then
Core.SendToAll("<"..tUser.sNick.."> "..MessageToAll[math.random(PhrasLen)])
end
if BanMode == 0 then
Core.SendToUser(tUser,"<"..sBot.."> "..sByByText)
BanMan.Ban(tUser,sReason,sBot,true)
end
if BanMode == 1 then
Core.SendToUser(tUser,"<"..sBot.."> "..sByByText)
BanMan.TempBan(tUser,BanTime,sReason,sBot,true)
end
if BanMode == 2 then
Core.SendToUser(tUser,"<"..sBot.."> "..sByByText)
Core.Kick(tUser,sBot,sReason)
end
if BanMode == 3 then
Core.SendToUser(tUser,"<"..sBot.."> *** "..text)
end
collectgarbage("collect")
return true
end
end

function checkForAdvertising(msg)
for _,v in ipairs(adverTable) do
if string.find(msg, v) then
return true
end
end
return false
end

function checkForSafe(msg)
for _,v in ipairs(safeTable) do
if string.find(msg, v) then
return true
end
end
return false
end

Не работает вот это:
-- Что разрешаем
safeTable = {
"dchub://vlz.e-telecom.ru","dchub://10.50.48.12","dchub://vlz.sytes.net",
}

Т. е. если писать эти адреса в чате, то они тоже блокируются, хотя не должны. Где ошибка?

Надеюсь на Вашу помощь. Заранее спасибо.

Автор: Damaks 11.8.2011, 7:38

Цитата(Fe(one)X @ 11.8.2011, 1:40) *
Не работает вот это:
-- Что разрешаем
safeTable = {
"dchub://vlz.e-telecom.ru","dchub://10.50.48.12","dchub://vlz.sytes.net",
}

Т. е. если писать эти адреса в чате, то они тоже блокируются, хотя не должны. Где ошибка?

Всё работает, исключения не подпадают под запрет и проходят в чат.

Кстати, в этом скрипте есть лазейка: если ввести в чат фразу, содержащую и запрет, и исключение, например
Цитата
Заходите на Пупкин-ХАБ! . . . . . dchub://pupkinhub.ru . . . . . (рекомендует администрация dchub://vlz.sytes.net)

то она пройдёт в чат без фильтрации big_smile.gif

Автор: Alexey 11.8.2011, 7:47

[offtop]
Делаем ставки, господа, через сколько постов Дамакс кинет ссылку на свой скрипт? ))
[/offtop]

Автор: Damaks 11.8.2011, 8:18

Цитата(Alexey @ 11.8.2011, 8:47) *
[offtop]
Делаем ставки, господа, через сколько постов Дамакс кинет ссылку на свой скрипт? ))
[/offtop]

По многочисленным просьбам трудящихся: http://mydc.ru/topic3516.html
Хороший скрипт не грех порекомендовать victory.gif

Автор: Fe(one)X 11.8.2011, 13:03

Цитата(Damaks @ 11.8.2011, 8:38) *
Всё работает, исключения не подпадают под запрет и проходят в чат.

Так должно быть, но если я пишу адрес хаба из списка исключений, то всё равно даётся бан. Видимо где-то в самом коде ошибка, вот только где?

Автор: Damaks 11.8.2011, 15:50

Fe(one)X
В исключениях нужно экранировать символы ( ) . % + - * ? [ ] ^ $
Для этого перед ними нужно поставить символ % (например dchub://vlz%.e%-telecom%.ru)

Автор: Fe(one)X 11.8.2011, 18:52

Цитата(Damaks @ 11.8.2011, 16:50) *
Fe(one)X
В исключениях нужно экранировать символы ( ) . % + - * ? [ ] ^ $
Для этого перед ними нужно поставить символ % (например dchub://vlz%.e%-telecom%.ru)

Спасибо, помогло. ;-)

ЗЫ: А со скриптом времени поможете?

Автор: Damaks 11.8.2011, 20:25

Вставляешь в конце скрипта:

Раскрывающийся текст
Код
function OnStartup()
    tmr = TmrMan.AddTimer (60*60000)    -- проверка и смена топика каждые 60 минут
end

function OnTimer(tmr)
    local iHour = tonumber(os.date"%H")
    if iHour >= 4 and iHour < 7 then
        SetMan.SetString(10, RutSubs[math.random(#RutSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    elseif iHour >= 7 and iHour < 12 then
        SetMan.SetString(10, UtrSubs[math.random(#UtrSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    elseif iHour >= 12 and iHour < 17 then
        SetMan.SetString(10, DaySubs[math.random(#DaySubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    elseif iHour >= 17 and iHour < 18 then
        SetMan.SetString(10, SkveSubs[math.random(#SkveSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    elseif iHour >= 18 and iHour <= 22 then
        SetMan.SetString(10, VeSubs[math.random(#VeSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    elseif iHour >= 22 and iHour <= 24 then
        SetMan.SetString(10, PozdveSubs[math.random(#PozdveSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    elseif iHour >= 00 and iHour <= 4 then
        SetMan.SetString(10, NoSubs[math.random(#NoSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X"))
    end
    return true
end

Запускаешь скрипт в ровное время (9.00, 10.00, 11.00 и т.д.).
Смена топика произойдёт через час после запуска. Можешь изменить время.

Автор: Fe(one)X 23.8.2011, 21:21

Damaks, спасибо конечно, но это немного нето. Дело в том, что у меня на хабе стоит скрипт Автотопик, который автоматически меняет топик каждые 20 секунд. Так вот можно сделать так, чтобы время отображалось рядом с топиком? Или сделать так чтобы время отображалось в автотопике? Заранее спасибо.

И ещё:

Раскрыть!

-- This script is converted with PtokaX LUA API Converter v0.9 at 10/17/08 09:10:38
--------------------------------------------------------------------
-- ChatFilter V1.02 by KoYoT
-- Скрипт на блокировку рекламы хабов, мат и прочего.
-- Безобидно отучает пользователей от злоупотребления терпением администратора хаба.
--------------------------------------------------------------------

-- Эти фразы будут заменять не прошедшие цензуру строки
-- Можно добавлять без ограничений
Phrases = {
[1] = "Реклама на хабе запрещена - Читай правила !rules",
[2] = "Реклама на хабе запрещена - Наш сайт http://mydc.ru/r/?http://vlz.e-telecom.ru&quot;,
}
local tProfiles = {
[0] = 0, -- Мастер
[1] = 0, -- ОПератор
[2] = 0, -- VIP
[3] = 1, -- Зарегистрированный пользователь
[-1] = 1, -- Незарегистрированный пользователь
}
-- Ключевые буквосочетания, по которым вводим цензуру (добавляем сами под конкретные нужды)
-- Чем их больше, тем больше нагрузка на процессор
Filter = {
[1] = "http",
[2] = "ftp",
[3] = "www",
[4] = "%d+%.%d+%.%d+%.%d+",
[5] = "%d+%,%d+%,%d+%,%d+",
[6] = "%d+%-%d+%-%d+%-%d+",
[7] = "%d+% %d+% %d+% %d+",
[8] = "%d+%_%d+%_%d+%_%d+",



}
PhrasLen = #Phrases
FilterLen = #Filter

-----------------------------------------------
function ChatArrival(curUser,data)
if tProfiles[curUser.iProfile] == 1 then
Core.GetUserAllData(curUser)
local _,_,sdata = string.find( data, "^%b<>%s(.*)$")
if sdata then
sdata = StringLower(sdata)
for i = 1, FilterLen do
if string.find( sdata, Filter[i]) then
Core.SendToAll("<"..curUser.sNick.."> ".. Phrases[math.random(PhrasLen)])
return true
end
end
end
end
end

-----------------------------------------------
function StringLower(arg) -- Приводим текстовую строку в нижний регистр
local res = ""
local Byte, Len = nil, string.len(arg)
arg = string.lower(arg)
for i = 1, Len do
Byte = string.byte(arg, i)
if (Byte >= 192) and (Byte < 224) then
Byte = Byte + 32
end
if (Byte == 168) or (Byte == 184) then Byte = 229 end -- убираем проблему с Ё
res = res..string.char(Byte)
end
return res
end
-----------------------------------------------


Помогите кто-нибудь сделать в этом скрипте таблицу исключений для заданных адресов. Увы времени разобраться самому категорически не хватает, т. к. помимо хаба ещё сайт, радиопроект и прочее, а также личная жизнь...
В общем заранее спасибо за помощь.

Автор: Ksan 24.8.2011, 0:52

Цитата(Fe(one)X @ 24.8.2011, 1:21) *
...Увы времени разобраться самому категорически не хватает, т. к. помимо хаба ещё ....

Думаешь, остальные занимаются только скриптами и им за это платят деньги? У всех есть другие дела, и может, поболее твоих.
Думаю, если сильно надо, разберешься, тем более исключения делать - раз плюнуть, примеров исключений море во множестве скриптов!
Извините..

Автор: Damaks 24.8.2011, 13:27

Цитата(Fe(one)X @ 23.8.2011, 22:21) *
Так вот можно сделать так, чтобы время отображалось рядом с топиком?

Оно уже отображается рядом с топиком, после фразы "Московское время:".

Автор: Fe(one)X 26.8.2011, 19:08

Цитата(Ksan @ 24.8.2011, 1:52) *
Думаешь, остальные занимаются только скриптами и им за это платят деньги? У всех есть другие дела, и может, поболее твоих.
Думаю, если сильно надо, разберешься, тем более исключения делать - раз плюнуть, примеров исключений море во множестве скриптов!
Извините..

Ну что поделать если я полный нуб в этом деле... Вот сегодня попробовал, посидел, но ничего не вышло. Да, не буду спорить и у меня кривые руки...

Вот к примеру попробовал с другого скрипта прикрутить таблицу исключений к этому, но в итоге ничего не работает:
Раскрыть!

-- This script is converted with PtokaX LUA API Converter v0.9 at 10/17/08 09:10:38
--------------------------------------------------------------------
-- ChatFilter V1.02 by KoYoT
-- Скрипт на блокировку рекламы хабов, мат и прочего.
-- Безобидно отучает пользователей от злоупотребления терпением администратора хаба.
--------------------------------------------------------------------

-- Эти фразы будут заменять не прошедшие цензуру строки
-- Можно добавлять без ограничений
Phrases = {
[1] = "Реклама на хабе запрещена - Читай правила !rules",
[2] = "Реклама на хабе запрещена - Наш сайт http://mydc.ru/r/?http://vlz.e-telecom.ru&quot;,
}
local tProfiles = {
[0] = 0, -- Мастер
[1] = 0, -- ОПератор
[2] = 0, -- VIP
[3] = 1, -- Зарегистрированный пользователь
[-1] = 1, -- Незарегистрированный пользователь
}
-- Что разрешаем
safeTable = {
"http://vlz.e-telecom.ru","http://vlz.sytes.net",
}
-- Ключевые буквосочетания, по которым вводим цензуру (добавляем сами под конкретные нужды)
-- Чем их больше, тем больше нагрузка на процессор
Filter = {
[1] = "http",
[2] = "ftp",
[3] = "www",
[4] = "%d+%.%d+%.%d+%.%d+",
[5] = "%d+%,%d+%,%d+%,%d+",
[6] = "%d+%-%d+%-%d+%-%d+",
[7] = "%d+% %d+% %d+% %d+",
[8] = "%d+%_%d+%_%d+%_%d+",



}
PhrasLen = #Phrases
FilterLen = #Filter

-----------------------------------------------
function ChatArrival(curUser,data)
if tProfiles[curUser.iProfile] == 1 then
Core.GetUserAllData(curUser)
local _,_,sdata = string.find( data, "^%b<>%s(.*)$")
if sdata then
sdata = StringLower(sdata)
for i = 1, FilterLen do
if string.find( sdata, Filter[i]) then
Core.SendToAll("<"..curUser.sNick.."> ".. Phrases[math.random(PhrasLen)])
return true
end
end
end
end
end

-----------------------------------------------
function StringLower(arg) -- Приводим текстовую строку в нижний регистр
local res = ""
local Byte, Len = nil, string.len(arg)
arg = string.lower(arg)
for i = 1, Len do
Byte = string.byte(arg, i)
if (Byte >= 192) and (Byte < 224) then
Byte = Byte + 32
end
if (Byte == 168) or (Byte == 184) then Byte = 229 end -- убираем проблему с Ё
res = res..string.char(Byte)
end
return res
end
-----------------------------------------------
function checkForSafe(msg)
for _,v in ipairs(safeTable) do
if string.find(msg, v) then
return true
end
end
return false
end

Где я допустил ошибку? Если написать адрес из таблицы исключений, то адрес блокируется. % пробовал ставить, но не помогло.

Damaks, я уже понимаю, что порядком надоел, но со временем в топике так ничего и не выходит. Я вот попробовал поэкспериментировать с кодом времени в скрипте Автотопик, но опять же ничего не получилось. В общем думаю сделать вот как:
Раскрыть!

local sBot = SetMan.GetString(21)
local iTimer = 20
local sTopic = Core.GetPtokaXPath().."scripts/Topic/topic.dat"
tTopic = {}

function OnStartup()
if loadfile(sTopic) then
dofile(sTopic)
end
TmrMan.AddTimer(iTimer*1000)
end

function OnTimer()
if tTopic ~= {} then
SetMan.SetString(10,tTopic[math.random(1,table.maxn(tTopic))]:sub(1,256))
end
end

function OpConnected(tUser)
if tUser.iProfile == 0 then
Core.SendToNick(tUser.sNick,"$UserCommand 1 3 Админцентр\\Топики хаба\\Добавить топик$<%[mynick]> !topic_add %[line:добавить топик]|")
Core.SendToNick(tUser.sNick,"$UserCommand 1 3 Админцентр\\Топики хаба\\Просмотреть все топики$<%[mynick]> !topic_view|")
Core.SendToNick(tUser.sNick,"$UserCommand 1 3 Админцентр\\Топики хаба\\Удалить топик$<%[mynick]> !topic_del %[line:введите номер топика]|")
end
end

function ChatArrival(tUser, sData)
local data = string.sub(sData, 1, -2)
local _, _, cmd = string.find(data, "%b<>%s+(%S+)")
if tUser.iProfile == 0 then
if cmd == "!topic_add" then
local _, _, msg = string.find(data, cmd.."(.*)")
if not msg then
Core.SendToUser(tUser, "<"..sBot.."> Вы не ввели топик!")
else
tTopic[table.maxn(tTopic)+1] = msg
WriteTable(tTopic, " tTopic", sTopic)
Core.SendToUser(tUser, "<"..sBot.."> Топик успешно добавлен!")
end
return true
end
if cmd == "!topic_view" then
local msg = "Топики для автосмены:"
for i,v in pairs(tTopic) do
msg = msg.."\r\n\r\n\t ["..i.."] "..v
end
if msg == "Топики для автосмены:" then
Core.SendToUser(tUser, "<"..sBot.."> Нет топиков!")
else
Core.SendToUser(tUser, "<"..sBot.."> "..msg)
end
return true
end
if cmd == "!topic_del" then
local _, _, iNumb = string.find(data, "%b<>%s+%S+%s+(%d+)")
if not iNumb then
Core.SendToUser(tUser, "<"..sBot.."> Вы не ввели номер топика!")
else
if not tTopic[tonumber(iNumb)] then
Core.SendToUser(tUser, "<"..sBot.."> Топика с таким номером не существует!")
else
table.remove (tTopic, tonumber(iNumb))
WriteTable(tTopic, " tTopic", sTopic)
Core.SendToUser(tUser, "<"..sBot.."> Топик удачно удалён!")
end
end
return true
end
end
end

function WriteTable(tTable, tablename, file)
local handle = io.open(file, "w")
Serialize(tTable, tablename, handle)
handle:close()
end

function Serialize(tTable, sTableName, hFile, sTab)
sTab = sTab or "";
hFile:write(sTab..sTableName.." = {\n" );
for key, value in pairs(tTable) do
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
Serialize(value, sKey, hFile, sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
hFile:write(sTab.."\t"..sKey.." = "..sValue);
end
hFile:write(",\n");
end
hFile:write(sTab.."}");
end

Имеется скрипт Автотопик, который содержит следующий набор топиков:
Раскрыть!

tTopic = {
[1] = "Неофициальный хаб сети «Евротелеком»",
[2] = "Приятного общения!",
[3] = "Спасибо, что Вы с нами!",
[4] = "Главный хаб города Волжского!",
[5] = "Будьте с нами и зовите всех сюда!",
[6] = "Добавляйте в избранные командой /fav",
[7] = "1,5 года успешной работы!",
}

Топики хранятся в файле topic.dat
Идея состоит в следующем, что если в конце топика написать к примеру os.date("%X"), то это понималось как время и приписывалось в конец топика, т. е. выглядеть это в файле должно вот как: Добавляйте в избранные командой /fav os.date("%X") или на хабе так: Добавляйте в избранные командой /fav 12:34:05
Как это реализовать?
С кодом экспериментировал вот с этим:
Раскрыть!

function ChatArrival(tUser, sData)
local cmd = sData:match"%b<>%s+(%S+).*|"
if cmd == "!сегодня" or cmd == "!date" or cmd == "!дата" or cmd == "!today" then
local iHour, sMsg = tonumber(os.date"%H"), " Точное время "..os.date("%X").." "
if iHour >= 4 and iHour < 7 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. RutSubs[math.random(#RutSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 7 and iHour < 12 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. UtrSubs[math.random(#UtrSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 12 and iHour < 17 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. DaySubs[math.random(#DaySubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 17 and iHour < 18 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. SkveSubs[math.random(#SkveSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 18 and iHour <= 22 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. VeSubs[math.random(#VeSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 22 and iHour <= 24 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. PozdveSubs[math.random(#PozdveSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
elseif iHour >= 00 and iHour <= 4 then
Core.SendToAll("<"..sBot.."> *** "..tUser.sNick..", ".. NoSubs[math.random(#NoSubs)].." Сегодня: "..os.date("%d.%m.%Y").." Московское время: "..os.date("%X").."")
end
return true
end
end

Надеюсь, что понятно объяснил.
Ребят помогите пожалуйста, буду очень Вам благодарен за помощь.

ЗЫ: Damaks, про список хабов нашей области помню, как будет время составлю и передам тебе.

Автор: Ksan 26.8.2011, 20:57

Fe(one)X, в скрипте отправки топика измени одну строку так:

Код
function OnTimer()
    if tTopic ~= {} then
        SetMan.SetString(10,tTopic[math.random(1,table.maxn(tTopic))]:sub(1,256).." Время: "..os.date("%X"))  -- изменённая строка*
    end
end

И будет выводить твои топики + текущее время (но только на момент отправки, потом до следующего топика время будет висеть одно и то же). Может, лучше хотя бы без секунд? Тогда время в топике будет более корректно выглядеть.
Если без секунд, то строка должна выглядет так:
Код
        SetMan.SetString(10,tTopic[math.random(1,table.maxn(tTopic))]:sub(1,256).." Время: "..os.date("%H:%M"))  --  изменённая строка*

Автор: Fe(one)X 30.8.2011, 23:17

Ksan, спасибо огромное. Работает на ура.
А в скрипте антирекламы можешь подсказать где я допустил ошибку?

Автор: Ksan 31.8.2011, 0:39

Fe(one)X, функцию function checkForSafe(msg) ты написал, но нет обращения к ней, то есть, у тебя нет проверки вхождения выражения из таблицы исключений в сообщение юзера.
Короче, надо вместо строки

Код
        if sdata then
написать так
Код
        if sdata and not checkForSafe(sdata) then


Автор: Fe(one)X 1.9.2011, 0:30

Ksan, всё работает, спасибо тебе огромнейшее.

Собственно это всё что мне требовалось, тему можно закрывать, ещё раз всем спасибо.

Автор: Marc 1.9.2011, 5:07

Вот не знаю, как у вас, а у меня есть вопросы к автотопику:

-скрипт работает сам при запуске, время отображается, топик меняется, но

1. из меню команда на просмотр списка не работает у меня почему-то, хотя в осн чат и поступает
2. удаление номера топика также не происходит, хотя команда в чат проходит
3. тоже самое и с добавлением нового номера топика

двигать в разные места пробовал...
Подскажите, может, что не так делаю!

ps. Просьба к Fe(one)X прикрепить сюда готовый скрипт тогда для АPI 2

Автор: Fe(one)X 21.12.2011, 2:05

Цитата(Marc @ 1.9.2011, 6:07) *
Вот не знаю, как у вас, а у меня есть вопросы к автотопику:

-скрипт работает сам при запуске, время отображается, топик меняется, но

1. из меню команда на просмотр списка не работает у меня почему-то, хотя в осн чат и поступает
2. удаление номера топика также не происходит, хотя команда в чат проходит
3. тоже самое и с добавлением нового номера топика

двигать в разные места пробовал...
Подскажите, может, что не так делаю!

ps. Просьба к Fe(one)X прикрепить сюда готовый скрипт тогда для АPI 2

Эм, если честно не знаю, я привык топики править в самом файле в папке со скриптами, поэтому не знаю есть эта проблема или нет, хотя по команде скрипт топики выводит в чат.

У меня другая проблема, решил заменить скрипт статистики (старый был сильно большой по объёму), но мне надо в нём сделать вот что:
Код скрипта

function UserConnected(tUser)
local Profile = (ProfMan.GetProfile(tUser.iProfile) and ProfMan.GetProfile(tUser.iProfile).sProfileName) or "Guest"
Core.SendToUser(tUser,"\n[::] Информация: \n[::] : Ник " ..tUser.sNick.." \n[::] Класс : "..Profile.." ("..tUser.iProfile..") \n[::] Ваш ip: "..tUser.sIP.." \n[::] Страна: "..tostring(IP2Country.GetCountryName(tUser)).."\n")
end
RegConnected = UserConnected
OpConnected = UserConnected

Нужно чтобы за место страны скрипт выдавал информацию пользователю с какой он сети. Слово Страна на Сеть поменять не сложно, но что требуется добавить и изменить в самом коде? Диапазоны сетей имеются, нужен только образец.
Заранее спасибо за помощь.

Автор: Enyby 21.12.2011, 16:29

Как самый простой вариант - в ip-to-country.csv прописать провадеров как отдельные страны. Нормальный вариант - сделать самому проверку на принадлежности IP нужным диапазон. Такой код есть во мнгоих скриптах. Можно оттуда выдрать и изменить под себя.

Автор: dj hoodo 21.12.2011, 18:12

вот Этот скрипт добавит в описание юзера, его сеть

Скриптиг
------------------------------------------------------------------- Конфиг бота: -------------------------------------------------------------------

-- Профильные теги:
tProfileTag= {
[0] = "[:Администратор:]",
[1] = "[:Оператор:]",
[2] = "[:vip:]",
[3] = "[:Зарегестрированные:]",
[-1] = "[:Не Зарегестрированные:]"
}

-- Теги сети:
RangeDesc = {
"10.21.0.1-10.26.255.255-[Билайн Киев ]", --127.0.0.1-127.0.0.255 за место этого свой ипы на раён
"10.0.0.1-10.255.255.255-[Билайн]",
"10.41.0.1-10.44.255.255-[Билайн Запорожье]",
"10.51.0.1-10.53.255.255-[Билайн Львов]",
"10.61.0.1-10.64.255.255-[Билайн Харьков]",
"10.71.0.0-10.71.255.255-[Билайн Днепропетровск]",
"10.92.0.0-10.92.255.255-[Билайн ОДЕССА]",

}

-- Теги полов:
tMaleTags = {
["x"] = "[:*:]", -- Неизвестно
["m"] = "[:М:]", -- Мужской
["w"] = "[:Ж:]", -- Женский
}

-- Тег при IP, не входящем в описанные:
sNoDescMsg = "[Интернет]"

-- Профили у которых "не будет" шары ( 1 - нет шары, 0 - есть ) by AУA™.lua
tNoShareProfiles = {
[0] = 0, -- Админ
[1] = 0, -- ОПератор
[2] = 0, -- VIP
[3] = 0, -- Зарегеный юзер
[-1] = 0, -- Не заргеный юзер
}

-- Можно ли будет скачать с юзера "без шары" (0 - нет, 1 - да)
bCanDownload = 1

-- Будет ли откликаться юзер "без шары" на поисковые завпросы (0 - нет, 1 - да)
bAnswToSearch = 1

-- Будет ли описание полсе тега (1), либо в описании будет только тег (0)
bIsFuuDescr = 0


sMenuWay = "::Опции юзера::\\Ваш пол\\" -- Путь в меню к командам пола

sSexTblWay = "Sex.tbl" -- Файл с полом юзеров

---------------------------------------------------------------- Конец конфига! ----------------------------------------------------------------
-- Дальше лучше ничего не меняй! )))

function OnStartup()
sBot = SetMan.GetString(21)
tNeedToSend = {}
tNeedToSend2 = {}
tSex = {}
if loadfile(sSexTblWay) then
dofile(sSexTblWay)
end
local tableover = Core.GetOnlineUsers() or {}
for i, v in pairs(tableover) do
table.insert(tNeedToSend, v.sNick)
end
TmrMan.AddTimer(1000, "OnTimer")
end

function OnExit()
SaveToFile(sSexTblWay, tSex, "tSex")
end

function OnError(sErrorMsg)
OnExit()
end

OpConnected = UserConnected
RegConnected = UserConnected

function MyINFOArrival(curUser,sData)
table.insert(tNeedToSend, curUser.sNick)
end

function GetNickListArrival(curUser,sData)
table.insert(tNeedToSend2, curUser.sNick)
end

tCmds = {
["mysex"] = function(sUser, sData)
local _,_,arg1 = string.find(sData, "%b<>%s+%S+%s+(%S+)")
if arg1 ~= nil then
local sUserNick = sUser.sNick
if arg1 == "м" then
tSex[sUserNick] = "m"
OnExit()
MyINFOArrival(sUser)
Core.SendToUser(sUser, "<"..sBot.."> Вы выбрали пол: мужской.")
elseif arg1 == "ж" then
tSex[sUserNick] = "w"
OnExit()
MyINFOArrival(sUser)
Core.SendToUser(sUser, "<"..sBot.."> Вы выбрали пол: женский.")
else
Core.SendToUser(sUser, "<"..sBot.."> Укажите свой пол правильно: !mysex <м/ж>")
end
return true
else
Core.SendToUser(sUser, "<"..sBot.."> Вы не указали свой пол! Правильно: !mysex <м/ж>")
return true
end
end,
["sexlist"] = function(sUser, sData)
local _,_,arg1 = string.find(sData, "%b<>%s+%S+%s+(%S+)")
if arg1 == nil then
local sMsg = "\r\n\t"..string.rep("«»",25).."\r\n\t\tСписок мальчиков.\r\n\t"..string.rep("«»",25).."\r\n"
for i,v in pairs(tSex) do
if (v == "m") then
sMsg = sMsg.. "\r\n\t\t• "..i
end
end
sMsg = sMsg.."\r\n\r\n\t"..string.rep("«»",25).."\r\n\t\tСписок девочек.\r\n\t"..string.rep("«»",25).."\r\n"
for i,v in pairs(tSex) do
if (v == "w") then
sMsg = sMsg.. "\r\n\t\t• "..i
end
end
Core.SendToUser(sUser, "<"..sBot.."> "..sMsg)
return true
elseif arg1 == "м" then
local sMsg = "\r\n\t"..string.rep("«»",25).."\r\n\t\tСписок мальчиков.\r\n\t"..string.rep("«»",25).."\r\n"
for i,v in pairs(tSex) do
if (v == "m") then
sMsg = sMsg.. "\r\n\t\t• "..i
end
end
Core.SendToUser(sUser, "<"..sBot.."> "..sMsg)
return true
elseif arg1 == "ж" then
local sMsg ="\r\n\t"..string.rep("«»",25).."\r\n\t\tСписок девочек.\r\n\t"..string.rep("«»",25).."\r\n"
for i,v in pairs(tSex) do
if (v == "w") then
sMsg = sMsg.. "\r\n\t\t• "..i
end
end
Core.SendToUser(sUser, "<"..sBot.."> "..sMsg)
return true
end
end,
}

function ChatArrival(sUser,sData)
local sData = string.sub(sData, 1, -2)
local _,_,cmd = string.find(sData, "%b<>%s+[%!%+%?%#](%S+)")
if tCmds[cmd] then
tCmds[cmd](sUser, sData);
return true
else
return 0
end
end

function OnTimer()
ReWrite()
end

function ReBuilMyINFO(curUser)
local descript, userip = nil, CalcIP(curUser.sIP)
if userip ~= 0 then
for index,descIP in pairs(RangeDesc) do
local _,_,startRange,endRange,RangeDescript = string.find(descIP, "(.*)-(.*)-(.*)")
startRange = CalcIP(startRange)
endRange = CalcIP(endRange)
if userip>=startRange and userip<=endRange then
descript = RangeDescript
end
end
if descript == nil then
descript = sNoDescMsg
end
Core.GetUserData(curUser, 16)
local nick,share = curUser.sNick,curUser.iShareSize
if tNoShareProfiles[curUser.iProfile] == 1 then
share = 0
end
local sMale = tMaleTags["x"]
if tSex[curUser.sNick] then
sMale = tMaleTags[tSex[curUser.sNick]]
end
local addtag = descript.." "..tProfileTag[curUser.iProfile].." "..sMale
if bIsFuuDescr == 1 then
addtag = addtag.." "..curUser.sDescription
end
return "$MyINFO $ALL "..nick.." "..addtag.."$ $ $ $"..share.."$"
end
end

function CalcIP(ipcalc)
local _,_,a,b,c,d = string.find(ipcalc, "(%d+).(%d+).(%d+).(%d+)")
local calc = 0
if (tonumber(a) and tonumber(b) and tonumber© and tonumber(d)) then
calc = a*16777216 + b*65536 + c*256 + d
return calc
else
return 0
end
end

function OverWrite(curUser)
local tableover = Core.GetOnlineUsers() or {}
for i, Userover in pairs(tableover) do
local sNewMyINFO = ReBuilMyINFO(Userover)
Core.SendToUser(curUser, sNewMyINFO)
end
end

function ReWrite()
for i, v in pairs(tNeedToSend) do
local v2 = Core.GetUser(v)
if v2 then
local sNewMyINFO = ReBuilMyINFO(v2)
Core.SendToAll(sNewMyINFO)
Core.SendToUser(v2, sNewMyINFO)
tNeedToSend[i] = nil
end
end
for i, v in pairs(tNeedToSend2) do
local v3 = Core.GetUser(v)
if v3 then
local tableover = Core.GetOnlineUsers() or {}
for k, l in pairs(tableover) do
local sNewMyINFO = ReBuilMyINFO(l)
Core.SendToUser(v3, sNewMyINFO)
end
tNeedToSend2[i] = nil
end
end
end

function SearchArrival(curUser, sData)
if bAnswToSearch == 0 then
local tableover = Core.GetOnlineUsers() or {}
for i, Userover in pairs(tableover) do
if tNoShareProfiles[Userover.iProfile] ~= 1 then
Core.SendToUser(Userover, sData)
end
end
return 1
end
end

function ConnectToMeArrival(curUser, sData)
if bCanDownload == 0 then
local _,_, sToNick = string.find(sData, "^$%S+%s+(%S+)")
local sToNick = Core.GetUser(sToNick)
if sToNick and tNoShareProfiles[sToNick.iProfile] == 1 then
return 1
end
end
end
MultiConnectToMeArrival = ConnectToMeArrival
RevConnectToMeArrival = ConnectToMeArrival
SRArrival = ConnectToMeArrival
UDPSRArrival = ConnectToMeArrival

function SaveToFile(sFileWay, tTable, sTableName)
local sHandle = io.open(sFileWay,"w+")
sHandle:write(Serialize(tTable, sTableName))
sHandle:flush()
sHandle:close()
end

function Serialize(tTable, sTableName, sTab)
sTab = sTab or ""
sTmp = ""
sTmp = sTmp..sTab..sTableName.." = {\n"
for key, value in pairs(tTable) do
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
end
sTmp = sTmp..",\n"
end
sTmp = sTmp..sTab.."}"
return sTmp
end

А вот этот при входе юзера посылает сообщение с какой он сети. и Вообще имеет Очень хороший функционал по управлению юзерами разных сетей. называется NetworkSeparation http://mydc.ru/topic61.html
мож что пригодится? все брал тут

Автор: Alexey 21.12.2011, 19:09

Цитата(Enyby @ 21.12.2011, 17:29) *
Как самый простой вариант - в ip-to-country.csv прописать провадеров как отдельные страны.

Но тогда коды провайдеров должны соответствовать кодам реальных стран. И надо будет держать таблицу соответствия кодов стран и провайдеров.

Цитата(Enyby @ 21.12.2011, 17:29) *
Нормальный вариант - сделать самому проверку на принадлежности IP нужным диапазон. Такой код есть во мнгоих скриптах. Можно оттуда выдрать и изменить под себя.

Есть инфа, что встроенная проверка на принадлежность диапазону работает намного быстрее, чем самописная на Lua.

Автор: Enyby 21.12.2011, 19:12

1. Забыть про страны, использовать только провайдеры. Что-то мне так кажется, что если людям важен провайдер, то им не важна страна и наоборот.
2. Есть инфа, что встроенные проверки диапазонов содержат от силы 10 диапазонов, а не over 9000, как для стран всего мира, так что различия в скорости не существенны.

Автор: Alexey 21.12.2011, 20:20


1. Провайдер важен, но не для всех пользователей известен и для этих пользователей нужно знать хотя-бы страну.
2.

Цитата(Enyby @ 21.12.2011, 20:12) *
содержат от силы 10 диапазонов

Сейчас у меня там за сотню диапазонов. Есть инфа, с какой цифры разница будет существенна?

Автор: Enyby 21.12.2011, 20:31

1. Дерибаним страну на несколько диапазонов, добавляя фиксированные страны. т. е. От России откусываем Корбину и создаем новую "страну" Корбина с "откушенными" диапазонами.
2. Инфы нет, но можно взять конкретный скрипт и замерить его производительность. Тут еще нужно смотреть какая реализация.
Но это экономия на спичках по большому счету. К слову, в базе мира порядка 160 тысяч диапазонов. Поиск быстрый, потому что они по порядку расположены.

UPD: Для первого пункта даже можно скрипт сделать, который будет автоматом патчить новые базы.

Автор: Артём 22.12.2011, 1:10

Fe(one)X, http://mydc.ru/topic5001.html этот скрипт видел? Там при входе показывает Сеть...

Автор: Alexey 22.12.2011, 1:29

1. Проблема в том, что в птоку, на уровне исходников, вшит список всех возможных кодов стран и использовать свои собственные коды выдуманных стран без правки этого вшитого списка не удастся. Придётся вырезать адреса какой-нибудь африканской страны и вписывать под её идентификатором диапазоны провайдера. Провайдеров у меня, конечно, значительно меньше, чем стран мира, но есть провайдеры с чётким закреплением диапазонов IP-адресов за микрорайонами города и вот там список определяемых стран будет особо куцым.

Автор: Enyby 22.12.2011, 1:34

Ну дык. Баланс, туды его в качель. Или по скорости работы, или по объему или по времени работы. Можно в птоку добавить страны и пересобрать. Я бы сделал скриптом и не морочился. Lua конечно не C, но не думаю что существенное будет различие в скорости.

UPD: Чтобы не тупило, можно сделать следующий вариант: берем Зимбабве и загоняем на него все диапазоны для провайдерства. Потом пишем скрипт, если страна - Зимбабве, то начинаем определять какой именно провайдер. На лицо выигрышь в том, что фильтрация первого уровня идет на Си. Т. е. только сортировка по провайдерам уже на уровне LUA.

Автор: Ksan 22.12.2011, 2:22

Мне кажется, суета не стоит сожжённых свеч.
Кому нужны провайдеры - уже есть такие скрипты, как уже выше показали.

Автор: Enyby 22.12.2011, 2:24

Как по мне, это вопрос не решения, а возможных подходов. Хотя я бы остановился бы на скриптах.

Автор: Fe(one)X 24.12.2011, 2:23

Ничего себе вы тут понаписали...
Артём, спасибо, но мне нужно это реализовать именно в том скрипте, который я кинул, т. к. он занимает мало места в чате. А почему нужно чтобы отображал именно название сети, потому что на хабе сидят в основном локальные пользователи и пользователи с одного города.
Ну так что поможет кто-нибудь?

Автор: Enyby 24.12.2011, 2:32

Править ip-to-country.csv. Вариант?
Второй вариант состоит в том, чтобы сделать таблицу диапазонови проверять наличие ip в диапазоне.

Автор: Fe(one)X 24.12.2011, 2:41

Цитата(Enyby @ 24.12.2011, 3:32) *
Править ip-to-country.csv.

Я конечно извиняюсь, не допёр с первого раза про файл, сейчас глянул, но в папке cfg у меня его нету. Отсюда вопрос, где можно его взять?
Спасибо.

Автор: Enyby 24.12.2011, 2:45

http://mydc.ru/topic5036.html?hl=ip+to+country

Автор: Артём 24.12.2011, 2:47

Fe(one)X, а взять твой и тот что я выложил и самому скрестить в то что тебе нужно не судьба?
dell...
проверил, работает...

Цитата
- [: Информация:
- [: : Ник Админ
- [: Класс : Guest (-1)
- [: Ваш ip: 178.хх
- [: Сеть: [ua] Triolan Харьков

дальше думаю разберёшься сам!
Код
local sNetsPath = "D:/Проги/FlylinkDC++ 500/Settings/"..sINIFileName

Свой путь указать не забудь к файлу CustomLocations.ini

Автор: Ksan 24.12.2011, 2:48

Fe(one)X, ищи лучше, этот файл там должен оказаться при установке Птоки обязательно.
Если всё же нет, значит, ты или кто-то другой удалил принудительно.
Тогда выход - поставить в отдельную папку Птоку и там найти этот файл и скопировать туда, где не его хватает.

Автор: Fe(one)X 24.12.2011, 3:14

Скачал я этот файл, спасибо Enyby, но из всего содержимого понял только названия стран =) Что значат цифры и как написать в нём диапазон провайдера?
Спасибо.

Автор: Артём 24.12.2011, 3:19

Fe(one)X, я так понял то, что выше я дал готовое тебе не нужно... удалил big_smile.gif если нужно, сделаешь сам

Автор: Ksan 24.12.2011, 3:26

Артём, ну в твоём же надо своими руками провайдеров набивать, а он, похоже, ждёт, что кто-нибудь ему предложит уже готовое решение - скачал/запустил и радуйся жизни. big_smile.gif

Автор: Артём 24.12.2011, 3:29

Ksan, ничего руками не нужно вбивать, можно поставить Flylink 5хх там автообновление стоит, указать путь к файлу и ждать пока автоматом будут разрабы флая пихать базу с провайдерами big_smile.gif

Автор: Enyby 24.12.2011, 3:29

Цифры это ип. Начальный и конечный для диапазона. Тебе нужно сделать следующее: устанавливаешь ипы на нужные, а потом меняешь название страны, не трогая ее аббревиатуру. Именем страны будет служить имя провайдера.
Ип рассчитывается как: ((A*256 + B)*256 + C)*256 + D где A.B.C.D - это IP адрес.
Например: 192.168.0.1 => ((192*256 + 168)*256 + 0)*256 + 1 = 3232235521

Автор: Fe(one)X 24.12.2011, 3:56

Enyby, спасибо за вразумительный ответ. Попробую как будет время.

Автор: Enyby 24.12.2011, 9:56

Проверил с ip-to-country.csv. Работать не будет. Причина проста - соответствие аббревиатур и их расшифровок жестко зашиты в PtokaX.
Тогда только второй вариант. Например так:

Код
tDiaps = {
    {"192.168.0.1", "192.168.0.255", "ISP 1"},
    {"192.168.32.1", "192.168.32.255", "ISP 2"},
    {"192.168.34.1", "192.168.34.255", "ISP 2"},
    {"10.0.0.1", "10.0.50.255", "Corbina"},
    {"127.0.0.1", "127.255.255.255", "Loopback"},
}

function OnStartup()
    for _, tDiap in ipairs(tDiaps) do
        tDiap[4] = ipToLong(tDiap[1])
        tDiap[5] = ipToLong(tDiap[2])
    end
end

function getDiapName(sIP)
    local iIP = ipToLong(sIP)
    for _, tDiap in ipairs(tDiaps) do
        if tDiap[4] <= iIP and iIP <= tDiap[5] then
            return tDiap[3]
        end
    end
    return "Unknown"
end

function ipToLong(sIP)    
    local _, _, iFirst, iSecond, iThird, iFourth = sIP:find("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
    return ((iFirst*256 + iSecond)*256 + iThird)*256 + iFourth
end

function UserConnected(tUser)
local Profile = (ProfMan.GetProfile(tUser.iProfile) and ProfMan.GetProfile(tUser.iProfile).sProfileName) or "Guest"
Core.SendToUser(tUser,"\n[::] Информация: \n[::] : Ник " ..tUser.sNick.." \n[::] Класс : "..Profile.." ("..tUser.iProfile..") \n[::] Ваш ip: "..tUser.sIP.." \n[::] Провайдер: "..getDiapName(tUser.sIP).."\n")
end
RegConnected = UserConnected
OpConnected = UserConnected

Автор: Alexey 24.12.2011, 20:01

Цитата(Enyby @ 24.12.2011, 10:56) *
Проверил с ip-to-country.csv. Работать не будет. Причина проста - соответствие аббревиатур и их расшифровок жестко зашиты в PtokaX.

Жаль, что мы так и не услышали начальника транспортного цеха. А ведь на предыдущей странице я про это писал. И про костыльное решение проблемы.

Автор: Enyby 24.12.2011, 20:34

Дело в том, что оно не будет работать, даже если использовать существующие страны. Т. е. "IS" - это Island вне зависимости от того, что нарисовано в CSV файле. Можно извратится и сделать массив трансляций вида "Island" => "Провайдер", но тогда уже лучше вышепоказаный скрипт.

Автор: Артём 24.12.2011, 23:41

А я выше давал скрипт уже готовый, который при входе показывает


но ТС проигнорировал его... bad_smile.gif

Автор: Fe(one)X 25.12.2011, 23:31

Цитата(Enyby @ 24.12.2011, 10:56) *
Проверил с ip-to-country.csv. Работать не будет. Причина проста - соответствие аббревиатур и их расшифровок жестко зашиты в PtokaX.
Тогда только второй вариант. Например так:
Код
tDiaps = {
    {"192.168.0.1", "192.168.0.255", "ISP 1"},
    {"192.168.32.1", "192.168.32.255", "ISP 2"},
    {"192.168.34.1", "192.168.34.255", "ISP 2"},
    {"10.0.0.1", "10.0.50.255", "Corbina"},
    {"127.0.0.1", "127.255.255.255", "Loopback"},
}

function OnStartup()
    for _, tDiap in ipairs(tDiaps) do
        tDiap[4] = ipToLong(tDiap[1])
        tDiap[5] = ipToLong(tDiap[2])
    end
end

function getDiapName(sIP)
    local iIP = ipToLong(sIP)
    for _, tDiap in ipairs(tDiaps) do
        if tDiap[4] <= iIP and iIP <= tDiap[5] then
            return tDiap[3]
        end
    end
    return "Unknown"
end

function ipToLong(sIP)    
    local _, _, iFirst, iSecond, iThird, iFourth = sIP:find("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
    return ((iFirst*256 + iSecond)*256 + iThird)*256 + iFourth
end

function UserConnected(tUser)
local Profile = (ProfMan.GetProfile(tUser.iProfile) and ProfMan.GetProfile(tUser.iProfile).sProfileName) or "Guest"
Core.SendToUser(tUser,"\n[::] Информация: \n[::] : Ник " ..tUser.sNick.." \n[::] Класс : "..Profile.." ("..tUser.iProfile..") \n[::] Ваш ip: "..tUser.sIP.." \n[::] Провайдер: "..getDiapName(tUser.sIP).."\n")
end
RegConnected = UserConnected
OpConnected = UserConnected


Спасибо, что предупредили, а то сидел бы сейчас и правил этот ip-to-country.csv бестолку =)
А за код спасибо, но проверю его работоспособность позже, просто сейчас вылезла другая проблема с хабом, начал виснуть... Не пойму в чём причина.

Цитата(Артём @ 25.12.2011, 0:41) *
А я выше давал скрипт уже готовый, который при входе показывает


но ТС проигнорировал его... bad_smile.gif

Спасибо, но Ваш вариант не катит, т. к. на компьютере на котором стоит хаб не установлен ДЦ клиент, а в скрипте, я так понял, необходимо указать путь к файлу CustomLocalization, а раз клиента нет, то и смысла нету в скрипте...

Автор: Артём 26.12.2011, 2:11

Fe(one)X, да причём здесь клиент, файл/базу провайдеров можно хоть в папку с скриптами положить, это уже без разницы где он будет лежать и без клиента работать будет, у меня стоял такой путь, из-за того что флай 5хх автообновляемый и база обновляется...
ну да ладно, дело хозяйское, сиди в ожидание чуда... bad_smile.gif

Автор: Ksan 26.12.2011, 15:04

Артём, он бесподобен! big_smile.gif