Версия для печати темы
MyDC.ru _ Kорзина _ Кто К Нам Ломится?
Автор: district 17.11.2008, 17:14
Решил вот выложить сырую такую прикидку, нацарапанную с непосредственным онлайн участием Sephiroth_Lukaw (Special Thanx To)
Идея была в том, чтобы получать кое-какую информацию о пытающихся вломиться на хаб юзерах, нарушителях технических правил, забаненных и т п. Ну и по возможности, если бороться с с ними уже бесполезно, внести их айпи во внешний фаер, чтоб не долбили хаб запросами.
Кроме ника и айпи ничего до входа юзера на хаб получить, как было установлено, нельзя, но и это уже что-то.
Пока что код работает так: каждую минуту из пяти выдает ОПам о попытках входа на хаб. Фильтрацию тех, кому дениед от тех, кому хелло, тоже пока организовать не удалось...
Может быть, идея получит какое-то развитие. За дельные замечания, как всегда, буду благодарен 
Код
sBot = "Бюрократ"
iTimeGlob = 300 -- в секундах
iTime = iTimeGlob
function Main()
SetTimer(1000)
StartTimer()
end
function OnTimer()
iTime = iTime - 1
if iTime == 0 then
StopTimer()
Looptime()
else
return 0
end
end
function ValidateNickArrival(curUser, sData)
incm = curUser.sName
ip = curUser.sIP
if iTime>=0 and iTime<60 then
SendToOps(sBot, "*** Кто-то страшный к нам идет... Ник: "..incm..", IP: [ "..ip.." ]")
end
end
function Looptime()
SendToOps(sBot, "*** Цикл перезапущен")
iTime = iTimeGlob
StartTimer()
end
Автор: district 18.11.2008, 21:58
Сегодня прикидка оформилась в какое-то подобие чего-то. И даже была успешно применена на хабе в сугубо практических целях.
Еще раз изложу идею этого ботика. Идея заключается в том, чтобы получить максимально возможное количество информации о попытках входа на хаб, о юзерах, пытающихся войти на хаб, и о причинах, почему вход невозможен.
Бот работает в автоматическом режиме, период включения проверки и период самой проверки - задаются, а также в ручном режиме: запустить проверку, остановить проверку.
1. Обнаружить непонятливого забаненного юзера (с белым IP), который третий месяц ломится на хаб, и этим только создает
лишнюю нагрузку на этот хаб, и внести его IP во внешний фаерволл.
2. Обнаружить правильного юзера с динамическим IP, который бедолага нечаянно попал на забаненный IP, и решить проблему.
3.Проявить милосердие: разбанить юзера, забаненного когда-то за мелкий проступок, и дать ему "второй шанс" )))
Глобальные вопросы.
1.Необходимо отфильтровать сообщения об удачных входах на хаб. Т е бот во время проверки не должен выдавать сообщений о тех юзерах, которые чинно-благопристойно завалидатились и вошли.
2.Какие еще доп.данные о толкущихся за пределами хаба юзерах можно получить и с использованием каких приемов? Интересует ЛЮБАЯ информация. Была сделана попытка идентифицировать невалидного юзера как забаненного по нику, вот в этом куске функции ValidateNickArrival :
Код
--[[if GetBannedItemIp(user.sNick) then
addrep = "Забанен по нику"
if addrep then
SendToOps(sBot, addrep)
end
end]]--
(просто проверка, будет функция схватывать параметр, или нет). Пока - безуспешно. Может, можно все же реализовать?
3.Попутно очень хочется выяснить, в каких случаях имеет смысл включать в скрипт функцию очистки памяти (дайте ссылку на дельное руководство, что ли

)
4. Хотелось бы иметь возможность выбора между отсылкой репорта всем опам, и всем никам из определенной таблицы. Как должно выглядеть выражение отсылки репорта всем никам из таблицы?
5. О косметических мелочах пока не спрашиваю, всему свое время.
Жду дельных комментариев и советов, особенно от
Setuper'а
Автор: Wariner 18.11.2008, 22:05
Цитата(district @ 18.11.2008, 21:58)

4. Хотелось бы иметь возможность выбора между отсылкой репорта всем опам, и всем никам из определенной таблицы. Как должно выглядеть выражение отсылки репорта всем никам из таблицы?
помоему так
Код
for i,v in pairs(tTable) do
SendToNick(v, Data)
end
Автор: Sephiroth_Lukaw 18.11.2008, 22:17
Цитата("district")
Как должно выглядеть выражение отсылки репорта всем никам из таблицы?
Код
tTable = { 'Nick', 'Nick' }
for sNick in ipairs(tTable) do
SendToNick(sNick, sString)
end
Цитата("district")
забаненного по нику
frmHub:GetPermBanList(), frmHub:GetTempBanList()
upd. От это я тормоз Оо
Автор: district 18.11.2008, 22:43
Цитата(Wariner @ 19.11.2008, 1:05)

