contact.py 4.61 KB
Newer Older
1
# Copyright 2010 Le Coz Florent <louiz@louiz.org>
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#
# This file is part of Poezio.
#
# Poezio is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# Poezio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Poezio.  If not, see <http://www.gnu.org/licenses/>.

17
"""
18 19
Defines the Resource and Contact classes, which are used in
the roster
20
"""
21

22 23
import logging
log = logging.getLogger(__name__)
24

25 26
from sleekxmpp.xmlstream.stanzabase import JID

27
class Resource(object):
28
    """
29 30
    Defines a roster item.
    It's a precise resource.
31 32
    """
    def __init__(self, jid):
33
        self._jid = JID(jid)         # Full jid
34 35 36
        self._status = ''
        self._presence = 'unavailable'
        self._priority = 0
37

38
    def get_jid(self):
39
        return self._jid
40 41 42 43 44 45 46 47

    def __repr__(self):
        return '%s' % self._jid

    def set_priority(self, priority):
        assert isinstance(priority, int)
        self._priority = priority

48 49 50
    def get_priority(self):
        return self._priority

51 52 53 54 55
    def set_presence(self, pres):
        self._presence = pres

    def get_presence(self):
        return self._presence
56

57 58 59
    def get_status(self):
        return self._status

60
    def set_status(self, s):
61 62
        self._status = s

63 64 65
class Contact(object):
    """
    This a way to gather multiple resources from the same bare JID.
66
    This class contains zero or more Resource object and useful methods
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
    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):
        """
86
        Return the resource with the highest priority
87 88 89 90 91 92 93 94 95 96 97 98
        """
        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)
        """
99 100
        def f(o):
            return o.get_priority()
101
        self._resources.append(resource)
102
        self._resources = sorted(self._resources, key=f, reverse=True)
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

    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
128

129 130 131 132 133 134
    def toggle_folded(self):
        """
        Fold if it's unfolded, and vice versa
        """
        self._folded = not self._folded

135 136 137 138 139
    def set_name(self, name):
        self._display_name = name

    def get_name(self):
        return self._display_name
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

    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):
        """
161
        Return all resources, sorted by priority
162 163 164 165 166 167 168 169 170
        """
        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'