summaryrefslogtreecommitdiff
path: root/sleekxmpp/stanza/roster.py
blob: 292c8956a45c209c6d272ef64c34f2e91174e176 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
    SleekXMPP: The Sleek XMPP Library
    Copyright (C) 2010  Nathanael C. Fritz
    This file is part of SleekXMPP.

    See the file LICENSE for copying permission.
"""

from sleekxmpp.stanza import Iq
from sleekxmpp.xmlstream import JID
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin
from sleekxmpp.xmlstream.stanzabase import ET, ElementBase


class Roster(ElementBase):

    """
    Example roster stanzas:
        <iq type="set">
          <query xmlns="jabber:iq:roster">
            <item jid="user@example.com" subscription="both" name="User">
              <group>Friends</group>
            </item>
          </query>
        </iq>

    Stanza Inteface:
        items -- A dictionary of roster entries contained
                 in the stanza.

    Methods:
        getItems -- Return a dictionary of roster entries.
        setItems -- Add <item> elements.
        delItems -- Remove all <item> elements.
    """

    namespace = 'jabber:iq:roster'
    name = 'query'
    plugin_attrib = 'roster'
    interfaces = set(('items',))

    def setItems(self, items):
        """
        Set the roster entries in the <roster> stanza.

        Uses a dictionary using JIDs as keys, where each entry is itself
        a dictionary that contains:
            name         -- An alias or nickname for the JID.
            subscription -- The subscription type. Can be one of 'to',
                            'from', 'both', 'none', or 'remove'.
            groups       -- A list of group names to which the JID
                            has been assigned.

        Arguments:
            items -- A dictionary of roster entries.
        """
        self.delItems()
        for jid in items:
            ijid = str(jid)
            item = ET.Element('{jabber:iq:roster}item', {'jid': ijid})
            if 'subscription' in items[jid]:
                item.attrib['subscription'] = items[jid]['subscription']
            if 'name' in items[jid]:
                name = items[jid]['name']
                if name is not None:
                    item.attrib['name'] = name
            if 'groups' in items[jid]:
                for group in items[jid]['groups']:
                    groupxml = ET.Element('{jabber:iq:roster}group')
                    groupxml.text = group
                    item.append(groupxml)
            self.xml.append(item)
        return self

    def getItems(self):
        """
        Return a dictionary of roster entries.

        Each item is keyed using its JID, and contains:
            name         -- An assigned alias or nickname for the JID.
            subscription -- The subscription type. Can be one of 'to',
                            'from', 'both', 'none', or 'remove'.
            groups       -- A list of group names to which the JID has
                            been assigned.
        """
        items = {}
        itemsxml = self.xml.findall('{jabber:iq:roster}item')
        if itemsxml is not None:
            for itemxml in itemsxml:
                item = {}
                item['name'] = itemxml.get('name', '')
                item['subscription'] = itemxml.get('subscription', '')
                item['groups'] = []
                groupsxml = itemxml.findall('{jabber:iq:roster}group')
                if groupsxml is not None:
                    for groupxml in groupsxml:
                        item['groups'].append(groupxml.text)
                items[itemxml.get('jid')] = item
        return items

    def delItems(self):
        """
        Remove all <item> elements from the roster stanza.
        """
        for child in self.xml.getchildren():
            self.xml.remove(child)


registerStanzaPlugin(Iq, Roster)