Writing Ayttm Plugins

Philip S Tellis

Foss.in/2007 • December 4-8, 2007 • Bangalore, India

Chatters in the crowd, raise your hands!

What's the best part about chatting with friends?

What can you do to enhance the experience?

Two parts to Instant Messaging

Everything else must be pretty huge

Everything else must be pretty huge

Everything else must be pretty huge

Everything else must be pretty huge

Everything else must be pretty huge

Everything else must be pretty huge

Everything else must be pretty huge

Everything else must be pretty huge

But simple chat is no small matter either

But simple chat is no small matter either

But simple chat is no small matter either

But simple chat is no small matter either

But simple chat is no small matter either

But simple chat is no small matter either

Enter plugins

Ayttm's plugin mechanism

Let's get down and dirty and build one

1. Linkify Bugzilla links

1Linkify Bugzilla links

1aThe module skeleton

   #include "plugin_api.h"

   #define plugin_info bugzilla_LTX_plugin_info
   #define module_version bugzilla_LTX_module_version

   static int ref_count = 0;

   static int plugin_init();
   static int plugin_finish();

   PLUGIN_INFO plugin_info = {
      ...
   };

   unsigned int module_version() { return CORE_VERSION; }

   ...

1bModule signature

   PLUGIN_INFO plugin_info = {
           PLUGIN_FILTER,
           "Bugzilla linker",
           "Linkify bugzilla links",
           "$Revision: $",
           "$Date: $",
           &ref_count,
           plugin_init,
           plugin_finish,
           reload_prefs,
           NULL
   };

1cOnload handler

   static int plugin_init()
   {
        input_list *il = calloc(1, sizeof(input_list));
        plugin_info.prefs = il;

        il->widget.checkbox.value = &enable_bugzilla_links;
        il->name = "enable_bugzilla_links";
        il->label = _("Enable automatic Bugzilla Linking");
        il->type = EB_INPUT_CHECKBOX;

        il->next = calloc(1, sizeof(input_list));
        il = il->next;
        il->widget.entry.value = &bugzilla_url;
        il->name = "bugzilla_url";
        il->label = _("Base Bugzilla URL:");
        il->type = EB_INPUT_ENTRY;

        eb_debug(DBG_MOD, "Bugzilla initialised\n");

        outgoing_message_filters = l_list_prepend(outgoing_message_filters,
                     &bugzilla_linkify);
        incoming_message_filters = l_list_append(incoming_message_filters,
                     &bugzilla_linkify);

        return 0;
   }

1dOnUnload handler

   static int plugin_finish()
   {
        eb_debug(DBG_MOD, "Auto-bugzilla shutting down\n");
        outgoing_message_filters = l_list_remove(outgoing_message_filters,
                     &bugzilla_linkify);
        incoming_message_filters = l_list_remove(incoming_message_filters,
                     &bugzilla_linkify);

        while(plugin_info.prefs) {
                input_list *il = plugin_info.prefs->next;
                free(plugin_info.prefs);
                plugin_info.prefs = il;
        }

        return 0;
   }

1eFilter signatures



   static char *bugzilla_linkify(const eb_local_account * local,
                                 const eb_account * remote,
                                 const struct contact *contact,
                                 const char * s);

1fAttaching filters



   outgoing_message_filters = l_list_prepend(outgoing_message_filters,
                                             &pre_out_filter_function);

   outgoing_message_filters = l_list_append(outgoing_message_filters,
                                            &post_out_filter_function);

   incoming_message_filters = l_list_append(incoming_message_filters,
                                            &in_filter_function);

1gDoing the do



   static char *bugzilla_linkify(const eb_local_account * local,
                                 const eb_account * remote,
                                 const struct contact *contact,
                                 const char * s)
   {
        char *p;
        if (!enable_bugzilla_links) {
                return strdup(s);
        }

        /* Now we need to do something like this: */
        /* s/\[(bug:? )(\d+)\]/[<a href="$bugzilla_url/$2">$1$2</a>]/g */

        return p;
   }

1hThe code

bugzilla.c

2. Weather module

2Weather module

Use the source! weather.c

3. Image converter

3Image converter

Use the source! image_filter/img2jpc.c
(in CVS)

Getting your code back into ayttm

It's fairly easy to get commit access

  1. Submit 3 or 4 good patches, OR
  2. Submit a good module of general usefulness
  3. Stick to ayttm's coding standards
  4. Stick to ayttm's release guidelines
  5. If you still don't get it, ask for commit access

Pointers or References?

Greetz

Philip S Tellis

philip@bluesmoon.info

http://bluesmoon.info/

Made with Eric A Meyer's S5