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


Script TCL + SQL
#1
Bonjour,

J'ai tenté un petit script toutefois le résultat n'est pas fameux...


Code:
##############
# CONFIGURATION #
##############

# -> Login
set sql(login) ""
# -> Mot de passe
set sql(pass) ""
# -> Nom de la base de donnée
set sql(db) ""
# -> L'host a l'aquelle ce connecté
set sql(host) "localhost"
# -> Localisation de fichier mysql.sock
set sql(sock) "/var/run/mysqld/mysqld.sock"

###########
# PAQUETAGE #
###########

catch {package require mysqltcl}

#######
# CODE  #
#######

#########
# CONNECT #
#########
proc service:connect {} {
    set ::mysqlink [::mysql::connect -host $::sql(host) -user $::sql(login) -password $::sql(pass) -sock $::sql(sock)]
    ::mysql::use $::mysqlink $::sql(db)
}

###########
# DECONNECT #
###########

proc service:deconnect {} {
    ::mysql::close $::mysqlink; unset -nocomplain ::mysqlink    
}

########
# INFOS #
########

proc infos {artistes titres} {
   service:connect
   set query "SELECT idvideos, v_artistes, v_titres FROM v5_videos WHERE v_artistes LIKE '%$artistes%' OR v_titres LIKE '%$titres%'"
   set res [::mysql::sel $::mysqlink $query -flatlist]
   service:deconnect
   return $res
}

#Users with these flags can operate this function
set wdntwflags "h|h"

bind pub $wdntwflags !sound pub:wdntwcmd

proc pub:wdntwcmd {nick host hand chan arg} {
    set artistes [lindex $arg 0]
    set titres [lindex $arg 1]
    if{[infos $artistes $titres]}{
    putlog "$artistes => $titres";
    }else{
    putlog "Ce son n'existe pas";
    }
}

putlog "Script WDNTW SQL by KiBa loaded!"
En gros, je vais taper dans une table qui contient un certains nombres de musiques et j'aimerai en sortir le titres et l'artistes (pour le moment) en faisant un !sound Blink 182 par exemple

Voilà le résultat :


Code:
[13:56:46] <@KiBa> !sound Passenger
[13:56:47] <(VDMBot> [13:56:48] Tcl error [pub:wdntwcmd]: invalid command name "if{1 Gotye {Somebody That I Used To Know featuring Kimbra} 3 Booba {Kalash featuring Kaaris} 4 {Positive Flow} {Do What I Do featuring Omar} 5 Adele {Hometown Glory High Contrast Remix} 6 Beyonce {I Was Here} 7 {Mark Farina} {Dream Machine} 8 Jay-Z {Public Service Announcement Nba2K13 OST} 9 {Kid Ink} {Lowkey Poppin} 10 Bibio {Lovers Carvings Catz'n Dogz Remix} 11 {Angels And
Un petit coup de pouce siouplé :)
#2
manque un espace après if :

