view libpurple/purple-notifications-example @ 23325:8c315f969600

Patch from Andrew Gaul that fixes another leak: ==24860== 61,150 (15,900 direct, 45,250 indirect) bytes in 124 blocks are definitely lost in loss record 294 of 317 ==24860== at 0x4A07A7E: malloc (vg_replace_malloc.c:207) ==24860== by 0x331303F8A2: g_malloc (in /lib64/libglib-2.0.so.0.1600.3) ==24860== by 0x3313055397: g_slice_alloc (in /lib64/libglib-2.0.so.0.1600.3) ==24860== by 0x3BC001B0D9: gdk_color_copy (in /usr/lib64/libgdk-x11-2.0.so.0.1200.9) ==24860== by 0x3313408E2B: (within /lib64/libgobject-2.0.so.0.1600.3) ==24860== by 0x331340FC95: g_object_get_valist (in /lib64/libgobject-2.0.so.0.1600.3) ==24860== by 0x331340FF03: g_object_get (in /lib64/libgobject-2.0.so.0.1600.3) ==24860== by 0x47C1A1: tag_to_html_start (gtkimhtml.c:5023) ==24860== by 0x47C5EF: text_tag_data_new (gtkimhtml.c:5114) ==24860== by 0x47CA50: gtk_imhtml_get_markup_range (gtkimhtml.c:5198) ==24860== by 0x47CEF8: gtk_imhtml_get_markup (gtkimhtml.c:5314) ==24860== by 0x44BC3B: send_cb (gtkconv.c:548)
author Ka-Hing Cheung <khc@hxbc.us>
date Sun, 08 Jun 2008 22:18:14 +0000
parents 61c2d36a38a3
children
line wrap: on
line source

#!/usr/bin/env python

# This is a simple purple notification server.
# It shows notifications when your buddy signs on or you get an IM message.
#
# This script requires Python 2.4 and PyGTK bindings
#
# Note that all function names are resolved dynamically, no
# purple-specific library is needed.

import dbus
import dbus.glib
import dbus.decorators
import gobject
import os

def ensureimconversation(conversation, account, name):
    if conversation != 0:
        return conversation
    else:
        # 1 = PURPLE_CONV_IM 
        return purple.PurpleConversationNew(1, account, name)

def receivedimmsg(account, name, message, conversation, flags):
    buddy = purple.PurpleFindBuddy(account, name)
    if buddy != 0:
        alias = purple.PurpleBuddyGetAlias(buddy)
    else:
        alias = name

    text = "%s says %s" % (alias, message)
    code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons",
                      "'So what?','Show me',Close,Abuse", text)

    if code == 101:                     # so what?
        pass
    else:
        conversation = ensureimconversation(conversation, account, name)

    if code == 102:                     # show me
        window = purple.PurpleConversationGetWindow(conversation)
        purple.PurpleConvWindowRaise(window)

    if code == 103:                     # close 
        purple.PurpleConversationDestroy(conversation)

    if code == 104:                     # abuse
        im = purple.PurpleConversationGetImData(conversation)
        purple.PurpleConvImSend(im, "Go away you f...")
                                 
        
def buddysignedon(buddyid):
    alias = purple.PurpleBuddyGetAlias(buddyid)
    text = "%s is online" % alias

    code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons",
                      "'So what?','Let's talk'", text)

    if code == 101:                     # so what?
        pass

    if code == 102:                     # talk
        name = purple.PurpleBuddyGetName(buddyid)
        account = purple.PurpleBuddyGetAccount(buddyid)
        purple.PurpleConversationNew(1, account, name)
    

bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")

bus.add_signal_receiver(receivedimmsg,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "ReceivedImMsg")

bus.add_signal_receiver(buddysignedon,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "BuddySignedOn")

print "This is a simple purple notification server."
print "It shows notifications when your buddy signs on or you get an IM message."

loop = gobject.MainLoop()
loop.run()