2011-09-06 00:45:53 +00:00
|
|
|
# Copyright 2010-2011 Florent Le Coz <louiz@louiz.org>
|
2010-09-16 17:57:27 +00:00
|
|
|
#
|
|
|
|
# This file is part of Poezio.
|
|
|
|
#
|
|
|
|
# Poezio is free software: you can redistribute it and/or modify
|
2011-09-11 15:10:05 +00:00
|
|
|
# it under the terms of the zlib license. See the COPYING file.
|
2010-09-16 17:57:27 +00:00
|
|
|
|
2010-10-27 22:49:52 +00:00
|
|
|
"""
|
2010-11-15 11:59:09 +00:00
|
|
|
Defines the Resource and Contact classes, which are used in
|
|
|
|
the roster
|
2010-10-27 22:49:52 +00:00
|
|
|
"""
|
2010-11-15 11:59:09 +00:00
|
|
|
|
2010-11-10 21:15:08 +00:00
|
|
|
import logging
|
|
|
|
log = logging.getLogger(__name__)
|
2010-09-16 17:57:27 +00:00
|
|
|
|
2010-11-15 11:59:09 +00:00
|
|
|
from sleekxmpp.xmlstream.stanzabase import JID
|
|
|
|
|
2010-10-17 17:27:07 +00:00
|
|
|
class Resource(object):
|
2010-09-16 17:57:27 +00:00
|
|
|
"""
|
2010-10-17 17:27:07 +00:00
|
|
|
Defines a roster item.
|
|
|
|
It's a precise resource.
|
2010-09-16 17:57:27 +00:00
|
|
|
"""
|
|
|
|
def __init__(self, jid):
|
2010-10-17 17:27:07 +00:00
|
|
|
self._jid = JID(jid) # Full jid
|
2010-09-26 18:01:38 +00:00
|
|
|
self._status = ''
|
|
|
|
self._presence = 'unavailable'
|
|
|
|
self._priority = 0
|
2010-10-04 00:27:40 +00:00
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def jid(self):
|
2010-09-16 17:57:27 +00:00
|
|
|
return self._jid
|
2010-09-26 18:01:38 +00:00
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return '%s' % self._jid
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def priority(self):
|
2010-10-17 17:27:07 +00:00
|
|
|
return self._priority
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@priority.setter
|
|
|
|
def priority(self, value):
|
|
|
|
assert isinstance(value, int)
|
|
|
|
self._priority = value
|
2010-09-26 18:01:38 +00:00
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def presence(self):
|
2010-09-26 18:01:38 +00:00
|
|
|
return self._presence
|
2010-09-27 01:40:34 +00:00
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@presence.setter
|
|
|
|
def presence(self, value):
|
|
|
|
self._presence = value
|
|
|
|
|
|
|
|
@property
|
|
|
|
def status(self):
|
2010-10-04 00:27:40 +00:00
|
|
|
return self._status
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@status.setter
|
|
|
|
def status(self, value):
|
|
|
|
self._status = value
|
2010-10-04 00:27:40 +00:00
|
|
|
|
2010-10-17 17:27:07 +00:00
|
|
|
class Contact(object):
|
|
|
|
"""
|
|
|
|
This a way to gather multiple resources from the same bare JID.
|
2010-10-27 22:49:52 +00:00
|
|
|
This class contains zero or more Resource object and useful methods
|
2010-10-17 17:27:07 +00:00
|
|
|
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
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def groups(self):
|
|
|
|
"""Groups the contact is in"""
|
2011-10-01 12:26:19 +00:00
|
|
|
return self._groups
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def bare_jid(self):
|
|
|
|
"""The bare_jid or the contact"""
|
2010-10-17 17:27:07 +00:00
|
|
|
return self._jid
|
|
|
|
|
|
|
|
def get_highest_priority_resource(self):
|
|
|
|
"""
|
2010-11-15 11:59:09 +00:00
|
|
|
Return the resource with the highest priority
|
2010-10-17 17:27:07 +00:00
|
|
|
"""
|
|
|
|
ret = None
|
|
|
|
for resource in self._resources:
|
2011-11-09 21:00:38 +00:00
|
|
|
if not ret or ret.priority < resource.priority:
|
2010-10-17 17:27:07 +00:00
|
|
|
ret = resource
|
|
|
|
return ret
|
|
|
|
|
|
|
|
def add_resource(self, resource):
|
|
|
|
"""
|
|
|
|
Called, for example, when a new resource get offline
|
|
|
|
(the first, or any subsequent one)
|
|
|
|
"""
|
2010-11-15 11:59:09 +00:00
|
|
|
def f(o):
|
2011-11-09 21:00:38 +00:00
|
|
|
return o.priority
|
2010-10-17 17:27:07 +00:00
|
|
|
self._resources.append(resource)
|
2010-11-15 11:59:09 +00:00
|
|
|
self._resources = sorted(self._resources, key=f, reverse=True)
|
2010-10-17 17:27:07 +00:00
|
|
|
|
|
|
|
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:
|
2011-11-09 21:00:38 +00:00
|
|
|
if resource.jid == fulljid:
|
2010-10-17 17:27:07 +00:00
|
|
|
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:
|
2011-11-09 21:00:38 +00:00
|
|
|
if resource.jid.full == fulljid:
|
2010-10-17 17:27:07 +00:00
|
|
|
return resource
|
|
|
|
return None
|
2010-10-27 22:49:52 +00:00
|
|
|
|
2010-10-17 17:27:07 +00:00
|
|
|
def toggle_folded(self):
|
|
|
|
"""
|
|
|
|
Fold if it's unfolded, and vice versa
|
|
|
|
"""
|
|
|
|
self._folded = not self._folded
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def name(self):
|
2010-09-27 01:40:34 +00:00
|
|
|
return self._display_name
|
2010-10-17 17:27:07 +00:00
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@name.setter
|
|
|
|
def name(self, value):
|
|
|
|
self._display_name = value
|
2010-10-17 17:27:07 +00:00
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def ask(self):
|
2010-10-17 17:27:07 +00:00
|
|
|
return self._ask
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@ask.setter
|
|
|
|
def ask(self, value):
|
|
|
|
self._ask = value
|
2010-10-17 17:27:07 +00:00
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@property
|
|
|
|
def subscription(self):
|
2010-10-17 17:27:07 +00:00
|
|
|
return self._subscription
|
|
|
|
|
2011-11-09 21:00:38 +00:00
|
|
|
@subscription.setter
|
|
|
|
def subscription(self, value):
|
|
|
|
self._subscription = value
|
|
|
|
|
2010-10-17 17:27:07 +00:00
|
|
|
def get_nb_resources(self):
|
|
|
|
"""
|
|
|
|
Get the number of connected resources
|
|
|
|
"""
|
|
|
|
return len(self._resources)
|
|
|
|
|
|
|
|
def get_resources(self):
|
|
|
|
"""
|
2010-10-27 22:49:52 +00:00
|
|
|
Return all resources, sorted by priority
|
2010-10-17 17:27:07 +00:00
|
|
|
"""
|
2011-11-09 21:00:38 +00:00
|
|
|
compare_resources = lambda x: x.priority
|
2010-10-17 17:27:07 +00:00
|
|
|
return sorted(self._resources, key=compare_resources)
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
ret = '<Contact: %s' % self._jid
|
|
|
|
for resource in self._resources:
|
2011-06-04 18:15:18 +00:00
|
|
|
ret += '\n\t\t%s' % resource
|
2010-10-17 17:27:07 +00:00
|
|
|
return ret + ' />\n'
|