помоему так
Код
for i,v in pairs(tTable) do
SendToNick(v, Data)
end
Точно так!
Благодарю за оперативное реагирование

-------------------------------------------------------------------------------------------------------
Подшаманено, перезагружено.
Автор: Sephiroth_Lukaw 18.11.2008, 23:31
=( если честно, до сих пор не могу понять зачем нужен таймер.
--
Зачем делать большенство переменных типа 'howbanned = "перманентно"' глобальными?
--
Мб так лучше?
Код
if GetBannedItemName(user.sIP) then
bannednick = GetBannedItemName(user.sIP)
howbanned = "перманентно"
end
if GetTempBannedItemName(user.sIP) then
bannednick = GetTempBannedItemName(user.sIP)
howbanned = "временно"
end
if GetBannedItemName(user.sIP) or GetTempBannedItemName(user.sIP) then
заменить на
Код
local bannednick = nil
local howbanned = nil
if GetBannedItemName(user.sIP) then
bannednick = GetBannedItemName(user.sIP)
howbanned = "перманентно"
else
if GetTempBannedItemName(user.sIP) then
bannednick = GetTempBannedItemName(user.sIP)
howbanned = "временно"
end
end
if howbanned ~= nil then
upd. или даже так
Код
local bannednick = GetBannedItemName(user.sIP)
local howbanned = nil
if bannednick then
howbanned = "перманентно"
else
bannednick = GetTempBannedItemName(user.sIP)
if bannednick then
howbanned = "временно"
end
end
if howbanned ~= nil then
Автор: Wariner 18.11.2008, 23:49
2district: а ты в чём пишешь скрипты? На мой взгляд какая-то у них структура странная... Меня кто-то учил ступенчатой структуре(мож это и не так называется) Получается гораздо нагляднее)))
PS: сорри за оффтоп
Автор: district 19.11.2008, 0:10
Спасибо, ребята, за комменты. Но голова уже нифига не варит - ночь на дворе.
Ступенчато оно конечно лучше, и до этого доберемся со временем. Я Ноутпад++ меньше недели назад поставил... вот пробую.
Sephiroth_Lukaw! Не заколебай меня насчет таймера!
Раз Партия решила, значит, быть таймеру, и все тут!
PS а глобальные переменные остались от варианта, когда я пытался соорудить отдельную функцию репорта, и просуммировать инфу из валидата и суппорта. Но тот вариант не прокатил.
Автор: Setuper 19.11.2008, 14:27
1). Суть таймера я не понял! Для чего он нужен? По коду он просто выдаёт фразы о начале проверки и о конце проверки, при этом ничего не делает! Поэтому выбрасываем его из кода полностью, или объясни, что ты хотел с этим таймером добиться!
2). Команды !strprk и !stpprk также ничего не делают, только отправляют эти же сообщения о начале или конце проверки и останавливают и тут же запускают таймер.
В итоге выбрасываем из кода функции: Main(), ChatArrival(curUser, sData), OnTimer(), StartCheck(), StopCheck(), OpConnected(user,data).
3). Из-за функции ValidateNickArrival будет сплошной флуд для админов в чате, то есть при каждом заходе на хаб любого юзера админам отсылается фраза: "Ломится юзер...". Для чего это сделано - непонятно. Вероятно нужна проверка опять же банов, но для этого код должен быть другим.
4). Лишние конкатенации лучше убирать.
5). Не понятен смысл ввода новой глобальной переменной в функции SupportsArrival: ip=user.sIP.
6). Переменные bannednick и howbanned лучше делать локальными.
7). Зачем писать: "if GetBannedItemName(user.sIP) or GetTempBannedItemName(user.sIP) then" и тем самым лишний раз вызывать функции GetBannedItemName и GetTempBannedItemName.
8). В функциях SupportsArrival и ValidateNickArrival ты всё равно не используешь переменную data, поэтому её можно не писать, дабы не забивать лишними данными стек lua.
9). Часто повторяющийся код лучше вынести отдельной функцией.
В итоге, после всего сказанного код приобретает вид:
CODE
sBot="GUI"
ToAdmins=1
tAdmin={
"[INT]district",
"asss",
"Sephiroth_Lukaw",
"Alex"
}
function SupportsArrival(user)
local bannednick=GetBannedItemName(user.sIP)
if bannednick then
Sender("Ломится навсегда забаненный "..bannednick.." с IP [ "..user.sIP.." ]")
else
bannednick=GetTempBannedItemName(user.sIP)
if bannednick then
Sender("Ломится временно забаненный "..bannednick.." с IP [ "..user.sIP.." ]")
end
end
end
function ValidateNickArrival(user)
if GetBannedItemIp(user.sName) then
Sender("Ломится юзер "..user.sName.." с IP [ "..user.sIP.." ]")
end
end
function Sender(sMsg)
if ToAdmins==1 then
for i,v in pairs(tAdmin) do
SendToNick(v,"<"..sBot.."> "..sMsg)
end
else
SendToOps(sBot,sMsg)
end
end
Автор: district 19.11.2008, 14:57
Setuper
Что ж, спасибо за код, оптимизацию учтем, но:
1.Требуется отслеживать не только забаненных, но и нарушающих технические правила по шаре, по слотам, просто не-могущих войти из-за плохого коннекта и т.д.
2.Таймер задает период автоматического сканирования (хоть раз в десять дней) и подпериод подачи непосредственно репортов. Запустить репорты и остановить можно из меню. А постоянные сообщения о попытках входа в чате мне как раз-таки задаром не нужны.
Автор: Setuper 19.11.2008, 15:17
Контроль шары и слотов ты не сможешь реализовать, потому что в функции ValidateNickArrival шара пользователя ещё не определена, а проверка ограничений на шару происходит непосредственно после этой функции.
Единственное как это можно обойти - это отключить стандартную проверку шары и слотов и написать в функции MyINFOArrival свою проверку.
С таймерами всё равно не понятно! Зачем всё усложнять и вводит какие-то лишние никому не нужные вещи?
Автор: district 19.11.2008, 21:08
Переработано.
Что ж, функция Sender порадовала своим изяществом и простотой. И подумать не мог, что sMsg ,будет вот так отрабатываться, при том что нигде нет прямого присваивания вроде sMsg = "БлаБлаБла".. Это надо запомнить.
Таймер все-таки оставил, как дань тем суткам, что были бессонно угроханы на этот ботик. Да и как без таймера ограничить цикл репортирования? Постоянное нытье в чате "Ломится такой-то, повторяю, совсем ни к чему. Другое дело, что авторежим теперь опционален - хочешь, оставь авторепорт на каждые несколько часов, хочешь, запускай только вручную.
Почему сделаны разными имя бота и имя репортера. Ну подумайте сами: логика: Прокуратура - начинает и заканчивает проверку в ГУИНе, ГУИН - докладывает. Да и зрительно гораздо легче цикл воспринимается.. 
Да, и прошу всерьез не воспринимать шуточный стиль репортов бота. В конце концов - каждый может поменять его в соответствии со своим вкусом.
Автор: Setuper 19.11.2008, 22:32
тогда уж так:
remake.lua ( 3.25 килобайт )
: 14
Автор: district 19.11.2008, 23:14
Setuper
Ну, путь к идеалу как говорится, долог тернист и бесконечен ) Т.е вариантов можно наделать уйму)) У тебя красивше, конечно, ступенчато, организовано.
Вот! Давно мечтаю узнать, ради чего добавляют вертикальный слэш?
Код
function OpConnected(user)
user:SendData("$UserCommand 1 3 "..sMenu.."\\Начать проверку$<%[mynick]> !strprk||"..
"$UserCommand 1 3 "..sMenu.."\\Остановить проверку$<%[mynick]> !stpprk|")
end
(ну тут не отображается, но вопрос, думаю, ясен. В первой строке менюшки?)
А есть вот еще вопрос практический, только что созрел.
Вот, получили мы репорт. Скажем, десяток юзеров.
Идея такая: прямо в чате, прямо райткликом по имени юзера или айпи, вызываем функцию сверки с ConnectedUsers.txt
И получаем - в случае если выбран ник - все айпи, с которых когда-либо заходил этот ник, в случае, если выбран айпи - все ники, которые заходили с этого айпи. Тема актуальная, приходится в КоннектедЮзерс.тхт вручную рыться, часто.
Мне бы только ядро функции, а дальше доделаю. Тут же можно было бы присовокупить ввод ника или айпи из строки меню, для проверки его на "многоликость"
А может, вынести все это дело в отдельный бот. Что скажешь?
Автор: Setuper 19.11.2008, 23:40
Следующие коды эквивалентны:
Код
function OpConnected(user)
user:SendData("$UserCommand 1 3 "..sMenu.."\\Начать проверку$<%[mynick]> !strprk&#*124;|"..
"$UserCommand 1 3 "..sMenu.."\\Остановить проверку$<%[mynick]> !stpprk&#*124;")
end
Код
function OpConnected(user)
user:SendData("$UserCommand 1 3 "..sMenu.."\\Начать проверку$<%[mynick]> !strprk&#*124;")
user:SendData("$UserCommand 1 3 "..sMenu.."\\Остановить проверку$<%[mynick]> !stpprk&#*124;")
end
* - удалить
НО первый код более оптимизирован, из-за того, что функция SendData отправляет данные только 1 раз, в отличии от второго кода, в котором эта функция вызывается 2 раза.
Теперь о вертикальной черте.
Из устройства протокола dc следует, что любая строка данных должна содержать эту вертикальную черту. Эта черта разделяет сообщения. Функция SendData автоматически добавляет эту черту в конце строки, если её нету. Поэтому, можно отсылать 2 сообщения, или отсылать 1 сообщение, которое будет разделено вертикальной чертой на 2 части. Надеюсь понятно объяснил принцип отправки сообщений в протоколе dc

