Mercurial > pidgin.yaz
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()