view finch/libgnt/pygnt/dbus-gnt @ 19649:c6f1f9971c4a

When doing oscar server-side list management, do deletions before additions because if it's done the other way then it's possible for Pidgin to try to add one buddy to two different groups, which isn't allowed for ICQ. Fixes schoen's comment at http://developer.pidgin.im/ticket/576 References #576.
author Mark Doliner <mark@kingant.net>
date Wed, 05 Sep 2007 05:43:08 +0000
parents c1c260d41365
children
line wrap: on
line source

#!/usr/bin/env python

# This script requires Python 2.4 and pygnt 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
import gnt
import sys

import time

convwins = {}

def buddysignedon(buddy):
    pass

def conv_closed(conv):
    key = get_dict_key(conv)
    stuff = convwins[key]
    stuff[0].destroy()
    # if a conv window is closed, then reopened, this thing crashes
    convwins[key] = None

def add_message(conv, who, msg, flags, timestamp):
    stuff = show_conversation(conv, False)
    tv = stuff[1]
    tv.append_text_with_flags("\n", 0)
    if timestamp:
        tv.append_text_with_flags(time.strftime("(%X) ", time.localtime(timestamp)), 8)
    else:
        tv.append_text_with_flags(time.strftime("(%X) "), 8)
    if flags & 3:
        tv.append_text_with_flags(who + ": ", 1)
        msg = purple.PurpleMarkupStripHtml(msg)
        tv.append_text_with_flags(msg, 0)
        stuff[0].set_urgent()
    else:
        tv.append_text_with_flags(msg, 8)
    tv.scroll(0)

def wrote_msg(account, who, msg, conv, flags):
    add_message(conv, who, msg, flags, None)

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(buddysignedon,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "BuddySignedOn")

bus.add_signal_receiver(wrote_msg,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "WroteImMsg")

bus.add_signal_receiver(wrote_msg,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "WroteChatMsg")

bus.add_signal_receiver(conv_closed,
                        dbus_interface = "im.pidgin.purple.PurpleInterface",
                        signal_name = "DeletingConversation")

def get_dict_key(conv):
    val = purple.PurpleConversationGetName(conv)
    return val

def send_im_cb(entry, key, conv):
    if key[0] == '\r':
        # XXX: do something about the / commands
        type = purple.PurpleConversationGetType(conv)
        if type == 1:
            imdata = purple.PurpleConversationGetImData(conv)
            purple.PurpleConvImSend(imdata, entry.get_text())
        else:
            chatdata = purple.PurpleConversationGetChatData(conv)
            purple.PurpleConvChatSend(chatdata, entry.get_text())
        entry.clear()

def conv_window_destroyed(win, key):
    del convwins[key]

def show_conversation(conv, history):
    key = get_dict_key(conv)
    if key in convwins:
        return convwins[key]
    win = gnt.Window()
    vbox = gnt.Box(0, 1)
    win.add_widget(vbox)
    win.set_title(purple.PurpleConversationGetName(conv))
    win.set_pad(0)
    vbox.set_pad(0)
    tv = gnt.TextView()
    entry = gnt.Entry("")
    vbox.add_widget(tv)
    entry.set_size(40, 1)
    vbox.add_widget(entry)
    entry.connect("key_pressed", send_im_cb, conv)
    tv.clear()
    tv.attach_scroll_widget(entry)
    win.show()
    convwins[key] = [win, tv, entry]
    win.connect("destroy", conv_window_destroyed, key)
    
    if history:
        msgs = purple.PurpleConversationGetMessageHistory(conv)
        msgs.reverse()
        for msg in msgs:
            who = purple.PurpleConversationMessageGetSender(msg)
            what = purple.PurpleConversationMessageGetMessage(msg)
            flags = purple.PurpleConversationMessageGetFlags(msg)
            when = purple.PurpleConversationMessageGetTimestamp(msg)
            add_message(conv, who, what, flags, when)

    return convwins[key]

def show_buddylist():
    win = gnt.Window()
    tree = gnt.Tree()
    tree.set_property("columns", 1)
    win.add_widget(tree)
    node = purple.PurpleBlistGetRoot()
    while node:
        if purple.PurpleBlistNodeIsGroup(node):
            sys.stderr.write(str(node) + "\n")
            tree.add_row_after(str(node), ["asd", ""], None, None)
            #tree.add_row_after(node, [str(purple.PurpleGroupGetName(node)), ""], None, None)
            #tree.add_row_after(node, ["aasd", ""], None, None)
        elif purple.PurpleBlistNodeIsContact(node):
            buddy = purple.PurpleContactGetPriorityBuddy(node)
            group = purple.PurpleBuddyGetGroup(buddy)
            #tree.add_row_after(node, [str(purple.PurpleBuddyGetName(buddy)), ""], group, None)

        node = purple.PurpleBlistNodeNext(node, False)
    win.show()

gnt.gnt_init()

# show_buddylist()

convs = purple.PurpleGetConversations()
for conv in convs:
    show_conversation(conv, True)

gnt.gnt_main()

gnt.gnt_quit()