По поводу какой-то свёртки по правому клику, не совсем понял о чём речь.
Автор: district 20.11.2008, 0:02
насчет СендДаты - понял, надо будет также запомнить эту фишку.
а насчет "свёртки" - ну, есть файл лог соединений, ConnectedUsers.txt
Задача: оперативно пробить а) по нику - под какими айпи был замечен этот ник
б) по айпи - с какими никами заходили с этого айпи.
Используя этот файл.
Автор: Setuper 20.11.2008, 1:32
Это у кого такой файл? В папке с клиентом он или в папке сервера? Какой формат данных в этом файле?
P.S. SendData - читается по английски как СэндДэйта (переводится как ОтсылкаДанных), не путать Data и Date
Автор: district 20.11.2008, 2:05
C:\Program Files\ptokax0.3.6.0lua5.1.2\scripts\ConnectedUsers.txt
Логирует Тандер, насколько я понимаю.
Формат такой:
sg9511|194.44.191.120
district|80.64.81.70
district|80.64.81.70
Алекс|78.37.39.124
b-minor|77.35.7.159
district|80.64.81.70
sg9511|194.44.191.120
b-minor|77.35.0.24
district|80.64.81.70
sg9511|194.44.191.120
sg9511|194.44.191.120
b-minor|77.35.2.116
district|80.64.81.70
ЗЫ
А логирует вот так:
Код
function NewUserConnected(user)
if log == "enable" then
local f,e = io.open( Conlogs, "a+" )
line = user.sName.."|"..user.sIP
if f then
f:write( line.."\r\n" )
f:close()
end
end
Но если такой формат совсем непригоден, то, ради такого дела, можно ведь изменить формат лога.
Автор: Setuper 20.11.2008, 3:02
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:flush()
f:close()
return a,b
end
end
function Read(fStream)
local b,tIP,tNick=true,{},{}
while b do
local sLine=fStream:read()
if not sLine then break end
local _,_,sNick,sIP=sLine:find("(%S+)|(%S+)")
if sNick and sIP then
tNick[sNick]=tNick[sNick] or {}
tIP[sIP]=tIP[sIP] or {}
tNick[sNick][sIP]=tNick[sNick][sIP] and tNick[sNick][sIP]+1 or 1
tIP[sIP][sNick]=tIP[sIP][sNick] and tIP[sIP][sNick]+1 or 1
end
end
return tNick,tIP
end
function GetIpForNick(sNick,sFile)
local sMsg,tNicks,tIPs="*** IP адреса, с которых входил пользователь с ником "..sNick,GetNickAndIp(sFile)
if tNicks and tNicks[sNick] then
for i,v in pairs(tNicks[sNick]) do
sMsg=sMsg.."\n\t"..i.." - "..v
end
else
sMsg="*** Пользователь с ником "..sNick.." в базе не найден."
end
return sMsg
end
function GetNickForIp(sIP,sFile)
local sMsg,tNicks,tIPs="*** Ники, с которых входил пользователь с IP адресом "..sIP,GetNickAndIp(sFile)
if tIPs and tIPs[sIP] then
for i,v in pairs(tIPs[sIP]) do
sMsg=sMsg.."\n\t"..i.." - "..v
end
else
sMsg="*** Пользователь с IP адресом "..sIP.." в базе не найден."
end
return sMsg
end
Использование под API1:
Код
function ChatArrival(tUser,sData)
sData=sData:sub(tUser.sName:len()+4,-2)
local _,_,sCmd,sArg=sData:find("%p(%S+)%s+(.*)")
if sCmd then
if sCmd:lower()=="getipfornick" then
if sArg and sArg~="" then
tUser:SendData(GetIpForNick(sArg,frmHub:GetPtokaXLocation().."scripts/ConnectedUsers.txt"))
else
tUser:SendData("*** Вы не ввели ник.")
end
return 1
elseif sCmd:lower()=="getnickforip" then
if sArg and sArg~="" and sArg:find("%d+%.%d+%.%d+%.%d+") then
tUser:SendData(GetNickForIp(sArg,frmHub:GetPtokaXLocation().."scripts/ConnectedUsers.txt"))
else
tUser:SendData("*** Вы не ввели ip.")
end
return 1
end
end
end
function OpConnected(tUser)
tUser:SendData("$UserCommand 1 2 Меню админа\\IP этого юзера$<%[mynick]> !getipfornick %[nick]&#*124;|"..
"$UserCommand 1 3 Меню админа\\IP юзера$<%[mynick]> !getipfornick %[line:Введите ник]&#*124;|"..
"$UserCommand 1 2 Меню админа\\Ники этого юзера$<%[mynick]> !getnickforip %[ip]&#*124;|"..
"$UserCommand 1 3 Меню админа\\Ники юзера$<%[mynick]> !getnickforip %[line:Введите IP]&#*124;")
end
* - удалить
Автор: district 20.11.2008, 10:15
Спасибо, попробую разобраться.
Сразу два вопроса.
while и break - это "операторы"? И хотелось бы услышать популярных пару слов об их назначении, смысле и применении в контексте LUA (смысл англ. слов - известен ))) )
С ходу
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
return Read(f)
f:close()
f:flush()
end
end
не пошло
Код
5: 'end' expected (to close 'if' at line 3) near 'f'
сделал так:
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
return Read(f)
end
f:close()
f:flush()
end
ЗАРАБОТАЛО! Якорный бабай, да он еще и число входов выдает! Зреет шедевр, честное слово

