From f4c5e0a091e9e56e95ff687654e68e90dc6144e0 Mon Sep 17 00:00:00 2001 From: "louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13" Date: Sun, 17 Oct 2010 17:27:07 +0000 Subject: Multi-resource. Handling stanzas. But the normal conversation window is broken :^). Fixed #1888 --- src/contact.py | 127 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 19 deletions(-) (limited to 'src/contact.py') diff --git a/src/contact.py b/src/contact.py index 8966289b..3a0ea30e 100644 --- a/src/contact.py +++ b/src/contact.py @@ -16,31 +16,16 @@ from sleekxmpp.xmlstream.jid import JID -class Contact(object): +class Resource(object): """ - Defines a roster item + Defines a roster item. + It's a precise resource. """ def __init__(self, jid): - self._jid = JID(jid) # a SleekXMPP jid object - self._display_name = None - self._subscription = 'none' - self._ask = None + self._jid = JID(jid) # Full jid self._status = '' self._presence = 'unavailable' self._priority = 0 - self._groups = [] # a list of groups the contact is in - - def set_ask(self, ask): - self._ask = ask - - def get_ask(self): - return self._ask - - def set_subscription(self, sub): - self._subscription = sub - - def get_subscription(self, sub): - return self._subscription def get_jid(self): return self._jid @@ -52,6 +37,9 @@ class Contact(object): assert isinstance(priority, int) self._priority = priority + def get_priority(self): + return self._priority + def set_presence(self, pres): self._presence = pres @@ -64,8 +52,109 @@ class Contact(object): def set__status(self, s): self._status = s +class Contact(object): + """ + This a way to gather multiple resources from the same bare JID. + This class contains zero or more esource class and useful methods + to get the resource with the highest priority, etc + """ + def __init__(self, bare_jid): + self._jid = bare_jid + self._resources = [] + self._folded = True # Folded by default + self._display_name = None + self._subscription = 'none' + self._ask = None + self._groups = [] # a list of groups the contact is in + + def get_bare_jid(self): + """ + Just get the bare_jid or the contact + """ + return self._jid + + def get_highest_priority_resource(self): + """ + There must be, at any time, at least ONE resource. + And they always should be ordered by priority. + """ + ret = None + for resource in self._resources: + if not ret or ret.get_priority() < resource.get_priority(): + ret = resource + return ret + + def add_resource(self, resource): + """ + Called, for example, when a new resource get offline + (the first, or any subsequent one) + """ + # TODO sort by priority + self._resources.append(resource) + + def remove_resource(self, resource): + """ + Called, for example, when one resource goes offline. + """ + self._resources.remove(resource) + + def remove_resource_by_fulljid(self, fulljid): + """ + Like 'remove_resource' but just by knowing the full jid + """ + for resource in self._resources: + if resource.get_jid().full == fulljid: + self._resources.remove(resource) + return + assert False + + def get_resource_by_fulljid(self, fulljid): + """ + Return the resource with the given fulljid + """ + for resource in self._resources: + if resource.get_jid().full == fulljid: + return resource + return None + def toggle_folded(self): + """ + Fold if it's unfolded, and vice versa + """ + self._folded = not self._folded + def set_name(self, name): self._display_name = name def get_name(self): return self._display_name + + def set_ask(self, ask): + self._ask = ask + + def get_ask(self): + return self._ask + + def set_subscription(self, sub): + self._subscription = sub + + def get_subscription(self, sub): + return self._subscription + + def get_nb_resources(self): + """ + Get the number of connected resources + """ + return len(self._resources) + + def get_resources(self): + """ + Return all resources + """ + compare_resources = lambda x: x.get_priority() + return sorted(self._resources, key=compare_resources) + + def __repr__(self): + ret = '\n' -- cgit v1.2.3