Support for displaying XEP-0184 receipts.
This commit is contained in:
parent
8b1abeba54
commit
f704701ba4
5 changed files with 91 additions and 13 deletions
BIN
data/pixmaps/xep0184.png
Normal file
BIN
data/pixmaps/xep0184.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 194 B |
|
@ -45,7 +45,7 @@ from common.contacts import GC_Contact
|
||||||
from common.logger import Constants
|
from common.logger import Constants
|
||||||
constants = Constants()
|
constants = Constants()
|
||||||
from common.rst_xhtml_generator import create_xhtml
|
from common.rst_xhtml_generator import create_xhtml
|
||||||
from common.xmpp.protocol import NS_XHTML, NS_FILE, NS_MUC, NS_ESESSION
|
from common.xmpp.protocol import NS_XHTML, NS_FILE, NS_MUC, NS_RECEIPTS, NS_ESESSION
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import gtkspell
|
import gtkspell
|
||||||
|
@ -660,7 +660,7 @@ class ChatControlBase(MessageControl):
|
||||||
|
|
||||||
def print_conversation_line(self, text, kind, name, tim,
|
def print_conversation_line(self, text, kind, name, tim,
|
||||||
other_tags_for_name=[], other_tags_for_time=[], other_tags_for_text=[],
|
other_tags_for_name=[], other_tags_for_time=[], other_tags_for_text=[],
|
||||||
count_as_new=True, subject=None, old_kind=None, xhtml=None, simple=False):
|
count_as_new=True, subject=None, old_kind=None, xhtml=None, simple=False, xep0184_id = None):
|
||||||
'''prints 'chat' type messages'''
|
'''prints 'chat' type messages'''
|
||||||
jid = self.contact.jid
|
jid = self.contact.jid
|
||||||
full_jid = self.get_full_jid()
|
full_jid = self.get_full_jid()
|
||||||
|
@ -672,6 +672,9 @@ class ChatControlBase(MessageControl):
|
||||||
other_tags_for_name, other_tags_for_time, other_tags_for_text,
|
other_tags_for_name, other_tags_for_time, other_tags_for_text,
|
||||||
subject, old_kind, xhtml, simple=simple)
|
subject, old_kind, xhtml, simple=simple)
|
||||||
|
|
||||||
|
if xep0184_id is not None:
|
||||||
|
textview.show_xep0184_warning(xep0184_id)
|
||||||
|
|
||||||
if not count_as_new:
|
if not count_as_new:
|
||||||
return
|
return
|
||||||
if kind == 'incoming':
|
if kind == 'incoming':
|
||||||
|
@ -1538,12 +1541,23 @@ class ChatControl(ChatControlBase):
|
||||||
gobject.source_remove(self.possible_inactive_timeout_id)
|
gobject.source_remove(self.possible_inactive_timeout_id)
|
||||||
self._schedule_activity_timers()
|
self._schedule_activity_timers()
|
||||||
|
|
||||||
if ChatControlBase.send_message(self, message, keyID,
|
id = ChatControlBase.send_message(self, message, keyID,
|
||||||
type = 'chat', chatstate = chatstate_to_send,
|
type = 'chat', chatstate = chatstate_to_send,
|
||||||
composing_xep = composing_xep,
|
composing_xep = composing_xep,
|
||||||
process_command = process_command):
|
process_command = process_command)
|
||||||
|
if id:
|
||||||
|
# XXX: Once we have fallback to disco, remove
|
||||||
|
# notexistant check
|
||||||
|
if gajim.capscache.is_supported(contact, NS_RECEIPTS) \
|
||||||
|
and not gajim.capscache.is_supported(contact,
|
||||||
|
'notexistant') and gajim.config.get_per('accounts',
|
||||||
|
self.account, 'request_receipt'):
|
||||||
|
xep0184_id = id
|
||||||
|
else:
|
||||||
|
xep0184_id = None
|
||||||
|
|
||||||
self.print_conversation(message, self.contact.jid,
|
self.print_conversation(message, self.contact.jid,
|
||||||
encrypted = encrypted)
|
encrypted = encrypted, xep0184_id = xep0184_id)
|
||||||
|
|
||||||
def check_for_possible_paused_chatstate(self, arg):
|
def check_for_possible_paused_chatstate(self, arg):
|
||||||
''' did we move mouse of that window or write something in message
|
''' did we move mouse of that window or write something in message
|
||||||
|
@ -1629,7 +1643,7 @@ class ChatControl(ChatControlBase):
|
||||||
self.session.is_loggable(), self.session and self.session.verified_identity)
|
self.session.is_loggable(), self.session and self.session.verified_identity)
|
||||||
|
|
||||||
def print_conversation(self, text, frm='', tim=None, encrypted=False,
|
def print_conversation(self, text, frm='', tim=None, encrypted=False,
|
||||||
subject=None, xhtml=None, simple=False):
|
subject=None, xhtml=None, simple=False, xep0184_id=None):
|
||||||
# TODO: contact? ITYM frm.
|
# TODO: contact? ITYM frm.
|
||||||
'''Print a line in the conversation:
|
'''Print a line in the conversation:
|
||||||
if contact is set to status: it's a status message
|
if contact is set to status: it's a status message
|
||||||
|
@ -1683,7 +1697,7 @@ class ChatControl(ChatControlBase):
|
||||||
xhtml = '<body xmlns="%s">%s</body>' % (NS_XHTML, xhtml)
|
xhtml = '<body xmlns="%s">%s</body>' % (NS_XHTML, xhtml)
|
||||||
ChatControlBase.print_conversation_line(self, text, kind, name, tim,
|
ChatControlBase.print_conversation_line(self, text, kind, name, tim,
|
||||||
subject=subject, old_kind=self.old_msg_kind, xhtml=xhtml,
|
subject=subject, old_kind=self.old_msg_kind, xhtml=xhtml,
|
||||||
simple=simple)
|
simple=simple, xep0184_id=xep0184_id)
|
||||||
if text.startswith('/me ') or text.startswith('/me\n'):
|
if text.startswith('/me ') or text.startswith('/me\n'):
|
||||||
self.old_msg_kind = None
|
self.old_msg_kind = None
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1729,6 +1729,13 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
||||||
receipt.setThread(thread_id)
|
receipt.setThread(thread_id)
|
||||||
con.send(receipt)
|
con.send(receipt)
|
||||||
|
|
||||||
|
# We got our message's receipt
|
||||||
|
if msg.getTag('received', namespace=common.xmpp.NS_RECEIPTS) \
|
||||||
|
and session.control and gajim.config.get_per('accounts',
|
||||||
|
self.name, 'request_receipt'):
|
||||||
|
session.control.conv_textview.hide_xep0184_warning(
|
||||||
|
msg.getID())
|
||||||
|
|
||||||
addressTag = msg.getTag('addresses', namespace = common.xmpp.NS_ADDRESS)
|
addressTag = msg.getTag('addresses', namespace = common.xmpp.NS_ADDRESS)
|
||||||
|
|
||||||
# Be sure it comes from one of our resource, else ignore address element
|
# Be sure it comes from one of our resource, else ignore address element
|
||||||
|
|
|
@ -148,8 +148,10 @@ class ConversationTextview:
|
||||||
'''Class for the conversation textview (where user reads already said messages)
|
'''Class for the conversation textview (where user reads already said messages)
|
||||||
for chat/groupchat windows'''
|
for chat/groupchat windows'''
|
||||||
|
|
||||||
path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'muc_separator.png')
|
FOCUS_OUT_LINE_PIXBUF = gtk.gdk.pixbuf_new_from_file(os.path.join(
|
||||||
FOCUS_OUT_LINE_PIXBUF = gtk.gdk.pixbuf_new_from_file(path_to_file)
|
gajim.DATA_DIR, 'pixmaps', 'muc_separator.png'))
|
||||||
|
XEP0184_WARNING_PIXBUF = gtk.gdk.pixbuf_new_from_file(os.path.join(
|
||||||
|
gajim.DATA_DIR, 'pixmaps', 'xep0184.png'))
|
||||||
|
|
||||||
# smooth scroll constants
|
# smooth scroll constants
|
||||||
MAX_SCROLL_TIME = 0.4 # seconds
|
MAX_SCROLL_TIME = 0.4 # seconds
|
||||||
|
@ -175,6 +177,7 @@ class ConversationTextview:
|
||||||
self.handlers = {}
|
self.handlers = {}
|
||||||
self.images = []
|
self.images = []
|
||||||
self.image_cache = {}
|
self.image_cache = {}
|
||||||
|
self.xep0184_marks = {}
|
||||||
|
|
||||||
# It's True when we scroll in the code, so we can detect scroll from user
|
# It's True when we scroll in the code, so we can detect scroll from user
|
||||||
self.auto_scrolling = False
|
self.auto_scrolling = False
|
||||||
|
@ -389,6 +392,58 @@ class ConversationTextview:
|
||||||
self.smooth_id = None
|
self.smooth_id = None
|
||||||
self.smooth_scroll_timer.cancel()
|
self.smooth_scroll_timer.cancel()
|
||||||
|
|
||||||
|
def show_xep0184_warning(self, id):
|
||||||
|
try:
|
||||||
|
if self.xep0184_marks[id] is not None:
|
||||||
|
return
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
buffer = self.tv.get_buffer()
|
||||||
|
|
||||||
|
buffer.begin_user_action()
|
||||||
|
|
||||||
|
end_iter = buffer.get_end_iter()
|
||||||
|
buffer.insert(end_iter, ' ')
|
||||||
|
buffer.insert_pixbuf(end_iter,
|
||||||
|
ConversationTextview.XEP0184_WARNING_PIXBUF)
|
||||||
|
|
||||||
|
end_iter = buffer.get_end_iter();
|
||||||
|
before_img_iter = end_iter.copy()
|
||||||
|
# XXX: Is there a nicer way?
|
||||||
|
before_img_iter.backward_char();
|
||||||
|
before_img_iter.backward_char();
|
||||||
|
|
||||||
|
self.xep0184_marks[id] = buffer.create_mark(None,
|
||||||
|
buffer.get_end_iter(), left_gravity=True)
|
||||||
|
|
||||||
|
buffer.end_user_action()
|
||||||
|
|
||||||
|
def hide_xep0184_warning(self, id):
|
||||||
|
try:
|
||||||
|
if self.xep0184_marks[id] is None:
|
||||||
|
return
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
|
||||||
|
buffer = self.tv.get_buffer()
|
||||||
|
|
||||||
|
buffer.begin_user_action()
|
||||||
|
|
||||||
|
end_iter = buffer.get_iter_at_mark(self.xep0184_marks[id])
|
||||||
|
|
||||||
|
begin_iter = end_iter.copy()
|
||||||
|
# XXX: Is there a nicer way?
|
||||||
|
begin_iter.backward_char();
|
||||||
|
begin_iter.backward_char();
|
||||||
|
|
||||||
|
buffer.delete(begin_iter, end_iter)
|
||||||
|
buffer.delete_mark(self.xep0184_marks[id])
|
||||||
|
|
||||||
|
buffer.end_user_action()
|
||||||
|
|
||||||
|
self.xep0184_marks[id] = None
|
||||||
|
|
||||||
def show_focus_out_line(self):
|
def show_focus_out_line(self):
|
||||||
if not self.allow_focus_out_line:
|
if not self.allow_focus_out_line:
|
||||||
# if room did not receive focus-in from the last time we added
|
# if room did not receive focus-in from the last time we added
|
||||||
|
|
|
@ -167,6 +167,8 @@ class MessageControl:
|
||||||
|
|
||||||
# Send and update history
|
# Send and update history
|
||||||
return conn.send_message(jid, message, keyID, type = type,
|
return conn.send_message(jid, message, keyID, type = type,
|
||||||
chatstate = chatstate, msg_id = msg_id, composing_xep = composing_xep,
|
chatstate = chatstate, msg_id = msg_id,
|
||||||
|
composing_xep = composing_xep,
|
||||||
resource = self.resource, user_nick = user_nick,
|
resource = self.resource, user_nick = user_nick,
|
||||||
session = self.session, original_message = original_message)
|
session = self.session,
|
||||||
|
original_message = original_message)
|
||||||
|
|
Loading…
Add table
Reference in a new issue