Тестируем дальше :sablay:
Пока не работает отображение НИКОВ по IP.
Во всех случаях - " *** Пользователь с IP адресом ... в базе не найден"
Автор: Sephiroth_Lukaw 20.11.2008, 11:05
Цитата(district @ 20.11.2008, 13:15)

while и break
While - Цикл, выполняется до тех пор, пока условие внутри него не равно false;
break - Принудительно останавливает(обрывает) цикл;
Код
while 1 == 1 do
SendToAll("Test 1")
end
- будет выполняться бесконечно т.к. 1 всегда равен 1(т.е. будет выводить Test 1 - до бесконечности)
Код
while 1 == 1 do
SendToAll("Test 1")
break
SendToAll("Test 2")
end
Остановится, после того как встретит "break" т.е. данный код распечатает - "Test 1" 1 раз и больше ничего не сделает, даже не дойдет до распечатки "Test 2". break - Например, может использоваться если мы проходим по таблице в поиске какого-то значения и при его встречи не имеет смысла дальше теребить таблицу, тогда, мы прерываем цикл с его помощью
Цитата(district)
if f then
return Read(f)
f:close()
f:flush()
end
ммм...функция же возвращает значение, тогда же не выполняется -
Цитата(district)
f:close()
f:flush()
и ещё, у меня вопрос, а если написать
Код
if f then
do return Read(f) end
f:close()
f:flush()
end
- то последующие операторы выполняются и вообще, допустим ли такой синтаксис? Если да, то, что произойдёт?))).
Автор: district 20.11.2008, 12:52
Sephiroth_Lukaw
Ясненько, хорошие примерчики, зенькую бардзо ))
По поводу вчерашних мучений вот с этим:
Код
ValidateNickArrival(user,data)
for i, tPermBan in pairs(frmHub:GetPermBanList()) do
if user.sName == tPermBan.sName then
Sender("Ломится забаненный по нику "..user.sName.." с IP [ "..user.sIP.." ]
...
frmHub:GetPermBanList() возвращает ники ЗАРЕГАННЫХ юзеров
Цитата
Returns an array containing all registered users as PermBan objects.
(если я правильно перевел эту фразу

)
а у меня все забаненные автоматически удаляются из списка регов.
Может, тут "собака порылась" ? Надо еще попробовать.
Автор: Setuper 20.11.2008, 13:01
Да! Это моя ошибка при проектировании скрипта, возникла из-за того, что я сначало не делал возврат значения в функции, а в конце написания вдруг сделал. А на самом деле должно быть так:
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:close()
f:flush()
return a,b
end
end
Функцию GetNickForIp тоже подправил:
Код
function GetNickForIp(sIP,sFile)
local sMsg,tNicks,tIPs="*** Ники, с которых входил пользователь с IP адресом "..sIP,GetNickAndIp(sFile)
if tIPs and tIPs[sIP] then
for i,v in pairs(tIPs[sIP]) do
sMsg=sMsg.."\n\t"..i.." - "..v
end
else
sMsg="*** Пользователь с IP адресом "..sIP.." в базе не найден."
end
return sMsg
end
Автор: district 20.11.2008, 21:47
Сенкс, роем дальше! 
Но я уже простов восторге, это ж просто песня какая то:
Цитата
[17:23:35] <ConnectionsInspector> *** IP адреса, с которых входил пользователь с ником [hor]userko
93.80.110.160 - 2 раз(а)
78.106.203.73 - 1 раз(а)
78.106.170.114 - 3 раз(а)
78.106.194.170 - 2 раз(а)
93.81.230.134 - 5 раз(а)
78.106.197.255 - 1 раз(а)
93.80.110.31 - 1 раз(а)
:dance:
SetuperНу вроде все работает, но осталось две проблемки.
Крайний код GetNickAndIp(hFile) , приведенный тобой - увы, тоже не идет,
Цитата
attempt to use a closed file
. Если никаких подводных камней нет, то, может, оставить так, как я привел выше? Глюков вроде нет, все работает.
А вот вторая "проблемка" посерьезнее. Требуется изменение функции GetNickForIp(sIP,sFile)
Дело вот в чем. (Видимо, я с самого начала несколько не до конца задачу сформулировал, ибо сам не представлял, как именно будет работать скрипт.)
Допустим, мы пробиваем ники по айпи. Если айпи статический, то все прекрасно, скрипт показывает или один ник, если юзер порядочный, или несколько, если юзер "многоликий Янус".
А вот если айпи динамический - то скрипт показывает только те ники, под которыми юзер заходил только с
этого конкретного текущего айпи. А он мог заходить еще с пятидесяти айпи, и под другими никами. В таком случае вскрыть его многоликость не удается.
Вот пример.
Цитата
[00:39:42] <ConnectionsInspector> *** Ники, под которыми входил пользователь с IP адресом 78.106.193.201
[sln]Vadim - 1 раз(а) с этого IP
[00:40:02] <ConnectionsInspector> *** IP адреса, с которых входил пользователь с ником [sln]Vadim
93.80.223.24 - 2 раз(а)
93.81.185.195 - 3 раз(а)
93.80.207.15 - 1 раз(а)
93.81.184.77 - 2 раз(а)
93.80.204.133 - 1 раз(а)
93.81.159.168 - 2 раз(а)
93.81.186.103 - 1 раз(а)
93.81.153.71 - 1 раз(а)
93.80.234.47 - 1 раз(а)
93.81.184.134 - 1 раз(а)
78.106.193.201 - 1 раз(а)
95.24.54.46 - 1 раз(а)
93.80.240.107 - 2 раз(а)
93.80.233.3 - 3 раз(а)
95.24.59.143 - 1 раз(а)
93.80.244.196 - 1 раз(а)
93.80.208.174 - 1 раз(а)
Можно тут что-нибудь сделать?
Автор: Setuper 20.11.2008, 21:52
да ты прав, я что-то не подумал, что если закрыть файл, то поток не передастся в качестве переменной.
Вот правильный код:
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:close()
f:flush()
return a,b
end
end
По поводу второй проблемы ничего сделать нельзя! Подумай сам, как однозначно идентифицировать пользователя? По какому параметру, если ip адрес динамический и ник меняется свободно.
Допустим в сети несколько динамических ip адресов: 10.10.10.1 - 10.10.10.254. Пусть ip адреса арендуются пользователями, допустим на 1 день, и аренда ip адресов происходит по возрастанию последнего числа ip адреса.
Пусть пользователь Вася сегодня арендовал ip адрес 10.10.10.1, а пользователь Петя, тоже сегодня (двумя минутами позже), арендовал ip адрес 10.10.10.2.
Сегодня всё хорошо, но вот допустим завтра аренда ip адресов произошла наоборот (бывший Вася арендовал 10.10.10.2, бывший Петя арендовал 10.10.10.1) и допустим пользователи решили сменить ники (Вася(10.10.10.1) сменил ник на Вову(10.10.10.2), а Петя(10.10.10.2) сменил ник на Александра(10.10.10.1)).
Теперь вопрос: кто под какими никами сидит на хабе? Если мы знаем, последовательность смены ников, но мы можем точно ответить, что мол Вася=Вова, а Петя=Александр. Но если мы не знаем, а мы точно не знаем, так как мы являемся третьей стороной и в смене ников не принимаем участия, то идентифицировать пользователей нельзя: может быть Вася=Александр, так как ip адрес Васи и Александра один и тот же - 10.10.10.1, а может быть Вася=Вова, так как ip адрес сменился.
Это большая проблема однозначной идентификации пользователя. Если решить эту проблему, то, например, нельзя будет никаким способом избежать бана (что к сожалению сейчас можно делать), и можно будет привязывать статистику пользователя по этому параметру идентификации.
Многие ищат решения проблемы среди всяких DNS имён, MAC адресов, CID номеров, но все эти параметры можно также изменить как и ник, как и ip.
Поэтому идентификация пользователя является глобальной проблемой p2p сетей.
Автор: district 21.11.2008, 0:13
Что ж, уже то, что есть - очень хорошее подспорье ))
Чуть попозже со всеми подшаманиваниями и растолковываниями специально для таких админов, которые "а чиво он ни работаед?" выложу его в готовых скриптах, если ты не против, конечно.
Хочу попробовать саму функцию создания лога сюда еще добавить.. и может быть, даты входов как-то добавить.. в общем пока в раздумьях.
Автор: district 23.11.2008, 20:52
В общем добавил я в Инспектор коннектов функцию самой записи лога, теперь полноценная Вещь в себе получилась 
Добавил еще и запись даты, на всякий случай.
----------------------------------------------------------------
Переприкреплен вариант с однократной очисткой памяти после запроса.
(расход памяти потихоньку накапливается в процессе работы, в варианте однократной очистки. Если убрать СтопТаймер, очистка будет идти каждые несколько секунд и расход памяти будет поддерживаться на постоянном уровне)
Автор: Setuper 23.11.2008, 21:10
Почему не работает? Какую ошибку он выдаёт?
Твой код неправильный! Из-за него будет накапливаться неиспользуемая память, из-за того, что ты не закрываешь файл и не очищаешь входной поток.
Автор: district 24.11.2008, 13:05
Setuper
Цитата
attempt to use a closed file
а в моем варианте память и правда накапливается. 5 мб - многовато для такого ботика.
Автор: Setuper 24.11.2008, 13:34
опять моя ошибка из-за невнимательности.
Вот этот код работает, я проверил:
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:flush()
f:close()
return a,b
end
end
В чем разница увидел?
Автор: district 24.11.2008, 14:26
Увидел.
Действительно, работает, не вылетает. Но после первого же запроса расход памяти в "Нагрузке памяти скриптами" Птоки показывается как допустим 4600 кб и так и висит.
Сразу по запуске скрипта расход составляет 55-60 кб
В общем, не ощутил разницы с тем, что было.
PS Размер самого лог-файла на текущий момент - 2.48 Мб.
Автор: Setuper 24.11.2008, 14:43
В луа существует автоматический уборщик. Если все файлы закрыты, то со временем ненужный мусор сам очистится.
Автор: district 24.11.2008, 20:24
Попробовал один банальный и известный вариант - вроде, работает. После отработки запроса через 3 сек импользуемая память очищается, и становится в пределах 170 кб.
Код
function OnTimer()
collectgarbage("collect")
end
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:flush()
f:close()
SetTimer(3*1000) --добавлено
StartTimer() -- добавлено
return a,b
end
end
а потом падает до того значения, которое было при старте скрипта.
Автор: Setuper 24.11.2008, 20:44
Зачем мудрить что-то с таймером? Если хочешь принудительно собрать мусор, делай так:
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:flush()
f:close()
collectgarbage("collect")
return a,b
end
end
Автор: district 24.11.2008, 20:53
-
Автор: Wariner 24.11.2008, 20:57
Может надо так:
Код
function GetNickAndIp(hFile)
local f=io.open(hFile)
if f then
local a,b=Read(f)
f:flush()
f:close()
return a,b
end
collectgarbage("collect")
end
Автор: Setuper 24.11.2008, 21:03
2district: ппц... ты фигнёй страдаешь
2Wariner: сам подумай функция возвращает значение и твоя очистка никогда не будет выполняться.
Раз уж на то пошло, то надо очищать в функции ChatArrival, но никак не таймером! Представляете, что вы каждый 3 секунды вызываете функцию очистки, а функция очистки достаточно сильно нагружает процессор))
Автор: district 24.11.2008, 21:14
-
Автор: Setuper 24.11.2008, 21:22
а где ты его останавливаешь в упор не вижу
Автор: district 5.12.2008, 9:45
Тот набросок, с которого начался топик, вылился вот во что.
-Убрана функция автосканирования
-Репорты получает только тот, кто непосредственно запускает проверку (ОП)
-В репортах отсутствуют нормально законнектившиеся юзеры, не нарушающие технических правил хаба
-В репортах присутствуют размер шары, слоты и хабы юзера(может, еще что-то можно добавить?), изменен принцип получения информации - теперь на период проверки технические правила хаба по слотам, мин шаре и макс хабам отменяются, по окончании - возвращаются на место. ВНИМАНИЕ! Возвращаемый на место параметр миншары сделан применительно к "Гб", т.е. если на вашем хабе миншара указана в Мб, то потребуются соответствующие изменения кода.
-Добавлена блокировка перехвата процесса проверки другим ОПом.
Смысл проверки: узнать, кто пытается войти, и почему именно не может.
У меня это выглядит примерно так (см.картинку)
Может, кому-нибудь пригодится такой бот.
Автор: district 6.12.2008, 19:06
Немного оптимизированный вариант. Дисконнект теперь осуществляется до отсылки репорта, это избавляет от срабатывания на "вход" юзера других скриптов.
Добавлен показ соотношения Хабы/Слоты - лично мне эта фича помогла добавить логики в связь между техническими правилами своей Птоки по мин, макс слотам, макс хабам и соотношению хабы/слоты.
Автор: Wariner 7.12.2008, 11:42
При переводи под второй API нашёл кое какие ошибки. Скрипт работает не совсеми видами банов. Например бан ника он не определяет!
Автор: district 7.12.2008, 18:39
Цитата(Wariner @ 7.12.2008, 14:42)

