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é Smile
Répondre Avertir
#2
manque un espace après if :
Code :
if {[infos $artistes $titres]} {
Répondre Avertir
#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"
Répondre Avertir
#4
Ta procédure te retourne une liste, il faut donc tester sa longueur:
TCL
if { [llength [infos $artistes $titres]] > 0 } {


Répondre
#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...
Répondre Avertir
#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";
   }
}


Répondre
#7
Parfait Crazy, merci c'est fonctionnel !

Il ne me reste plus qu'à faire deux trois ajustements !
Répondre Avertir
#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 :

Code PHP :
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 ?

Code PHP :
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 Smile
Répondre Avertir
#9
Une piste peut être ici: http://forum.eggdrop.fr/Suppression-des-...-1432.html
CrazyCat a écrit :La prochaine fois, essaye d'imaginer que j'ai un cerveau ...
Répondre Avertir
#10
Yes BdS merci !

Bon donc j'avance correctement Smile

Code PHP :
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 Smile
Répondre Avertir
#11
Ah ben oui, il te faut un foreach {$artiste $titre $null $urlmenu} $res
Répondre
#12
Alors voilà :

Code PHP :
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 ?
Répondre Avertir
#13
Oui, c'est de ma faute:
TCL
foreach {artistes titres what urlmenu} $res {


Répondre
#14
Tout d'abord merci Crazy Smile

Je me rapproche vraiment de ce que je veux faire Smile

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


Atteindre :


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