Скрипт очень минималистичен и практически не влияет на производительность.
proc AntiSpamSet {var delay} {
global antispam
if {[info exists antispam($var)]} {
putlog "antispam has blocked: $var, setted [expr {[clock seconds] - $antispam($var)}] seconds ago"
return -level 2 false
} else {
set antispam($var) [clock seconds]
utimer $delay [list unset antispam($var)]
}
}
global antispam
if {[info exists antispam($var)]} {
putlog "antispam has blocked: $var, setted [expr {[clock seconds] - $antispam($var)}] seconds ago"
return -level 2 false
} else {
set antispam($var) [clock seconds]
utimer $delay [list unset antispam($var)]
}
}
Как им пользоваться:
Если у вас есть какая-то команда, например .hello которая говорит юзеру привет, и вы хотите запретить юзеру пользоваться ей чаще, чем раз в 10 секунд:
proc hello {nick uhost hand chan text} {
AntiSpamSet "hello" 10
say "Hello, $nick!"
}
AntiSpamSet "hello" 10
say "Hello, $nick!"
}
Что произойдет в первый раз:
- Вызовется процедура AntiSpamSet, которая установит глобальную переменную antispam(hello:$nick), и установит таймер на 10 секунд, который удалит её
- Проценура hello продолжит выполнение
Что произойдет если юзер повторит фразу:
- Процедура AntiSpamSet определит, что переменная существует, и бот не будет отвечать юзеру, потому что return происходит с параметром "-level 2".
Еще варианты применения:
# ставим антиспам на эту команду в 5 секунд, и раз в 30 секунд для юзера
proc hello {nick uhost hand chan text} {
AntiSpamSet "hello:$nick" 30
AntiSpamSet "hello" 5
say "Hello, $nick!"
}
proc hello {nick uhost hand chan text} {
AntiSpamSet "hello:$nick" 30
AntiSpamSet "hello" 5
say "Hello, $nick!"
}