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


aide pour le script
#1
Bonjour,
j'ai un soucis avec ce script. quand le bot détecte les informations a mettre dans la base de donné, si "age" et "an" ne sont pas vide il doit passer et refermer la connexion, dans le cas ou c'est vide je souhaite faire un update pour entrer les données et annoncer sur un canal l'info. mais si l'info arrive plusieurs fois de plusieurs bot différent c'est autant de fois répéter, moi je souhaiterai qu'il soit répéter qu'une fois et comme par la suite ce n'est plus vide qu'il ne fasse rien d'autre.

Merci pou votre aide,

Nos...



Code:
proc addinfo { nick uhost handle chan text } {
    global infochan echochan
    package require mysqltcl
    set mysql(HANDLE) [mysqlconnect -host $::mysql(HOSTNAME) -user $::mysql(USERNAME) -password $::mysql(PASSWORD) -port $::mysql(PORT) -db $::mysql(DB)]
    if {$chan != $infochan} { return }
    set args [split $text " "]
    set name [lindex $args 0]
    set age [lindex $args 1]
    set an [lindex $args 2]
    if { $age == "" || $an == "" } { return }
    set sql [mysqlsel $mysql(HANDLE) "SELECT `age`, `an` FROM dbase WHERE `name` = '$name'" -flatlist]
    if { $sql == "" } {
    mysqlclose $mysql(HANDLE);
    return 0;
    } else {
    set sql2 [mysqlexec $mysql(HANDLE) "UPDATE dbase SET `age` = '$age', `an` = '$an' WHERE `name` = '$name'"]
    foreach { chan } [split $echochan " "] {
    putquick "PRIVMSG $chan :\[\!iNFO\]\:: $name \:: \[$age\] \[$an\] \[By $nick\] \[1s\]"
    }
    mysqlclose $mysql(HANDLE)
    }
}
#2
OMG, quelle horreur.

On va se limiter à coeur du problème:

tcl
set sql [mysqlsel $mysql(HANDLE) "SELECT `age`, `an` FROM dbase WHERE `name` = '$name'" -flatlist]

donc $sql est une liste

