# HG changeset patch
# User souliane <souliane@mailoo.org>
# Date 1380185097 -7200
# Node ID 5c5cf5bca240c05282b51bcefb315ff7e5b88ec2
# Parent  e2eff3c7ad02ca40cf0dc73de554a037e66c8d3b
plugin XEP-0085: improvement for sending "composing" state

diff -r e2eff3c7ad02 -r 5c5cf5bca240 src/plugins/plugin_xep_0085.py
--- a/src/plugins/plugin_xep_0085.py	Thu Sep 26 10:14:23 2013 +0200
+++ b/src/plugins/plugin_xep_0085.py	Thu Sep 26 10:44:57 2013 +0200
@@ -99,7 +99,7 @@
         host.trigger.add("MessageReceived", self.messageReceivedTrigger)
         host.trigger.add("sendMessageXml", self.sendMessageXmlTrigger)
         host.trigger.add("paramUpdateTrigger", self.paramUpdateTrigger)
-        #TODO: handle profile disconnexion (free memory in entity data)
+        # TODO: handle profile disconnexion (free memory in entity data)
 
         # args: to_s (jid as string), profile
         host.bridge.addMethod("chatStateComposing", ".plugin", in_sign='ss',
@@ -217,7 +217,7 @@
         """
         Launch the chat state machine on "active" state.
         """
-        # TODO: use also the resource in map key
+        # TODO: use also the JID resource in the map key
         to_jid = to_jid.userhostJID()
         profile = self.host.memory.getProfileName(profile_key)
         if profile is None:
@@ -227,18 +227,32 @@
 
     def chatStateComposing(self, to_jid_s, profile_key):
         """
-        Move to the "composing" state.
+        Move to the "composing" state. Since this method is called
+        from the front-end, it needs to check the values of the
+        parameter "Send chat state notifications" and the entity
+        data associated to the target JID.
+        TODO: try to optimize this method which is called often
         """
-        # TODO: use also the resource in map key
+        # check if the parameter is active
+        if not self.host.memory.getParamA(PARAM_NAME, PARAM_KEY, profile_key=profile_key):
+            return
+        # TODO: use also the JID resource in the map key
         to_jid = JID(to_jid_s).userhostJID()
         profile = self.host.memory.getProfileName(profile_key)
         if profile is None:
             raise exceptions.ProfileUnknownError
+        # check if notifications should be sent to this contact
+        contact_enabled = True
         try:
-            self.map[profile][to_jid]._onEvent("composing")
-        except:
-            # it just means that no first message has been sent already
-            return
+            contact_enabled = self.host.memory.getEntityData(
+                to_jid, [ENTITY_KEY], profile)[ENTITY_KEY]
+        except (exceptions.UnknownEntityError, KeyError):
+            # wait for the first message before sending states
+            pass
+        if not contact_enabled:
+            return True
+        # now we are sure that the state should be sent
+        self.map[profile][to_jid]._onEvent("composing")
 
 
 class ChatStateMachine: