probleme avec mon script
#1
Bonjour,

Je reviens vers vous, car apparemment je n'ai pas tout compris.
Donc je souhaiterai que l'on m'explique ou ça ne va pas et surtout pourquoi ce que je fais ne tourne pas.

explication de ce que j'essaye de faire:

- commande pour rechercher dans ma base de donnée des articles sous la forme --> !search <articles> (ca marche enfin Smile )
- envoyer au bot qui sont relier entre eux sur le BotNet l'affichage de ce qui a été trouvé (sur un autre network et sur un autre canal), la commande qui a été tapé pour avoir ce résultat.

voici mon code:
Code :
# CONFIGURATION MySQL:
set ::MySQL(HOSTNAME)        "localhost"
set ::MySQL(USERNAME)        "xxxxxx"
set ::MySQL(PASSWORD)        "xxxxxxxxxx"
set ::MySQL(DATABASE)        "db"
set ::MySQL(PORT)            "3306"

# CONFIGURATION canal et bots:
set chan1 "test1"
set chan2 "test2"
set bots "Excalibur Legolas"

# CONFIGURATION commande:
bind pub - !search search
package require mysqltcl;
proc search { nick uhost hand chan arg } {
    if {[catch {set ::MySQL(Handle) [mysqlconnect -host $::MySQL(HOSTNAME) -user $::MySQL(USERNAME) -password $::MySQL(PASSWORD) -port $::MySQL(PORT) -db $::MySQL(DATABASE)]} errorMsg] } {
        putserv "PRIVMSG $chan2 :$errorMsg";
    mysqlclose $::MySQL(Handle);
    return 0;
}
    set args [string map [list "*" "%" " " "%"] $arg];
    set articles [mysqlsel $::MySQL(Handle) "SELECT `reference`, `articles` FROM `db` WHERE `articles` LIKE '%$args%' ORDER BY `articles` DESC LIMIT 5" -flatlist]
    if {$articles == ""} {
        putquick "PRIVMSG $chan2 :Aucun résultat."
    } elseif {$articles != ""} {
    foreach {reference articles} $articles {
        putquick "PRIVMSG $chan2 :${reference} ${articles}"
    }
    }
    mysqlclose $::MySQL(Handle);
    }

    # CONFIGURATION pour le botnet:
bind bot - ::search bot:search
proc bot:search { from_bot cmd text } {
    global chan1 chan2
    set args [split $text " "]
    set reference [lindex $args 0]
    set articles [lindex $args 1]
        foreach { chan } [split $chan2 " "] {
    putquick "PRIVMSG $chan2 :${reference} ${article}"
}
}

si vous le souhaitez je peux 'pour chaque ligne' vous dire pourquoi je le fait comme ca (enfin ce que j'ai dans la tête au moment ou je l'écris comme ca Smile)...

Merci d'avance,

Nos...

Ps: ces codes sont tiré de plusieurs codes TCL trouver sur le net, et écrite en fonction des divers doc que j'ai lu sur le net, etc....
Répondre Avertir
#2
Je ne vais pas te donner la solution immédiatement, mais te poser des questions qui t'aideront peut-être à trouver les erreurs de conception.

TCL
set args [string map [list "*" "%" " " "%"] $arg];


Donc, tu remplaces les "*" et " " par "%", ok, mais quid des "." et des "-" ?

TCL
bind bot - ::search bot:search


Bien bien, mais où se trouve la ligne qui dit qu'il faut envoyer sur le botnet (ou à un bot particulier) une commande ::search ?

A quoi sert la variable bots ?

A quoi sert la ligne suivante alors que $chan2 est juste le nom du canal ?
TCL
foreach { chan } [split $chan2 " "]


Répondre
#3
alors j'ai mis cette ligne
TCL
set args [string map [list "*" "%" " " "%"] $arg];


pour palier a mon problème de recherche:

quand je tapai --> !search boulon m10
le résultat était --> aucun résultats.
alors que si je tapai --> !search %boulon%m10%
le résultat est qu'il me trouvait toute ma liste de boulon M10

