X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fchannel%2Ftext.py;h=f9c00ae8c4a67276d1243a29e4eb28f0dd04762d;hp=4adc5441cf0e8d2a058094ac3b4e88aa205180b8;hb=89e33abd2a4f6962aa7d6ac721a9a1bb87611c11;hpb=f26efb065490275f8b82b64a5ee12f40c820dd34 diff --git a/src/channel/text.py b/src/channel/text.py index 4adc544..f9c00ae 100644 --- a/src/channel/text.py +++ b/src/channel/text.py @@ -1,10 +1,12 @@ import time +import datetime import logging import telepathy +import util.go_utils as gobject_utils +import util.coroutines as coroutines import gtk_toolbox -import handle _moduleLogger = logging.getLogger("channel.text") @@ -18,9 +20,23 @@ class TextChannel(telepathy.server.ChannelTypeText): def __init__(self, connection, h): telepathy.server.ChannelTypeText.__init__(self, connection, h) self._nextRecievedId = 0 + self._lastMessageTimestamp = datetime.datetime(1, 1, 1) self._otherHandle = h + self._conn.session.conversations.updateSignalHandler.register_sink( + self._on_conversations_updated + ) + + # The only reason there should be anything in the conversation is if + # its new, so report it all + try: + conversation = self._conn.session.conversations.get_conversation(self._contactKey) + except KeyError: + pass + else: + self._report_conversation(conversation) + @gtk_toolbox.log_exception(_moduleLogger) def Send(self, messageType, text): if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL: @@ -32,21 +48,57 @@ class TextChannel(telepathy.server.ChannelTypeText): @gtk_toolbox.log_exception(_moduleLogger) def Close(self): - telepathy.server.ChannelTypeText.Close(self) - self.remove_from_connection() - - def _on_message_received(self, contactId, contactNumber, message): - """ - @todo Attatch this to receiving a message - """ + try: + # Clear since the user has seen it all and it should start a new conversation + self._conn.session.conversations.clear_conversation(self._contactKey) + + self._conn.session.conversations.updateSignalHandler.unregister_sink( + self._on_conversations_updated + ) + finally: + telepathy.server.ChannelTypeText.Close(self) + self.remove_from_connection() + + @property + def _contactKey(self): + contactKey = self._otherHandle.contactID, self._otherHandle.phoneNumber + return contactKey + + @coroutines.func_sink + @coroutines.expand_positional + @gobject_utils.async + def _on_conversations_updated(self, conversationIds): + if self._contactKey not in conversationIds: + return + conversation = self._conn.session.conversations.get_conversation(self._contactKey) + self._report_conversation(conversation) + + def _report_conversation(self, conversation): + # @bug Check if messages sent need to be filtered out + completeMessageHistory = conversation["messageParts"] + messages = self._filter_seen_messages(completeMessageHistory) + self._lastMessageTimestamp = messages[-1][0] + formattedMessage = self._format_messages(messages) + self._report_new_message(formattedMessage) + + def _filter_seen_messages(self, messages): + return ( + message + for message in messages + if self._lastMessageTimestamp < message[0] + ) + + def _format_messages(self, messages): + return "\n".join(message[1] for message in messages) + + def _report_new_message(self, message): currentReceivedId = self._nextRecievedId timestamp = int(time.time()) - h = handle.create_handle(self._conn, "contact", contactId, contactNumber) type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL message = message.content - _moduleLogger.info("Received message from User %r" % h) - self.Received(id, timestamp, h, type, 0, message) + _moduleLogger.info("Received message from User %r" % self._otherHandle) + self.Received(id, timestamp, self._otherHandle, type, 0, message) self._nextRecievedId += 1