Yesterday evening (as in 7:30 PM) I started writing a gaim plugin for myself. This thing would tell me who exactly is talking to me. For example, if I wanted to talk to lunatech3007, I get the following.
It will tell me what this guy who's pinging me does in Yahoo !. The plugin was pretty simple enough to write - except of doubts about what to do with the g_free vs free functions. Did you know that all memory allocated with g_new0 has to be g_free'd. In hindsight, it does make a lot of sense. Here's some code for the coding oriented. I hook into the "conversation-created" signal with the gaim_new_conversation callback.
gaim_signal_connect(conv_handle, "conversation-created", plugin, GAIM_CALLBACK(gaim_new_conversation), NULL);
In the conversation-created, I use libcurl to fetch the HTML of the employee search. Use regex.h to extract the name, title and email-id. It's pretty much standard POSIX regex to extract the data required.
reg_err = regexec(&title_pattern, html, 3, matches, 0); if(!reg_err) { int start, len; start = matches[1].rm_so; len = matches[1].rm_eo - matches[1].rm_so; if(len != 0) { data->title = calloc(len+1, sizeof(char)); memcpy(data->title, &html[start], len); } }
Finally having got all the data, it is written out to the user as a system-message.
gaim_conversation_write(conv, NULL, message, GAIM_MESSAGE_SYSTEM, time(NULL));
Also add an in-memory cache so that it doesn't hit the webpage for each and every conversation. Had to spend quite some time fiddling with the hash functions till I got the hang of it. I already had a string hash function that I use regularly in C when I need hashtables - but sometimes it is better to go with the standard stuff.
user_data_cache = g_cache_new(get_user_data, destroy_user_data, (GCacheDupFunc)g_strdup, g_free, g_str_hash, user_data_hash_func, g_str_equal); .... static guint user_data_hash_func(gconstpointer key) { if(key == NULL) return 0; return g_str_hash(((user_data *)key)->id); }
Finally compile it up, push it into ~/.gaim/plugins/ and restart gaim. Navigate to the gaim plugin configuration and turn it on.
Starting from a simple sample, it didn't take me any time at all to get a working plugin. I have never written an easier plugin, the hard work was mainly to handle curl and get the regexes just right. I am too lazy to trim out the Yahoo! specific peices and throw out a really generic version, otherwise I'd have just pushed the code here.