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


TCL problème avec une variable
#1
Bonjour,


je poste ici le tcl pour mieux expliquer le probleme :


tcl
############################# Robot pour verifer les connexions (non fini) #####################
 
set active 0
 
bind raw - "NOTICE" myproc
bind msg - "MD5" exemple3:repond3
 
proc myproc { from keyword arg } {
if { ([string match "*connecting on port*" $arg]) } {
 
set nnickname [lindex $arg 9]
 
##Detection du message que le robot recoit en pv
##/PRIVMSG eggdrop :MD5 <le_code_md5_généré_par_un_applet>
proc exemple3:repond3 {nick uhost handle arg} {
 
##xxxxx c'est le mot de passe
set Pass "xxxxx"
 
## le md5  avec le nick et le Pass et le $arg dernier mot aprés message "MD5 <xxxxxxxxxxxxxxxxxxx>"
if { [md5 $nick$Pass] == $arg } {
putserv "PRIVMSG #connect :Verification OK pour $nick - hash [md5 $nick$Pass]"
 
##le set ne veut pas changer la variable je comprend pas - GROS PROBLEME sinon la personne risque le gline meme si le md5 est bon
set active 1
##changement de variable obligatoire pour pas que le if en bas ne s'execute
}
}
 
##Si le if ci-dessus change la valeur de la variable 'active' il execute pas le script ci-dessous
if { $active == 0 } {
putserv "PRIVMSG #connect :commande gline + commande privmsg pour connexion non autorisé."
}
 
}
}
 
 
 
############################# ####################### #####################



la detection de la notice est obligatoire : "*connecting on port*" car il y a 2 styles de clients sur le serveur irc:

1) Les gens de l'applet ils ont une variable MD5 (géneré par php) donc dés que l'applet est connecté il fait direct un /PRIVMSG eggdrop :MD5 <code_généré_par_php> et il verifie si c'est le meme code dans [md5 $nick$Pass] == $arg donc le md5 géneré par php c'est aussi le meme code avec md5("$pseudo$Pass");

2) les clients mirc/xchat/etc... donc ils envoient pas de pv et donc le seul truc qu'il faut faire c'est de détecté une Non-réception de pv pour que le message retourne "Non accepté" car il est pas sous l'applet.


le truc qui marche pas dans ce tcl c'est le changement de valeur dans "set active 1" , est-ce que quelqu'un sait comment faudrait faire ?


tcl
##le set ne veut pas changer la variable je comprend pas
##GROS PROBLEME sinon la personne risque le gline meme si le md5 est bon
set active 1
##changement de variable obligatoire pour pas que le if en bas ne s'execute


Script fait a la débutant donc j'espere que le code est assez correct.


Merci d'avance,
bonne journée.
#2

tcl
set active "1"


Essai ça, même si je suis sur de rien (lol)
#3
salut,

lorsque tu set ta variable active au début du tcl, tu crées une variable globale. Par contre lorsqu'une variable est créée dans une procédure elle est dite locale. Ces 2 variables, même si elles portent le même nom, ne sont donc pas liées. Il faut donc appeler ta variable globale dans la procédure.
Pour cela, 2 manières:

tcl
#à placer au début de la proc
global active


ou:

tcl
#ici on indique à tcl ou chercher la variable (les :: indique que c est une variable globale)
set ::active 1


sinon pour le code, tu crées 2 procédures l'une dans l autre, je doutes que se soit ce que tu voulais faire, essais comme ça:

tcl
############################# Robot pour verifer les connexions (non fini) #####################
 
set active 0
 
bind raw - "NOTICE" myproc
bind msg - "MD5" exemple3:repond3
 
proc myproc { from keyword arg } {
  global active
  if {[string match "*connecting on port*" $arg]} {
    set nnickname [lindex $arg 9]
    ##Si le if ci-dessus change la valeur de la variable 'active' il execute pas le script ci-dessous
    #ici $active étant un bolean (1 ou 0) on  est pas obligé de mettre ==0 il sufi de mettre un ! devant et pour ==1 ne rien mettre
    if {!$active} {
      putserv "PRIVMSG #connect :commande gline + commande privmsg pour connexion non autorisé."
    }
  }
}
 
##Detection du message que le robot recoit en pv
##/PRIVMSG eggdrop :MD5 <le_code_md5_généré_par_un_applet>
proc exemple3:repond3 {nick uhost handle arg} {
  global active
  ##xxxxx c'est le mot de passe
  set Pass "xxxxx"
 
  ## le md5  avec le nick et le Pass et le $arg dernier mot aprés message "MD5 <xxxxxxxxxxxxxxxxxxx>"
  if {[md5 $nick$Pass]==$arg} {
    putserv "PRIVMSG #connect :Verification OK pour $nick - hash [md5 $nick$Pass]"
 
    ##le set ne veut pas changer la variable je comprend pas - GROS PROBLEME sinon la personne risque le gline meme si le md5 est bon
    #ici on a mis global au début de la proc donc pas besoin de mettre les :: devant active
    set active 1
    ##changement de variable obligatoire pour pas que le if en bas ne s'execute
  }
}

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#4
Salut DjKenny, Merci pour le code, par contre le "connecting on port" il arrive bien avant le PRIVMSG et donc le bind raw - "NOTICE" myproc il sert a rien et il faudrait le remplacer par un autre bind mais je ne sais pas lequel.

