summaryrefslogtreecommitdiff
path: root/src/contact.py
diff options
context:
space:
mode:
authorlouiz@4325f9fc-e183-4c21-96ce-0ab188b42d13 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13>2010-10-17 17:27:07 +0000
committerlouiz@4325f9fc-e183-4c21-96ce-0ab188b42d13 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13>2010-10-17 17:27:07 +0000
commitf4c5e0a091e9e56e95ff687654e68e90dc6144e0 (patch)
treecb6ce6b15f3dad1b502f5065ebc42b9928e3d8e4 /src/contact.py
parent17ebb92ece4dc7b45b816bac660fed6ade9db0e7 (diff)
downloadpoezio-f4c5e0a091e9e56e95ff687654e68e90dc6144e0.tar.gz
poezio-f4c5e0a091e9e56e95ff687654e68e90dc6144e0.tar.bz2
poezio-f4c5e0a091e9e56e95ff687654e68e90dc6144e0.tar.xz
poezio-f4c5e0a091e9e56e95ff687654e68e90dc6144e0.zip
Multi-resource. Handling <presence /> stanzas. But the normal conversation window is broken :^). Fixed #1888
Diffstat (limited to 'src/contact.py')
-rw-r--r--src/contact.py127
1 files changed, 108 insertions, 19 deletions
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 = '<Contact: %s' % self._jid
+ for resource in self._resources:
+ ret += '\n\t\t%s'%resource
+ return ret + ' />\n'