Do buddy icons
This commit is contained in:
+44
-7
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user