Об IRC. Доступно и со вкусом.

Пишем простейшую защиту канала от флуда

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

Вставляем в ремоуты(Remote):

on @*:TEXT:*:#: {
if (%text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] == $null ) { set -u8 %text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] 1 }
else { inc %text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] }
if (%text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] > 3) {
.ignore -u10 $address($nick,3)
.mode # +b $address($nick,2)
.kick # $nick Больше 3 повторов за 8 секунд
}
}

Комментарии излишни, т.к. данный скрипт подробно рассматривался в предыдущей статье. Я хочу добавить лишь одно, переменная %text. [ $+ [ $chan $+ . $+ [ $nick ] ] ] будет иметь вид %text.#help.chertopolox.

Следущий скрипт будет наказывать всех кто любит очень много писать Caps Lockом:

on @*:text:*:#:{
; очищаем %text.caps от цветов, пробелов
var %i = 1, %text.caps = $remove($strip($1-),$chr(32)), %j
; запускаем цикл
while (%i <= $len(%text.caps)) {
; если сли буква большая то увеличиваем счетчик
if ($mid(%text.caps,%i,1) !islower) { inc %j }
; увеличиваем значение цикла на единицу
inc %i
}
; если количество больших букв в тексте превышает 80%
if ($round($calc((%j / %i) * 100),0) > 80) {
; кикаем нарушителя
.kick # $nick Отключите Caps Lock
}
}

В комментариях я постарался изложить все наиболее непонятные моменты, остальное (хотя точнее сказать все :) можно найти в help

Итак, наш следущий скрипт будет наказывать тех, кто любит излишне писать цветом на каналах. Не все серверы поддерживают опцию +c, так что это этот скрипт тоже будет полезен.

on @*:text:*:#:{
; если количество вхождений символа , символ получается при нажатии ctrl+k, в тексте больше 5
if ($count($1-,) > 5) {
; игнорим, баним и кикаем ник
.ignore -u10 $address($nick,3)
.mode # +b $address($nick,2)
kick # $nick Слишком много цветов
}
}

Вместо символа ctrl+k можно сделать ctrl+b или ctrl+u для считания соответственно жирного или подчеркнутого текста.

Теперь не менее занятный скрипт предотвращения join/part флуда.

on @*:part:#:{
if (%joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] == $null) { set -u60 %joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] 1 }
else { inc %joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] }
if (%joinpart. [ $+ [ $nick $+ . $+ [ $chan ] ] ] >= 3) {
.raw -q mode # +b $address($nick,2)
.echo -a >>> Join/Part Flood на #
}
}

Я думаю тут и так все понятно без комментариев, если вы разобрались в предыдущих скриптах.

На этом пока все, существует множество других видов флуда канала, но почти все защиты пишутся аналогично:
1 шаг - создается переменная на определенное время в которую мы сохраняем ник,канал (можно даже сеть) и закладываем туда какие нибудь данные
2 шаг - сравнение этой переменной с данными, которые мы считаем наиболее правильными
3 шаг - если сравнение не удалось, осуществляем наказание

Если появятся вопросы, или хотите что-либо уточнить, милости просим на форум.

P.S. Спасибо Nomad за найденые неточности.