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)
    }
}
Répondre Avertir
#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 ?
Répondre
#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 a écrit : 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 a écrit : 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 a écrit : 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.
Répondre Avertir
#4
Bonjour,

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

CrazyCat:

Citation :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:
Citation :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.

mcdeffice:

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...
Répondre Avertir
#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
Répondre Avertir
#6
re,

mcdeffice:

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,

mcdeffice:

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...
Répondre Avertir
#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
Répondre Avertir
#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
Répondre Avertir
#9
Bon, arrêtez de ramer, je vous aide:
(12/09/2013, 18:23)mcdeffice a écrit :
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 Smile
Répondre
#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:
Citation :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.
Répondre Avertir
#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.
Répondre
#12
bonjour CrazyCat,
Alors dans mon script pourrai tu me montrer a quoi ressemblerai le putlog stp?
Merci Smile

Nos...
Répondre Avertir
#13
Non.
Pas par méchanceté, mais parce qu'au bout d'un moment, il faut chercher un peu par soi-même.
Répondre
#14
Bonjour,
Oui effectivement je comprends Smile t’inquiète pas je ne t'en veux pas Wink Je vais regarder ca Very Happy

Nos
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté