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
#1
[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 :

Quote: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.
—( ^^ )—

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 !
#2
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.
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.
#3
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 
 
		}
 
	}
 
}

—( ^^ )—

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 !
#4
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.
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.
#5
MenzAgitat Wrote: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 !
—( ^^ )—

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 !
#6
N'hésites pas à distribuer ton système une fois que tu l'auras finit en globalité, ça pourrait intéresser du monde :)
#7
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é ;).

(Merci à vous encore une fois !)

antiflood - v0.9
—( ^^ )—

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 !
#8
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.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#9
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, ... ?
—( ^^ )—

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 !
#10
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
#11
Bien, je comprend.

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

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 !
#12
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.
#13
D'accord, merci.

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

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 !
#14
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?
#15
Oui effectivement, c'est important ?

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

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 !


Possibly Related Threads…
Thread Author Replies Views Last Post
  Plainte avec contrôle anti flood Amand 0 162 02/09/2022, 18:34
Last Post: Amand
  Modifier le script du trivia pour défiler les questions dans l'ordre Mimisth 2 3,524 05/12/2015, 19:45
Last Post: MisterS
  [Demande] Demande tcl pour faire parler eggdrop Yakka 9 8,508 26/09/2014, 14:10
Last Post: CrazyCat
  aide pour un script svp s2drk 3 5,055 11/08/2014, 23:23
Last Post: CrazyCat
  aide pour le script Nostromo1st 13 8,221 16/09/2013, 16:24
Last Post: Nostromo1st
  Script pour afficher la date à une heure donnée (ephemeride) conscience 13 9,389 04/06/2013, 21:29
Last Post: aliasangelius
  Mon script provoque un Excess Flood tow 6 4,679 04/03/2013, 22:59
Last Post: aliasangelius
  Anti-Flood TCL tow 1 4,195 09/12/2012, 11:00
Last Post: CrazyCat
  Aide pour faire un script TCL Ahriman 6 6,332 01/07/2012, 00:13
Last Post: Ahriman
  anti flood notice lesny 10 6,045 29/10/2011, 21:43
Last Post: lesny

Forum Jump:


Users browsing this thread: 1 Guest(s)