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


Un script anti-flood pour mon eggdrop
#16
Bah euh, non ça fonctionnera, mais c'est illogique Wink
#17
D'accord !

Sur le moment je pensais juste à mettre au même endroit l'appel de la procédure et la procédure elle-même.

Je modifie celà.

Si vous avez d'autres remarques, faites-moi en part =]

Edit: C'est fait.
—( ^^ )—

Pensez à global var dans une procédure ! L'oublier c'est le payer cher... Moi ça m'a couté une journée de prise de tête et des cheveux !
#18
A toutes fins utiles, je vous propose ma fonction antiflood; je l'utilise dans la plupart de mes scripts.

Elle utilise un namespace, permet de protéger autant de commandes qu'on le souhaite et possède également une fonction "antiflood global" englobant toutes les commandes du script.
De plus, elle est multi-chan : si le script est utilisé sur plusieurs chans en même temps et que l'antiflood se déclenche sur un chan, le fonctionnement des autres ne sera pas perturbé.

Je m'explique à propos de l'antiflood global :
Quote:<user> !commande1
<user> !commande1
<user> !commande1
<Bot> :::: Contrôle de flood activé pour la commande !commande1 : pas plus de 2 requête(s) toutes les 60 secondes."
Ici, on a déclenché l'antiflood sur la commande1.


Quote:<user> !commande1
<user> !commande2
<user> !commande3
<user> !commande2
<Bot> :::: Contrôle de flood activé sur toutes les commandes de NOM_DU_SCRIPT : pas plus de 3 commandes toutes les 80 secondes."
Ici, on a déclenché l'antiflood global (qui empêche le flood en utilisant plusieurs commandes à la fois.


Voici le code :
tcl
# On initialise le namespace et on règle les paramètres
namespace eval EXEMPLE {
 
	#### PARAMETRES DE L'ANTI-FLOOD
  #
  # Anti-flood (0 = désactivé, 1 = activé)
  variable antiflood 1
 
  # Combien de commandes sont autorisées en combien de temps ?
  # exemple : "6:30" = 6 commandes maximum en 30 secondes;
  # les suivantes seront ignorées.
  #
  # Contrôle anti-flood individuel
  # Paramètres antiflood pour la commande1 :
  variable cmdflood_commande1 "2:120"
  # Paramètres antiflood pour la commande2 :
  variable cmdflood_commande2 "4:80"
  # Paramètres antiflood pour la commande3 :
  variable cmdflood_commande1 "1:60"
	#
  # Contrôle anti-flood global (toutes commandes confondues)
  # remarque : pour le nombre de commandes, spécifiez une valeur supérieure à
  #            la plus grande valeur définie pour le contrôle de flood
  #            individuel.
	variable cmdflood_global "6:120"
 
  # Intervalle de temps minimum entre l'affichage de 2 messages
  # avertissant que l'anti-flood 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'anti-flood...)
  variable antiflood_msg_interval 20
 
	# Déclaration des binds et initialisation des variables
	bind pub -|- !commande1 EXEMPLE::pub_commande1
	bind pub -|- !commande2 EXEMPLE::pub_commande2
	bind pub -|- !commande3 EXEMPLE::pub_commande3
 
	# la variable floodsettingsstring doit être modifiée en fonction des commandes
	# sur lesquelles vous souhaitez mettre un antiflood :
	variable floodsettingsstring [split "global $cmdflood_global commande1 $cmdflood_commande1 commande2 $cmdflood_commande2 commande3 $cmdflood_commande3"]
	variable floodsettings ; array set floodsettings $floodsettingsstring
	variable instance ; array set instance {}
	variable antiflood_msg ; array set antiflood_msg {}
 
}
 
 
# Procédures appelées par les binds :
proc EXEMPLE::pub_commande1 {nick host handle chan arg} {
	if {($EXEMPLE::antiflood == 1) && (([EXEMPLE::antiflood $chan "global"] == "flood") || ([EXEMPLE::antiflood $chan "commande1"] == "flood"))} { return }
	 ...
}
 
