Prefixing more hacks with HACK to make it easier to remove later
[theonering] / src / channel / text.py
index 22e840d..d2c5313 100644 (file)
@@ -17,12 +17,20 @@ class TextChannel(telepathy.server.ChannelTypeText):
        Look into implementing ChannelInterfaceMessages for rich text formatting
        """
 
-       def __init__(self, connection, h):
-               telepathy.server.ChannelTypeText.__init__(self, connection, h)
+       def __init__(self, connection, manager, props, contactHandle):
+               self._manager = manager
+               self._props = props
+
+               try:
+                       # HACK Older python-telepathy way
+                       telepathy.server.ChannelTypeText.__init__(self, connection, contactHandle)
+               except TypeError:
+                       # HACK Newer python-telepathy way
+                       telepathy.server.ChannelTypeText.__init__(self, connection, manager, props)
                self._nextRecievedId = 0
                self._lastMessageTimestamp = datetime.datetime(1, 1, 1)
 
-               self._otherHandle = h
+               self._otherHandle = contactHandle
 
                self._callback = coroutines.func_sink(
                        coroutines.expand_positional(
@@ -48,21 +56,25 @@ class TextChannel(telepathy.server.ChannelTypeText):
                        raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
 
                self._conn.session.backend.send_sms(self._otherHandle.phoneNumber, text)
+               self._conn.session.stateMachine.reset_timers()
 
                self.Sent(int(time.time()), messageType, text)
 
        @gtk_toolbox.log_exception(_moduleLogger)
        def Close(self):
-               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.close()
 
-                       self._conn.session.conversations.updateSignalHandler.unregister_sink(
-                               self._callback
-                       )
-               finally:
-                       telepathy.server.ChannelTypeText.Close(self)
-                       self.remove_from_connection()
+       def close(self):
+               self._conn.session.conversations.updateSignalHandler.unregister_sink(
+                       self._callback
+               )
+               self._callback = None
+
+               telepathy.server.ChannelTypeText.Close(self)
+               if self._manager.channel_exists(self._props):
+                       # HACK Older python-telepathy requires doing this manually
+                       self._manager.remove_channel(self)
+               self.remove_from_connection()
 
        @property
        def _contactKey(self):
@@ -80,27 +92,31 @@ class TextChannel(telepathy.server.ChannelTypeText):
 
        def _report_conversation(self, mergedConversations):
                newConversations = mergedConversations.conversations
-               newConversations = list(newConversations)
-               lenMerged = len(newConversations)
                newConversations = self._filter_out_reported(newConversations)
-               newConversations = list(newConversations)
-               lenUnreported = len(newConversations)
                newConversations = self._filter_out_read(newConversations)
                newConversations = list(newConversations)
-               lenUnread = len(newConversations)
                if not newConversations:
                        _moduleLogger.info(
                                "New messages for %r have already been read externally" % (self._contactKey, )
                        )
                        return
-               _moduleLogger.debug("%s, %s, %s" % (lenMerged, lenUnreported, lenUnread))
                self._lastMessageTimestamp = newConversations[-1].time
 
-               for newConversation in newConversations:
-                       for newMessage in newConversations.messages:
-                               if newMessage.name != "Me:":
-                                       formattedMessage = self._format_message(newMessage)
-                                       self._report_new_message(formattedMessage)
+               messages = [
+                       newMessage
+                       for newConversation in newConversations
+                       for newMessage in newConversation.messages
+                       if newMessage.whoFrom != "Me:"
+               ]
+               if not newConversations:
+                       _moduleLogger.info(
+                               "All incoming messages were really outbound messages for %r" % (self._contactKey, )
+                       )
+                       return
+
+               for newMessage in messages:
+                       formattedMessage = self._format_message(newMessage)
+                       self._report_new_message(formattedMessage)
 
        def _filter_out_reported(self, conversations):
                return (