tcl
if { $sql == "" } {

Pourquoi pas plutôt [llength $sql]?

Ensuite, je ne vois pas l'intérêt de ton script: si l'enregistrement n'existe pas, tu ne fais rien mais s'il existe tu le mets à jour ? Donc il n'est jamais créé par le script ?
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#3
Un petit cou de débroussailleuse :

Code:
proc addinfo { nick uhost handle chan text } {
    package require mysqltcl

    # Creation d'un socket MySQL.
    set mysql(HANDLE)    [mysqlconnect -host $::mysql(HOSTNAME) -user $::mysql(USERNAME) -password $::mysql(PASSWORD) -port $::mysql(PORT) -db $::mysql(DB)];

    # Prise des données depuis la base.
    set SQL_SEL    [mysqlsel $mysql(HANDLE) "SELECT `age`, `an` FROM `dbase` WHERE `name` = '$name'" -flatlist];

    # Verification du salon.
    #      //      que 'name', 'age', et 'an' soit present dans 'text'
    #      //      que SQL_SEL retourne aucune valeur pour 'age' et 'an'
    if { $chan == $::infochan \
        && [llength $text] == 3 \
        && [llength $SQL_SEL] != 2 } {
        
        set name    [lindex $args 0];
        set age        [lindex $args 1];
        set an        [lindex $args 2];
        
        # Mise à jour en base de donnée.
        mysqlexec $mysql(HANDLE) "UPDATE `dbase` SET `age` = '$age', `an` = '$an' WHERE `name` = '$name'";
        
        # Annonce sur les salons contenu dans la liste 'echochan'
        foreach { chan } [split $::echochan " "] {
            putquick "PRIVMSG $chan :\[\!iNFO\]\:: $name \:: \[$age\] \[$an\] \[By $nick\] \[1s\]";
        }
    }
    
    # Fermeture di socket MySQL.
    mysqlclose $mysql(HANDLE);
}
(11/09/2013, 18:44)Nostromo1st Wrote: quand le bot détecte les informations a mettre dans la base de donné, si "age" et "an" ne sont pas vide il doit passer et refermer la connexion,
Je pense que c'est résolu, connexion ce ferme.
(11/09/2013, 18:44)Nostromo1st Wrote: dans le cas ou c'est vide je souhaite faire un update pour entrer les données et annoncer sur un canal l'info.
Je pense que c'est résolu aussi.

(11/09/2013, 18:44)Nostromo1st Wrote: mais si l'info arrive plusieurs fois de plusieurs bot différent c'est autant de fois répéter, moi je souhaiterai qu'il soit répéter qu'une fois et comme par la suite ce n'est plus vide qu'il ne fasse rien d'autre.
Pas sur d'avoir tout compris. Si c'est exécuté sur plusieurs robots(?). Il me semble que le premier va mettre a jour la base de données et l'afficher sur les salons.

Est ce que sa révolutionne le soucis?

PS: Le code je n'ai pas tester.
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
#4
Bonjour,

alors tout d'abord merci pour vos réponses:

CrazyCat:

Quote:OMG, quelle horreur.

Désolé, mais comme je te l'ai dis je suis un débutant en tcl et j'essaie de faire du mieux que je peux :/...

Sinon tu me demande:
Quote:Pourquoi pas plutôt [llength $sql]?

cela ne change pas mon problème : la base de donnée se met bien à jour mais mon problème c'est l'annonce qui se fait autant de fois qu'on envoie l'information sur le canal $infochan. Moi je souhaiterai qu'il n’annonce qu'une seule fois lors de la mise à jour ensuite il ne doit plus annoncer.

ZarTek:

Le code est magnifique comme cela, mais, comme je l'explique plus haut, si 10 utilisateurs ou robots mettent la même info en même temps, alors il y a 10 annonces identiques sur le canal $echochan, ce qui me fais me dire que je mets à jour à chaque fois la base de donnée aussi...

En gros voici le code comme je l'imagine (je mets les commentaires):

Code:
proc addinfo { nick uhost handle chan text } {
    global infochan echochan
    package require mysqltcl
    
# Creation d'un socket MySQL.    
    set mysql(HANDLE) [mysqlconnect -host $::mysql(HOSTNAME) -user $::mysql(USERNAME) -password $::mysql(PASSWORD) -port $::mysql(PORT) -db $::mysql(DB)];
    
# Verification du salon (si ce n'est pas le bon salon on passe à autre chose).
# Verification que 'name', 'age', et 'an' soit present dans 'text' sinon on passe à autre chose.
    if {$chan != $infochan && [llength $text] != 3} { return }
    set args [split $text " "]
    set name [lindex $args 0];
    set age [lindex $args 1];
    set an  [lindex $args 2];
    
# Prise des données depuis la base.    
    set SQL_SEL [mysqlsel $mysql(HANDLE) "SELECT `age`, `an` FROM dbase WHERE `name` = '$name'" -flatlist];
    
# Verification que SQL_SEL retourne une valeur pour 'age' et 'an'    
    if { [llength $SQL_SEL] == 2 } {
    
# Si SQL_SEL retourne une valeur pour 'age' et 'an', on ne continue pas on arrete là et on ferme le socket MySQL.
    mysqlclose $mysql(HANDLE);
    return 0;
    }

# Sinon mise à jour de la base de donnée.
    mysqlexec $mysql(HANDLE) "UPDATE releases SET `age` = '$age', `an` = '$an' WHERE `name` = '$name'";
    
# # Annonce sur les salons contenu dans la liste 'echochan'
    foreach { chan } [split $echochan " "] {
    putquick "PRIVMSG $chan :\[\!iNFO\]\:: $name \:: \[$age\] \[$an\] \[By $nick\] \[1s\]";
    }
    }
    
# Fermeture du socket MySQL.    
    mysqlclose $mysql(HANDLE);
}
Voila je ne sais pas si je pense bien mais en tout cas la base de donnée se rempli bien, mais l'annonce sur $echochan ne s’arrête pas à une seule annonce si plusieurs envoie la même information. Donc comment je peux faire pour que la mise à jour de la base de donnée et l’annonce ne se fait qu'une seule fois pour la même information ?

A bientôt Nos...
#5
Bonjour,

As-tu essayer mon code ?

Parce que d’après comment tu image la chose, mon code le fais.

Reste à savoir si il annonce plusieurs fois sur echochan
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
#6
re,

ZarTek:

oui oui j'ai testé ton code mais en partyline mon eggdrop me répond:
Tcl error [addinfo]: can't read "name": no such variable
Je pense que le SQL_SEL doit se faire après le "set name"
je teste ça.

Nos...

re,

ZarTek:

Bon alors j'ai testé ton code je n'est plus d'erreur mais plus de remplissage de la base de donnée qui reste vide et cela n'anonce plus non plus. Une idée ?

Nos...
#7

Code:
proc addinfo { nick uhost handle chan text } {
    package require mysqltcl

    set name    [lindex $args 0];
    set age     [lindex $args 1];
    set an      [lindex $args 2];

    # Creation d'un socket MySQL.
    set mysql(HANDLE)    [mysqlconnect -host $::mysql(HOSTNAME) -user $::mysql(USERNAME) -password $::mysql(PASSWORD) -port $::mysql(PORT) -db $::mysql(DB)];

    # Prise des données depuis la base.
    set SQL_SEL    [mysqlsel $mysql(HANDLE) "SELECT `age`, `an` FROM `dbase` WHERE `name` = '$name'" -flatlist];

    # Verification du salon.
    #      //      que 'name', 'age', et 'an' soit present dans 'text'
    #      //      que SQL_SEL retourne aucune valeur pour 'age' ou pour 'an'
    if { $chan == $::infochan \
        && [llength $text] == 3 \
        && ( [lindex $SQL_SEL 0] == "" || [lindex $SQL_SEL 1] == "" ) } {
        
        # Mise à jour en base de donnée.
        mysqlexec $mysql(HANDLE) "UPDATE `dbase` SET `age` = '$age', `an` = '$an' WHERE `name` = '$name'";
        
        # Annonce sur les salons contenu dans la liste 'echochan'
        foreach { chan } [split $::echochan " "] {
            putquick "PRIVMSG $chan :\[\!iNFO\]\:: $name \:: \[$age\] \[$an\] \[By $nick\] \[1s\]";
        }
    }
    
    # Fermeture di socket MySQL.
    mysqlclose $mysql(HANDLE);
}
A priori le soucis, serais le faite que [llength $SQL_SEL] compté toujours 2 longueurs même si elle s'etais "NULL" du coup changer en

