changeset 6d50c40b83de in /home/hg/repos/gajim

details:http://hg.gajim.org/gajim?cmd=changeset;node=6d50c40b83de
description: add XEP-0224 support (/attention command, persistant popup and 
special sound). F
        ixes #3465

diffstat:

 data/sounds/attention.wav                     |  Bin 
 src/chat_control.py                           |    9 ++++---
 src/command_system/implementation/standard.py |    5 ++++
 src/common/config.py                          |    2 +
 src/common/connection.py                      |   31 +++++++++++++++----------
 src/common/connection_handlers_events.py      |   22 +++++++++++++++++-
 src/common/xmpp/protocol.py                   |    1 +
 src/common/zeroconf/connection_zeroconf.py    |    9 ++++---
 src/config.py                                 |    1 +
 src/dialogs.py                                |   14 +++++-----
 src/groupchat_control.py                      |    5 ++-
 src/notify.py                                 |   31 ++++++++++++++-----------
 12 files changed, 86 insertions(+), 44 deletions(-)

diffs (truncated from 508 to 300 lines):

diff -r 47db41e2cbdc -r 6d50c40b83de data/sounds/attention.wav
Binary file data/sounds/attention.wav has changed
diff -r 47db41e2cbdc -r 6d50c40b83de src/chat_control.py
--- a/src/chat_control.py       Sun Apr 08 17:53:53 2012 +0200
+++ b/src/chat_control.py       Mon Apr 09 13:38:28 2012 +0200
@@ -863,7 +863,7 @@
 
     def send_message(self, message, keyID='', type_='chat', chatstate=None,
     msg_id=None, resource=None, xhtml=None, callback=None, callback_args=[],
-    process_commands=True):
+    process_commands=True, attention=False):
         """
         Send the given message to the active tab. Doesn't return None if error
         """
@@ -880,7 +880,7 @@
             keyID=keyID, type_=type_, chatstate=chatstate, msg_id=msg_id,
             resource=resource, user_nick=self.user_nick, xhtml=xhtml,
             label=label, callback=callback, callback_args=callback_args,
-            control=self))
+            control=self, attention=attention))
 
         # Record the history of sent messages
         self.save_message(message, 'sent')
@@ -2235,7 +2235,7 @@
             dialogs.ESessionInfoWindow(self.session)
 
     def send_message(self, message, keyID='', chatstate=None, xhtml=None,
-    process_commands=True):
+    process_commands=True, attention=False):
         """
         Send a message to contact
         """
@@ -2286,7 +2286,8 @@
         ChatControlBase.send_message(self, message, keyID, type_='chat',
             chatstate=chatstate_to_send, xhtml=xhtml, callback=_on_sent,
             callback_args=[contact, message, encrypted, xhtml,
-            self.get_seclabel()], process_commands=process_commands)
+            self.get_seclabel()], process_commands=process_commands,
+            attention=attention)
 
     def check_for_possible_paused_chatstate(self, arg):
         """
diff -r 47db41e2cbdc -r 6d50c40b83de 
src/command_system/implementation/standard.py
--- a/src/command_system/implementation/standard.py     Sun Apr 08 17:53:53 
2012 +0200
+++ b/src/command_system/implementation/standard.py     Mon Apr 09 13:38:28 
2012 +0200
@@ -230,6 +230,11 @@
         state = self._video_button.get_active()
         self._video_button.set_active(not state)
 
+    @command(raw=True)
+    @doc(_("Send a message to the contact that will attract his (her) 
attention"))
+    def attention(self, message):
+        self.send_message(message, process_commands=False, attention=True)
+
 class StandardChatCommands(CommandContainer):
     """
     This command container contains standard commands which are unique
