Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Plainte avec contrôle anti flood
#1
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 :


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

  Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Résolu] Commande /plainte pseudo raison gérer par un eggdrop avec un alias Unrealircd Alucard`68 3 4,046 01/02/2017, 03:39
Last Post: Alucard`68
  [Script] Contrôle du contenu d'un fichier KiBa 1 3,291 28/11/2013, 17:03
Last Post: CrazyCat
  Anti-Flood TCL tow 1 4,218 09/12/2012, 11:00
Last Post: CrazyCat
  anti flood notice lesny 10 6,077 29/10/2011, 21:43
Last Post: lesny
Money_euro Système de plainte BlackNight 9 6,423 26/06/2009, 16:18
Last Post: Merwin
  Plainte.tcl Aragorn 11 7,771 14/04/2009, 12:36
Last Post: MorDenX
  Un script anti-flood pour mon eggdrop Virgile 19 14,401 08/08/2008, 15:45
Last Post: Merwin

Forum Jump:


Users browsing this thread: 1 Guest(s)