pour moi (et c'est peut etre la que j'ai pas compris tout a fait les binds)
TCL
bind bot - ::search bot:search


signifie :
bind bot : qui doit réagir et a quelle commande
::search : la commande !search que j'ai décrite dans mon code
bot:search : le nom de ma procédure

la variable "bots" sert à donner les nom des bots qui sont sur le botnet, donc bind bot : le bot qui recois la commande ::search lance la proc bot:search

dans ce cas pour moi la commande qui demande d'envoyé la commande ::search au autre bots du botnet est :
TCL
proc bot:search { from_bot cmd text }


ou from_bot devrait être le bot qui envoie la commande.

pour ce qui est de:
TCL
foreach { chan } [split $chan2 " "]


en fait je souhaiterai que tout ce qui est tapé comme commande !search soit envoyer sur $chan2

voila ce que j'ai compris en lisant mon code et a mon avis c'est la que je dois pas bien comprendre la portée Smile et c'est pour cela que ca ne fonctionne pas :S

Re a tous,

Après une réflexion, je me dis que peut être je cherche à compliquer et que je pourrai certainement l'ecrire comme ca:

TCL
	# CONFIGURATION pour le botnet:
 bind bot - ::search bot:search
 proc bot:search { bot cmd text } {
	global search  bot chan1 chan2
	set args [split $text " "]
	set reference [lindex $args 0]
	set articles [lindex $args 1]
	putquick "PRIVMSG $chan2 :${reference} ${article}"
}


enfin un quelque chose du genre....

Nos...
Répondre Avertir
#4
Bon, alors un indice supplémentaire, parce qu'il te manque un truc assez énorme.
le bind bot réagit à un message envoyé par un bot sur le botnet. Donc, un de tes eggdrops doit faire un putbot ou un putallbots. Ces deux commandes sont expliquées sur le wiki.
Répondre
#5
merci pour l'indice mais j'étais déjà dessus car je relisais le wiki justement, et dans le même temps je venais de comprendre ce que tu me disais quand il manquait un truc énorme Smile ben oui je ne l'avais pas vu avant désolé mais bon j'ai rectifier du coup et j'ai rajouté à ma proc search le putbot qu'il manquait ce qui donne:
TCL
# CONFIGURATION MySQL:
 set ::MySQL(HOSTNAME)		"localhost"
 set ::MySQL(USERNAME)		"xxxxxx"
 set ::MySQL(PASSWORD)		"xxxxxxxxxx"
 set ::MySQL(DATABASE)		"db"
 set ::MySQL(PORT)			"3306"
 
 # CONFIGURATION canal et bots:
 set chan1 "test1"
 set chan2 "test2"
 set bots "Excalibur"
 
 # CONFIGURATION commande:
 bind pub - !search search
 package require mysqltcl;
 proc search { nick uhost hand chan arg } {
	if {[catch {set ::MySQL(Handle) [mysqlconnect -host $::MySQL(HOSTNAME) -user $::MySQL(USERNAME) -password $::MySQL(PASSWORD) -port $::MySQL(PORT) -db $::MySQL(DATABASE)]} errorMsg] } {
 		putserv "PRIVMSG $chan2 :$errorMsg";
 	mysqlclose $::MySQL(Handle);
 	return 0;
}
	set args [string map [list "*" "%" " " "%"] $arg];
    set articles [mysqlsel $::MySQL(Handle) "SELECT `reference`, `articles` FROM `db` WHERE `articles` LIKE '%$args%' ORDER BY `articles` DESC LIMIT 5" -flatlist]
	if {$articles == ""} {
		putquick "PRIVMSG $chan2 :Aucun résultat."
	} elseif {$articles != ""} {
	foreach {reference articles} $articles {
		putquick "PRIVMSG $chan2 :${reference} ${articles}"
	} 
	foreach { bot } [split $::bots " "] {
	putbot $bot "::search ${reference} ${articles}"
	}
	}
	mysqlclose $::MySQL(Handle);
	}

 # CONFIGURATION pour le botnet:
 bind bot - ::search bot:search
 proc bot:search { from_bot cmd text } {
	global chan1 chan2
	set args [split $text " "]
	set reference [lindex $args 0]
	set articles [lindex $args 1]
	foreach { chan } [split $chan2 " "] {
	putquick "PRIVMSG $chan2 :${reference} ${article}"
	}
}