Code:
if {[infos $artistes $titres]} {
Toute l'actualité de mes scripts ici     (dernière mise à jour le 22/04/2020)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction, de quoi l'on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.
#3
Oui j'avais tenté avec l'espace toutefois...


Code:
proc pub:wdntwcmd {nick host hand chan arg} {
    set artistes [lindex $arg 0]
    set titres [lindex $arg 1]
    if {[infos $artistes $titres]} {
    putlog "$artistes => $titres";
    } else {
    putlog "Ce son n'existe pas";
    }
}

Code:
[14:22:50] <(VDMBot> [14:22:51] Tcl error [pub:wdntwcmd]: expected boolean value but got "1 Gotye {Somebody That I Used To Know featuring Ki"
#4
Ta procédure te retourne une liste, il faut donc tester sa longueur:

tcl
if { [llength [infos $artistes $titres]] > 0 } {

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#5
Ok, c'est déjà mieux, je n'ai plus d'erreur...

En putlog, voici le résultat :


Code:
[15:12:16] <@KiBa> !sound Blink 182
[15:12:17] <(VDMBot> [15:12:17] Blink => 182
Je présume que l'espace entre les deux arguments fait qu'il considère que Blink est $artistes et 182 est $titres...

Du coup ce n'est pas tout à fait ça...
#6
Ben oui, c'est exactement ce que tu lui dis de faire.

Je reprends le code modifié et le commente:

tcl
proc pub:wdntwcmd {nick host hand chan arg} {
   # $arg est la liste des arguments qui suivent la commande (séparée par des espaces)
   set artistes [lindex $arg 0]
   # $artistes est donc le premier "mot" contenu dans $arg
   set titres [lindex $arg 1]
   # $titres est donc le second
   if { [llength [infos $artistes $titres]] > 0 } {
      putlog "$artistes => $titres";
   } else {
      putlog "Ce son n'existe pas";
   }
}

Comme tu veux pouvoir chercher un artiste ou un titre, je pense qu'il faut revoir ta requête et même les deux procédures:

tcl
proc infos {donnees} {
   service:connect
   set query "SELECT idvideos, v_artistes, v_titres FROM v5_videos WHERE CONCAT(v_artistes, '%', v_titres) LIKE '%$donnees%'"
   set res [::mysql::sel $::mysqlink $query -flatlist]
   service:deconnect
   return $res
}
 
proc pub:wdntwcmd {nick host hand chan arg} {
   set donnees [string map {" " %} [join $arg]]
   # on transforme les espaces en %
   set res [infos $donnees]
   if { [llength $res] > 0 } {
      putlog "Résultat : [join $res]";
   } else {
      putlog "Ce son n'existe pas";
   }
}

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#7
Parfait Crazy, merci c'est fonctionnel !

Il ne me reste plus qu'à faire deux trois ajustements !
#8
Désolé pour le "double" post...

En php, j'ai une fonction qui me remplace toutes mes majuscules, mes accents etc. pour "cleaner" mes titres d'artistes et de musiques...

La voici :

PHP Code:
function cleanLink($chaine){
    
//$chaine = utf8_encode($chaine);
    
return strtolower(str_replace
    array(
"à","á","â","ã","ä""ç""è","é","ê","ë""ì","í","î","ï""ñ""ò","ó","ô","õ","ö""ù","ú","û","ü""ý","ÿ""À","Á","Â","Ã","Ä""Ç""È","É","Ê","Ë""Ì","Í","Î","Ï""Ñ""Ò","Ó","Ô","Õ","Ö""Ù","Ú","Û","Ü""Ý" " ""_""&","/",".","'","(",")",","),
    array(
"a","a","a","a","a""c""e","e","e","e""i","i","i","i""n""o","o","o","o","o""u","u","u","u""y","y""A","A","A","A","A""C""E","E","E","E""I","I","I","I""N""O","O","O","O","O""U","U","U","U""Y" "-""-""and","-","","","","",""), $chaine));


Est-ce qu'il existe quelque chose de similaire en TCL ?

PHP Code:
proc string_filter {str} {
    
set str [string map -nocase {
        
" "        "-"        "_"        "-"        "&"        "-"        "/"        "-"
        "."        "-"        "("        "-"        ")"        "-"        "'"        ""
        ","        ""        "è"        "e"        "é"        "e"
    
$str]

    
regsub -all {<br />} $str " " str
    regsub 
-all {<[^>]+>} $str "" str
    regsub 
-all {\n$str " " str

    set str 
[encoding convertfrom utf-8 $str]
    
set str [string tolower $str]
    return 
$str


J'ai toutefois un problème, quand je fais


Code:
[17:08:15] <Aomine> !sound Petit frère
[17:08:16] <(VDMBot> [17:10:00] Ce son n'existe pas
Alors que j'ai bien un résultat sur "Petit frère"

Merci :)
#9
#10
Yes BdS merci !

Bon donc j'avance correctement :)

PHP Code:
bind pub $wdntwflags !sound pub:wdntwcmd

proc pub
:wdntwcmd {nick host hand chan arg} {
    
set donnees [string_filter [string map {" " %} [join $arg]]]
    
# on transforme les espaces en %
    
if { [llength [split $arg]] == } { 
      
putserv "NOTICE $nick : Merci de préciser ta recherche. Exemple : !sound *artistes ou titres*" 
      
return 
    
}
    
set res [infos $donnees]
    
set artistes [lindex $res 0]
    
set titres [lindex $res 1]
    
set urlmenu [lindex $res 3]
    
set minartistes [string_filter [lindex $res 0]]
    
set mintitres [string_filter [lindex $res 1]]
    if { [
llength $res] > } {
      
#putlog "Résultat : [join $res]";
      
putlog "$artistes - $titres : http://www.wdntw.com/$urlmenu/$minartistes/$mintitres";
    } else {
      
putserv "NOTICE $nick : Désolé mais ce son n'existe pas dans ma base de données.";
    }
}

proc string_filter {str} {
    
set str [string map -nocase {
        
" "        "-"        "_"        "-"        "&"        "-"        "/"        "-"
        "."        "-"        "("        "-"        ")"        "-"        "'"        ""
        ","        ""        "è"        "e"        "é"        "e"
    
$str]

    
regsub -all {<br />} $str " " str
    regsub 
-all {<[^>]+>} $str "" str
    regsub 
-all {\n$str " " str

    set str 
[encoding convertfrom utf-8 $str]
    
set str [string tolower $str]
    return 
$str


Je pense qu'il y a des optimisations bien sur...

En revanche je n'arrive à retourner qu'un résultat pour mes recherches... Il faut que je fasse une boucle ?

Merci pour vos réponses :)
#11
Ah ben oui, il te faut un foreach {$artiste $titre $null $urlmenu} $res
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#12
Alors voilà :

PHP Code:
foreach {$artistes $titres $null $urlmenu$res {
if { [
llength $res] > } {
#putlog "Résultat : [join $res]";
putlog "$artistes - $titres : http://www.wdntw.com/$urlmenu/$minartistes/$mintitres";
} else {
putserv "NOTICE $nick : Désolé mais ce son n'existe pas dans ma base de données.";
}



Code:
[15:42:06] <@KiBa> !sound Asaf Avidan
[15:42:18] <(VDMBot> [15:41:55] Asaf Avidan - Reckoning Song : http://www.wdntw.com/pop-us/asaf-avidan/reckoning-song
[15:42:18] <(VDMBot> [15:41:55] Asaf Avidan - Reckoning Song : http://www.wdntw.com/pop-us/asaf-avidan/reckoning-song
[15:42:18] <(VDMBot> [15:41:55] Asaf Avidan - Reckoning Song : http://www.wdntw.com/pop-us/asaf-avidan/reckoning-song
J'ai bien trois entrées dans ma base qui correspondent à Asaf Avidan mais il me répète trois fois le même morceau en revanche...
Normal ?
#13
Oui, c'est de ma faute:

tcl
foreach {artistes titres what urlmenu} $res {

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#14
Tout d'abord merci Crazy :)

Je me rapproche vraiment de ce que je veux faire :)

Toutefois je rencontre toujours un problème avec les liens :


Code:
[10:12:40] <KiBa> !sound Blink 182
[10:12:41] <%VDMBot>  Blink 182 - Love Is Dangerous : http://www.wdntw.com/punk-rock/blink-182/love-is-dangerous
[10:12:42] <%VDMBot>  Blink 182 - Every Time I look For You : http://www.wdntw.com/punk-rock/blink-182/love-is-dangerous
[10:12:43] <%VDMBot>  Blink 182 - When I Was Young : http://www.wdntw.com/punk-rock/blink-182/love-is-dangerous
[10:12:43] <%VDMBot>  Blink 182 - I Miss You : http://www.wdntw.com/punk-rock/blink-182/love-is-dangerous
Si on regarde bien, la requête est bonne, les résultats sont bien différents... mais les liens sont les mêmes...

Je comprends pas trop...
#15
Ben sans ton code complet, c'est un peu difficile de t'aider.
Je ne sais pas si tu te rends compte que depuis le début je suis obligé d'imaginer la plupart de tes variables, donc soit tu adaptes correctement les bouts que je te donne soit tu mets toutes les infos (tout le code utile) pour qu'on puisse te donner quelque chose de fonctionnel.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away


Forum Jump:


Users browsing this thread: 1 Guest(s)