quick_frontend, primitivus (contact_list): improved and simplified handling of "special" entities:

- special_extras has been removed
    - specials handle all entities (bare + full) in a single set
This commit is contained in:
Goffi 2016-07-24 17:47:09 +02:00
commit 57daef07a7
2 changed files with 31 additions and 61 deletions

View file

@ -106,7 +106,7 @@ class Message(object):
except KeyError:
log.error(u"extra data is missing user nick for uid {}".format(self.uid))
return ""
if self.parent.type == C.CHAT_GROUP or entity in contact_list.getSpecialExtras(C.CONTACT_SPECIAL_GROUP):
if self.parent.type == C.CHAT_GROUP or entity in contact_list.getSpecials(C.CONTACT_SPECIAL_GROUP):
return entity.resource or ""
if entity.bare in contact_list:
return contact_list.getCache(entity, 'nick') or contact_list.getCache(entity, 'name') or entity.node or entity

View file

@ -56,10 +56,9 @@ class ProfileContactList(object):
# for different profiles (e.g. directed presence)
self._cache = {}
# special entities (groupchat, gateways, etc), bare jids
# special entities (groupchat, gateways, etc)
# may be bare or full jid
self._specials = set()
# extras are specials with full jids (e.g.: private MUC conversation)
self._special_extras = set()
# group data contain jids in groups and misc frontend data
# None key is used for jids with not group
@ -178,20 +177,6 @@ class ProfileContactList(object):
"""
return self._cache[entity]
def getSpecialExtras(self, special_type=None):
"""Return special extras with given type
If special_type is None, return all special extras.
@param special_type(unicode, None): one of special type (e.g. C.CONTACT_SPECIAL_GROUP)
None to return all special extras.
@return (set[jid.JID])
"""
if special_type is None:
return self._special_extras
specials = self.getSpecials(special_type)
return {extra for extra in self._special_extras if extra.bare in specials}
def _gotContacts(self, contacts):
"""Called during filling, add contacts and notice parent that contacts are filled"""
for contact in contacts:
@ -289,22 +274,25 @@ class ProfileContactList(object):
"""Set special flag on an entity
@param entity(jid.JID): jid of the special entity
if the jid is full, will be added to special extras
@param special_type: one of special type (e.g. C.CONTACT_SPECIAL_GROUP) or None to remove special flag
"""
assert special_type in C.CONTACT_SPECIAL_ALLOWED + (None,)
self.setCache(entity, C.CONTACT_SPECIAL, special_type)
def getSpecials(self, special_type=None):
def getSpecials(self, special_type=None, bare=False):
"""Return all the bare JIDs of the special roster entities of with given type.
If special_type is None, return all specials.
@param special_type: one of special type (e.g. C.CONTACT_SPECIAL_GROUP) or None to return all specials.
@return: set(jid.JID)
@param special_type(unicode, None): if not None, filter by special type (e.g. C.CONTACT_SPECIAL_GROUP)
@param bare(bool): return only bare jids if True
@return (iter[jid.JID]): found special entities
"""
if special_type is None:
return self._specials
return set([entity for entity in self._specials if self.getCache(entity, C.CONTACT_SPECIAL) == special_type])
for entity in self._specials:
if bare and entity.resource:
continue
if special_type is not None and self.getCache(entity, C.CONTACT_SPECIAL) != special_type:
continue
yield entity
def disconnect(self):
# for now we just clear contacts on disconnect
@ -320,7 +308,6 @@ class ProfileContactList(object):
self._cache.clear()
self._groups.clear()
self._specials.clear()
self._special_extras.clear()
self._roster.clear()
self.update()
@ -369,9 +356,9 @@ class ProfileContactList(object):
if C.CONTACT_SPECIAL in attributes:
if attributes[C.CONTACT_SPECIAL] is None:
del attributes[C.CONTACT_SPECIAL]
self._specials.remove(entity_bare)
self._specials.remove(entity)
else:
self._specials.add(entity_bare)
self._specials.add(entity)
cache[C.CONTACT_MAIN_RESOURCE] = None
# now the attributes we keep in cache
@ -441,7 +428,7 @@ class ProfileContactList(object):
self._groups[group]['jids'].remove(entity_bare)
if not self._groups[group]['jids']:
self._groups.pop(group) # FIXME: we use pop because of pyjamas: http://wiki.goffi.org/wiki/Issues_with_Pyjamas/en
for iterable in (self._selected, self._specials, self._special_extras):
for iterable in (self._selected, self._specials):
to_remove = set()
for set_entity in iterable:
if set_entity.bare == entity.bare: