Extensions Ce chapitre décrit l'API extension de WeeChat et les extensions fournies par défaut avec WeeChat.
Les extensions dans WeeChat Une extension ("plugin" en anglais) est un programme écrit en C qui peut appeler des fonctions de WeeChat définies dans une interface. Ce programme C n'a pas besoin des sources WeeChat pour être compilé et peut être chargé/déchargé dynamiquement dans WeeChat via la commande /plugin. L'extension doit être au format bibliothèque, chargeable dynamiquement par le système d'exploitation. Sous GNU/Linux, il s'agit d'un fichier ayant pour extension ".so", sous Windows ".dll".
Ecrire une extension L'extension doit inclure le fichier "weechat-plugin.h" (disponible dans les sources de WeeChat). Ce fichier définit les structures et types dont l'extension aura besoin pour communiquer avec WeeChat. L'extension doit comporter certaines macros obligatoires (pour définir des variables) et des fonctions (sans quoi l'extension ne peut être chargée) : Macro Description WEECHAT_PLUGIN_NAME le nom de l'extension WEECHAT_PLUGIN_DESCRIPTION une courte description de l'extension WEECHAT_PLUGIN_VERSION la version de l'extension WEECHAT_PLUGIN_WEECHAT_VERSION la version de WeeChat pour laquelle l'extension est destinée (attention: l'extension ne pourra tourner sur aucune autre version de WeeChat !) WEECHAT_PLUGIN_LICENSE la licence de l'extension Fonction Description int weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) fonction appelée au chargement de l'extension qui doit renvoyer WEECHAT_RC_OK en cas de succès, WEECHAT_RC_ERROR en cas d'erreur (si erreur, l'extension ne sera PAS chargée), argv/argv sont les paramètres pour l'extension (donnés sur la ligne de commande par l'utilisateur) int weechat_plugin_end (struct t_weechat_plugin *plugin) fonction appelée au déchargement de l'extension
Compiler l'extension La compilation ne nécessite pas les sources WeeChat, mais seulement le fichier "weechat-plugin.h". Pour compiler une extension composée d'un fichier "toto.c" (sous GNU/Linux) : $ gcc -fPIC -Wall -c toto.c $ gcc -shared -fPIC -o libtoto.so toto.o
Charger l'extension dans WeeChat Copier le fichier "libtoto.so" dans le répertoire système des extensions (par exemple "/usr/local/lib/weechat/plugins)" ou bien dans celui de l'utilisateur (par exemple "/home/xxxxx/.weechat/plugins"). Sous WeeChat : /plugin load toto
Exemple d'extension Un exemple complet d'extension, qui ajoute une commande /double affichant deux fois les paramètres passés sur le tampon courant ou exécutant deux fois une commande (d'accord ce n'est pas très utile mais ceci est un exemple !) : #include <stdlib.h> #include "weechat-plugin.h" WEECHAT_PLUGIN_NAME("double"); WEECHAT_PLUGIN_DESCRIPTION("Test plugin for WeeChat"); WEECHAT_PLUGIN_AUTHOR("FlashCode <flashcode@flashtux.org>"); WEECHAT_PLUGIN_VERSION("0.1"); WEECHAT_PLUGIN_WEECHAT_VERSION("0.2.7"); WEECHAT_PLUGIN_LICENSE("GPL3"); struct t_weechat_plugin *weechat_plugin = NULL; /* "/double" command manager */ int double_cmd (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { /* make C compiler happy */ (void) argv; if (argc > 1) { weechat_command (NULL, argv_eol[1]); weechat_command (NULL, argv_eol[1]); } return WEECHAT_RC_OK; } int weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) { weechat_plugin = plugin; weechat_hook_command ("double", "Display two times a message", "msg", "msg: message to display two times", NULL, &double_cmd, NULL); return WEECHAT_RC_OK; } int weechat_plugin_end (struct t_weechat_plugin *plugin) { /* nothing done here */ (void) plugin; return WEECHAT_RC_OK; }