# 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;
    }

&plugin_irc.fr.xml;

&plugin_fifo.fr.xml;

&plugin_xfer.fr.xml;