Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: e4dc7e3e by lovetox at 2021-03-06T20:50:48+01:00 Refactor Blocking
- - - - -
5 changed files:
- gajim/common/modules/blocking.py - gajim/common/modules/contacts.py - gajim/gtk/blocking.py - gajim/gtk/main.py - gajim/gtk/roster.py
Changes:
===================================== gajim/common/modules/blocking.py ===================================== @@ -38,7 +38,7 @@ class Blocking(BaseModule): def __init__(self, con): BaseModule.__init__(self, con)
- self.blocked = [] + self.blocked = set()
self.handlers = [ StanzaHandler(name='iq', @@ -61,6 +61,9 @@ def pass_disco(self, info):
self._log.info('Discovered blocking: %s', info.jid)
+ def is_blocked(self, jid): + return jid in self.blocked + @as_task def get_blocking_list(self): _task = yield @@ -70,9 +73,9 @@ def get_blocking_list(self): raise_if_error(blocking_list)
self.blocked = blocking_list - app.nec.push_incoming_event(NetworkEvent('blocking', - conn=self._con, - changed=self.blocked)) + for contact in self._get_contacts_from_jids(blocking_list): + contact.set_blocked() + yield blocking_list
@as_task @@ -93,42 +96,50 @@ def _blocking_push_received(self, _con, _stanza, properties): if not properties.is_blocking: return
- changed_list = [] - if properties.blocking.unblock_all: - self.blocked = [] - for jid in self.blocked: - self._presence_probe(jid) - self._log.info('Unblock all Push') - - for jid in properties.blocking.unblock: - changed_list.append(jid) - if jid not in self.blocked: - continue - self.blocked.remove(jid) - self._presence_probe(jid) - self._log.info('Unblock Push: %s', jid) + unblock = set(self.blocked) + self.blocked = set() + self._unblock_jids(unblock) + raise nbxmpp.NodeProcessed + + if properties.blocking.unblock: + self.blocked -= properties.blocking.unblock + self._unblock_jids(properties.blocking.unblock) + + if properties.blocking.block: + block = properties.blocking.block + self.blocked.update(block) + for contact in self._get_contacts_from_jids(block): + self._log.info('Block Push: %s', contact.jid) + contact.set_blocked() + + raise nbxmpp.NodeProcessed + + def _unblock_jids(self, jids): + for contact in self._get_contacts_from_jids(jids): + contact.set_unblocked() + self._presence_probe(contact.jid) + self._log.info('Unblock Push: %s', contact.jid)
- for jid in properties.blocking.block: - if jid in self.blocked: + def _get_contacts_from_jids(self, jids): + for jid in jids: + if jid.resource is not None: + # Currently not supported by GUI continue - changed_list.append(jid) - self.blocked.append(jid) - self._set_contact_offline(str(jid)) - self._log.info('Block Push: %s', jid)
- app.nec.push_incoming_event(NetworkEvent('blocking', - conn=self._con, - changed=changed_list)) + if jid.is_domain: + module = self._con.get_module('Contacts') + contacts = module.get_contacts_with_domain(jid.domain) + for contact in contacts: + if contact.is_groupchat: + # Currently not supported by GUI + continue
- raise nbxmpp.NodeProcessed + yield contact + + continue
- def _set_contact_offline(self, jid: str) -> None: - # TODO - return - # contact_list = app.contacts.get_contacts(self._account, jid) - # for contact in contact_list: - # contact.show = 'offline' + yield self._get_contact(jid)
def _presence_probe(self, jid: JID) -> None: self._log.info('Presence probe: %s', jid)
===================================== gajim/common/modules/contacts.py ===================================== @@ -83,6 +83,13 @@ def get_contact(self, jid, groupchat=False): def get_group_chat_contact(self, jid): return self.get_contact(jid, groupchat=True)
+ def get_contacts_with_domain(self, domain): + contacts = [] + for contact in self._contacts.values(): + if contact.jid.domain == domain: + contacts.append(contact) + return contacts +
class CommonContact(Observable): def __init__(self, logger, jid, account): @@ -234,6 +241,16 @@ def subscription(self): def groups(self): return self._get_roster_attr('groups')
+ @property + def is_blocked(self): + return self._module('Blocking').is_blocked(self._jid) + + def set_blocked(self): + self.update_presence(UNKNOWN_PRESENCE) + self.notify('blocking-update') + + def set_unblocked(self): + self.notify('blocking-update')
class ResourceContact(CommonContact):
===================================== gajim/gtk/blocking.py ===================================== @@ -75,8 +75,8 @@ def _on_blocking_list_received(self, task):
self._prev_blocked_jids = set(blocking_list) self._ui.blocking_store.clear() - for item in blocking_list: - self._ui.blocking_store.append((item,)) + for jid in blocking_list: + self._ui.blocking_store.append((str(jid),))
self._set_grid_state(True) self._disable_spinner()
===================================== gajim/gtk/main.py ===================================== @@ -485,26 +485,15 @@ def execute_command(account, jid): def block_contact(self, account, jid): client = app.get_client(account)
- if jid_is_blocked(account, jid): + contact = client.get_module('Contacts').get_contact(jid) + if contact.is_blocked: client.get_module('Blocking').unblock([jid]) - roster = self._account_pages[account].get_roster() - roster.draw_contact(jid) return
# TODO: Keep "confirm_block" setting? def _block_contact(report=None): - app.events.remove_events(account, jid) - - contact = client.get_module('Contacts').get_contact(jid) - client.get_module('Blocking').block([jid], report) - if not contact.is_in_roster: - self.remove_chat(account, jid) - return - - roster = self._account_pages[account].get_roster() - roster.draw_contact(jid) - # TODO: draw_contact draws too early (not blocked yet) - # TODO: Draw ChatList row differently? + client.get_module('Blocking').block([contact.jid], report) + self.remove_chat(account, contact.jid)
ConfirmationDialog( _('Block Contact'),
===================================== gajim/gtk/roster.py ===================================== @@ -330,18 +330,19 @@ def enable_sort(self, enable):
def _initial_draw(self): for contact in self._client.get_module('Roster').iter_contacts(): - contact.connect('presence-update', self._on_presence_update) - contact.connect('avatar-update', self._on_avatar_update) + self._connect_contact_signals(contact) self._add_or_update_contact(contact)
self.enable_sort(True) self.set_model() self._roster.expand_all()
- def _on_presence_update(self, contact, _signal_name): - self._draw_contact(contact) + def _connect_contact_signals(self, contact): + contact.connect('presence-update', self._on_contact_update) + contact.connect('avatar-update', self._on_contact_update) + contact.connect('blocking-update', self._on_contact_update)
- def _on_avatar_update(self, contact, _signal_name): + def _on_contact_update(self, contact, _signal_name): self._draw_contact(contact)
@event_filter(['account']) @@ -353,8 +354,11 @@ def _on_roster_push(self, event): contact = self._get_contact(event.item.jid)
if event.item.subscription == 'remove': + contact.disconnect(self) self._remove_contact(contact) else: + if contact.jid not in self._contact_refs: + self._connect_contact_signals(contact) self._add_or_update_contact(contact)
def _get_current_groups(self, jid): @@ -482,7 +486,7 @@ def _draw_contact_row(self, ref, contact): iter_ = self._get_iter_from_ref(ref)
name = GLib.markup_escape_text(contact.name) - if jid_is_blocked(self._account, contact.jid): + if contact.is_blocked: name = f'<span strikethrough="true">{name}</span>' self._store[iter_][Column.TEXT] = name
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/e4dc7e3e729e69228427f1f1630d545ad...