diff -r 47db41e2cbdc -r 6d50c40b83de src/common/config.py
--- a/src/common/config.py      Sun Apr 08 17:53:53 2012 +0200
+++ b/src/common/config.py      Mon Apr 09 13:38:28 2012 +0200
@@ -300,6 +300,7 @@
             'stun_server': [opt_str, '', _('STUN server to use when using 
jingle')],
             'show_affiliation_in_groupchat': [opt_bool, True, _('If True, 
Gajim will show affiliation of groupchat occupants by adding a colored square 
to the status icon')],
             'global_proxy': [opt_str, '', _('Proxy used for all outgoing 
connections if the account does not have a specific proxy configured')],
+            'ignore_incoming_attention': [opt_bool, False, _('If True, Gajim 
will ignore incoming attention requestd ("wizz").')],
     }
 
     __options_per_key = {
@@ -497,6 +498,7 @@
     }
 
     soundevents_default = {
+            'attention_received': [True, 'attention.wav'],
             'first_message_received': [ True, 'message1.wav' ],
             'next_message_received_focused': [ True, 'message2.wav' ],
             'next_message_received_unfocused': [ True, 'message2.wav' ],
diff -r 47db41e2cbdc -r 6d50c40b83de src/common/connection.py
--- a/src/common/connection.py  Sun Apr 08 17:53:53 2012 +0200
+++ b/src/common/connection.py  Mon Apr 09 13:38:28 2012 +0200
@@ -253,7 +253,7 @@
     def _prepare_message(self, jid, msg, keyID, type_='chat', subject='',
     chatstate=None, msg_id=None, resource=None, user_nick=None, xhtml=None,
     session=None, forward_from=None, form_node=None, label=None,
-    original_message=None, delayed=None, callback=None):
+    original_message=None, delayed=None, attention=False, callback=None):
         if not self.connection or self.connected < 2:
             return 1
         try:
@@ -304,7 +304,8 @@
                                     msgtxt, original_message, fjid, resource,
                                     jid, xhtml, subject, chatstate, msg_id,
                                     label, forward_from, delayed, session,
-                                    form_node, user_nick, keyID, callback)
+                                    form_node, user_nick, keyID, attention,
+                                    callback)
                         gajim.nec.push_incoming_event(GPGTrustKeyEvent(None,
                             conn=self, callback=_on_always_trust))
                     else:
@@ -312,7 +313,7 @@
                             original_message, fjid, resource, jid, xhtml,
                             subject, chatstate, msg_id, label, forward_from,
                             delayed, session, form_node, user_nick, keyID,
-                            callback)
+                            attention, callback)
                 gajim.thread_interface(encrypt_thread, [msg, keyID, False],
                     _on_encrypted, [])
                 return
@@ -320,18 +321,18 @@
             self._message_encrypted_cb(('', error), type_, msg, msgtxt,
                 original_message, fjid, resource, jid, xhtml, subject,
                 chatstate, msg_id, label, forward_from, delayed, session,
-                form_node, user_nick, keyID, callback)
+                form_node, user_nick, keyID, attention, callback)
             return
 
         self._on_continue_message(type_, msg, msgtxt, original_message, fjid,
             resource, jid, xhtml, subject, msgenc, keyID, chatstate, msg_id,
             label, forward_from, delayed, session, form_node, user_nick,
-            callback)
+            attention, callback)
 
     def _message_encrypted_cb(self, output, type_, msg, msgtxt,
     original_message, fjid, resource, jid, xhtml, subject, chatstate, msg_id,
     label, forward_from, delayed, session, form_node, user_nick, keyID,
-    callback):
+    attention, callback):
         msgenc, error = output
 
         if msgenc and not error:
@@ -344,7 +345,7 @@
             self._on_continue_message(type_, msg, msgtxt, original_message,
                 fjid, resource, jid, xhtml, subject, msgenc, keyID,
                 chatstate, msg_id, label, forward_from, delayed, session,
-                form_node, user_nick, callback)
+                form_node, user_nick, attention, callback)
             return
         # Encryption failed, do not send message
         tim = localtime()
