From 59f25b07418e5f1143d9ddf94b5497ca9436f8d9 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 22 Jun 2006 22:07:54 +0000 Subject: Get one-to-one chat to actually work... --- (limited to 'activities/chat') diff --git a/activities/chat/ChatActivity.py b/activities/chat/ChatActivity.py index cb3ada8..07d8762 100644 --- a/activities/chat/ChatActivity.py +++ b/activities/chat/ChatActivity.py @@ -1,13 +1,16 @@ import dbus import random +import logging import pygtk pygtk.require('2.0') import gtk +import gobject from sugar.activity.Activity import Activity from sugar.LogWriter import LogWriter -from sugar.presence.Service import Service +from sugar.presence import Service +from sugar.chat.Chat import Chat from sugar.chat.BuddyChat import BuddyChat from sugar.p2p.Stream import Stream from sugar.presence.PresenceService import PresenceService @@ -17,21 +20,24 @@ _CHAT_ACTIVITY_TYPE = "_chat_activity_type._tcp" class ChatActivity(Activity): def __init__(self, service): - Activity.__init__(self, _GMAIL_ACTIVITY_TYPE) + Activity.__init__(self, _CHAT_ACTIVITY_TYPE) self._service = service + self._chat = BuddyChat(self._service) def on_connected_to_shell(self): + self.set_tab_text(self._service.get_name()) self.set_can_close(True) - self.set_tab_icon(icon_name="im") + self.set_tab_icon(name = "im") self.set_show_tab_icon(True) plug = self.gtk_plug() - - chat = BuddyChat(self._service) - plug.add(chat) - chat.show() + plug.add(self._chat) + self._chat.show() plug.show() + + def recv_message(self, message): + self._chat.recv_message(message) class ChatShellDbusService(dbus.service.Object): def __init__(self, parent): @@ -42,8 +48,8 @@ class ChatShellDbusService(dbus.service.Object): dbus.service.Object.__init__(self, bus_name, object_path) @dbus.service.method('com.redhat.Sugar.ChatShell') - def open_chat(self, message): - self._parent.send_text_message(message) + def open_chat(self, serialized_service): + self._parent.open_chat(Service.deserialize(serialized_service)) class ChatShell: instance = None @@ -55,25 +61,49 @@ class ChatShell: get_instance = staticmethod(get_instance) def __init__(self): + ChatShellDbusService(self) + + self._chats = {} + self._pservice = PresenceService.get_instance() self._pservice.start() self._pservice.track_service_type(BuddyChat.SERVICE_TYPE) def start(self): port = random.randint(5000, 65535) - service = Service(sugar.env.get_nick_name(), BuddyChat.SERVICE_TYPE, - 'local', '', port) + service = Service.Service(sugar.env.get_nick_name(), BuddyChat.SERVICE_TYPE, + 'local', '', port) self._buddy_stream = Stream.new_from_service(service) - self._buddy_stream.set_data_listener(getattr(self, "_recv_message")) + self._buddy_stream.set_data_listener(self._recv_message) self._pservice.register_service(service) - def _recv_message(self, address, msg): - print msg + def _recv_message(self, address, message): + [nick, msg] = Chat.deserialize_message(message) + buddy = self._pservice.get_buddy_by_nick_name(nick) + if buddy: + if buddy == self._pservice.get_owner(): + return + service = buddy.get_service_of_type(BuddyChat.SERVICE_TYPE) + name = service.get_name() + if service: + if not self._chats.has_key(name): + self.open_chat(service) + self._chats[name].recv_message(message) + else: + logging.error('The buddy %s does not have a chat service.' % (nick)) + else: + logging.error('The buddy %s is not present.' % (nick)) + return - def open_chat(self, serialized_service): - service = Service.deserialize(serialized_service) - self._chat = ChatActivity(service) - self._chat.connect_to_shell() + def open_chat(self, service): + chat = ChatActivity(service) + self._chats[service.get_name()] = chat + gobject.idle_add(self._connect_chat, chat) + return chat + + def _connect_chat(self, chat): + chat.connect_to_shell() + return False log_writer = LogWriter("Chat") log_writer.start() -- cgit v0.9.1