|
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
![]()
Сообщение
#1
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Решил вот выложить сырую такую прикидку, нацарапанную с непосредственным онлайн участием 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 |
|
|
![]()
Сообщение
#2
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Сегодня прикидка оформилась в какое-то подобие чего-то. И даже была успешно применена на хабе в сугубо практических целях.
Еще раз изложу идею этого ботика. Идея заключается в том, чтобы получить максимально возможное количество информации о попытках входа на хаб, о юзерах, пытающихся войти на хаб, и о причинах, почему вход невозможен. Бот работает в автоматическом режиме, период включения проверки и период самой проверки - задаются, а также в ручном режиме: запустить проверку, остановить проверку. 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'а ![]()
Прикрепленные файлы
|
|
|
![]()
Сообщение
#3
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
|
|
|
![]()
Сообщение
#4
|
|
![]() Освоившийся участник ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз ![]() |
Цитата("district") Как должно выглядеть выражение отсылки репорта всем никам из таблицы? Код tTable = { 'Nick', 'Nick' } for sNick in ipairs(tTable) do SendToNick(sNick, sString) end Цитата("district") забаненного по нику frmHub:GetPermBanList(), frmHub:GetTempBanList()upd. От это я тормоз Оо |
|
|
![]()
Сообщение
#5
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
помоему так Код for i,v in pairs(tTable) do SendToNick(v, Data) end Точно так! Благодарю за оперативное реагирование ![]() ------------------------------------------------------------------------------------------------------- Подшаманено, перезагружено.
Прикрепленные файлы
|
|
|
![]()
Сообщение
#6
|
|
![]() Освоившийся участник ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 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 upd. или даже так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 Код 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 |
|
|
![]()
Сообщение
#7
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
2district: а ты в чём пишешь скрипты? На мой взгляд какая-то у них структура странная... Меня кто-то учил ступенчатой структуре(мож это и не так называется) Получается гораздо нагляднее)))
PS: сорри за оффтоп |
|
|
![]()
Сообщение
#8
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Спасибо, ребята, за комменты. Но голова уже нифига не варит - ночь на дворе.
Ступенчато оно конечно лучше, и до этого доберемся со временем. Я Ноутпад++ меньше недели назад поставил... вот пробую. Sephiroth_Lukaw! Не заколебай меня насчет таймера! ![]() PS а глобальные переменные остались от варианта, когда я пытался соорудить отдельную функцию репорта, и просуммировать инфу из валидата и суппорта. Но тот вариант не прокатил. |
|
|
![]()
Сообщение
#9
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
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 |
|
|
![]()
Сообщение
#10
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Setuper
Что ж, спасибо за код, оптимизацию учтем, но: 1.Требуется отслеживать не только забаненных, но и нарушающих технические правила по шаре, по слотам, просто не-могущих войти из-за плохого коннекта и т.д. 2.Таймер задает период автоматического сканирования (хоть раз в десять дней) и подпериод подачи непосредственно репортов. Запустить репорты и остановить можно из меню. А постоянные сообщения о попытках входа в чате мне как раз-таки задаром не нужны. |
|
|
![]()
Сообщение
#11
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Контроль шары и слотов ты не сможешь реализовать, потому что в функции ValidateNickArrival шара пользователя ещё не определена, а проверка ограничений на шару происходит непосредственно после этой функции.
Единственное как это можно обойти - это отключить стандартную проверку шары и слотов и написать в функции MyINFOArrival свою проверку. С таймерами всё равно не понятно! Зачем всё усложнять и вводит какие-то лишние никому не нужные вещи? |
|
|
![]()
Сообщение
#12
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Переработано.
Что ж, функция Sender порадовала своим изяществом и простотой. И подумать не мог, что sMsg ,будет вот так отрабатываться, при том что нигде нет прямого присваивания вроде sMsg = "БлаБлаБла".. Это надо запомнить. Таймер все-таки оставил, как дань тем суткам, что были бессонно угроханы на этот ботик. Да и как без таймера ограничить цикл репортирования? Постоянное нытье в чате "Ломится такой-то, повторяю, совсем ни к чему. Другое дело, что авторежим теперь опционален - хочешь, оставь авторепорт на каждые несколько часов, хочешь, запускай только вручную. Почему сделаны разными имя бота и имя репортера. Ну подумайте сами: логика: Прокуратура - начинает и заканчивает проверку в ГУИНе, ГУИН - докладывает. Да и зрительно гораздо легче цикл воспринимается.. ![]() Да, и прошу всерьез не воспринимать шуточный стиль репортов бота. В конце концов - каждый может поменять его в соответствии со своим вкусом.
Прикрепленные файлы
|
|
|
![]()
Сообщение
#13
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
|
|
|
![]()
Сообщение
#14
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Setuper
![]() Вот! Давно мечтаю узнать, ради чего добавляют вертикальный слэш? Код function OpConnected(user) user:SendData("$UserCommand 1 3 "..sMenu.."\\Начать проверку$<%[mynick]> !strprk||".. "$UserCommand 1 3 "..sMenu.."\\Остановить проверку$<%[mynick]> !stpprk|") end (ну тут не отображается, но вопрос, думаю, ясен. В первой строке менюшки?) А есть вот еще вопрос практический, только что созрел. Вот, получили мы репорт. Скажем, десяток юзеров. Идея такая: прямо в чате, прямо райткликом по имени юзера или айпи, вызываем функцию сверки с ConnectedUsers.txt И получаем - в случае если выбран ник - все айпи, с которых когда-либо заходил этот ник, в случае, если выбран айпи - все ники, которые заходили с этого айпи. Тема актуальная, приходится в КоннектедЮзерс.тхт вручную рыться, часто. Мне бы только ядро функции, а дальше доделаю. Тут же можно было бы присовокупить ввод ника или айпи из строки меню, для проверки его на "многоликость" А может, вынести все это дело в отдельный бот. Что скажешь? |
|
|
![]()
Сообщение
#15
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Следующие коды эквивалентны:
Код 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 ![]() По поводу какой-то свёртки по правому клику, не совсем понял о чём речь. |
|
|
![]()
Сообщение
#16
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
насчет СендДаты - понял, надо будет также запомнить эту фишку.
а насчет "свёртки" - ну, есть файл лог соединений, ConnectedUsers.txt Задача: оперативно пробить а) по нику - под какими айпи был замечен этот ник б) по айпи - с какими никами заходили с этого айпи. Используя этот файл. |
|
|
![]()
Сообщение
#17
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Это у кого такой файл? В папке с клиентом он или в папке сервера? Какой формат данных в этом файле?
P.S. SendData - читается по английски как СэндДэйта (переводится как ОтсылкаДанных), не путать Data и Date ![]() |
|
|
![]()
Сообщение
#18
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
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 Но если такой формат совсем непригоден, то, ради такого дела, можно ведь изменить формат лога. |
|
|
![]()
Сообщение
#19
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Код 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 |
|
|
![]()
Сообщение
#20
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Спасибо, попробую разобраться.
Сразу два вопроса. 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 ЗАРАБОТАЛО! Якорный бабай, да он еще и число входов выдает! Зреет шедевр, честное слово ![]() Пока не работает отображение НИКОВ по IP. Во всех случаях - " *** Пользователь с IP адресом ... в базе не найден" |
|
|
![]() ![]() |
![]() |
Сейчас: 2.4.2025, 4:18 |