@@ -353,7 +354,8 @@
 
     def _on_continue_message(self, type_, msg, msgtxt, original_message, fjid,
     resource, jid, xhtml, subject, msgenc, keyID, chatstate, msg_id,
-    label, forward_from, delayed, session, form_node, user_nick, callback):
+    label, forward_from, delayed, session, form_node, user_nick, attention,
+    callback):
         if type_ == 'chat':
             msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ=type_,
                     xhtml=xhtml)
@@ -424,6 +426,10 @@
             if session.enable_encryption:
                 msg_iq = session.encrypt_stanza(msg_iq)
 
+        # XEP-0224
+        if attention:
+            msg_iq.setTag('attention', namespace=common.xmpp.NS_ATTENTION)
+
         if callback:
             callback(jid, msg, keyID, forward_from, session, original_message,
                 subject, type_, msg_iq, xhtml)
@@ -1794,8 +1800,8 @@
     def send_message(self, jid, msg, keyID=None, type_='chat', subject='',
     chatstate=None, msg_id=None, resource=None, user_nick=None, xhtml=None,
     label=None, session=None, forward_from=None, form_node=None,
-    original_message=None, delayed=None, callback=None, callback_args=[],
-    now=False):
+    original_message=None, delayed=None, attention=False, callback=None,
+    callback_args=[], now=False):
 
         def cb(jid, msg, keyID, forward_from, session, original_message,
         subject, type_, msg_iq, xhtml):
@@ -1813,7 +1819,8 @@
             chatstate=chatstate, msg_id=msg_id, resource=resource,
             user_nick=user_nick, xhtml=xhtml, label=label, session=session,
             forward_from=forward_from, form_node=form_node,
-            original_message=original_message, delayed=delayed, callback=cb)
+            original_message=original_message, delayed=delayed,
+            attention=attention, callback=cb)
 
     def _nec_message_outgoing(self, obj):
         if obj.account != self.name:
@@ -1838,7 +1845,7 @@
             resource=obj.resource, user_nick=obj.user_nick, xhtml=obj.xhtml,
             label=obj.label, session=obj.session, 
forward_from=obj.forward_from,
             form_node=obj.form_node, original_message=obj.original_message,