proc EXEMPLE::pub_commande2 {nick host handle chan arg} {
	if {($EXEMPLE::antiflood == 1) && (([EXEMPLE::antiflood $chan "global"] == "flood") || ([EXEMPLE::antiflood $chan "commande2"] == "flood"))} { return }
	 ...
}
 
proc EXEMPLE::pub_commande3 {nick host handle chan arg} {
	if {($EXEMPLE::antiflood == 1) && (([EXEMPLE::antiflood $chan "global"] == "flood") || ([EXEMPLE::antiflood $chan "commande3"] == "flood"))} { return }
	 ...
}
 
 
# Procédures de l'antiflood :
proc EXEMPLE::antiflood {chan type} {
  variable antiflood_msg
  if {![info exists antiflood_msg($chan$type)]} { set antiflood_msg($chan$type) 0 }
  variable instance
  if {![info exists instance($chan$type)]} { set instance($chan$type) 0 }
  set max_instances [lindex [split $EXEMPLE::floodsettings($type) ":"] 0]
  set instance_length [lindex [split $EXEMPLE::floodsettings($type) ":"] 1]
  if { $instance($chan$type) >= $max_instances } {
    if { $antiflood_msg($chan$type) == 0 } {
      set antiflood_msg($chan$type) 1
      if {$type != "global"} {
        putquick "privmsg $chan :::: Contrôle de flood activé pour la commande \002!$type\002 : pas plus de $max_instances requête(s) toutes les $instance_length secondes."
      } else {
        putquick "privmsg $chan :::: Contrôle de flood activé sur toutes les commandes de \002NOM_DU_SCRIPT\002 : pas plus de $max_instances commandes toutes les $instance_length secondes."
      }
      utimer $EXEMPLE::antiflood_msg_interval "EXEMPLE::antiflood_msg_reset $chan $type"
    }
    return "flood"
  } else {
    incr instance($chan$type)
    utimer $instance_length "EXEMPLE::antiflood_close_instance $chan $type"
    return "no flood"
  }
}
 
# Une instance se termine
proc EXEMPLE::antiflood_close_instance {chan type} {
  variable instance
  if { $instance($chan$type) > 0 } { incr instance($chan$type) -1 }
}
 
# Réinitialisation du message d'avertissement de l'antiflood
proc EXEMPLE::antiflood_msg_reset {chan type} {
  variable antiflood_msg
  set antiflood_msg($chan$type) 0
}

Toute l'actualité de mes scripts ici     (dernière mise à jour le 22/04/2020)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction, de quoi l'on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.
#19
joli script ! :)
merci bcp
#20
Y a de l'idée, mais des choses à améliorer au niveau de l'implémentation, je te conseille notemment de jeter un coup d'oeil du coté de return -code return Smile


Possibly Related Threads…
Thread Author Replies Views Last Post
  Modifier le script du trivia pour défiler les questions dans l'ordre Mimisth 2 3,503 05/12/2015, 19:45
Last Post: MisterS
  [Demande] Demande tcl pour faire parler eggdrop Yakka 9 8,474 26/09/2014, 14:10
Last Post: CrazyCat
  aide pour un script svp s2drk 3 5,028 11/08/2014, 23:23
Last Post: CrazyCat
  aide pour le script Nostromo1st 13 8,196 16/09/2013, 16:24
Last Post: Nostromo1st
  Script pour afficher la date à une heure donnée (ephemeride) conscience 13 9,360 04/06/2013, 21:29
Last Post: aliasangelius
  Mon script provoque un Excess Flood tow 6 4,654 04/03/2013, 22:59
Last Post: aliasangelius
  Anti-Flood TCL tow 1 4,173 09/12/2012, 11:00
Last Post: CrazyCat
  Aide pour faire un script TCL Ahriman 6 6,300 01/07/2012, 00:13
Last Post: Ahriman
  anti flood notice lesny 10 6,021 29/10/2011, 21:43
Last Post: lesny
  Je suis bloquer pour mon 1er script NesCrex 6 5,639 24/02/2011, 22:53
Last Post: CrazyCat

Forum Jump:


Users browsing this thread: 1 Guest(s)