Avec l'applet j'envoi ceci :

::Connexion Server
::NICK <Pseudodumec>
::USER <username> host 127.0.0.1 :<realname>
>Connexion établie sur le serveur irc
::PRIVMSG Eggdrop :MD5 <MD5_généré_par_php>

Donc l'eggdrop lui, il peut pas verifier le message privé car la notice serveur elle arrive aussitot que la connexion est faite:
>Connexion établie sur le serveur irc

ensuite il y a la reception du pv.



moi je croyais qu'il etait possible de faire la connexion au serveur, mettre en attente le pseudo pour voir si le pseudo arriverais en pv en lui mettant le md5 , c'est un probleme d'ordre il faudrait que le pv arrive bien avant la notice serveur et là le script il marcherait surement.




tcl
##Detection du message que le robot recoit en pv
##/PRIVMSG eggdrop :MD5 <le_code_md5_généré_par_un_applet>
proc exemple3:repond3 {nick uhost handle arg} {
  global active
  ##xxxxx c'est le mot de passe
  set Pass "xxxxx"
 
  ## le md5  avec le nick et le Pass et le $arg dernier mot aprés message "MD5 <xxxxxxxxxxxxxxxxxxx>"
  if {[md5 $nick$Pass]==$arg} {
    putserv "PRIVMSG #connect :Verification OK pour $nick - hash [md5 $nick$Pass]"
 
    #ici on a mis global au début de la proc donc pas besoin de mettre les :: devant active
    set active 1
  } else {
     putserv "PRIVMSG #connect :Faux code $nick - Gline"
}
 
}


J'aurais donc une question a poser tout en gardant le proc ci-dessus sans le SNotice:

-Est-ce que c'est possible de détecter une personne qui viens PAS dans le pv du robot aprés 1 ou 2 seconde maximum ? le privmsg a la connexion de l'applet il est surement immédiat et la reception du pv elle met peut etre moins de 1 seconde, est-ce que c'est possible de détecté une non-réception d'un pv ?



il faudrait comme un "else" aprés le proc exemple3:repond3 en mettant un message que le pv n'a pas été reçu et que donc le gline est autorisé.


J'arriverais jamais a monter un tel truc a moi tout seul et merci de m'avoir aidé jusqu'a présent.



=================

Sinon juste avant que tu me passe ce code, en attendant d'avoir une réponse j'avais fais un autre systeme mais avec mysql

la technique c'etait de verifier l'ident de chaque connexion, la personne se connecte et l'ident ne se trouve pas dans la bdd et donc le truc il marchait "PRIVMSG #test :$nnickname N'a pas été trouvé dans la bdd et donc gline ! " ou alors l'ident a été trouvé (car l'applet il enregistre l'ident dans mysql avant la connexion)


Mais je crois que la technique du pv (reception ou non) je crois que c'est mieux car en effet avec mysql il est tellement lent que la verification se fait plus de 60 secondes aprés.

donc l'idée du mysql pas si top.
#5
avec un timer ou utimer
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#6
j'ai testé avec un utimer, mais en faite non je comprend pas comment ça marche, il faut le placer ou ce utimer?


un script tcl il lit dans l'ordre comme un script php ? a chaque fois qu'il recoit une notice il repart en haut du tcl et il lit? ou les proc sont en lecture jusqu'a tant que l'eggdrop quitte (die) ?
#7
non tcl n'as rien a voir avec php, il charge les proc en mémoire et les lit lorsqu'elles sont appelées, soit par un bind soit en direct.
pour ton code en réalité je suis pas vraiment sur que se soit faisable, ou alors assez compliqué. pourquoi ne pas tout simplement mettre un mot de passe sur ton serveur?
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away


Possibly Related Threads…
Thread Author Replies Views Last Post
  probleme avec le script Pooshy.tcl LTEF 18 331 22/06/2022, 12:49
Last Post: CrazyCat
  Problème avec Les poupées linkeuses zappeur78 22 5,465 31/03/2022, 16:52
Last Post: CrazyCat
  [Résolu] Problème avec le script autolog T3nS 2 3,221 06/12/2017, 16:08
Last Post: T3nS
  [Bug] Problème avec le script zurl.tcl T3nS 0 3,059 03/08/2017, 19:40
Last Post: T3nS
  [Résolu] Problème d'accents avec script TCL maison CC30 3 4,703 25/08/2016, 13:55
Last Post: Alucard`68
  [Résolu] Problème d'encodage avec rss-synd Naruto 24 13,577 18/05/2014, 21:16
Last Post: CrazyCat
  Problème avec Clams SaiTek 7 5,850 06/09/2013, 09:02
Last Post: SaiTek
  Problème d'accent avec shoutcast.tcl Naruto 8 6,703 05/08/2013, 15:17
Last Post: Naruto
  Probleme namespace, variable, proc ZarTek 3 4,332 03/08/2013, 21:10
Last Post: CrazyCat
  [Résolu] [Aide]Problème avec un tcl Naruto 6 5,897 17/07/2013, 20:56
Last Post: CrazyCat

Forum Jump:


Users browsing this thread: 1 Guest(s)