При переводи под второй API нашёл кое какие ошибки. Скрипт работает не совсеми видами банов. Например бан ника он не определяет!
Это дружище не ошибка, над решением этой проблемы бились , так сказать, Лучшие Умы ))))
Но решить ее пока не удавалось.
Дело в следующем.
Глобальные функции АПИ1 GetBannedItemName(IP) и GetTempBannedItemName(IP) , как видим, привязаны к айпи. А где ж Птоке взять айпи, если юзер забанен только по нику?
Равным образом не могут работать и функции GetBannedItemIp(nick) и GetTempBannedItemIp(nick) - по той же причине.
Искать в массивах frmHub:GetPermBanList() и frmHub:GetTempBanList() тоже можно, более того, все там есть и все находится. Только вот сравнивать опять же не с чем - не в ValidateNickArrival, ни тем более в SupportsArrival ник забаненного не проявляется, прицепиться ни к user.sName, ни к local _,_,nick = string.find(data,"(%S+)$") (что совсем для меня загадочно) не получается.
Может, чего-то я еще не знаю, а может, в новом АПИ есть какие-то новые соответствующие глобальные функции, которые могли бы решить задачу.
Автор: district 8.12.2008, 9:46
Еще один вариант.
Изменения:
- показываются только те параметры, которые расходятся с тех.правилами хаба
- показываются редиректы для каждого параметра
- для темпбана сделан округленный показ времени, оставшегося до окончания бана
- на время проверки каждому пытающемуся войти посылаются уведомления, с напоминанием технических правил хаба, вот в таком виде:
Цитата
[2008-12-07 22:09] <БотПрощайМолодость>
Настройки вашего DC-клиента не соответствуют техническим правилам хаба district's restricted hub.
Напоминаем технические правила:
Мин шара: 10.0 ГБ.
Макс.хабов: 100
Слоты отдачи: От 2 до 100
Соотношение Хабы/Слоты: Не более 50/1,
т.е. на каждые 50 хабов должно быть открыто не менее 1 слотов.
Администрация хаба district's restricted hub
- изменен формат репортов, для большего удобства восприятия
Автор: Wariner 10.12.2008, 21:43
Цитата(district @ 7.12.2008, 18:39)

Это дружище не ошибка, над решением этой проблемы бились , так сказать, Лучшие Умы ))))
Но решить ее пока не удавалось.
Мда, интересный вопрос... На сколько я понимаю новых функций к сожалению нет(((