Bonjour à tous,
J'ai crée un script pour ceux qui veulent utiliser un anti flood sur une commande spécifique en me basant sur la procédure de @"MenzAgitat" disponible sur https://boulets.eggdrop.fr/tcl/routines/...-0020.html et aussi pour apporter une réponse précise au thread de @"Valentin" :
J'ai crée un script pour ceux qui veulent utiliser un anti flood sur une commande spécifique en me basant sur la procédure de @"MenzAgitat" disponible sur https://boulets.eggdrop.fr/tcl/routines/...-0020.html et aussi pour apporter une réponse précise au thread de @"Valentin" :
tcl
############
# plainte #
############
if {[::tcl::info::commands ::plainte::uninstall] eq "::plainte::uninstall"} { ::plainte::uninstall }
namespace eval ::plainte {
############
# VARIABLE #
############
# Activer l'antiflood ? (0 = désactivé / 1 = activé)
variable antiflood 1
# Contrôle de flood individuel.
# Lorsqu'il s'active, la commande sera bloquée pour l'utilisateur qui l'a
# déclenché uniquement.
# Exemple : "10:600" = 10 requêtes maximum en 600 secondes, les suivantes seront
# ignorées.
# Seuil pour la commande plainte :
variable addplainte_flood_limit "1:240"
# Contrôle de flood global, toutes commandes confondues.
# Lorsqu'il s'active, les commandes du script sont bloquées pour tout le monde
# sur le chan concerné.
# Remarque : pour le nombre de requêtes, spécifiez une valeur supérieure à la
# plus grande valeur définie pour le contrôle de flood individuel.
variable global_flood_limit "20:600"
# Intervalle de temps minimum entre l'affichage de 2 messages avertissant que
# l'antiflood a été déclenché (ne réglez pas cette valeur trop bas afin de ne
# pas être floodé par les messages d'avertissement de l'antiflood...)
variable antiflood_msg_interval 60
# Mode d'affichage préféré pour les messages de l'antiflood.
# (1 = message public / 2 = notice à l'utilisateur)
variable preferred_display_mode 2
proc ::plainte::uninstall {args} {
putlog "Désallocation des ressources de \002plainte\002..."
# Suppression des binds.
foreach binding [lsearch -inline -all -regexp [binds *[set ns [::tcl::string::range [namespace current] 2 end]]*] " \{?(::)?$ns"] {
unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
}
# Arrêt des utimers en cours.
foreach running_utimer [utimers] {
if { [::tcl::string::match "*[namespace current]::*" [lindex $running_utimer 1]] } { killutimer [lindex $running_utimer 2] }
}
namespace delete ::plainte
}
}
proc ::plainte::addplainte {nick host hand text} {
variable antiflood
variable preferred_display_mode
variable addplainte_flood_limit
variable global_flood_limit
if {
(($antiflood == 1)
&& (([antiflood $nick "solo" "nick" plaintes $addplainte_flood_limit])
|| ([antiflood $nick "global" "chan" "*" $global_flood_limit])))
} then {
return
} else {
puthelp "NOTICE $nick :Plainte envoyé blabla machin c'est ok"
}
}
###############################################################################
### Contrôle du flood.
### - focus peut valoir "chan" ou "nick" et différenciera un contrôle de flood
### collectif où les commandes seront bloquées pour tout le monde, d'un
### contrôle individuel où les commandes seront bloquées pour un seul individu.
### - command peut valoir "*" ou le nom d'une commande et différenciera un
### contrôle par commande ou toutes commandes du script confondues.
### - limit est exprimé sous la forme "xx:yy", où xx = nombre maximum de
### requêtes et yy = durée d'une instance.
###############################################################################
proc ::plainte::antiflood {nick chan focus command limit} {
variable antiflood_instances
variable antiflood_msg
variable preferred_display_mode
variable antiflood_msg_interval
lassign [split $limit ":"] max_instances instance_length
if { $focus eq "chan" } {
set hash [md5 "$chan,$command"]
} else {
set hash [md5 "$nick,$chan,$command"]
}
# L'antiflood est dans un statut neutre, on l'initialise.
if { ![::tcl::info::exists antiflood_instances($hash)] } {
set antiflood_instances($hash) 0
set antiflood_msg($hash) 0
}
if { $antiflood_instances($hash) >= $max_instances } {
if { $preferred_display_mode == 1 } {
set output_method "PRIVMSG"
set output_target $chan
} else {
set output_method "NOTICE"
set output_target $nick
}
if { !$antiflood_msg($hash) } {
set antiflood_msg($hash) 2
if { $command eq "*" } {
if { $focus eq "chan" } {
puthelp "PRIVMSG $nick :\00304:::\003 \00314Contrôle de flood activé pour toutes les commandes du script : pas plus de $max_instances requête(s) toutes les $instance_length seconde(s).\003"
} else {
puthelp "PRIVMSG $nick :\00304:::\003 \00314Contrôle de flood activé pour $nick sur toutes les commandes du script : pas plus de $max_instances requête(s) toutes les $instance_length seconde(s).\003"
}
} else {
if { $focus eq "chan" } {
puthelp "$output_method $output_target :Contrôle de flood activé pour les \"$command\" : pas plus de $max_instances requête(s) toutes les $instance_length seconde(s)."
} else {
puthelp "$output_method $output_target :Contrôle de flood activé pour $nick sur les \"$command\" : pas plus de $max_instances requête(s) toutes les $instance_length seconde(s)."
}
}
if { [set msgresettimer [utimerexists "antiflood_msg_reset $hash"]] ne ""} {
killutimer $msgresettimer
}
utimer $antiflood_msg_interval [list ::plainte::antiflood_msg_reset $hash]
} elseif { $antiflood_msg($hash) == 1 } {
set antiflood_msg($hash) 2
if { $command eq "*" } {
puthelp "PRIVMSG $nick :Le contrôle de flood est toujours actif, merci de patienter."
} else {
puthelp "$output_method $output_target :Le contrôle de flood est toujours actif, merci de patienter."
}
if { [set msgresettimer [utimerexists "antiflood_msg_reset $hash"]] ne ""} {
killutimer $msgresettimer
}
utimer $antiflood_msg_interval [list ::plainte::antiflood_msg_reset $hash]
}
return 1
} else {
incr antiflood_instances($hash) 1
utimer $instance_length [list ::plainte::antiflood_close_instance $hash]
return 0
}
}
###############################################################################
### Fermeture d'une instance de l'antiflood.
###############################################################################
proc ::plainte::antiflood_close_instance {hash} {
variable antiflood_instances
variable antiflood_msg
incr antiflood_instances($hash) -1
# si le nombre d'instances retombe à 0, on efface les variables instance et
# antiflood_msg afin de ne pas encombrer la mémoire inutilement
if { $antiflood_instances($hash) == 0 } {
unset antiflood_instances($hash)
unset antiflood_msg($hash)
# le nombre d'instances est retombé en dessous du seuil critique, on
# réinitialise antiflood_msg
} else {
set antiflood_msg($hash) 0
if { [set msgresettimer [utimerexists "antiflood_msg_reset $hash"]] ne ""} {
killutimer $msgresettimer
}
}
return
}
###############################################################################
### Réinitialisation de l'état du message d'avertissement de l'antiflood.
###############################################################################
proc ::plainte::antiflood_msg_reset {hash} {
variable antiflood_msg
set antiflood_msg($hash) 1
return
}
###############################################################################
### Test de l'existence d'un timer, renvoi de son ID
###############################################################################
proc ::plainte::timerexists {command} {
foreach timer_ [timers] {
if { ![::tcl::string::compare $command [lindex $timer_ 1]] } {
return [lindex $timer_ 2]
}
}
}
###############################################################################
### Test de l'existence d'un utimer, renvoi de son ID
###############################################################################
proc ::plainte::utimerexists {command} {
foreach utimer_ [utimers] {
if { ![::tcl::string::compare $command [lindex $utimer_ 1]] } {
return [lindex $utimer_ 2]
}
}
}
bind msg - "plainte" ::plainte::addplainte
bind evnt - prerehash ::plainte::uninstall