2018-09-05 02:59:34 +02:00
|
|
|
# Copyright (C) 2008-2014 Yann Leboulanger <asterix AT lagaule.org>
|
|
|
|
# Copyright (C) 2008 Brendan Taylor <whateley AT gmail.com>
|
|
|
|
# Jonathan Schleifer <js-gajim AT webkeks.org>
|
|
|
|
# Stephan Erb <steve-e AT h3c.de>
|
|
|
|
#
|
|
|
|
# This file is part of Gajim.
|
|
|
|
#
|
|
|
|
# Gajim is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published
|
|
|
|
# by the Free Software Foundation; version 3 only.
|
|
|
|
#
|
|
|
|
# Gajim is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
2008-08-15 05:20:23 +02:00
|
|
|
|
2018-05-27 01:01:35 +02:00
|
|
|
import string
|
|
|
|
import random
|
|
|
|
import itertools
|
|
|
|
|
2018-09-16 11:37:38 +02:00
|
|
|
from gajim import notify
|
2017-06-13 23:58:06 +02:00
|
|
|
from gajim.common import helpers
|
|
|
|
from gajim.common import events
|
2017-08-13 13:18:56 +02:00
|
|
|
from gajim.common import app
|
2017-06-13 23:58:06 +02:00
|
|
|
from gajim.common import contacts
|
|
|
|
from gajim.common import ged
|
2018-04-23 18:32:01 +02:00
|
|
|
from gajim.common.const import KindConstant
|
2018-09-26 19:06:47 +02:00
|
|
|
from gajim.gtk.single_message import SingleMessageWindow
|
2008-06-21 21:12:47 +02:00
|
|
|
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2018-09-16 11:56:56 +02:00
|
|
|
class ChatControlSession:
|
2018-05-27 01:01:35 +02:00
|
|
|
def __init__(self, conn, jid, thread_id, type_='chat'):
|
|
|
|
self.conn = conn
|
|
|
|
self.jid = jid
|
|
|
|
self.type_ = type_
|
|
|
|
self.resource = jid.getResource()
|
2010-02-08 15:08:40 +01:00
|
|
|
self.control = None
|
|
|
|
|
2018-05-27 01:01:35 +02:00
|
|
|
if thread_id:
|
|
|
|
self.received_thread_id = True
|
|
|
|
self.thread_id = thread_id
|
|
|
|
else:
|
|
|
|
self.received_thread_id = False
|
|
|
|
if type_ == 'normal':
|
|
|
|
self.thread_id = None
|
|
|
|
else:
|
|
|
|
self.thread_id = self.generate_thread_id()
|
|
|
|
|
|
|
|
self.loggable = True
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2018-05-27 01:01:35 +02:00
|
|
|
self.last_send = 0
|
|
|
|
self.last_receive = 0
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2018-05-27 01:01:35 +02:00
|
|
|
app.ged.register_event_handler('decrypted-message-received',
|
|
|
|
ged.PREGUI,
|
|
|
|
self._nec_decrypted_message_received)
|
|
|
|
|
|
|
|
def generate_thread_id(self):
|
|
|
|
return ''.join(
|
|
|
|
[f(string.ascii_letters) for f in itertools.repeat(
|
|
|
|
random.choice, 32)]
|
|
|
|
)
|
|
|
|
|
|
|
|
def is_loggable(self):
|
|
|
|
return app.config.should_log(self.conn.name,
|
|
|
|
self.jid.getStripped())
|
|
|
|
|
|
|
|
def get_to(self):
|
|
|
|
to = str(self.jid)
|
|
|
|
return app.get_jid_without_resource(to) + '/' + self.resource
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2010-12-08 21:58:13 +01:00
|
|
|
def _nec_decrypted_message_received(self, obj):
|
2010-02-08 15:08:40 +01:00
|
|
|
"""
|
|
|
|
Dispatch a received <message> stanza
|
|
|
|
"""
|
2010-12-08 21:58:13 +01:00
|
|
|
if obj.session != self:
|
|
|
|
return
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.contacts.get_contact(self.conn.name, obj.jid,
|
2015-05-17 15:40:42 +02:00
|
|
|
obj.resource)
|
2016-01-17 20:54:20 +01:00
|
|
|
if not contact:
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.contacts.get_gc_contact(self.conn.name, obj.jid,
|
2016-01-17 20:54:20 +01:00
|
|
|
obj.resource)
|
2010-12-08 21:58:13 +01:00
|
|
|
if self.resource != obj.resource:
|
|
|
|
self.resource = obj.resource
|
2015-05-17 15:40:42 +02:00
|
|
|
if self.control:
|
2016-01-17 20:54:20 +01:00
|
|
|
if isinstance(contact, contacts.GC_Contact):
|
|
|
|
self.control.gc_contact = contact
|
|
|
|
self.control.contact = contact.as_contact()
|
|
|
|
else:
|
|
|
|
self.control.contact = contact
|
2015-05-17 15:40:42 +02:00
|
|
|
if self.control.resource:
|
|
|
|
self.control.change_resource(self.resource)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2010-12-08 21:58:13 +01:00
|
|
|
if obj.mtype == 'chat':
|
2018-09-29 21:48:21 +02:00
|
|
|
if not obj.msgtxt:
|
2010-02-08 15:08:40 +01:00
|
|
|
return
|
|
|
|
|
2017-08-08 16:44:03 +02:00
|
|
|
log_type = KindConstant.CHAT_MSG_RECV
|
|
|
|
if obj.forwarded and obj.sent:
|
|
|
|
log_type = KindConstant.CHAT_MSG_SENT
|
2010-02-08 15:08:40 +01:00
|
|
|
else:
|
2017-08-08 16:44:03 +02:00
|
|
|
log_type = KindConstant.SINGLE_MSG_RECV
|
|
|
|
if obj.forwarded and obj.sent:
|
|
|
|
log_type = KindConstant.SINGLE_MSG_SENT
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
treat_as = app.config.get('treat_incoming_messages')
|
2010-12-11 18:51:34 +01:00
|
|
|
if treat_as:
|
|
|
|
obj.mtype = treat_as
|
2010-02-08 15:08:40 +01:00
|
|
|
pm = False
|
2018-02-22 21:42:49 +01:00
|
|
|
if obj.muc_pm or (obj.gc_control and obj.resource):
|
2010-02-08 15:08:40 +01:00
|
|
|
# It's a Private message
|
|
|
|
pm = True
|
2010-12-08 21:58:13 +01:00
|
|
|
obj.mtype = 'pm'
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-08 16:44:03 +02:00
|
|
|
if self.is_loggable() and obj.msgtxt:
|
2017-08-13 13:18:56 +02:00
|
|
|
if obj.xhtml and app.config.get('log_xhtml_messages'):
|
2017-08-08 16:44:03 +02:00
|
|
|
msg_to_log = obj.xhtml
|
|
|
|
else:
|
|
|
|
msg_to_log = obj.msgtxt
|
|
|
|
|
|
|
|
jid = obj.fjid
|
|
|
|
if not pm:
|
|
|
|
jid = obj.jid
|
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
obj.msg_log_id = app.logger.insert_into_logs(
|
2017-11-17 21:42:44 +01:00
|
|
|
self.conn.name, jid, obj.timestamp, log_type,
|
2017-08-08 16:44:03 +02:00
|
|
|
message=msg_to_log,
|
|
|
|
subject=obj.subject,
|
2017-10-22 23:27:47 +02:00
|
|
|
additional_data=obj.additional_data,
|
|
|
|
stanza_id=obj.unique_id)
|
2017-08-08 16:44:03 +02:00
|
|
|
|
2018-07-29 19:36:02 +02:00
|
|
|
self.conn.get_module('MAM').save_archive_id(
|
|
|
|
None, obj.stanza_id, obj.timestamp)
|
|
|
|
|
2018-02-22 21:42:49 +01:00
|
|
|
if obj.muc_pm and not obj.gc_control:
|
|
|
|
# This is a carbon of a PM from a MUC we are not currently
|
|
|
|
# joined. We log it silently without notification.
|
|
|
|
return True
|
|
|
|
|
2010-12-08 21:58:13 +01:00
|
|
|
if not obj.msgtxt: # empty message text
|
2011-05-01 22:09:50 +02:00
|
|
|
return True
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
if app.config.get_per('accounts', self.conn.name,
|
|
|
|
'ignore_unknown_contacts') and not app.contacts.get_contacts(
|
2010-12-08 21:58:13 +01:00
|
|
|
self.conn.name, obj.jid) and not pm:
|
2011-05-01 22:09:50 +02:00
|
|
|
return True
|
2010-02-08 15:08:40 +01:00
|
|
|
|
|
|
|
if not self.control:
|
2017-08-13 13:18:56 +02:00
|
|
|
ctrl = app.interface.msg_win_mgr.search_control(obj.jid,
|
2011-08-21 09:51:57 +02:00
|
|
|
obj.conn.name, obj.resource)
|
2010-02-08 15:08:40 +01:00
|
|
|
if ctrl:
|
|
|
|
self.control = ctrl
|
|
|
|
self.control.set_session(self)
|
2016-01-17 20:54:20 +01:00
|
|
|
if isinstance(contact, contacts.GC_Contact):
|
|
|
|
self.control.gc_contact = contact
|
|
|
|
self.control.contact = contact.as_contact()
|
|
|
|
else:
|
|
|
|
self.control.contact = contact
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2011-05-01 22:09:50 +02:00
|
|
|
if not pm:
|
|
|
|
self.roster_message2(obj)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
if app.interface.remote_ctrl:
|
|
|
|
app.interface.remote_ctrl.raise_signal('NewMessage', (
|
2010-12-08 21:58:13 +01:00
|
|
|
self.conn.name, [obj.fjid, obj.msgtxt, obj.timestamp,
|
2018-09-29 21:48:21 +02:00
|
|
|
obj.encrypted, obj.mtype, obj.subject,
|
2016-02-27 19:52:46 +01:00
|
|
|
obj.msg_log_id, obj.user_nick, obj.xhtml, obj.form_node]))
|
2010-12-08 21:58:13 +01:00
|
|
|
|
2011-05-01 22:09:50 +02:00
|
|
|
def roster_message2(self, obj):
|
|
|
|
"""
|
|
|
|
Display the message or show notification in the roster
|
|
|
|
"""
|
|
|
|
contact = None
|
|
|
|
jid = obj.jid
|
|
|
|
resource = obj.resource
|
|
|
|
|
|
|
|
fjid = jid
|
|
|
|
|
|
|
|
# Try to catch the contact with correct resource
|
|
|
|
if resource:
|
|
|
|
fjid = jid + '/' + resource
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.contacts.get_contact(obj.conn.name, jid, resource)
|
2011-05-01 22:09:50 +02:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
highest_contact = app.contacts.get_contact_with_highest_priority(
|
2011-05-01 22:09:50 +02:00
|
|
|
obj.conn.name, jid)
|
|
|
|
if not contact:
|
|
|
|
# If there is another resource, it may be a message from an
|
|
|
|
# invisible resource
|
2017-08-13 13:18:56 +02:00
|
|
|
lcontact = app.contacts.get_contacts(obj.conn.name, jid)
|
2011-05-01 22:09:50 +02:00
|
|
|
if (len(lcontact) > 1 or (lcontact and lcontact[0].resource and \
|
|
|
|
lcontact[0].show != 'offline')) and jid.find('@') > 0:
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.contacts.copy_contact(highest_contact)
|
2011-05-01 22:09:50 +02:00
|
|
|
contact.resource = resource
|
|
|
|
contact.priority = 0
|
|
|
|
contact.show = 'offline'
|
|
|
|
contact.status = ''
|
2017-08-13 13:18:56 +02:00
|
|
|
app.contacts.add_contact(obj.conn.name, contact)
|
2011-05-01 22:09:50 +02:00
|
|
|
|
|
|
|
else:
|
|
|
|
# Default to highest prio
|
|
|
|
fjid = jid
|
|
|
|
contact = highest_contact
|
|
|
|
|
|
|
|
if not contact:
|
|
|
|
# contact is not in roster
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.interface.roster.add_to_not_in_the_roster(
|
2011-05-01 22:09:50 +02:00
|
|
|
obj.conn.name, jid, obj.user_nick)
|
|
|
|
|
|
|
|
if not self.control:
|
2017-08-13 13:18:56 +02:00
|
|
|
ctrl = app.interface.msg_win_mgr.search_control(obj.jid,
|
2011-08-21 09:51:57 +02:00
|
|
|
obj.conn.name, obj.resource)
|
2011-05-01 22:09:50 +02:00
|
|
|
if ctrl:
|
|
|
|
self.control = ctrl
|
|
|
|
self.control.set_session(self)
|
|
|
|
else:
|
2011-08-21 09:51:57 +02:00
|
|
|
fjid = jid
|
2011-05-01 22:09:50 +02:00
|
|
|
|
|
|
|
obj.popup = helpers.allow_popup_window(self.conn.name)
|
|
|
|
|
2016-02-29 21:04:08 +01:00
|
|
|
event_t = events.ChatEvent
|
2011-05-01 22:09:50 +02:00
|
|
|
event_type = 'message_received'
|
|
|
|
|
|
|
|
if obj.mtype == 'normal':
|
2016-02-29 21:04:08 +01:00
|
|
|
event_t = events.NormalEvent
|
2011-05-01 22:09:50 +02:00
|
|
|
event_type = 'single_message_received'
|
|
|
|
|
|
|
|
if self.control and obj.mtype != 'normal':
|
2017-03-14 22:17:16 +01:00
|
|
|
# We have a ChatControl open
|
|
|
|
obj.show_in_roster = False
|
|
|
|
obj.show_in_systray = False
|
2017-08-13 23:03:11 +02:00
|
|
|
do_event = False
|
2017-03-14 22:17:16 +01:00
|
|
|
elif obj.forwarded and obj.sent:
|
|
|
|
# Its a Carbon Copied Message we sent
|
2011-05-01 22:09:50 +02:00
|
|
|
obj.show_in_roster = False
|
|
|
|
obj.show_in_systray = False
|
2017-09-29 12:41:26 +02:00
|
|
|
unread_events = app.events.get_events(
|
|
|
|
self.conn.name, fjid, types=['chat'])
|
|
|
|
read_ids = []
|
|
|
|
for msg in unread_events:
|
|
|
|
read_ids.append(msg.msg_log_id)
|
|
|
|
app.logger.set_read_messages(read_ids)
|
2017-08-13 13:18:56 +02:00
|
|
|
app.events.remove_events(self.conn.name, fjid, types=['chat'])
|
2017-08-13 23:03:11 +02:00
|
|
|
do_event = False
|
2011-05-01 22:09:50 +02:00
|
|
|
else:
|
2017-03-14 22:17:16 +01:00
|
|
|
# Everything else
|
2011-05-01 22:09:50 +02:00
|
|
|
obj.show_in_roster = notify.get_show_in_roster(event_type,
|
2018-06-30 11:02:30 +02:00
|
|
|
self.conn.name, contact.jid, self)
|
2011-05-01 22:09:50 +02:00
|
|
|
obj.show_in_systray = notify.get_show_in_systray(event_type,
|
2018-06-30 11:02:30 +02:00
|
|
|
self.conn.name, contact.jid)
|
2017-11-10 18:09:36 +01:00
|
|
|
if obj.mtype == 'normal' and obj.popup:
|
2017-08-13 23:03:11 +02:00
|
|
|
do_event = False
|
|
|
|
else:
|
|
|
|
do_event = True
|
|
|
|
if do_event:
|
2016-02-29 21:04:08 +01:00
|
|
|
event = event_t(obj.msgtxt, obj.subject, obj.mtype, obj.timestamp,
|
2016-02-29 21:29:20 +01:00
|
|
|
obj.encrypted, obj.resource, obj.msg_log_id,
|
|
|
|
correct_id=(obj.id_, obj.correct_id), xhtml=obj.xhtml,
|
2016-02-29 21:04:08 +01:00
|
|
|
session=self, form_node=obj.form_node,
|
|
|
|
displaymarking=obj.displaymarking,
|
|
|
|
sent_forwarded=obj.forwarded and obj.sent,
|
2011-05-01 22:09:50 +02:00
|
|
|
show_in_roster=obj.show_in_roster,
|
2017-11-01 23:14:47 +01:00
|
|
|
show_in_systray=obj.show_in_systray,
|
|
|
|
additional_data=obj.additional_data)
|
2011-05-01 22:09:50 +02:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
app.events.add_event(self.conn.name, fjid, event)
|
2010-04-08 01:20:17 +02:00
|
|
|
|
2010-02-08 15:08:40 +01:00
|
|
|
def roster_message(self, jid, msg, tim, encrypted=False, msg_type='',
|
2016-02-27 19:52:46 +01:00
|
|
|
subject=None, resource='', msg_log_id=None, user_nick='', xhtml=None,
|
2017-02-08 03:12:41 +01:00
|
|
|
form_node=None, displaymarking=None, additional_data=None):
|
2010-02-08 15:08:40 +01:00
|
|
|
"""
|
|
|
|
Display the message or show notification in the roster
|
|
|
|
"""
|
|
|
|
contact = None
|
|
|
|
fjid = jid
|
|
|
|
|
2017-02-08 03:12:41 +01:00
|
|
|
if additional_data is None:
|
|
|
|
additional_data = {}
|
|
|
|
|
2010-02-08 15:08:40 +01:00
|
|
|
# Try to catch the contact with correct resource
|
|
|
|
if resource:
|
|
|
|
fjid = jid + '/' + resource
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.contacts.get_contact(self.conn.name, jid, resource)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
highest_contact = app.contacts.get_contact_with_highest_priority(
|
2010-02-08 15:08:40 +01:00
|
|
|
self.conn.name, jid)
|
|
|
|
if not contact:
|
|
|
|
# If there is another resource, it may be a message from an invisible
|
|
|
|
# resource
|
2017-08-13 13:18:56 +02:00
|
|
|
lcontact = app.contacts.get_contacts(self.conn.name, jid)
|
2010-02-08 15:08:40 +01:00
|
|
|
if (len(lcontact) > 1 or (lcontact and lcontact[0].resource and \
|
|
|
|
lcontact[0].show != 'offline')) and jid.find('@') > 0:
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.contacts.copy_contact(highest_contact)
|
2010-02-08 15:08:40 +01:00
|
|
|
contact.resource = resource
|
|
|
|
if resource:
|
|
|
|
fjid = jid + '/' + resource
|
|
|
|
contact.priority = 0
|
|
|
|
contact.show = 'offline'
|
|
|
|
contact.status = ''
|
2017-08-13 13:18:56 +02:00
|
|
|
app.contacts.add_contact(self.conn.name, contact)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
|
|
|
else:
|
|
|
|
# Default to highest prio
|
|
|
|
fjid = jid
|
|
|
|
contact = highest_contact
|
|
|
|
|
|
|
|
if not contact:
|
|
|
|
# contact is not in roster
|
2017-08-13 13:18:56 +02:00
|
|
|
contact = app.interface.roster.add_to_not_in_the_roster(
|
2010-02-08 15:08:40 +01:00
|
|
|
self.conn.name, jid, user_nick)
|
|
|
|
|
|
|
|
if not self.control:
|
2017-08-13 13:18:56 +02:00
|
|
|
ctrl = app.interface.msg_win_mgr.get_control(fjid, self.conn.name)
|
2010-02-08 15:08:40 +01:00
|
|
|
if ctrl:
|
|
|
|
self.control = ctrl
|
|
|
|
self.control.set_session(self)
|
|
|
|
else:
|
2011-08-21 09:51:57 +02:00
|
|
|
fjid = jid
|
2010-02-08 15:08:40 +01:00
|
|
|
|
|
|
|
# Do we have a queue?
|
2017-08-13 13:18:56 +02:00
|
|
|
no_queue = len(app.events.get_events(self.conn.name, fjid)) == 0
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2011-06-13 23:06:43 +02:00
|
|
|
popup = helpers.allow_popup_window(self.conn.name)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
|
|
|
if msg_type == 'normal' and popup: # it's single message to be autopopuped
|
2018-07-16 23:22:33 +02:00
|
|
|
SingleMessageWindow(self.conn.name, contact.jid,
|
2010-02-08 15:08:40 +01:00
|
|
|
action='receive', from_whom=jid, subject=subject, message=msg,
|
2010-06-09 10:39:36 +02:00
|
|
|
resource=resource, session=self, form_node=form_node)
|
2010-02-08 15:08:40 +01:00
|
|
|
return
|
|
|
|
|
|
|
|
# We print if window is opened and it's not a single message
|
|
|
|
if self.control and msg_type != 'normal':
|
|
|
|
typ = ''
|
|
|
|
|
|
|
|
if msg_type == 'error':
|
|
|
|
typ = 'error'
|
|
|
|
|
|
|
|
self.control.print_conversation(msg, typ, tim=tim, encrypted=encrypted,
|
2016-09-05 23:07:31 +02:00
|
|
|
subject=subject, xhtml=xhtml, displaymarking=displaymarking,
|
|
|
|
additional_data=additional_data)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2016-02-27 19:52:46 +01:00
|
|
|
if msg_log_id:
|
2017-08-13 13:18:56 +02:00
|
|
|
app.logger.set_read_messages([msg_log_id])
|
2010-02-08 15:08:40 +01:00
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
# We save it in a queue
|
2016-02-29 21:04:08 +01:00
|
|
|
event_t = events.ChatEvent
|
2010-02-08 15:08:40 +01:00
|
|
|
event_type = 'message_received'
|
|
|
|
|
|
|
|
if msg_type == 'normal':
|
2016-02-29 21:04:08 +01:00
|
|
|
event_t = events.NormalEvent
|
2010-02-08 15:08:40 +01:00
|
|
|
event_type = 'single_message_received'
|
|
|
|
|
|
|
|
show_in_roster = notify.get_show_in_roster(event_type, self.conn.name,
|
2018-06-30 11:02:30 +02:00
|
|
|
contact.jid, self)
|
2010-02-08 15:08:40 +01:00
|
|
|
show_in_systray = notify.get_show_in_systray(event_type, self.conn.name,
|
2018-06-30 11:02:30 +02:00
|
|
|
contact.jid)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2016-02-29 21:04:08 +01:00
|
|
|
event = event_t(msg, subject, msg_type, tim, encrypted, resource,
|
|
|
|
msg_log_id, xhtml=xhtml, session=self, form_node=form_node,
|
|
|
|
displaymarking=displaymarking, sent_forwarded=False,
|
2016-09-05 23:07:31 +02:00
|
|
|
show_in_roster=show_in_roster, show_in_systray=show_in_systray,
|
|
|
|
additional_data=additional_data)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
app.events.add_event(self.conn.name, fjid, event)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
|
|
|
if popup:
|
|
|
|
if not self.control:
|
2017-08-13 13:18:56 +02:00
|
|
|
self.control = app.interface.new_chat(contact,
|
2011-08-21 09:51:57 +02:00
|
|
|
self.conn.name, session=self)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2018-09-16 01:10:04 +02:00
|
|
|
if app.events.get_events(self.conn.name, fjid):
|
2010-02-08 15:08:40 +01:00
|
|
|
self.control.read_queue()
|
|
|
|
else:
|
|
|
|
if no_queue: # We didn't have a queue: we change icons
|
2017-08-13 13:18:56 +02:00
|
|
|
app.interface.roster.draw_contact(jid, self.conn.name)
|
2010-02-08 15:08:40 +01:00
|
|
|
|
2017-08-13 13:18:56 +02:00
|
|
|
app.interface.roster.show_title() # we show the * or [n]
|
2010-02-08 15:08:40 +01:00
|
|
|
# Select the big brother contact in roster, it's visible because it has
|
|
|
|
# events.
|
2017-08-13 13:18:56 +02:00
|
|
|
family = app.contacts.get_metacontacts_family(self.conn.name, jid)
|
2010-02-08 15:08:40 +01:00
|
|
|
if family:
|
2018-09-17 21:11:45 +02:00
|
|
|
_nearby_family, bb_jid, bb_account = \
|
2017-08-13 13:18:56 +02:00
|
|
|
app.contacts.get_nearby_family_and_big_brother(family,
|
2010-02-08 15:08:40 +01:00
|
|
|
self.conn.name)
|
|
|
|
else:
|
|
|
|
bb_jid, bb_account = jid, self.conn.name
|
2017-08-13 13:18:56 +02:00
|
|
|
app.interface.roster.select_contact(bb_jid, bb_account)
|