Communauté Eggdrop
Un script anti-flood pour mon eggdrop - Version imprimable

+- Communauté Eggdrop (https://forum.eggdrop.fr)
+-- Forum : Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum : Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Sujet : Un script anti-flood pour mon eggdrop (/showthread.php?tid=251)

Pages : 1 2


Un script anti-flood pour mon eggdrop - Virgile - 05/08/2008

[J'avais posté un message similaire sur eggdrop-fr.org. Néanmoins leur forum semble... desertique !]

Bonjour,

J'essaie tant bien que mal de coder une fonction d'aide pour le future fonctionnement de mon eggdrop.

Une sécurité anti-flood s'impose donc.

La version de mon egg-drop est la suivante : v1.7

Voilà le code :

TCL
#Variables constantes
 
set request_max 3
set timer_max 10

#Variables
 
set timer_flood 0
set anti_flood 0
set attente_max 60

#Timer
 
utimer 1 "incr timer_flood"

#Binds
 
bind pub - !aide pub:aide
bind msg - aide msg:aide

#Procedures
 
proc pub:aide { nick uhost handle channel arg } {
 
global timer_flood anti_flood attente_max timer_max request_max
 
	if [[[$timer_flood < $timer_max && $anti_flood < $request_max] || [$timer_flood >= $timer_max && $anti_flood <= $request_max]] && $attente_max == 60] {
 
		putquick "NOTICE $nick :Aide...Bla bla"
 
		incr anti_flood
	}
 
	elseif [$attente_max == 0] {
 
		set attente_max 60
 
		putquick "PRIVMSG $channel :La limite de : $request_max pour $timer_max secondes a été atteinte."
		putquick "PRIVMSG $channel :Merci de patienter $attente_max secondes"
 
 
	}
 
	elseif [$attente_max == 60] {
 
	utimer 60 "set attente_max 0 set timer_flood 0 set anti_flood 0"
 
	}
 
}



J'ai une erreur, la suivante :

Citation :Tcl error [pub:aide]: invalid command name "1"

Je détail (Dans le cas où ne serait pas clair) le fonctionnement de mon code.

Je me sert de deux variables, une qui sera associée à un timer, une autre pour "compter" les demandes d'aide.

Dans des variables qui ne seront pas modifiées je stock les limites, ici 3 requêtes maximum pour 10 secondes.

A l'aide d'un timer, j'incrémente une variable tout les secondes.

De même à chaque requête, j'incrémente la variable correspondante.

Si les deux variables sont comprise dans la limite, on affiche l'aide.

Si non, on affiche une erreur, et on initialise le compteur d'un timer.

Une fois la variable du timer initialisée (attente_max), on fait patienter l'user 60 secondes, au bout desquelles toutes la variables seront réinitialisée.

Et on recommence...

Merci de votre aide.


RE: Un script anti-flood pour mon eggdrop - MenzAgitat - 05/08/2008

La syntaxe pour la commande if est la suivante :

TCL
if { condition } {
  lignes de code
}


ou
TCL
if { condition } {
  lignes de code
} else {
  lignes de code
}


ou
TCL
if { condition } {
  lignes de code
} elseif { condition } {
  lignes de code
} else {
  lignes de code
}



Ne confonds pas les [ ] avec les { } et attention au retour à la ligne avant les elseif et else.


RE: Un script anti-flood pour mon eggdrop - Virgile - 06/08/2008

Merci pour la réponse.

J'avance un peu plus, j'ai quelque peu modifié mon code qui n'allait pas, mais j'ai toujours cette même erreur, mais surement plus pour la même raison.

J'édite mon premier message avec le nouveau code.

Hum, je ne peux pas éditer mon premier message avant 60 minutes. Je pose donc mon code dans celui-ci :

TCL
			#Variables constantes
 
set request_max 3
set timer_max 10

#Variables
 
set timer_flood 0
set anti_flood 0
set attente_max 60

#Timer
 
utimer 1 [incr timer_flood]

#Binds
 
bind pub - !aide pub:aide
bind msg - aide msg:aide

#Procedures
 
proc pub:aide { nick uhost handle channel arg } {
 
global timer_flood anti_flood attente_max timer_max request_max
 
	if {[[$timer_flood < $timer_max && $anti_flood < $request_max] || [$timer_flood >= $timer_max && $anti_flood <= $request_max]] && $attente_max == 60} {
 
		putquick "NOTICE $nick :Aide...Bla bla"
 
		incr anti_flood
 
	} elseif {$attente_max == 60} {
 
		set attente_max 0
 
		putquick "PRIVMSG $channel :La limite de : $request_max pour $timer_max secondes a été atteinte."
		putquick "PRIVMSG $channel :Merci de patienter $attente_max secondes"
 
 
	} elseif {$attente_max == 0} {
 
		utimer 60 init_var
 
		proc init_var {
 
			set timer_flood 0 
			set anti_flood 0
			set attente_max 60 
 
		}
 
	}
 
}





RE: Un script anti-flood pour mon eggdrop - MenzAgitat - 06/08/2008

L'utilisation de [ ] force l'évaluation (entendre exécution) du code contenu à l'intérieur.

TCL
if {[[$timer_flood < $timer_max && $anti_flood < $request_max] || [$timer_flood >= $timer_max && $anti_flood <= $request_max]] && $attente_max == 60} {



prenons par exemple ta première condition :
TCL
$timer_flood < $timer_max && $anti_flood < $request_max


vaut 1 si les conditions sont vérifiées et 0 sinon.

Les [ ] qui l'entourent vont exécuter le résultat (donc 1 ou 0)

Donc tu exécutes [1] ou [0] selon le résultat de l'évaluation, et ni 1 ni 0 ne sont une commande valide.

Maintenant que tu comprends le problème, voici la ligne corrigée :
TCL
if {((($timer_flood < $timer_max) && ($anti_flood < $request_max)) || (($timer_flood >= $timer_max) && ($anti_flood <= $request_max))) && ($attente_max == 60)} {



Ici, certaines parenthèses que j'ai mises pourraient être enlevées mais dans un souci de lisibilité et de rapidité d'exécution du code (ça aide l'interpréteur), laissons-les.


RE: Un script anti-flood pour mon eggdrop - Virgile - 06/08/2008

MenzAgitat a écrit :Donc tu exécutes [1] ou [0] selon le résultat de l'évaluation, et ni 1 ni 0 ne sont une commande valide.

D'accord je comprend !

D'où le "invalid command name "1""

Merci beaucoup.

Je viens de tester une ènième fois mon script, et il fonctionne en globalité, il reste quelques petites choses à mettre au point. Merci encore !


RE: Un script anti-flood pour mon eggdrop - DaV34 - 07/08/2008

N'hésites pas à distribuer ton système une fois que tu l'auras finit en globalité, ça pourrait intéresser du monde Smile


RE: Un script anti-flood pour mon eggdrop - Virgile - 08/08/2008

Voilà, j'ai terminé avec ce système anti-flood, je l'ai pour ainsi quasiment refondu, les bugs que j'avais m'ont caché les différentes choses qui faisait que le système précédent ne fonctionnait pas.
Limite qui s'enclenchait quand il ne faut pas, qui ne s'enlevait pas, timer mal foutu, ...

Sur le conseil de DaV34, je le met donc à disposition de toutes personnes souhaitant l'utiliser.

Après quelques tests, il semble fonctionner plutôt bien.

Néanmoins, je ne garantis pas sa stabilité, ni sa rapidité...

En effet, je trouve le code assez lourd pour un script anti-flood. Il est sujet à optimisation.

Ce script est en libre service, faites moi seulement part de vos optimisations/modifications importantes sur ce sujet ou par e-mail, précisé dans le fichier.

Et si vous utilisez ce script, citez juste où vous l'avez trouvé Wink.

(Merci à vous encore une fois !)

antiflood - v0.9


RE: Un script anti-flood pour mon eggdrop - CrazyCat - 08/08/2008

J'ai vite regardé, et je ne ferais qu'une remarque pour l'instant, en rapport avec ta "signature": plutôt que d'utiliser "global", appelle les variables du namespace global.
Par exemple:
TCL
proc init_var {} {
   global timer_flood anti_flood securite
   set timer_flood 0
   set anti_flood 0
   set securite 0
}


peut devenir:
TCL
proc init_var {} {
   set ::timer_flood 0
   set ::anti_flood 0
   set ::securite 0
}


Et les appels des variables se font avec $::variable.


RE: Un script anti-flood pour mon eggdrop - Virgile - 08/08/2008

Et qu'est ce ça change en faite ? C'est plus propre ?

Sinon, as-tu une quelconque remarque sur script ? Des techniques à ne plus utiliser, certaines méthodes pas très propres, possibles optimisations, ... ?


RE: Un script anti-flood pour mon eggdrop - Merwin - 08/08/2008

Ca ne changes rien du tout Virgile, c'est un tout petit peu plus rapide en temps d'éxécution, global effectue en fait une copie de la variable globale dans la procédure, alors qu'en spécifiant avec :: tu fais directement référence à la variable globale, sans passer par une copie.

Disons que c'est une question de choix, tout simplement Wink


RE: Un script anti-flood pour mon eggdrop - Virgile - 08/08/2008

Bien, je comprend.

Mais je dois quand même continuer à utiliser global dans certains cas ou dorénavant utiliser :: en permanence ?


RE: Un script anti-flood pour mon eggdrop - Merwin - 08/08/2008

C'est purement une question de choix, d'esthétique, à toi de voir ce que tu préfères, je serais d'avis que tu continus à utiliser global, parceque la tu vas utiliser quelquechose dont tu ne comprends pas le sens, les namespace.


RE: Un script anti-flood pour mon eggdrop - Virgile - 08/08/2008

D'accord, merci.

J'irais me documenter sur les namespace, c'est toujours ça de pris.


RE: Un script anti-flood pour mon eggdrop - Merwin - 08/08/2008

Note: T'as fais n'importe quoi dans ton script, tu déclare la procédure init_var dans une condition, quel intéret? Tu dois la déclarer avant et l'appeller dans ta condition plutot non?


RE: Un script anti-flood pour mon eggdrop - Virgile - 08/08/2008

Oui effectivement, c'est important ?

Je ne sais pas, du moment qu'elle est appellée et executée =/ .