Dont use callbacks when sending messages
Using a callback to display a sent message inside the ChatControl means that all messages we send have to be issued from the GUI layer (send_message()) if we want them to display in the ChatControl. This replaces the callback and catches the stanza-message-outgoing event after it was processed by the core. This is easier to read/understand than dealing with callbacks and lets the core issue messages without having to care if a ChatControl is open or not
This commit is contained in:
parent
4cccdad5a1
commit
7815ce19a5
|
@ -236,6 +236,8 @@ class ChatControl(ChatControlBase):
|
||||||
self._nec_chatstate_received)
|
self._nec_chatstate_received)
|
||||||
app.ged.register_event_handler('caps-received', ged.GUI1,
|
app.ged.register_event_handler('caps-received', ged.GUI1,
|
||||||
self._nec_caps_received)
|
self._nec_caps_received)
|
||||||
|
app.ged.register_event_handler('stanza-message-outgoing', ged.OUT_POSTCORE,
|
||||||
|
self._message_sent)
|
||||||
|
|
||||||
# PluginSystem: adding GUI extension point for this ChatControl
|
# PluginSystem: adding GUI extension point for this ChatControl
|
||||||
# instance object
|
# instance object
|
||||||
|
@ -811,6 +813,35 @@ class ChatControl(ChatControlBase):
|
||||||
app.plugin_manager.extension_point(
|
app.plugin_manager.extension_point(
|
||||||
'encryption_dialog' + self.encryption, self)
|
'encryption_dialog' + self.encryption, self)
|
||||||
|
|
||||||
|
def _message_sent(self, obj):
|
||||||
|
if obj.conn.name != self.account:
|
||||||
|
return
|
||||||
|
if obj.jid != self.contact.jid:
|
||||||
|
return
|
||||||
|
if not obj.message:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.last_sent_msg = obj.stanza_id
|
||||||
|
id_ = obj.msg_iq.getID()
|
||||||
|
xep0184_id = None
|
||||||
|
if self.contact.jid != app.get_jid_from_account(self.account):
|
||||||
|
if app.config.get_per('accounts', self.account, 'request_receipt'):
|
||||||
|
xep0184_id = id_
|
||||||
|
if obj.label:
|
||||||
|
displaymarking = obj.label.getTag('displaymarking')
|
||||||
|
else:
|
||||||
|
displaymarking = None
|
||||||
|
if self.correcting:
|
||||||
|
self.correcting = False
|
||||||
|
gtkgui_helpers.remove_css_class(
|
||||||
|
self.msg_textview, 'msgcorrectingcolor')
|
||||||
|
|
||||||
|
self.print_conversation(obj.message, self.contact.jid, tim=obj.timestamp,
|
||||||
|
encrypted=obj.encrypted, xep0184_id=xep0184_id, xhtml=obj.xhtml,
|
||||||
|
displaymarking=displaymarking, msg_stanza_id=id_,
|
||||||
|
correct_id=obj.correct_id,
|
||||||
|
additional_data=obj.additional_data)
|
||||||
|
|
||||||
def send_message(self, message, keyID='', chatstate=None, xhtml=None,
|
def send_message(self, message, keyID='', chatstate=None, xhtml=None,
|
||||||
process_commands=True, attention=False):
|
process_commands=True, attention=False):
|
||||||
"""
|
"""
|
||||||
|
@ -843,32 +874,9 @@ class ChatControl(ChatControlBase):
|
||||||
|
|
||||||
self._schedule_activity_timers()
|
self._schedule_activity_timers()
|
||||||
|
|
||||||
def _on_sent(obj, msg_stanza, message, encrypted, xhtml, label):
|
|
||||||
id_ = msg_stanza.getID()
|
|
||||||
xep0184_id = None
|
|
||||||
if self.contact.jid != app.get_jid_from_account(self.account):
|
|
||||||
if app.config.get_per('accounts', self.account, 'request_receipt'):
|
|
||||||
xep0184_id = id_
|
|
||||||
if label:
|
|
||||||
displaymarking = label.getTag('displaymarking')
|
|
||||||
else:
|
|
||||||
displaymarking = None
|
|
||||||
if self.correcting:
|
|
||||||
self.correcting = False
|
|
||||||
gtkgui_helpers.remove_css_class(
|
|
||||||
self.msg_textview, 'msgcorrectingcolor')
|
|
||||||
|
|
||||||
self.print_conversation(message, self.contact.jid, tim=obj.timestamp,
|
|
||||||
encrypted=encrypted, xep0184_id=xep0184_id, xhtml=xhtml,
|
|
||||||
displaymarking=displaymarking, msg_stanza_id=id_,
|
|
||||||
correct_id=obj.correct_id,
|
|
||||||
additional_data=obj.additional_data)
|
|
||||||
|
|
||||||
ChatControlBase.send_message(self, message, keyID, type_='chat',
|
ChatControlBase.send_message(self, message, keyID, type_='chat',
|
||||||
chatstate=chatstate_to_send, xhtml=xhtml, callback=_on_sent,
|
chatstate=chatstate_to_send, xhtml=xhtml,
|
||||||
callback_args=[message, self.encryption, xhtml, self.get_seclabel()],
|
process_commands=process_commands, attention=attention)
|
||||||
process_commands=process_commands,
|
|
||||||
attention=attention)
|
|
||||||
|
|
||||||
def on_cancel_session_negotiation(self):
|
def on_cancel_session_negotiation(self):
|
||||||
msg = _('Session negotiation cancelled')
|
msg = _('Session negotiation cancelled')
|
||||||
|
@ -1138,6 +1146,8 @@ class ChatControl(ChatControlBase):
|
||||||
self._nec_chatstate_received)
|
self._nec_chatstate_received)
|
||||||
app.ged.remove_event_handler('caps-received', ged.GUI1,
|
app.ged.remove_event_handler('caps-received', ged.GUI1,
|
||||||
self._nec_caps_received)
|
self._nec_caps_received)
|
||||||
|
app.ged.remove_event_handler('stanza-message-outgoing', ged.OUT_POSTCORE,
|
||||||
|
self._message_sent)
|
||||||
|
|
||||||
self.unsubscribe_events()
|
self.unsubscribe_events()
|
||||||
|
|
||||||
|
|
|
@ -742,17 +742,13 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
|
||||||
return label
|
return label
|
||||||
|
|
||||||
def send_message(self, message, keyID='', type_='chat', chatstate=None,
|
def send_message(self, message, keyID='', type_='chat', chatstate=None,
|
||||||
resource=None, xhtml=None, callback=None, callback_args=None,
|
resource=None, xhtml=None, process_commands=True, attention=False):
|
||||||
process_commands=True, attention=False):
|
|
||||||
"""
|
"""
|
||||||
Send the given message to the active tab. Doesn't return None if error
|
Send the given message to the active tab. Doesn't return None if error
|
||||||
"""
|
"""
|
||||||
if not message or message == '\n':
|
if not message or message == '\n':
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if callback_args is None:
|
|
||||||
callback_args = []
|
|
||||||
|
|
||||||
if process_commands and self.process_as_command(message):
|
if process_commands and self.process_as_command(message):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -766,11 +762,6 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
|
||||||
|
|
||||||
label = self.get_seclabel()
|
label = self.get_seclabel()
|
||||||
|
|
||||||
def _cb(obj, msg, cb, *cb_args):
|
|
||||||
self.last_sent_msg = obj.stanza_id
|
|
||||||
if cb:
|
|
||||||
cb(obj, msg, *cb_args)
|
|
||||||
|
|
||||||
if self.correcting and self.last_sent_msg:
|
if self.correcting and self.last_sent_msg:
|
||||||
correct_id = self.last_sent_msg
|
correct_id = self.last_sent_msg
|
||||||
else:
|
else:
|
||||||
|
@ -780,8 +771,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
|
||||||
account=self.account, jid=self.contact.jid, message=message,
|
account=self.account, jid=self.contact.jid, message=message,
|
||||||
keyID=keyID, type_=type_, chatstate=chatstate,
|
keyID=keyID, type_=type_, chatstate=chatstate,
|
||||||
resource=resource, user_nick=self.user_nick, xhtml=xhtml,
|
resource=resource, user_nick=self.user_nick, xhtml=xhtml,
|
||||||
label=label, callback=_cb, callback_args=[callback] + callback_args,
|
label=label, control=self, attention=attention, correct_id=correct_id,
|
||||||
control=self, attention=attention, correct_id=correct_id,
|
|
||||||
automatic_message=False, encryption=self.encryption))
|
automatic_message=False, encryption=self.encryption))
|
||||||
|
|
||||||
# Record the history of sent messages
|
# Record the history of sent messages
|
||||||
|
|
|
@ -2061,6 +2061,9 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
if encryption:
|
if encryption:
|
||||||
app.plugin_manager.extension_point(
|
app.plugin_manager.extension_point(
|
||||||
'encrypt' + encryption, self, obj, self.send_message)
|
'encrypt' + encryption, self, obj, self.send_message)
|
||||||
|
if not obj.encrypted:
|
||||||
|
# Dont propagate event
|
||||||
|
return True
|
||||||
else:
|
else:
|
||||||
self.send_message(obj)
|
self.send_message(obj)
|
||||||
|
|
||||||
|
@ -2072,8 +2075,6 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
None, conn=self, jid=obj.jid, message=obj.message, keyID=obj.keyID,
|
None, conn=self, jid=obj.jid, message=obj.message, keyID=obj.keyID,
|
||||||
chatstate=obj.chatstate, automatic_message=obj.automatic_message,
|
chatstate=obj.chatstate, automatic_message=obj.automatic_message,
|
||||||
stanza_id=obj.stanza_id, additional_data=obj.additional_data))
|
stanza_id=obj.stanza_id, additional_data=obj.additional_data))
|
||||||
if obj.callback:
|
|
||||||
obj.callback(obj, obj.msg_iq, *obj.callback_args)
|
|
||||||
|
|
||||||
if isinstance(obj.jid, list):
|
if isinstance(obj.jid, list):
|
||||||
for j in obj.jid:
|
for j in obj.jid:
|
||||||
|
@ -2702,8 +2703,6 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
None, conn=self, jid=obj.jid, message=obj.message, keyID=None,
|
None, conn=self, jid=obj.jid, message=obj.message, keyID=None,
|
||||||
chatstate=None, automatic_message=obj.automatic_message,
|
chatstate=None, automatic_message=obj.automatic_message,
|
||||||
stanza_id=obj.stanza_id, additional_data=obj.additional_data))
|
stanza_id=obj.stanza_id, additional_data=obj.additional_data))
|
||||||
if obj.callback:
|
|
||||||
obj.callback(obj)
|
|
||||||
|
|
||||||
def send_gc_subject(self, jid, subject):
|
def send_gc_subject(self, jid, subject):
|
||||||
if not app.account_is_connected(self.name):
|
if not app.account_is_connected(self.name):
|
||||||
|
|
|
@ -2845,6 +2845,7 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent):
|
||||||
self.correct_id = None
|
self.correct_id = None
|
||||||
self.automatic_message = True
|
self.automatic_message = True
|
||||||
self.encryption = ''
|
self.encryption = ''
|
||||||
|
self.encrypted = False
|
||||||
|
|
||||||
def get_full_jid(self):
|
def get_full_jid(self):
|
||||||
if self.resource:
|
if self.resource:
|
||||||
|
|
|
@ -342,8 +342,6 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf):
|
||||||
jid=obj.jid, message=obj.message, keyID=obj.keyID,
|
jid=obj.jid, message=obj.message, keyID=obj.keyID,
|
||||||
automatic_message=obj.automatic_message, chatstate=None,
|
automatic_message=obj.automatic_message, chatstate=None,
|
||||||
stanza_id=stanza_id))
|
stanza_id=stanza_id))
|
||||||
if obj.callback:
|
|
||||||
obj.callback(obj.msg_iq, *obj.callback_args)
|
|
||||||
|
|
||||||
self.log_message(obj, obj.jid)
|
self.log_message(obj, obj.jid)
|
||||||
|
|
||||||
|
@ -352,6 +350,8 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf):
|
||||||
app.nec.push_incoming_event(MessageErrorEvent(None, conn=self,
|
app.nec.push_incoming_event(MessageErrorEvent(None, conn=self,
|
||||||
fjid=obj.jid, error_code=-1, error_msg=reason, msg=None,
|
fjid=obj.jid, error_code=-1, error_msg=reason, msg=None,
|
||||||
time_=None, session=obj.session))
|
time_=None, session=obj.session))
|
||||||
|
# Dont propagate event
|
||||||
|
return True
|
||||||
|
|
||||||
ret = self.connection.send(
|
ret = self.connection.send(
|
||||||
obj.msg_iq, obj.message is not None,
|
obj.msg_iq, obj.message is not None,
|
||||||
|
@ -363,6 +363,8 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf):
|
||||||
fjid=obj.jid, error_code=-1, error_msg=_(
|
fjid=obj.jid, error_code=-1, error_msg=_(
|
||||||
'Contact is offline. Your message could not be sent.'),
|
'Contact is offline. Your message could not be sent.'),
|
||||||
msg=None, time_=None, session=obj.session))
|
msg=None, time_=None, session=obj.session))
|
||||||
|
# Dont propagate event
|
||||||
|
return True
|
||||||
|
|
||||||
def send_stanza(self, stanza):
|
def send_stanza(self, stanza):
|
||||||
# send a stanza untouched
|
# send a stanza untouched
|
||||||
|
|
|
@ -493,6 +493,8 @@ class GroupchatControl(ChatControlBase):
|
||||||
self._nec_signed_in)
|
self._nec_signed_in)
|
||||||
app.ged.register_event_handler('decrypted-message-received', ged.GUI2,
|
app.ged.register_event_handler('decrypted-message-received', ged.GUI2,
|
||||||
self._nec_decrypted_message_received)
|
self._nec_decrypted_message_received)
|
||||||
|
app.ged.register_event_handler('gc-stanza-message-outgoing', ged.OUT_POSTCORE,
|
||||||
|
self._message_sent)
|
||||||
app.gc_connected[self.account][self.room_jid] = False
|
app.gc_connected[self.account][self.room_jid] = False
|
||||||
# disable win, we are not connected yet
|
# disable win, we are not connected yet
|
||||||
ChatControlBase.got_disconnected(self)
|
ChatControlBase.got_disconnected(self)
|
||||||
|
@ -1985,6 +1987,15 @@ class GroupchatControl(ChatControlBase):
|
||||||
if self.model.iter_n_children(parent_iter) == 0:
|
if self.model.iter_n_children(parent_iter) == 0:
|
||||||
self.model.remove(parent_iter)
|
self.model.remove(parent_iter)
|
||||||
|
|
||||||
|
def _message_sent(self, obj):
|
||||||
|
# we'll save sent message text when we'll receive it in
|
||||||
|
# _nec_gc_message_received
|
||||||
|
self.last_sent_msg = obj.stanza_id
|
||||||
|
if self.correcting:
|
||||||
|
self.correcting = False
|
||||||
|
gtkgui_helpers.remove_css_class(
|
||||||
|
self.msg_textview, 'msgcorrectingcolor')
|
||||||
|
|
||||||
def send_message(self, message, xhtml=None, process_commands=True):
|
def send_message(self, message, xhtml=None, process_commands=True):
|
||||||
"""
|
"""
|
||||||
Call this function to send our message
|
Call this function to send our message
|
||||||
|
@ -2011,15 +2022,6 @@ class GroupchatControl(ChatControlBase):
|
||||||
if message != '' or message != '\n':
|
if message != '' or message != '\n':
|
||||||
self.save_message(message, 'sent')
|
self.save_message(message, 'sent')
|
||||||
|
|
||||||
def _cb(obj):
|
|
||||||
# we'll save sent message text when we'll receive it in
|
|
||||||
# _nec_gc_message_received
|
|
||||||
self.last_sent_msg = obj.stanza_id
|
|
||||||
if self.correcting:
|
|
||||||
self.correcting = False
|
|
||||||
gtkgui_helpers.remove_css_class(
|
|
||||||
self.msg_textview, 'msgcorrectingcolor')
|
|
||||||
|
|
||||||
if self.correcting and self.last_sent_msg:
|
if self.correcting and self.last_sent_msg:
|
||||||
correct_id = self.last_sent_msg
|
correct_id = self.last_sent_msg
|
||||||
else:
|
else:
|
||||||
|
@ -2027,7 +2029,7 @@ class GroupchatControl(ChatControlBase):
|
||||||
# Send the message
|
# Send the message
|
||||||
app.nec.push_outgoing_event(GcMessageOutgoingEvent(None,
|
app.nec.push_outgoing_event(GcMessageOutgoingEvent(None,
|
||||||
account=self.account, jid=self.room_jid, message=message,
|
account=self.account, jid=self.room_jid, message=message,
|
||||||
xhtml=xhtml, label=label, callback=_cb, correct_id=correct_id,
|
xhtml=xhtml, label=label, correct_id=correct_id,
|
||||||
automatic_message=False))
|
automatic_message=False))
|
||||||
self.msg_textview.get_buffer().set_text('')
|
self.msg_textview.get_buffer().set_text('')
|
||||||
self.msg_textview.grab_focus()
|
self.msg_textview.grab_focus()
|
||||||
|
@ -2148,6 +2150,8 @@ class GroupchatControl(ChatControlBase):
|
||||||
self._nec_signed_in)
|
self._nec_signed_in)
|
||||||
app.ged.remove_event_handler('decrypted-message-received', ged.GUI2,
|
app.ged.remove_event_handler('decrypted-message-received', ged.GUI2,
|
||||||
self._nec_decrypted_message_received)
|
self._nec_decrypted_message_received)
|
||||||
|
app.ged.remove_event_handler('gc-stanza-message-outgoing', ged.OUT_POSTCORE,
|
||||||
|
self._message_sent)
|
||||||
|
|
||||||
if self.room_jid in app.gc_connected[self.account] and \
|
if self.room_jid in app.gc_connected[self.account] and \
|
||||||
app.gc_connected[self.account][self.room_jid]:
|
app.gc_connected[self.account][self.room_jid]:
|
||||||
|
|
Loading…
Reference in New Issue