-            delayed=obj.delayed, callback=cb)
+            delayed=obj.delayed, attention=obj.attention, callback=cb)
 
     def send_contacts(self, contacts, jid):
         """
diff -r 47db41e2cbdc -r 6d50c40b83de src/common/connection_handlers_events.py
--- a/src/common/connection_handlers_events.py  Sun Apr 08 17:53:53 2012 +0200
+++ b/src/common/connection_handlers_events.py  Mon Apr 09 13:38:28 2012 +0200
@@ -1192,6 +1192,7 @@
         self.sent = self.msg_obj.sent
         self.popup = False
         self.msg_id = None # id in log database
+        self.attention = False # XEP-0224
 
         self.receipt_request_tag = self.stanza.getTag('request',
             namespace=xmpp.NS_RECEIPTS)
@@ -1206,6 +1207,9 @@
         if self.seclabel:
             self.displaymarking = self.seclabel.getTag('displaymarking')
 
+        if self.stanza.getTag('attention', namespace=xmpp.NS_ATTENTION):
+            self.attention = True
+
         self.form_node = self.stanza.getTag('x', namespace=xmpp.NS_DATA)
 
         if gajim.config.get('ignore_incoming_xhtml'):
@@ -2062,7 +2066,19 @@
             # we're online or chat
             self.do_popup = True
 
-        if self.first_unread and helpers.allow_sound_notification(
+        if msg_obj.attention and not gajim.config.get(
+        'ignore_incoming_attention'):
+            self.popup_timeout = 0
+            self.do_popup = True
+        else:
+            self.popup_timeout = gajim.config.get('notification_timeout')
+
+        if msg_obj.attention and not gajim.config.get(
+        'ignore_incoming_attention') and gajim.config.get_per('soundevents',
+        'attention_received', 'enabled'):
+            self.sound_event = 'attention_received'
+            self.do_sound = True
+        elif self.first_unread and helpers.allow_sound_notification(
         self.conn.name, 'first_message_received'):
             self.do_sound = True
         elif not self.first_unread and self.control_focused and \
@@ -2175,6 +2191,8 @@
         self.popup_image = gtkgui_helpers.get_path_to_generic_or_avatar(
             img_path, jid=self.jid, suffix=suffix)
 
+        self.popup_timeout = gajim.config.get('notification_timeout')
+
         if event == 'status_change':
             self.popup_title = _('%(nick)s Changed Status') % \
                 {'nick': gajim.get_name_from_jid(account, self.jid)}
@@ -2219,6 +2237,7 @@
         self.popup_event_type = ''
         self.popup_msg_type = ''
         self.popup_image = ''
+        self.popup_timeout = -1
 
         self.do_command = False
         self.command = ''
@@ -2261,6 +2280,7 @@
         self.now = False
         self.is_loggable = True
         self.control = None
+        self.attention = False
 
     def generate(self):
         return True
diff -r 47db41e2cbdc -r 6d50c40b83de src/common/xmpp/protocol.py
--- a/src/common/xmpp/protocol.py       Sun Apr 08 17:53:53 2012 +0200
+++ b/src/common/xmpp/protocol.py       Mon Apr 09 13:38:28 2012 +0200
@@ -40,6 +40,7 @@
 NS_ARCHIVE_MANUAL = NS_ARCHIVE + ':manual'                            # 
XEP-0136
 NS_ARCHIVE_PREF   = NS_ARCHIVE + ':pref'
 NS_ATOM           = 'http://www.w3.org/2005/Atom'
+NS_ATTENTION      = 'urn:xmpp:attention:0'                            # 
XEP-0224
 NS_AUTH           = 'jabber:iq:auth'
 NS_AVATAR         = 'http://www.xmpp.org/extensions/xep-0084.html#ns-metadata'
 NS_BIND           = 'urn:ietf:params:xml:ns:xmpp-bind'
diff -r 47db41e2cbdc -r 6d50c40b83de src/common/zeroconf/connection_zeroconf.py
--- a/src/common/zeroconf/connection_zeroconf.py        Sun Apr 08 17:53:53 
2012 +0200
+++ b/src/common/zeroconf/connection_zeroconf.py        Mon Apr 09 13:38:28 
2012 +0200
@@ -336,8 +336,8 @@
     def send_message(self, jid, msg, keyID, type_='chat', subject='',
     chatstate=None, msg_id=None, resource=None, user_nick=None, xhtml=None,
     label=None, session=None, forward_from=None, form_node=None,
-    original_message=None, delayed=None, callback=None, callback_args=[],
-    now=True):
+    original_message=None, delayed=None, attention=False, callback=None,
+    callback_args=[], now=True):
 
         def on_send_ok(msg_id):
             gajim.nec.push_incoming_event(MessageSentEvent(None, conn=self,
@@ -370,7 +370,8 @@
                 chatstate=chatstate, msg_id=msg_id, resource=resource,
                 user_nick=user_nick, xhtml=xhtml, session=session,
                 forward_from=forward_from, form_node=form_node,
-                original_message=original_message, delayed=delayed, 
callback=cb)
+                original_message=original_message, delayed=delayed,
+                attention=attention, callback=cb)
 
     def _nec_message_outgoing(self, obj):
         if obj.account != self.name:
@@ -411,7 +412,7 @@
             resource=obj.resource, user_nick=obj.user_nick, xhtml=obj.xhtml,
             label=obj.label, session=obj.session, 
forward_from=obj.forward_from,
             form_node=obj.form_node, original_message=obj.original_message,
-            delayed=obj.delayed, callback=cb)
+            delayed=obj.delayed, attention=obj.attention, callback=cb)
 
     def send_stanza(self, stanza):
         # send a stanza untouched
_______________________________________________
Commits mailing list
[email protected]
http://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to