EpicNet.Ru - Форум IRC Чата

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Anti Flood Join/Part

Сообщений 1 страница 7 из 7

1

Название: Anti Flood Join/Part
Версия: 1.1
Дата: 10.10.2025
Разработчик: Epic
Приложение: mIRC

Скрипт: AntiFloodJoinPart.mrc

Описание: Скрипт активирует защиту, когда пользователь совершает множество перезаходов на канал за короткий промежуток времени. При превышении установленного лимита перезаходов "max_join" в течении указанного периода времени "period_time" пользователь получит "Kick+Ban". Это похоже на то, как работает функция IRCd модуля для установки режима канала [c]/mode #channel +j <joins>:<sec>[/c], но скрипт имеет более широкие возможности настройки.

Настройка: С помощью специальных алиасов в нижней части кода вы можете изменить возвращаемые параметры на необходимые вам значения:

  • log_file - возвращает путь к лог-файлу для записи причины бана, с датой, временем, каналом и пользовательскими данными.

  • delay_check - возвращает время задержки в миллисекундах, которое должно пройти перед запуском проверки, чтобы пользователь успел получить префикс канала [c]~ & @ % +[/c]

  • echo_info - возвращает "yes" или "no" для включения или отключения эхо-сообщения с информацией о количестве выполненных "Join" на канале.

  • when_warn - возвращает количество совершённых перезаходов на канале, при котором пользователю будет отправлено уведомление с предупреждением.

  • max_join - возвращает максимальное количество перезаходов на канале, при превышении которого пользователь получит "Kick+Ban".

  • period_time - возвращает период времени в секундах, в течении которого пользователь может получить "Kick+Ban", если превысит значение max_join.

  • ban_type - возвращает числовое значение типа бана, который будет использоваться для установки "Ban" на канале.

  • ban_time - возвращает время в секундах, на которое будет установлен "Ban" на канале.

  • warn_msg - возвращает текст сообщения, которое будет отправлено пользователю-нарушителю, с помощью команды "notice".

  • ban_msg - возвращает текст сообщения, которое будет отправлено пользователю-нарушителю при установке "Ban" на канале.

Примечание: Наиболее эффективная защита будет при интенсивной флуд-атаке, когда большое количество пользователей/ботов совершают массовый набег на ваш канал, бесконечно выполняя "Join/Part" действия, в течении короткого периода времени (1-5 секунд). При этом, не рекомендуется устанавливать слишком большое значение для параметра "period_time" вместе с маленьким значением для параметра "max_join", если не хотите случайно забанить большую часть пользователей вашего канала, у которых могли быть разные причины для выполнения нескольких перезаходов на канал в течении установленного периода времени, например, если у них были проблемы с интернет связью или иные причины, требующие выключения IRC клиента или перезагрузки компьютера и т.д. Поэтому старайтесь осторожно подходить к настройке данных параметров. Тем не менее, при необходимости вы можете установить префиксы [c]~ & @ % +[/c] для дружелюбных пользователей канала, чтобы исключить их из проверки.
[indent=0.8,0.5]
Установка:

  • Откройте редактор скриптов вашего клиента с помощью комбинации клавиш "ALT+R" (на вкладке "Remote").

  • Выберите в верхнем меню пункт "File/New", чтобы открыть новый файл и разместите в нём этот код.

  • Выберите в верхнем меню пункт "File/Save As..." и сохраните код в директории "scripts\FolderName\ScriptName.mrc".

  • Если ранее была установлена предыдущая версия кода, то замените его на этот новый код скрипта.

Скачать 💾

Код:
;#####################################################################
;#  Name: Anti Flood Join/Part v1.1
;#  Developer: Epic (https://forum.epicnet.ru, irc.epicnet.ru 6667 #Code)
;#  Description: Protection against "Join/Part" flooding will be activated when a user makes multiple re-joins to the channel in a short period of time.
;#####################################################################

