mardi, juin 20, 2006

amaroK chat bot plugin

Bonsoir,
l'avant dernier post n'a été qu'une mise en bouche pour réaliser quelque chose de plus intéressant. Au menu du jour, je propose encore un nouveau plugin pour aMSN.

OK, cette fois j'évite le listing de code, le jargon technique et toutes ces choses qui font du blog «encore un autre blog par un informaticien pour informaticiens». Tous doivent s'y retrouver!

Le chat botté.

En quelques mots, un «chat bot» ou «chat robot» est un logiciel qui mène une conversation avec un humain. Ce logiciel prétend être intelligent en essayant de répondre de façon cohérente aux messages envoyés par l'interlocuteur.

..au pays des merveilles

A.L.I.C.E ou Alice est un chat bot qui est fondé sur une base de connaissances écrite dans un langage XML nommé AIML. Le plugin que je propose, intègre Alice à aMSN et permet de laisser le bot faire la conversation à votre place.

Par exemple, une fois le chat bot activé, celui-ci mène la conversation engagée par un de vos contacts MSN.

Les outils

Pour réaliser cela j'ai utilisé le langage Python qui est disponible sur la majorité des distributions Linux. Le binding Python pour le SDK de KDE est aussi nécessaire dans la mesure où DCOP est utilisé comme protocole de communication inter-processus. Pour manipuler la base de connaissance en AIML, pyAIML a été utilisé. Et enfin, pour réaliser le plugin, on peut reprendre, moyennant quelques modifications, le code TCL de l'avant dernier post.

La conception

Le script Python sera utilisé pour:
  1. Charger les fichiers AIML.
  2. Transmettre le message de l'interlocuteur à Alice.
  3. Renvoyer la réponse.

L'idée est d'utiliser DCOP pour la communication entre notre script TCL et notre script Python. Une fois le plugin activé, les messages entrant sont soumis par le biais de DCOP au script Python. Ensuite, la réponse trouvée de la base de connaissances de Alice est relayée par le script TCL au contact.

TCL <--> DCOP <--> Python

Les seuls messages DCOP exposés par le script Python sont:

ask: Pour soumettre un message à Alice et obtenir une réponse

syntaxe: dcop Alice bot ask "" ""

exemple: dcop Alice-6466 "what is the date today?" "david"

exit: Pour arrêter le programme Python.

syntaxe: dcop Alice bot exit

Télécharger le script python ici.

Le plugin TCL

Inutile de publier le code du plugin. Pour le réaliser, il suffit de repartir du dernier plugin et de coder la procédure received dans laquelle on fait cette fois l'appel DCOP ask.

Pour appeler ask on peut écrire quelque chose comme ça:
set reponse [exec dcop `dcop | grep -i alice` bot ask $question $identifiant]


La réponse obtenue, on l'envoi à l'interlocuteur en utilisant la procédure MessageSend définie dans le fichier gui.tcl. Comme pour le dernier plugin, rien n'est prévu pour l'arrêt, ni pour le chargement. Je laisse le soin à l'intéressé de compléter.

jeudi, juin 01, 2006

Plugin aMSN pour amaroK

Le blog est mort?

De retour dans la blogosphère après quelques semaines d'absence. Personne ne remarque! C'est normal, personne ne lit ;o)

Je reviens la santé fragilisée par le stress des examens. Donc, au programme pour ces vacances: le repos, une meilleure alimentation, programmer avec autre chose que Java, s'approprier quelques nouvelles techniques en guitare...

Un plugin aMSN pour amaroK

aMSN est le client de MSN multi plate-formes sous licence GPL que j'utilise sur mon ordinateur. J'ai essayé quelques-uns de ses plugins, mais celui de «music» ne fonctionne pas pour moi. Alors j'ai jeté un oeil sur le code du plugin «Nudge» et j'ai vu qu'il est assez facile d'en coder un.

Un plugin pourquoi faire?

Je voulais simplement mettre dans la fenêtre de aMSN le titre de la chanson et son interprète dans l'espace réservé pour le message personnel. Les plugins sous aMSN sont codés (ou plutôt scriptés) en TCL. Je n'avais jamais vu un code écrit dans ce langage - qui à mon avis a une syntaxe pas très élégante.

Voici une capture d'écran du résultat souhaité


Réalisation du plugin


Pour réaliser le plugin il suffit d'utiliser DCOP. Pour le moment il est vraiment élémentaire et je ne pense pas y ajouter d'autres fonctions vu que je suis déjà passé à quelque chose d'autre.

Le code

Voilà ce que j'ai codé:
#!/usr/bin/tclsh
# Description: Plugin pour afficher dans l'espace PSM
# Il faut d'abord commencer par échanger des messages
# avant que le plugin ne fonctionne. Mais bon,
# chacun peut ajuster le comportement à sa guise.
namespace eval ::amaroK {
# var globale
set oldTitre "oldTitre"

proc Init { dir } {
::plugins::RegisterPlugin "amaroK"
::config::setKey amarokpluginpath $dir

::amaroK::RegisterEvent
}

proc RegisterEvent {} {
::plugins::RegisterEvent "amaroK" chat_msg_received received
}

proc received { event evpar } {
# récupérer le titre, l'artiste ssi amaroK fonctionne
if {[catch {exec dcop amarok player title} errmsg]} {
set titre "Not listening to music :("
set artiste ""
set strPrefix ""
set strDe ""
} else {
set titre [exec dcop amarok player title]
set artiste [exec dcop amarok player artist]
#set cover [exec dcop amarok player coverImage]
set strPrefix "listening to: "
set strDe " - "
}

global amaroK::oldTitre
# n'afficher le titre que si celui-ci à changé
if { [string compare $oldTitre $titre] != 0 } {
set oldTitre $titre
set txt $strPrefix$titre$strDe$artiste
# afficher le changement dans chaque fenêtre ouverte
foreach chatid [::ChatWindow::getAllChatIds] {
# SendMessageFIFO command stack lock
SendMessageFIFO [list ::amaroK::writeMessageToGUI $chatid $txt]
"::amsn::messages_stack($chatid)"
"::amsn::messages_flushing($chatid)"
#::amsn::set_displaypic $cover
}
::MSN::changePSM "$txt"; # echange le message personnel
}

# après 35 secondes rafraîchir
after 35000 ::amaroK::received $event $evpar
}

# écrire le message $txt dans la fenêtre $chatid
proc writeMessageToGUI { chatid txt } {
set color "green"
amsn::WinWrite $chatid "\n" $color
amsn::WinWriteIcon $chatid greyline 3
amsn::WinWrite $chatid "\n" $color
amsn::WinWrite $chatid "[timestamp] $txt\n" $color
amsn::WinWriteIcon $chatid greyline 3
}
}