Philipp Hörist pushed to branch master at gajim / gajim
Commits: de1866a6 by Philipp Hörist at 2019-08-17T10:53:44Z Refactor MUC disco info cache
- Store disco info in cache database - Remove MucCapsCache, the DiscoInfo object supports all the methods
- - - - - 01be1d6f by Philipp Hörist at 2019-08-17T10:54:46Z Discovery: Refactor disco_muc()
- Use everywhere disco_muc() - Cache results with set_last_disco_info() - Raise muc-disco-update event after every successful disco - Raise muc-join-failed when disco is not successful before join
- - - - - f54a1677 by Philipp Hörist at 2019-08-17T10:55:27Z Adapt to nbxmpp changes
- - - - - cf14c04d by Philipp Hörist at 2019-08-17T10:55:27Z Raise required nbxmpp version to 0.9.92
- - - - -
17 changed files:
- gajim/common/caps_cache.py - gajim/common/contacts.py - gajim/common/helpers.py - gajim/common/logger.py - gajim/common/modules/discovery.py - gajim/common/modules/iq.py - gajim/common/modules/mam.py - gajim/common/modules/message.py - gajim/common/modules/muc.py - gajim/dialog_messages.py - gajim/gajim.py - gajim/groupchat_control.py - gajim/gtk/groupchat_config.py - gajim/gtk/groupchat_join.py - gajim/gtk/start_chat.py - setup.cfg - test/no_gui/unit/test_caps_cache.py
Changes:
===================================== gajim/common/caps_cache.py ===================================== @@ -29,8 +29,6 @@ through ClientCaps objects which are hold by contact instances.
import logging
-import nbxmpp -from nbxmpp.const import Affiliation from nbxmpp import (NS_XHTML_IM, NS_ESESSION, NS_CHATSTATES, NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO, NS_JINGLE_FILE_TRANSFER_5) @@ -52,15 +50,13 @@ FAKED = 3 # allow NullClientCaps to behave as it has a cached item ################################################################################
capscache = None -muc_caps_cache = None + def initialize(logger): """ Initialize this module """ global capscache - global muc_caps_cache capscache = CapsCache(logger) - muc_caps_cache = MucCapsCache()
def client_supports(client_caps, requested_feature): lookup_item = client_caps.get_cache_lookup_strategy() @@ -333,87 +329,3 @@ class CapsCache: key = (hash_method, hash_) if key in self.__cache: del self.__cache[key] - - -class MucCapsCache: - - def __init__(self): - self.cache = {} - - def append(self, info): - if nbxmpp.NS_MUC not in info.features: - # Not a MUC, don't cache info - return - - self.cache[info.jid] = info - - def is_cached(self, jid): - return jid in self.cache - - def supports(self, jid, feature): - if jid in self.cache: - if feature in self.cache[jid].features: - return True - return False - - def has_mam(self, jid): - try: - if nbxmpp.NS_MAM_2 in self.cache[jid].features: - return True - if nbxmpp.NS_MAM_1 in self.cache[jid].features: - return True - return False - except (KeyError, AttributeError): - return False - - def get_mam_namespace(self, jid): - try: - if nbxmpp.NS_MAM_2 in self.cache[jid].features: - return nbxmpp.NS_MAM_2 - if nbxmpp.NS_MAM_1 in self.cache[jid].features: - return nbxmpp.NS_MAM_1 - except (KeyError, AttributeError): - return - - def is_subject_change_allowed(self, jid, affiliation): - allowed = True - if affiliation in (Affiliation.OWNER, Affiliation.ADMIN): - return allowed - - if jid in self.cache: - for form in self.cache[jid].dataforms: - try: - allowed = form['muc#roominfo_changesubject'].value - except KeyError: - pass - return allowed - - def is_open(self, jid): - return 'muc_membersonly' not in self.cache[jid].features - - def is_password_protected(self, jid): - return 'muc_unsecured' not in self.cache[jid].features - - def is_anonymous(self, jid): - return 'muc_nonanonymous' not in self.cache[jid].features - - def is_persistent(self, jid): - return 'muc_temporary' not in self.cache[jid].features - - def get_room_infos(self, jid): - room_info = {} - if jid in self.cache: - for form in self.cache[jid].dataforms: - try: - room_info['name'] = form['muc#roomconfig_roomname'].value - except KeyError: - room_info['name'] = None - try: - room_info['desc'] = form['muc#roominfo_description'].value - except KeyError: - room_info['desc'] = None - try: - room_info['lang'] = form['muc#roominfo_lang'].value - except KeyError: - room_info['lang'] = None - return room_info or None
===================================== gajim/common/contacts.py ===================================== @@ -188,11 +188,10 @@ class Contact(CommonContact): if name: return name
- cache = caps_cache.muc_caps_cache.cache - if self.jid in cache: - name = cache[self.jid].muc_room_name - if name: - return name + disco_info = app.logger.get_last_disco_info(self.jid) + if disco_info is not None: + if disco_info.muc_room_name: + return disco_info.muc_room_name return self.jid.split('@')[0]
def get_shown_groups(self):
===================================== gajim/common/helpers.py ===================================== @@ -65,7 +65,6 @@ from gi.repository import GLib import precis_i18n.codec # pylint: disable=unused-import
from gajim.common import app -from gajim.common import caps_cache from gajim.common import configpaths from gajim.common.i18n import Q_ from gajim.common.i18n import _ @@ -1087,10 +1086,11 @@ def update_optional_features(account=None): # Give plugins the possibility to add their features app.plugin_manager.extension_point('update_caps', account_)
- app.caps_hash[account_] = compute_caps_hash(DiscoInfo( - None, None, [app.gajim_identity], - app.gajim_common_features + features, - []), compare=False) + disco_info = DiscoInfo(None, + [app.gajim_identity], + app.gajim_common_features + features, + []) + app.caps_hash[account_] = compute_caps_hash(disco_info, compare=False) # re-send presence with new hash connected = app.connections[account_].connected if connected > 1 and app.SHOW_LIST[connected] != 'invisible': @@ -1334,9 +1334,9 @@ def call_counter(func): return helper
def get_sync_threshold(jid, archive_info): - cache = caps_cache.muc_caps_cache + disco_info = app.logger.get_last_disco_info(jid) if archive_info is None or archive_info.sync_threshold is None: - if cache.supports(jid, 'muc#roomconfig_membersonly'): + if disco_info is not None and disco_info.muc_is_members_only: threshold = app.config.get('private_room_sync_threshold') else: threshold = app.config.get('public_room_sync_threshold')
===================================== gajim/common/logger.py ===================================== @@ -38,8 +38,10 @@ from collections import namedtuple from gi.repository import GLib
from nbxmpp.protocol import Node +from nbxmpp.protocol import Iq from nbxmpp.structs import DiscoInfo from nbxmpp.modules.dataforms import extend_form +from nbxmpp.modules.discovery import parse_disco_info
from gajim.common import exceptions from gajim.common import app @@ -105,6 +107,11 @@ CACHE_SQL_STATEMENT = ''' data TEXT, last_seen INTEGER ); + CREATE TABLE last_seen_disco_info( + jid TEXT PRIMARY KEY UNIQUE, + disco_info TEXT, + last_seen INTEGER + ); CREATE TABLE roster_entry( account_jid_id INTEGER, jid_id INTEGER, @@ -120,7 +127,7 @@ CACHE_SQL_STATEMENT = ''' group_name TEXT, PRIMARY KEY (account_jid_id, jid_id, group_name) ); - PRAGMA user_version=2; + PRAGMA user_version=3; '''
log = logging.getLogger('gajim.c.logger') @@ -170,6 +177,17 @@ def caps_decoder(dict_): dataforms=dataforms)
+def _convert_disco_info(disco_info): + return parse_disco_info(Iq(node=disco_info)) + +def _adapt_disco_info(disco_info): + return str(disco_info.stanza) + +sqlite.register_converter('disco_info', _convert_disco_info) + +sqlite.register_adapter(DiscoInfo, _adapt_disco_info) + + class Logger: def __init__(self): self._jid_ids = {} @@ -179,6 +197,8 @@ class Logger: self._log_db_path = configpaths.get('LOG_DB') self._cache_db_path = configpaths.get('CACHE_DB')
+ self._disco_info_cache = {} + self._create_databases() self._migrate_databases() self._connect_databases() @@ -299,6 +319,16 @@ class Logger: ] self._execute_multiple(con, statements)
+ if self._get_user_version(con) < 3: + statements = [ + '''CREATE TABLE last_seen_disco_info( + jid TEXT PRIMARY KEY UNIQUE, + disco_info TEXT, + last_seen INTEGER)''', + 'PRAGMA user_version=3' + ] + self._execute_multiple(con, statements) + @staticmethod def _execute_multiple(con, statements): """ @@ -341,8 +371,10 @@ class Logger: app.ged.raise_event(event, None, str(error))
def _connect_databases(self): - self._con = self._connect( - self._log_db_path, timeout=20.0, isolation_level='IMMEDIATE') + self._con = self._connect(self._log_db_path, + timeout=20.0, + isolation_level='IMMEDIATE', + detect_types=sqlite.PARSE_COLNAMES)
self._con.row_factory = self.namedtuple_factory
@@ -1465,3 +1497,55 @@ class Logger: self._con.execute(sql, tuple(kwargs.values()) + (jid_id,)) log.info('Set message archive info: %s %s', jid, kwargs) self._timeout_commit() + + def get_last_disco_info(self, jid): + """ + Get last disco info from jid + + :param jid: The jid + + """ + + if jid in self._disco_info_cache: + return self._disco_info_cache[jid] + + sql = '''SELECT disco_info as "disco_info [disco_info]", last_seen FROM + last_seen_disco_info + WHERE jid = ?''' + row = self._con.execute(sql, (str(jid),)).fetchone() + if row is None: + return None + + disco_info = row.disco_info._replace(timestamp=row.last_seen) + self._disco_info_cache[jid] = disco_info + return disco_info + + def set_last_disco_info(self, jid, disco_info): + """ + Get last disco info from jid + + :param jid: The jid + + :param disco_info: A DiscoInfo object + + """ + + log.info('Save disco info from %s', jid) + + disco_exists = self.get_last_disco_info(jid) is not None + if disco_exists: + sql = '''UPDATE last_seen_disco_info SET + disco_info = ?, last_seen = ? + WHERE jid = ?''' + + self._con.execute(sql, (disco_info, disco_info.timestamp, str(jid))) + + else: + sql = '''INSERT INTO last_seen_disco_info + (jid, disco_info, last_seen) + VALUES (?, ?, ?)''' + + self._con.execute(sql, (str(jid), disco_info, disco_info.timestamp)) + + self._disco_info_cache[jid] = disco_info + self._timeout_commit()
===================================== gajim/common/modules/discovery.py ===================================== @@ -19,10 +19,9 @@ from nbxmpp.structs import StanzaHandler from nbxmpp.util import is_error_result
from gajim.common import app -from gajim.common.caps_cache import muc_caps_cache from gajim.common.nec import NetworkIncomingEvent from gajim.common.modules.base import BaseModule -from gajim.common.connection_handlers_events import InformationEvent +from gajim.common.nec import NetworkEvent
class Discovery(BaseModule): @@ -197,39 +196,27 @@ class Discovery(BaseModule): self._con.connection.send(iq) raise nbxmpp.NodeProcessed
- def disco_muc(self, jid, callback, update=False): + def disco_muc(self, jid, callback=None): if not app.account_is_connected(self._account): return - if muc_caps_cache.is_cached(jid) and not update: - callback() - return
- self._log.info('Request MUC info %s', jid) + self._log.info('Request MUC info for %s', jid)
self.disco_info(jid, - callback=self._muc_info_response, + callback=self._muc_info_received, user_data=callback)
- def _muc_info_response(self, result, callback): - if is_error_result(result): - if result.condition == 'item-not-found': - # Groupchat does not exist - self._log.info('MUC does not exist: %s', result.jid) - callback() - else: - self._log.info('MUC disco error: %s', result) - app.nec.push_incoming_event( - InformationEvent( - None, - dialog_name='unable-join-groupchat', - kwargs={ - 'server': result.jid, - 'error': str(result)})) - return - + def _muc_info_received(self, result, callback): self._log.info('MUC info received: %s', result.jid) - muc_caps_cache.append(result) - callback() + if not is_error_result(result): + app.logger.set_last_disco_info(result.jid, result) + app.nec.push_incoming_event(NetworkEvent( + 'muc-disco-update', + account=self._account, + room_jid=result.jid)) + + if callback is not None: + callback(result)
def get_instance(*args, **kwargs):
===================================== gajim/common/modules/iq.py ===================================== @@ -15,7 +15,6 @@ # Iq handler
import nbxmpp -from nbxmpp.const import Error from nbxmpp.structs import StanzaHandler
from gajim.common import app @@ -37,13 +36,13 @@ class Iq(BaseModule):
def _iq_error_received(self, _con, _stanza, properties): self._log.info('Error: %s', properties.error) - if properties.error.type in (Error.JID_MALFORMED, - Error.FORBIDDEN, - Error.NOT_ACCEPTABLE): + if properties.error.condition in ('jid-malformed', + 'forbidden', + 'not-acceptable'): sid = self._get_sid(properties.id) file_props = FilesProp.getFileProp(self._account, sid) if file_props: - if properties.error.type == Error.JID_MALFORMED: + if properties.error.condition == 'jid-malformed': file_props.error = -3 else: file_props.error = -4 @@ -52,11 +51,11 @@ class Iq(BaseModule): conn=self._con, jid=properties.jid.getBare(), file_props=file_props, - error_msg=properties.error.message)) + error_msg=properties.error.get_text())) self._con.get_module('Bytestream').disconnect_transfer(file_props) raise nbxmpp.NodeProcessed
- if properties.error.type == Error.ITEM_NOT_FOUND: + if properties.error.condition == 'item-not-found': sid = self._get_sid(properties.id) file_props = FilesProp.getFileProp(self._account, sid) if file_props:
===================================== gajim/common/modules/mam.py ===================================== @@ -26,7 +26,6 @@ from gajim.common.nec import NetworkIncomingEvent from gajim.common.const import ArchiveState from gajim.common.const import KindConstant from gajim.common.const import SyncThreshold -from gajim.common.caps_cache import muc_caps_cache from gajim.common.helpers import get_sync_threshold from gajim.common.helpers import AdditionalDataDict from gajim.common.modules.misc import parse_oob @@ -112,7 +111,8 @@ class MAM(BaseModule):
if properties.type.is_groupchat: archive_jid = properties.jid.getBare() - namespace = muc_caps_cache.get_mam_namespace(archive_jid) + disco_info = app.logger.get_last_disco_info(archive_jid) + namespace = disco_info.mam_namespace timestamp = properties.timestamp if namespace is None: # MUC History @@ -536,10 +536,12 @@ class MAM(BaseModule): def _get_archive_query(self, query_id, jid=None, start=None, end=None, with_=None, after=None, max_=70): # Muc archive query? - namespace = muc_caps_cache.get_mam_namespace(jid) - if namespace is None: + disco_info = app.logger.get_last_disco_info(jid) + if disco_info is None: # Query to our own archive namespace = self.archiving_namespace + else: + namespace = disco_info.mam_namespace
iq = nbxmpp.Iq('set', to=jid) query = iq.addChild('query', namespace=namespace)
===================================== gajim/common/modules/message.py ===================================== @@ -25,7 +25,6 @@ from gajim.common.i18n import _ from gajim.common.nec import NetworkIncomingEvent from gajim.common.nec import NetworkEvent from gajim.common.helpers import AdditionalDataDict -from gajim.common.caps_cache import muc_caps_cache from gajim.common.const import KindConstant from gajim.common.modules.base import BaseModule from gajim.common.modules.util import get_eme_message @@ -293,8 +292,8 @@ class Message(BaseModule): message_id=event.message_id)
def _check_for_mam_compliance(self, room_jid, stanza_id): - namespace = muc_caps_cache.get_mam_namespace(room_jid) - if stanza_id is None and namespace == nbxmpp.NS_MAM_2: + disco_info = app.logger.get_last_disco_info(room_jid) + if stanza_id is None and disco_info.mam_namespace == nbxmpp.NS_MAM_2: self._log.warning('%s announces mam:2 without stanza-id', room_jid)
def _get_unique_id(self, properties): @@ -306,8 +305,9 @@ class Message(BaseModule): return None, None
if properties.type.is_groupchat: - namespace = muc_caps_cache.get_mam_namespace( + disco_info = app.logger.get_last_disco_info( properties.jid.getBare()) + namespace = disco_info.mam_namespace archive = properties.jid else: namespace = self._con.get_module('MAM').archiving_namespace
===================================== gajim/common/modules/muc.py ===================================== @@ -20,12 +20,10 @@ import logging from datetime import datetime from datetime import timedelta from datetime import timezone -from functools import partial
import nbxmpp from nbxmpp.const import InviteType from nbxmpp.const import PresenceType -from nbxmpp.const import Error from nbxmpp.structs import StanzaHandler from nbxmpp.util import is_error_result
@@ -41,7 +39,6 @@ from gajim.common.helpers import get_default_muc_config from gajim.common.helpers import get_sync_threshold from gajim.common.helpers import to_user_string from gajim.common import idle -from gajim.common.caps_cache import muc_caps_cache from gajim.common.nec import NetworkEvent from gajim.common.modules.bits_of_binary import store_bob_data from gajim.common.modules.base import BaseModule @@ -145,7 +142,20 @@ class MUC(BaseModule): self._muc_data[muc_data.jid] = muc_data
self._con.get_module('Discovery').disco_muc( - muc_data.jid, partial(self._join, muc_data)) + muc_data.jid, + callback=self._on_disco_result) + + def _on_disco_result(self, result): + if is_error_result(result): + self._log.info('Disco %s failed: %s', result.jid, result.get_text()) + app.nec.push_incoming_event( + NetworkEvent('muc-join-failed', + account=self._account, + room_jid=result.jid.getBare(), + error=result)) + return + + self._join(self._get_muc_data(result.jid))
def _join(self, muc_data): show = helpers.get_xmpp_show(app.SHOW_LIST[self._con.connected]) @@ -228,8 +238,7 @@ class MUC(BaseModule): account=self._account, room_jid=result.jid))
- self._con.get_module('Discovery').disco_muc( - result.jid, partial(self._on_disco_update, result.jid), update=True) + self._con.get_module('Discovery').disco_muc(result.jid)
# If this is an automatic room creation try: @@ -245,12 +254,6 @@ class MUC(BaseModule): for jid in invites: self.invite(result.jid, jid)
- def _on_disco_update(self, room_jid): - app.nec.push_incoming_event(NetworkEvent( - 'muc-disco-update', - account=self._account, - room_jid=room_jid)) - def update_presence(self, auto=False): mucs = self.get_mucs_with_state([MUCJoinedState.JOINED, MUCJoinedState.JOINING]) @@ -291,7 +294,8 @@ class MUC(BaseModule): status=self._con.status)
def _add_history_query(self, muc_x, room_jid): - if muc_caps_cache.has_mam(room_jid): + disco_info = app.logger.get_last_disco_info(room_jid) + if disco_info.has_mam: # The room is MAM capable dont get MUC History muc_x.setTag('history', {'maxchars': '0'}) else: @@ -322,23 +326,27 @@ class MUC(BaseModule): return
if muc_data.state == MUCJoinedState.JOINING: - if properties.error.type == Error.CONFLICT: + if properties.error.condition == 'conflict': muc_data.nick += '_' self._log.info('Nickname conflict: %s change to %s', muc_data.jid, muc_data.nick) self._join(muc_data) - elif properties.error.type == Error.NOT_AUTHORIZED: + elif properties.error.condition == 'not-authorized': self._raise_muc_event('muc-password-required', properties) else: - self._raise_muc_event('muc-join-failed', properties) self._set_muc_state(room_jid, MUCJoinedState.NOT_JOINED) + app.nec.push_incoming_event( + NetworkEvent('muc-join-failed', + account=self._account, + room_jid=room_jid, + error=properties.error))
elif muc_data.state == MUCJoinedState.CAPTCHA_REQUEST: app.nec.push_incoming_event( NetworkEvent('muc-captcha-error', account=self._account, room_jid=room_jid, - error_text=properties.error.message)) + error_text=properties.error.get_text())) self._set_muc_state(room_jid, MUCJoinedState.CAPTCHA_FAILED) self._set_muc_state(room_jid, MUCJoinedState.NOT_JOINED)
===================================== gajim/dialog_messages.py ===================================== @@ -104,11 +104,6 @@ messages = { '%(error_msg)s'), ErrorDialog),
- 'unable-join-groupchat': Message( - _('Unable to Join Group Chat'), - '%(server)s\n%(error)s', - ErrorDialog), - 'gstreamer-error': Message( _('GStreamer Error'), _('Error: %(error)s\nDebug: %(debug)s'),
===================================== gajim/gajim.py ===================================== @@ -26,7 +26,7 @@ from distutils.version import LooseVersion as V
from gajim.common import i18n
-_MIN_NBXMPP_VER = "0.9.91" +_MIN_NBXMPP_VER = "0.9.92" _MIN_GTK_VER = "3.22.0" _MIN_CAIRO_VER = "1.14.0"
===================================== gajim/groupchat_control.py ===================================== @@ -53,7 +53,6 @@ from gajim import message_control from gajim import vcard
from gajim.common.const import AvatarSize -from gajim.common.caps_cache import muc_caps_cache from gajim.common import events from gajim.common import app from gajim.common import helpers @@ -371,6 +370,10 @@ class GroupchatControl(ChatControlBase): def room_name(self): return self.contact.get_shown_name()
+ @property + def disco_info(self): + return app.logger.get_last_disco_info(self.contact.jid) + def add_actions(self): super().add_actions() actions = [ @@ -421,8 +424,10 @@ class GroupchatControl(ChatControlBase): self.parent_win.window.add_action(act)
# Enable notify on all for private rooms - members_only = muc_caps_cache.supports(self.contact.jid, - 'muc#roomconfig_membersonly') + members_only = False + if self.disco_info is not None: + members_only = self.disco_info.muc_is_members_only + value = app.config.get_per( 'rooms', self.contact.jid, 'notify_on_all_messages', members_only)
@@ -486,12 +491,9 @@ class GroupchatControl(ChatControlBase): role.is_visitor)
# Change Subject - subject = False - if contact is not None: - subject = muc_caps_cache.is_subject_change_allowed( - self.room_jid, contact.affiliation) + subject_change = self._is_subject_change_allowed() self._get_action('change-subject-').set_enabled(self.is_connected and - subject) + subject_change)
# Change Nick self._get_action('change-nickname-').set_enabled(self.is_connected) @@ -517,7 +519,9 @@ class GroupchatControl(ChatControlBase): self.sendfile_button.set_tooltip_text(tooltip_text)
# Upload Avatar - vcard_support = muc_caps_cache.supports(self.room_jid, nbxmpp.NS_VCARD) + vcard_support = False + if self.disco_info is not None: + vcard_support = self.disco_info.supports(nbxmpp.NS_VCARD) self._get_action('upload-avatar-').set_enabled( self.is_connected and vcard_support and @@ -537,6 +541,19 @@ class GroupchatControl(ChatControlBase): self._get_action('print-status-').set_state( GLib.Variant.new_boolean(value))
+ def _is_subject_change_allowed(self): + contact = app.contacts.get_gc_contact( + self.account, self.room_jid, self.nick) + if contact is None: + return False + + if contact.affiliation in (Affiliation.OWNER, Affiliation.ADMIN): + return True + + if self.disco_info is None: + return False + return self.disco_info.muc_subjectmod + def _get_action(self, name): win = self.parent_win.window return win.lookup_action(name + self.control_id) @@ -623,14 +640,13 @@ class GroupchatControl(ChatControlBase): self.update_actions()
# After the room has been created, reevaluate threshold - if muc_caps_cache.has_mam(self.contact.jid): + if self.disco_info.has_mam: archive_info = app.logger.get_archive_infos(self.contact.jid) threshold = helpers.get_sync_threshold(self.contact.jid, archive_info) win.change_action_state('choose-sync-%s' % self.control_id, GLib.Variant('s', str(threshold)))
- def _connect_window_state_change(self, parent_win): if self._state_change_handler_id is None: id_ = parent_win.window.connect('notify::is-maximized', @@ -643,8 +659,7 @@ class GroupchatControl(ChatControlBase): self.leave()
def _on_information(self, action, param): - disco_info = muc_caps_cache.cache[self.contact.jid] - self._muc_info_box.set_from_disco_info(disco_info) + self._muc_info_box.set_from_disco_info(self.disco_info) if self._subject_data is not None: self._muc_info_box.set_subject(self._subject_data.subject) self._muc_info_box.set_author(self._subject_data.nickname, @@ -1386,7 +1401,7 @@ class GroupchatControl(ChatControlBase): changes.append(_('A setting not related to privacy has been ' 'changed')) app.connections[self.account].get_module('Discovery').disco_muc( - self.room_jid, self.update_actions, update=True) + self.room_jid)
if StatusCode.CONFIG_ROOM_LOGGING in event.status_codes: # Can be a presence (see chg_contact_status in groupchat_control.py) @@ -1479,7 +1494,7 @@ class GroupchatControl(ChatControlBase): GLib.source_remove(self.autorejoin) self.autorejoin = None
- if muc_caps_cache.has_mam(self.room_jid): + if self.disco_info.has_mam: # Request MAM con = app.connections[self.account] con.get_module('MAM').request_archive_on_muc_join( @@ -1925,17 +1940,14 @@ class GroupchatControl(ChatControlBase):
@event_filter(['account', 'room_jid']) def _on_muc_join_failed(self, event): - self.xml.error_label.set_text(event.properties.error.message) + self.xml.error_label.set_text(event.error.get_text()) self._show_page('error') self.autorejoin = False
@event_filter(['account', 'room_jid']) def _on_presence_error(self, event): - error_type = event.properties.error.type - error_message = event.properties.error.message - - self.add_info_message( - 'Error %s: %s' % (error_type.value, error_message)) + error_message = event.properties.error.get_text() + self.add_info_message('Error: %s' % error_message)
def add_contact_to_roster(self, nick): contact = app.contacts.get_gc_contact(self.account,
===================================== gajim/gtk/groupchat_config.py ===================================== @@ -22,7 +22,6 @@ from gi.repository import Gtk from gajim.common import app from gajim.common.i18n import _ from gajim.common.const import MUCUser -from gajim.common.caps_cache import muc_caps_cache
from gajim.gtk.dialogs import ErrorDialog from gajim.gtk.dataform import DataFormWidget @@ -53,7 +52,8 @@ class GroupchatConfig(Gtk.ApplicationWindow): self._ui.add_button.set_sensitive(True) self._ui.add_button.set_tooltip_text('')
- visible = muc_caps_cache.supports(jid, nbxmpp.NS_REGISTER) + disco_info = app.logger.get_last_disco_info(self.jid) + visible = disco_info.supports(nbxmpp.NS_REGISTER) self._ui.reserved_name_column.set_visible(visible) self._ui.info_button.set_sensitive(False)
===================================== gajim/gtk/groupchat_join.py ===================================== @@ -73,17 +73,14 @@ class GroupchatJoin(Gtk.ApplicationWindow): self.add(self._main_box) self.show_all()
- self._disco_muc(jid) + con = app.connections[self.account] + con.get_module('Discovery').disco_muc( + jid, callback=self._disco_info_received)
def _on_page_changed(self, stack, _param): name = stack.get_visible_child_name() self._join_button.set_sensitive(name == 'info')
- def _disco_muc(self, jid): - con = app.connections[self.account] - con.get_module('Discovery').disco_info( - jid, callback=self._disco_info_received) - @ensure_not_destroyed def _disco_info_received(self, result): if is_error_result(result):
===================================== gajim/gtk/start_chat.py ===================================== @@ -14,6 +14,7 @@
import locale from enum import IntEnum +from functools import partial
from gi.repository import Gdk from gi.repository import Gtk @@ -275,11 +276,11 @@ class StartChatDialog(Gtk.ApplicationWindow): def _disco_muc(self, account, jid): self._ui.stack.set_visible_child_name('progress') con = app.connections[account] - con.get_module('Discovery').disco_info( - jid, callback=self._disco_info_received, user_data=account) + con.get_module('Discovery').disco_muc( + jid, callback=partial(self._disco_info_received, account))
@ensure_not_destroyed - def _disco_info_received(self, result, account): + def _disco_info_received(self, account, result): if is_error_result(result): self._set_error(result)
===================================== setup.cfg ===================================== @@ -22,7 +22,7 @@ test_suite = test install_requires = cssutils>=1.0.2 keyring - nbxmpp>=0.9.91 + nbxmpp>=0.9.92 precis-i18n>=1.0.0 pyOpenSSL>=16.2 pycairo>=1.14.0
===================================== test/no_gui/unit/test_caps_cache.py ===================================== @@ -61,7 +61,7 @@ class TestCapsCache(CommonCapsTest): def test_set_and_store(self): ''' Test client_caps update gets logged into db '''
- disco_info = DiscoInfo(None, None, self.identities, self.features, []) + disco_info = DiscoInfo(None, self.identities, self.features, [])
item = self.cc[self.client_caps] item.set_and_store(disco_info)
View it on GitLab: https://dev.gajim.org/gajim/gajim/compare/623177a86d6adb87b6aa739f156e433b87...