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