Do buddy icons

This commit is contained in:
Dan Williams
2006-05-21 21:30:26 -04:00
parent 1c54ef5002
commit 2c272cc892
4 changed files with 104 additions and 17 deletions
+44 -7
View File
@@ -2,6 +2,7 @@
# -*- tab-width: 4; indent-tabs-mode: t -*-
import sys
import base64
import dbus
import dbus.service
@@ -292,7 +293,7 @@ class BuddyChat(Chat):
self.activity_set_tab_icon_name("im")
self.activity_show_icon(True)
self._stream_writer = self._controller.new_buddy_writer(self._buddy.get_service_name())
def recv_message(self, sender, msg):
Chat.recv_message(self, self._buddy, msg)
self._controller.notify_new_message(self, self._buddy)
@@ -300,7 +301,21 @@ class BuddyChat(Chat):
def activity_on_close_from_user(self):
Chat.activity_on_close_from_user(self)
del self._chats[self._buddy]
class BuddyIconRequestHandler(object):
def __init__(self, group, stream):
self._group = group
self._stream = stream
self._stream.register_handler(self._handle_buddy_icon_request, "get_buddy_icon")
def _handle_buddy_icon_request(self):
"""XMLRPC method, return the owner's icon encoded with base64."""
icon = self._group.get_owner().get_icon()
if icon:
return base64.b64encode(icon)
return ''
class GroupChat(Chat):
@@ -327,7 +342,8 @@ class GroupChat(Chat):
def _start(self):
self._group = LocalGroup()
self._group.add_presence_listener(self._on_group_event)
self._group.add_presence_listener(self._on_group_presence_event)
self._group.add_service_listener(self._on_group_service_event)
self._group.join()
name = self._group.get_owner().get_service_name()
@@ -336,6 +352,7 @@ class GroupChat(Chat):
# specific buddy chats
buddy_service = Service(name, CHAT_SERVICE_TYPE, CHAT_SERVICE_PORT)
self._buddy_stream = Stream.new_from_service(buddy_service, self._group)
self._buddy_icon_handler = BuddyIconRequestHandler(self._group, self._buddy_stream)
self._buddy_stream.set_data_listener(self._buddy_recv_message)
buddy_service.register(self._group)
@@ -343,8 +360,8 @@ class GroupChat(Chat):
group_service = Service(name, GROUP_CHAT_SERVICE_TYPE,
GROUP_CHAT_SERVICE_PORT,
GROUP_CHAT_SERVICE_ADDRESS)
self._group.add_service(group_service)
self._group.add_service(group_service)
self._group_stream = Stream.new_from_service(group_service, self._group)
self._group_stream.set_data_listener(self._group_recv_message)
self._stream_writer = self._group_stream.new_writer()
@@ -432,7 +449,6 @@ class GroupChat(Chat):
def _on_buddyList_buddy_selected(self, widget, *args):
(model, aniter) = widget.get_selection().get_selected()
name = self._buddy_list_model.get(aniter, self._MODEL_COL_NICK)
print "Selected %s" % name
def _on_buddyList_buddy_double_clicked(self, widget, *args):
""" Select the chat for this buddy or group """
@@ -444,7 +460,28 @@ class GroupChat(Chat):
self._chats[buddy] = chat
chat.activity_connect_to_shell()
def _on_group_event(self, action, buddy):
def _request_buddy_icon(self, buddy):
writer = self.new_buddy_writer(buddy.get_service_name())
icon = writer.custom_request("get_buddy_icon")
if icon and len(icon):
icon = base64.b64decode(icon)
print "Setting buddy icon for '%s' to %s" % (buddy.get_nick_name(), icon)
buddy.set_icon(icon)
def _on_group_service_event(self, action, service):
if action == Group.SERVICE_ADDED:
# Look for the olpc chat service
if service.get_type() == CHAT_SERVICE_TYPE:
# Find the buddy this service belongs to
buddy = self._group.get_buddy(service.get_name())
if buddy and buddy.get_address() == service.get_address():
# Try to get the buddy's icon
if buddy.get_nick_name() != self._group.get_owner().get_nick_name():
self._request_buddy_icon(buddy)
elif action == Group.SERVICE_REMOVED:
pass
def _on_group_presence_event(self, action, buddy):
if buddy.get_nick_name() == self._group.get_owner().get_nick_name():
# Do not show ourself in the buddy list
pass