Voila ca l'air de fonctionner mais je pense que je peux écrire ce code mieux que ca en mettant des foreach dans ma proc et va sera plus joli en plus Smile bref je ne sais pas trop...
Par contre je ne peux pas utiliser le même script partager sur les 2 bot je suis obliger de faire un script par bot avec le nom de l'autre bot sur le BotNet et vice et versa.... Oulla je sais pas si je suis clair la Smile
Bref je vais tester comme ca voir ce que ca donne... Et surtout lire bien ce wiki...

Nos...
Répondre Avertir
#6
Bonjour,

Alors j'ai quelque peu réécris mon script en essayant d'utiliser une "fonction" global, ce qui donne :

TCL
# CONFIGURATION MySQL:
 set ::MySQL(HOSTNAME)		"localhost"
 set ::MySQL(USERNAME)		"xxxxxx"
 set ::MySQL(PASSWORD)		"xxxxxxxxxx"
 set ::MySQL(DATABASE)		"db"
 set ::MySQL(PORT)			"3306"
 
 # Connection MySQL:
 package require mysqltcl
 set ::MySQL(Handle) [mysqlconnect -host $::MySQL(HOSTNAME) -user $::MySQL(USERNAME) -password $::MySQL(PASSWORD) -port $::MySQL(PORT) -db $::MySQL(DATABASE)]
 
 # CONFIGURATION canal et bots:
 set chan1 "test1"
 set chan2 "test2"
 set bots "Excalibur"
 
 # CONFIGURATION commande:
 bind pub - !search search
 proc search { nick uhost hand chan arg } {
	set args [string map [list "*" "%" " " "%"] $arg];
    set articles [mysqlsel $::MySQL(Handle) "SELECT `reference`, `articles` FROM `db` WHERE `articles` LIKE '%$args%' ORDER BY `articles` DESC LIMIT 5" -flatlist]
	if {$articles == ""} {
		putquick "PRIVMSG $chan2 :Aucun résultat."
	} elseif {$articles != ""} {
	foreach {reference articles} $articles {
		putquick "PRIVMSG $chan2 :${reference} ${articles}"
	} 
	foreach { bot } [split $::bots " "] {
	putbot $bot "::search ${reference} ${articles}"
	}
	}
	mysqlclose $::MySQL(Handle);
	}

 # CONFIGURATION pour le botnet:
 bind bot - ::search bot:search
 proc bot:search { from_bot cmd text } {
	global chan1 chan2
	set args [split $text " "]
	set reference [lindex $args 0]
	set articles [lindex $args 1]
	foreach { chan } [split $chan2 " "] {
	putquick "PRIVMSG $chan2 :${reference} ${article}"
	}
}



Mais voila il y a un mais quand je le lance, dans la party line j'ai une erreur:
Citation :Tcl error [search]: bad variable name "mysql(Handle)": upvar won't create a scalar variable that looks like an array element

Pourtant j'ai bien regardé l'exemple, lu ce qu'il y avait et la du coup, je ne saisie pas pourquoi ça ne se connecte pas, parce qu'il le prend apparament pour autre chose.

Merci pour vos réponses,

Nos....
Répondre Avertir
#7
Tu établis la connexion à MySQL au chargement du tcl, et ta procédure search la ferme.
Donc après la première recherche, il n'y a plus de connexion.
Répondre
#8
Bonjour à tous,

Alors je comprends, donc soit je fais au début de mon script une procédure d'ouverture et une de fermeture, soit j'insère directement dans ma procédure la variable (j'espère que ca s'appel comme ca Smile ) d'ouverture.... j'opte pour la deuxième solution qui me parait pour le moment plus simple Smile....

En tout cas, merci à tous, et surtout à CrazyCat qui sais se montrer patient, même avec un débutant comme moi....

Nos...
Répondre Avertir


Atteindre :


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