# Plugins

This chapter describes WeeChat plugin API and default plugins provided with WeeChat.

## Plugins in WeeChat

Ein Plugin ist ein C-Programm, dass WeeChat-Funktionen aufrufen kann, die in einem Interface definiert sind.

Dieses C-Programm braucht nicht den Quellcode von WeeChat (aber die API-Beschreibung) und kann dynamisch mit dem folgenden Kommando in WeeChat geladen werden `/plugin`.

Das Plugin muss in Form einer dynamischen Bibliothek vorliegen, damit es das Betriebssystem dynamisch laden kann. Unter GNU/Linux besitzt die Datei die Endung ".so", unter Windows ".dll".

## Ein Plugin schreiben

Das Plugin muss die Datei "weechat-plugin.h" einbinden (verfügbar im WeeChat-Quellcode). Diese Datei definiert die Strukturen und Typen um mit WeeChat zu kommunizieren.

The plugin must use some mandatory macros (to define some variables) and some functions (without them the plugin can't load):

Macro | Description
--- | ---
`WEECHAT_PLUGIN_NAME` | plugin name
`WEECHAT_PLUGIN_DESCRIPTION` | short description of plugin
`WEECHAT_PLUGIN_VERSION` | plugin version
`WEECHAT_PLUGIN_WEECHAT_VERSION` | target WeeChat version where plugin will run (warning: plugin will not run on any other WeeChat version!)
`WEECHAT_PLUGIN_LICENSE` | plugin license

Funktion | Beschreibung
--- | ---
`int weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])` | function called when plugin is loaded, must return WEECHAT_RC_OK if successful, WEECHAT_RC_ERROR if error (if error, plugin will NOT be loaded), argc/argv are arguments for plugin (given on command line by user)
`int weechat_plugin_end (struct t_weechat_plugin *plugin)` | Funktion wird beim Abschalten aufgerufen

### Übersetzen eines Plugins

Das Übersetzen braucht keine WeeChat-Quellen, aber die Datei "`weechat-plugin.h`".

Um ein Plugin zu übersetzen, das aus einer Datei "toto.c" besteht (unter GNU/Linux):

    $ gcc -fPIC -Wall -c toto.c
    $ gcc -shared -fPIC -o libtoto.so toto.o

### Laden des Plugins in WeeChat

Kopiere die Datei "libtoto.so" in das Plugin-Verzeichnis der systemweiten Dateien WeeChats (zum Beispiel: "`/usr/local/lib/weechat/plugins`") oder in das Plugin-Verzeichnis des Users (zum Beispiel: "`/home/xxxxx/.weechat/plugins`").

In WeeChat:

    /plugin load toto

### Plugin Beispiel

Full example of plugin, which adds a /double command, which displays two times arguments on current buffer, or execute two times a command (ok that's not very useful, but that's just an example!):

    #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.de.xml;

&plugin_fifo.de.xml;

&plugin_xfer.de.xml;