Code:
&& ( [lindex $SQL_SEL 0] == "" || [lindex $SQL_SEL 1] == ""
J'ai profiter pour corriger l'erreur du $name
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
#8
re,

Désolé mais non cela fait pareil que tout à l'heure, il ne se passe rien et dans mysql les cases "age" et "an" reste désespérément vide :/...

une autre idée peut être?

Nos
#9
Bon, arrêtez de ramer, je vous aide:
(12/09/2013, 18:23)ZarTek Wrote:
tcl
proc addinfo { nick uhost handle chan text } {
    package require mysqltcl
 
	set name	[lindex $args 0];
	set age     [lindex $args 1];
	set an      [lindex $args 2];

imho, $name, $age et $an seront toujours vide vu que tu utilises $args pour les remplir alors que la procédure parle de $text.

C'est ballot, un petit putlog de la requête l'aurait montré de suite. Comme quoi faut pas nettoyer son code trop vite :)
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#10
Bonjour,

merci encore pour vos réponses, et oui effectivement dans le code il faut changer:

tcl
proc addinfo { nick uhost handle chan text } {

par:

tcl
proc addinfo { nick uhost handle chan args } {

ou alors rajouter avant:

tcl
set name    [lindex $args 0];
set age     [lindex $args 1];
set an      [lindex $args 2];

ceci:

tcl
set args [split $text " "]

et changer aussi

tcl
&& [llength $text] == 3 \

par:

tcl
&& [llength $args] == 3 \


les 2 fonctionnent... Par contre a des moment le eggdrop doit perdre les pédales car il se remet a annoncer plusieurs fois la même chose mais ce n'est que de temps en temps.

Peut etre peut on régler cela par un regex ou quelque chose du genre pour etre sur q'une fois l'info enregistrer il n'enregistre plus rien du coup il n'annoncera lus rien d'autre également.

si vous avez des idées n’hésitez pas...

Nos...

PS: CrayzyCat:
Quote:C'est ballot, un petit putlog de la requête l'aurait montré de suite. Comme quoi faut pas nettoyer son code trop vite
Tu pourrais m'en dire plus ou me redirigé sur un post qui en parle merci d'avance.
#11
Il n'y a pas de post particulier où je le dis, je le dis à peu près chaque fois qu'on dit "il y a une erreur dans mes données, je ne vois pas pourquoi".

Moi, dès que j'ai un souci, je mets des putlog pour voir où je passe dans le script, avec quelles données.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#12
bonjour CrazyCat,
Alors dans mon script pourrai tu me montrer a quoi ressemblerai le putlog stp?
Merci :)

Nos...
#13
Non.
Pas par méchanceté, mais parce qu'au bout d'un moment, il faut chercher un peu par soi-même.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#14
Bonjour,
Oui effectivement je comprends :) t’inquiète pas je ne t'en veux pas ;) Je vais regarder ca :D

Nos


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Demande] besoin d'aide pour finaliser berni13 6 1,660 18/11/2020, 00:18
Last Post: berni13
Big Grin demande d'aide pour codage KeeViiNou 4 4,672 04/07/2016, 07:55
Last Post: CrazyCat
  Modifier le script du trivia pour défiler les questions dans l'ordre Mimisth 2 3,549 05/12/2015, 19:45
Last Post: MisterS
  aide pour un script svp s2drk 3 5,086 11/08/2014, 23:23
Last Post: CrazyCat
  [Demande] Besoin d'aide pour youtubeURL.tcl hades_48 4 5,173 01/07/2014, 15:41
Last Post: hades_48
  [Résolu] aide script assign bouba89 3 5,640 11/11/2013, 16:00
Last Post: bouba89
  [Demande] aide pour une modification pour whois loulou7593 21 13,461 29/10/2013, 13:35
Last Post: loulou7593
  [aide] comment rajouter des hosts et des salons en plus pour sajoin Naruto 11 7,788 17/07/2013, 22:51
Last Post: aliasangelius
  Script pour afficher la date à une heure donnée (ephemeride) conscience 13 9,436 04/06/2013, 21:29
Last Post: aliasangelius
  [Aide] Script de "réponse" Prototype 3 5,165 01/05/2013, 23:31
Last Post: Prototype

Forum Jump:


Users browsing this thread: 1 Guest(s)