Tutorial de Creación de Plugins para Pidgin en Linux

Como sabrán, quienes siguen a menudo mi blog, hace unos meses creé un plugin para Pidgin – MorseCodeTalk, ahora quiero compartirles un pequeño tutorial para poder crear vuestras propias extensiones.

1- Creamos un Directorio de Trabajo:

# mkdir ~/development

2- Descargar las fuentes de Pidgin y moverlo al directorio creado:
En mi caso he descargado la versión 2.7.9.
http://www.pidgin.im/download/source/
3- Descomprimir las fuentes:

# tar -jxvf pidgin-2.7.9.tar.bz2

4- Configurar las fuentes:

# cd pidgin-2.7.9
# ./configure

4.1- Errores:
Si hay errores de dependencias, instala los plugins que falta:

Ejem: aptitude install intltool

4.2- Opciones:
– Usa –disable-vv si no necesitarás alguna funcionalidad.

Ejem: ./configure --disable-vv --disable-idn --disable-nm --prefix=/opt/pidgin
  • prefix es para que se instale en /opt/pidgin

4.3- Advertencia:
Si ya tenías instalado pidgin anteriormente, te saldrá una advertencia, pero no te preocupes, podrás iniciar la nueva versión de Pidgin por consola.

Warning: You have an old copy of Pidgin at /usr/bin/pidgin.

5- Compilar las fuentes:

# make

Esto podría demorar un poco.

6- Crear el Plugin:
Para empezar crear el plugin deberemos dirigirnos al directorio siguiente:

$ cd libpurple/plugins/

Crearemos un plugin de ejemplo llamado holamundo que sólo nos mostrará una ventana de diálogo al activarlo, para ello debemos crear un fichero de acuerdo al lenguaje de programación que usaremos y el editor que prefieran, yo alterno entre gedit(editor gráfico) y nano(editor desde consola).

Pidgin ofrece API’s para crear extensiones en diferentes lenguajes, como C, Perl, Tcl, d-bus, para este ejemplo usaré el lenguaje de entre ellos que más conozco, que es C (no C++).

6.1- Crear el Código del Plugin:

$ nano holamundo.c
#define PURPLE_PLUGINS
#include
#include "notify.h"
#include "plugin.h"
#include "version.h"

static gboolean
plugin_load(PurplePlugin *plugin) {
    purple_notify_message(plugin, PURPLE_NOTIFY_MSG_INFO, "Hola Mundo!",
                        "Este es mi primer Plugin para Pidgin", NULL, NULL, NULL);

<pre><code>return TRUE;
</code></pre>

}

static PurplePluginInfo info = {
    PURPLE_PLUGIN_MAGIC,
    PURPLE_MAJOR_VERSION,
    PURPLE_MINOR_VERSION,
    PURPLE_PLUGIN_STANDARD,
    NULL,
    0,
    NULL,
    PURPLE_PRIORITY_DEFAULT,

<pre><code>&amp;quot;core-holamundo&amp;quot;,
&amp;quot;Hola Mundo&amp;quot;,
&amp;quot;1.0&amp;quot;,

&amp;quot;Plugin Hola Mundo&amp;quot;,
&amp;quot;Plugin Hola Mundo&amp;quot;,
&amp;quot;Beastieux Zeroo &amp;quot;,
&amp;quot;https://beastieux.com&quot;,

plugin_load,
NULL,
NULL,

NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
</code></pre>

};

static void
init_plugin(PurplePlugin *plugin)
{
}

PURPLE_INIT_PLUGIN(holamundo, init_plugin, info)

La siguiente parte del código nos permite dotar de información suficiente para el plugin, acontinuación describo cada uno de los parámetros:

static PurplePluginInfo info = {
    PURPLE_PLUGIN_MAGIC,    /* Este deber&#225; ser siempre
                               PURPLE_PLUGIN_MAGIC.*/

<pre><code>PURPLE_MAJOR_VERSION,   /* Este par&amp;#225;metro ayuda a determinar
               la versi&amp;#243;n de Pidgin en el que es
               compilado, del mismo modo permitir&amp;#225;
               usar el plugin s&amp;#243;lo en la versi&amp;#243;n
               donde fue compilada */

PURPLE_MINOR_VERSION,   /* Versi&amp;#243;n a partir del cual
               podr&amp;#225; funcionar el Pidgin */

PURPLE_PLUGIN_STANDARD, /* PurplePluginType: Hay 4 diferentes valores
               el primero es PURPLE_PLUGIN_UNKNOWN;
                           no deber&amp;#237;a ser usado, PURPLE_PLUGIN_STANDARD;
               este es el valor m&amp;#225;s usado.
               PURPLE_PLUGIN_LOADER; usamos este cuando
               queremos cargar plugins no nativos
               por ejemplo los hechos en Perl o Tcl,
               por &amp;#250;ltimo PURPLE_PLUGIN_PROTOCOL;
               si tu plugin permitir&amp;#225; conectar
               con otras redes.*/

NULL,              /* Si est&amp;#225;s escribiendo un Core Plugin
               deber&amp;#237;a ser NULL, Si est&amp;#225;s escribiendo un
               Pidgin Plugin debes usar PIDGIN_PLUGIN_TYPE.
               Si est&amp;#225;s escribiendo un Finch Plugin
                           deber&amp;#237;a usar FINCH_PLUGIN_TYPE.*/

0,                 /* Este par&amp;#225;metro es para determinar los flags.
               como el disponible para poner a invisible
                           (PURPLE_PLUGIN_FLAG_INVISIBLE).
               Con ello haremos que el plugin no aparezca
               en la lista de plugins. */

NULL,              /* Este es un GList de dependencias de plugins.*/

PURPLE_PRIORITY_DEFAULT,   /* Determina la prioridad que libpurple dar&amp;#225;
                  a tu plugin. Existen 3 posibilidades,
                  PURPLE_PRIORITY_DEFAULT,
                  PURPLE_PRIORITY_HIGHEST,
                  PURPLE_PRIORITY_LOWEST. */

&amp;quot;core-holamundo&amp;quot;,         /* Es el ID de tu plugin.*/

&amp;quot;Hola Mundo&amp;quot;,     /* Es el Nombre de tu plugin.*/

&amp;quot;1.1&amp;quot;,            /* Es la Versi&amp;#243;n de tu plugin.*/

&amp;quot;Res&amp;#250;men Hola Mundo&amp;quot;,    /* Es el Res&amp;#250;men de tu plugin.*/

&amp;quot;Descripci&amp;#243;n Hola Mundo&amp;quot;,    /* Es la descripci&amp;#243;n de tu plugin.*/

&amp;quot;Tu Nombre &amp;quot;, /* Datos del desarrollador del Plugin. */

&amp;quot;http://...&quot;,    /* La Web del Plugin, de donde pueden
               descargarlo, reportar bugs, etc.*/

plugin_load,    /* La funci&amp;#243;n que se carga cuando
           se inicia el plugin.
           Deber&amp;#237;a ser de tipo gboolean*/

NULL,       /* Es llamado cuando libpurple
           se descarga, tambi&amp;#233;n
           deber&amp;#225; ser de tipo gboolean.*/

NULL,       /* Es llamado cuando libpurple
           se destruye, tambi&amp;#233;n
           deber&amp;#225; ser de tipo gboolean.*/

NULL,       /* Deber&amp;#225; apuntar a un PidginPluginUiInfo.*/

NULL,       /* Determina si es un PurplePluginLoaderInfo
           o PurplePluginProtocolInfo*/

NULL,       /* Puntero que apunta a una estructura
           PurplePluginUiInfo.
           Puedes encontrar un ejemplo de ese
           tipo de c&amp;#243;digo en:
           libpurple/plugins/pluginpref_example.c */

NULL,       /* Es una funci&amp;#243;n puntero donde se definen
           acciones. Debe ser de tipo GList
           *function_name(PurplePlugin
           *plugin, gpointer context)*/

NULL,       /* Es un puntero reservado para el futuro,
           lo setearemos a NULL
           porque no lo necesitamos.*/

NULL,           /* Es un puntero reservado para el futuro,
           lo setearemos a NULL
           porque no lo necesitamos.*/

NULL,       /* Es un puntero reservado para el futuro,
           lo setearemos a NULL
           porque no lo necesitamos.*/

NULL        /* Es un puntero reservado para el futuro,
           lo setearemos a NULL
           porque no lo necesitamos.*/
</code></pre>

};

6.2- Compilar el fichero holamundo.c:

$ make holamundo.so

6.3- Copiar el plugin creado en el directorio de pidgin:

$ cp holamundo.so ~/.purple/plugins/

6.4- Ejecutar Pidgin y probar el plugin:

$ /opt/pidgin/bin/pidgin

Para crear un plugin con interfaces más elaboradas podemos usar las librerías GTK, y para la interacción con pidgin usamos las librerías libpurple; una buena combinación de C/GTK/Libpurple, y de los conocimientos necesarios del la estructura funcional de pidgin nos permitirán realizar los complementos que queramos, pueden buscar toda la información necesaria en la wiki de desarrolladores de pidgin. Una recomendación de mi parte es que revisen los códigos fuente de los plugins existentes en Pidgin Plugins, y tomarlos como referencia para construir los suyos, es lo que hice antes de empezar a crear mis propios complementes . Ahora, si quieren hacer la versión para windows, generar el dll tiene un proceso algo mas tedioso, se necesitará la ayuda de cygwin en windows y descargar e instalar todos los paquetes del cual pidgin depende para poder compilar las fuentes.

2 thoughts on “Tutorial de Creación de Plugins para Pidgin en Linux

  1. hola. me resulta muy interesante tu publicacion de como crear plug in para pidgin.
    te hago una consulta. puesto que tengo poco conocimiento en programación.
    seria muy dificil crear un plugin, que los mensajes que reciba pidgin los transmita por puerto serial? estoy usando arduino y estoy intentando esto…

Deja un comentario