domingo 14 de septiembre de 2008

Pidgin pop

Esta vez lo que me dejó un fin de semana de programación fue un nuevo plugin para mi pidgin, resulta que experimentando un poco comencé a desvariar ideas y después de un rato se me ocurrió darle soporte a pidgin para conectarse a un servidor pop3 de modo que me avise cuando tenga correos nuevos.

Fue algo muy entretenido, lo primero que hice fue leerme un poco sobre la documentación de pidgin en el siguiente enlace http://developer.pidgin.im/wiki/CHowTo de ese modo comprendí la metodología para crear plugins.

En seguida me di cuenta que necesitaba algo para conectarme con el servidor pop, así que buscando un poco me encontré con esta librería bastante útil http://savannah.nongnu.org/projects/libspopc/ así que me puse a descargarla e instalarla, después solo fue cuestión de leer su documentación, y listo hasta ese momento ya tenía un plugin que me avisaba cada cierto tiempo que tenía correo, pero los datos de configuración estaban fijos así que decidí que la mejor manera de configurarlo era por medio de un archivo XML.

Así que a buscar la documentación de libxml http://xmlsoft.org/html/index.html y listo aprendiendo como manejar un xml desde C pude hacer que mi plugin fuera configurable, desafortunadamente el archivo lo edito a mano, pero pronto haré una interfaz para esta tarea.

Bueno esa fue mi experiencia de desarrollo de plugins, el código lo listo a continuación, como pueden observar es algo muy simple:


#define PURPLE_PLUGINS

#include
#include
#include
#include
#include

#include"debug.h"
#include "notify.h"
#include "plugin.h"
#include "version.h"

PurplePlugin *poppidgin_plugin = NULL;
char *server;
char *username;
char *password;
int port;


void getSettings(){
xmlNodePtr root;
xmlDocPtr doc;
doc = xmlParseFile(".purple/pop/pop.xml");
root = xmlDocGetRootElement (doc);
username=xmlGetProp (root, "username");
password=xmlGetProp (root, "password");
server=xmlGetProp (root, "server");
port=atoi(xmlGetProp (root, "port"));
}


static void
get_mail(PurplePluginAction *action)
{

pop3sock_t mysock;
char* srvdata=NULL;
struct hostent myserver;
struct sockaddr_in myconnection;

mysock=pop3_prepare(server,port,&myconnection,&myserver);
if(BAD_SOCK==mysock){
purple_notify_message(poppidgin_plugin, PURPLE_NOTIFY_MSG_INFO,
"error", "no network",
NULL, NULL, NULL);
exit(1);
}
srvdata=pop3_connect(mysock,&myconnection);
if (!srvdata){
purple_notify_message(poppidgin_plugin, PURPLE_NOTIFY_MSG_INFO,
"error", "no connection",
NULL, NULL, NULL);
exit(1);
}
free(srvdata);
srvdata=pop3_user(mysock,username);
free(srvdata);
srvdata=pop3_pass(mysock,password);
free(srvdata);

srvdata=pop3_stat(mysock);
if(stat2last(srvdata)>0){
gchar *msg = g_strdup_printf(("You have %d mail(s)"),stat2last(srvdata));
purple_notify_message(poppidgin_plugin, PURPLE_NOTIFY_MSG_INFO,
"new mail", msg,
NULL, NULL, NULL);
}
}


static GList *
plugin_actions(PurplePlugin *plugin, gpointer context)
{
GList *list = NULL;
PurplePluginAction *action = NULL;
action = purple_plugin_action_new("get mail(s)", get_mail);
list = g_list_append(list, action);
return list;
}



static gboolean
plugin_load(PurplePlugin *plugin) {
getSettings();
get_mail(NULL);
g_timeout_add(600000, get_mail, NULL);
return TRUE;
}


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

"core-pop",
"POP pidgin!",
"1.1",

"POP pidgin Plugin",
"POP pidgin Plugin",
"raag ",
"http://raagpc.blogspot.com",

plugin_load,
NULL,
NULL,

NULL,
NULL,
NULL,
plugin_actions,
NULL,
NULL,
NULL,
NULL
};

static void
init_plugin(PurplePlugin *plugin)
{
}

PURPLE_INIT_PLUGIN(pop_pidgin, init_plugin, info)



ahora pongo un par de capturas de mi pequeño experimento:







Bueno, eso es todo por hoy, si alguién está interesado ya saben en donde encontrarme

Saludos y hasta la próxima