on !*:JOIN:#:{
  var %tname $+(AFJP,$chan,$ial($nick).host,$ticks)
  $+(.timer,%tname) -m 1 $delay_check check_start $unsafe($chan $address($nick,5))
}

alias -l check_start {
  var %chan $1, %hname $+(jpflood,%chan), %nick $geta($2).nick, %host $geta($2).host, %addr $geta($2).addr
  if ($nick(%chan,%nick,~&@%+)) { return }
  if (!$hget(%hname,%host)) { hadd $+(-mu,$period_time) %hname %host 1 }
  else {
    if ($hget(%hname,%host) <= $max_join) {
      hinc %hname %host 1 | if ($hget(%hname,%host) == $when_warn) { .notice %nick $warn_msg }
    }
    if ($hget(%hname,%host) > $max_join) {
      ban $+(-ku,$ban_time) %chan %nick $ban_type $ban_msg
      if (!$exists($nofile($log_file))) { mkdir $nofile($log_file) }
      write $log_file *JoinFlood* $date $time %chan %nick %addr | hdel %hname %host
    }
  }
  if ($echo_info == yes && $hget(%hname,%host)) {
    var %addtext $+($chr(40),left07 $hget(%hname,%host).unset,$chr(32),sec,$chr(41))
    echo 14 %chan JoinFlood ::05 %nick ::04 $v1 rejoins in04 $period_time sec %addtext
  }
}
alias -l geta {
  if ($prop == nick) { return $gettok($1,1,33) }
  if ($prop == ident) { return $gettok($gettok($1,2,33),1,64) }
  if ($prop == host) { return $gettok($1,2,64) }
  if ($prop == addr) { return $+($gettok($gettok($1,2,33),1,64),@,$gettok($1,2,64)) }
}

alias -l log_file { return scripts\AntiFloodJoinPart\log.txt }
alias -l delay_check { return 1000 }
alias -l echo_info { return yes }
alias -l when_warn { return 3 }
alias -l max_join { return 3 }
alias -l period_time { return 10 }
alias -l ban_type { return 2 }
alias -l ban_time { return 1800 }
alias -l warn_msg { return Warning: Too many re-joins in a short time. Stop, else will be banned! }
alias -l ban_msg { return Reason: Multiple re-joins to a channel in a short period of time! }

P.S. Если в процессе тестирования вы обнаружили баги/ошибки или у вас появились новые идеи по модификации этого скрипта, то оставьте здесь свой отчёт или список запросов, с подробным описанием и примерами использования будущих/новых функций.

Подпись автора

[html]<style>img {vertical-align:middle;}.hnet{color:#FFFFFF;}.hstar{color:#DE0000;}.htext{font-family:Verdana;font-size:13px;color:#6E1E00;}.heading{font-family:Verdana;font-size:13px;font-weight:bold;background-color:#4897E7;}.stitle{font-family:Verdana;font-size:12px;}.dot{color:#808000;}.desc{color:#ADADAD;}a .curl{font-family:Verdana;font-size:13px;color:#3A92CD;}</style><table><tr><td width="20px" height="20px"><img src="https://forumstatic.ru/files/000d/c9/8c/34681.jpg"></td><td><a href="https://forum.epicnet.ru/viewtopic.php?id=234"><span class="heading"> <span class="hstar">★</span> <span class="hnet">EpicNet.Ru</span> <span class="hstar">★</span> </span><span class="htext"> - IRC Чат © 2008</span></a></td></tr><tr><td></td><td><div class="stitle"><span class="dot">•</span> <span class="desc">Вход через вебгейт:</span> <a href="http://irc.epicnet.ru"><span class="curl">http://irc.epicnet.ru</span></a><br><span class="dot">•</span> <span class="desc">Сервер:</span> irc.epicnet.ru <span class="desc">Порты:</span> 6667, 6668 (ssl)<br><div></td></tr></table>[/html]

2

I have 3 questions:

[indent=0.8,0.5] 1)  - Is it possible to add a Warn message after 2nd rejoin?
[indent=0.8,0.5] 2)  - Is this the time to reach safe zone? I mean if re-join 3 times in 4 seconds , is ban? So can I set it 3 times in 1800 seconds?
[rect width=950]
join-max - Configures the maximum number of connections allowed per channel, which, if exceeded, will result in a "Kick+Ban" for the user. Default: 2
time-max - Configures the maximum time period in seconds during which a user can receive a "Kick+Ban" if they exceed join-max . Default: 4
[/rect]

[indent=0.8,0.5] 3)  - Can I set a time ban to 2 hours?

[indent=0.8,0.5]
Thanks

Отредактировано Chandra (08.10.2025 18:51)

3

1704,387 написал(а):

1)  - Is it possible to add a Warn message after 2nd rejoin?

Это будет реализовано в следующей версии скрипта.
[indent=0.8,0.5]

1704,387 написал(а):

2)  - Is this the time to reach safe zone? I mean if re-join 3 times in 4 seconds , is ban? So can I set it 3 times in 1800 seconds?

При настройках по умолчанию, если пользователь войдёт на канал больше 2-х раз в течении 4-х секунд - будет выполнено "Kick+Ban". Это эффективно при интенсивной флуд-атаке.
Да, вы можете увеличить период времени до 1800 секунд, но тогда будет риск, что под удар "Kick+Ban" могут попасть пользователи, у которых нестабильная связь с интернетом и т.д.
[indent=0.8,0.5]

1704,387 написал(а):

3)  - Can I set a time ban to 2 hours?

Это будет реализовано в следующей версии скрипта.


[indent=0.8,0.5]
Пожалуйста ожидайте и следите за обновлением первого поста в этой теме форума.

Подпись автора

[html]<style>img {vertical-align:middle;}.hnet{color:#FFFFFF;}.hstar{color:#DE0000;}.htext{font-family:Verdana;font-size:13px;color:#6E1E00;}.heading{font-family:Verdana;font-size:13px;font-weight:bold;background-color:#4897E7;}.stitle{font-family:Verdana;font-size:12px;}.dot{color:#808000;}.desc{color:#ADADAD;}a .curl{font-family:Verdana;font-size:13px;color:#3A92CD;}</style><table><tr><td width="20px" height="20px"><img src="https://forumstatic.ru/files/000d/c9/8c/34681.jpg"></td><td><a href="https://forum.epicnet.ru/viewtopic.php?id=234"><span class="heading"> <span class="hstar">★</span> <span class="hnet">EpicNet.Ru</span> <span class="hstar">★</span> </span><span class="htext"> - IRC Чат © 2008</span></a></td></tr><tr><td></td><td><div class="stitle"><span class="dot">•</span> <span class="desc">Вход через вебгейт:</span> <a href="http://irc.epicnet.ru"><span class="curl">http://irc.epicnet.ru</span></a><br><span class="dot">•</span> <span class="desc">Сервер:</span> irc.epicnet.ru <span class="desc">Порты:</span> 6667, 6668 (ssl)<br><div></td></tr></table>[/html]

4

1158,2 написал(а):

Name:  Anti Flood Join/Part
Version: 1.1
Date: 10.10.2025
Developer: Epic
Application:  mIRC

Script:  AntiFloodJoinPart.mrc

I'm so so sorry Epic: I right now was surfing Your forum and realized You edited Your post. So I found Your script.
Really sorry for my late reply (but there's no notification for edited post :-P )
I'll test it today.
Thanks a lot again and please excuse me

Отредактировано Chandra (18.10.2025 20:30)

5

Just a question: I noticed that this script create an hashtable ( %hname ) and on join add a host ( hadd $+(-mu,$period_time) %hname %host 1 ) and check join from there.
This mean that is not editable like a variable.
Or maybe there's a way to fast edit an hashtable?
Thanks

Пост написан 18.10.2025 20:31

6

1707,387 написал(а):

... maybe there's a way to fast edit an hashtable?

Для чего и зачем? Вы обнаружили какие-то баги/ошибки или у вас появились новые идеи по модификации этого скрипта?

Подпись автора

[html]<style>img {vertical-align:middle;}.hnet{color:#FFFFFF;}.hstar{color:#DE0000;}.htext{font-family:Verdana;font-size:13px;color:#6E1E00;}.heading{font-family:Verdana;font-size:13px;font-weight:bold;background-color:#4897E7;}.stitle{font-family:Verdana;font-size:12px;}.dot{color:#808000;}.desc{color:#ADADAD;}a .curl{font-family:Verdana;font-size:13px;color:#3A92CD;}</style><table><tr><td width="20px" height="20px"><img src="https://forumstatic.ru/files/000d/c9/8c/34681.jpg"></td><td><a href="https://forum.epicnet.ru/viewtopic.php?id=234"><span class="heading"> <span class="hstar">★</span> <span class="hnet">EpicNet.Ru</span> <span class="hstar">★</span> </span><span class="htext"> - IRC Чат © 2008</span></a></td></tr><tr><td></td><td><div class="stitle"><span class="dot">•</span> <span class="desc">Вход через вебгейт:</span> <a href="http://irc.epicnet.ru"><span class="curl">http://irc.epicnet.ru</span></a><br><span class="dot">•</span> <span class="desc">Сервер:</span> irc.epicnet.ru <span class="desc">Порты:</span> 6667, 6668 (ssl)<br><div></td></tr></table>[/html]

7

No error at all, it is really amazing.

You right said:

.....you can increase the time period to 1800 seconds, but then there's a risk that users with unstable internet connections, etc., may be hit by a Kick+Ban ....

And that's a good advice for sure.
Considering that I'm not interested what happen in the night (I mean when I'm not on duty), I easily can do something when I'm on duty.
1) - If there's any idiot troll who just loves to be a professional idiot, then is ok. I let it join and part and script will do the job.
2) - If there's an user who really need maybe to part and join for connection problems or other technical issues, then it should be better if I can edit part/join countdown.
This code, set a variable (%JoinPartFlood) that I easily can edit for mIRC Script Editor in Variables tab:

