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


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

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....
#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 " "]

zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
#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 :) 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...
#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.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
#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 :) 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 :) 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 :)
Bref je vais tester comme ca voir ce que ca donne... Et surtout lire bien ce wiki...

Nos...
#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:
Quote: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....
#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.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
#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 :) ) d'ouverture.... j'opte pour la deuxième solution qui me parait pour le moment plus simple :)....

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

Nos...


Possibly Related Threads…
Thread Author Replies Views Last Post
  Problème avec Les poupées linkeuses zappeur78 24 5,955 11/02/2023, 00:41
Last Post: Amand
  probleme avec le script Pooshy.tcl LTEF 18 681 22/06/2022, 12:49
Last Post: CrazyCat
  [Résolu] Problème avec le script autolog T3nS 2 3,396 06/12/2017, 16:08
Last Post: T3nS
  [Bug] Problème avec le script zurl.tcl T3nS 0 3,205 03/08/2017, 19:40
Last Post: T3nS
  [Résolu] Problème d'accents avec script TCL maison CC30 3 4,863 25/08/2016, 13:55
Last Post: Alucard`68
  [Résolu] Problème d'encodage avec rss-synd Naruto 24 13,955 18/05/2014, 21:16
Last Post: CrazyCat
  Problème avec Clams SaiTek 7 6,036 06/09/2013, 09:02
Last Post: SaiTek
  Problème d'accent avec shoutcast.tcl Naruto 8 6,893 05/08/2013, 15:17
Last Post: Naruto
  [Résolu] [Aide]Problème avec un tcl Naruto 6 6,060 17/07/2013, 20:56
Last Post: CrazyCat
  probleme avec regsub Nostromo1st 2 4,579 03/06/2013, 10:30
Last Post: Nostromo1st

Forum Jump:


Users browsing this thread: 1 Guest(s)