Код:
On *:JOIN:#test:{
  if (!$Timer($+(CheckAccessOP,_,$chan,_,$site,_,$network))) { .timer $+ $+(CheckAccessOP,_,$chan,_,$site,_,$network) -m 1 400 OP_check_access $unsafe($chan) $wildsite $nick }
}

Alias -l OP_check_access { 
  var %chan = $1, %site = $gettok($2,2,64) , %nick = $3, %wildsite = $2
  if (!$nick(%chan,%nick,!~&@%+)) { 
    if ($+(%,JoinPartFlood_,%site,_,%chan) == $null ) { set $+(%,JoinPartFlood_,%site,_,%chan) 1 }
    else { inc -u $+ $duration(1h) $+(%,JoinPartFlood_,%site,_,%chan) 1 }
    if ($($+(%,JoinPartFlood_,%site,_,%chan),2) == 3) { .timerwarn 1 4 notice $unsafe(%nick) WARN }    
    if ($($+(%,JoinPartFlood_,%site,_,%chan),2) == 4) {
      if (%wildsite !isban %chan) { ban -u $+ $duration(2h)  %chan %nick 2  | write $mircdir $+ banemule.txt *Join_Flood* $date $time %nick ---> %site }
      if (%nick ison %chan) { kick %chan %nick BANKICK REASON }
      unset $eval($+(%,JoinPartFlood_,%site,_,%chan),1)
    }
  }
}

I easily search the line about user i.e.:

%JoinPartFlood_11D009E6.B27F3F52.59FCA970.IP_#test 3

and change it to:

%JoinPartFlood_11D009E6.B27F3F52.59FCA970.IP_#test 2

So user will receive again a warn and it can advice me about connection problems and I can direct it in a room with no restrictions to solve.
I hope I been more clear.

Отредактировано Chandra (20.10.2025 18:59)