137 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
    SleekXMPP: The Sleek XMPP Library
 | 
						|
    Copyright (C) 2010 Nathanael C. Fritz, Lance J.T. Stout
 | 
						|
    This file is part of SleekXMPP.
 | 
						|
 | 
						|
    See the file LICENSE for copying permission.
 | 
						|
"""
 | 
						|
 | 
						|
from sleekxmpp.xmlstream import ElementBase, ET
 | 
						|
 | 
						|
 | 
						|
class DiscoItems(ElementBase):
 | 
						|
 | 
						|
    """
 | 
						|
    Example disco#items stanzas:
 | 
						|
        <iq type="get">
 | 
						|
          <query xmlns="http://jabber.org/protocol/disco#items" />
 | 
						|
        </iq>
 | 
						|
 | 
						|
        <iq type="result">
 | 
						|
          <query xmlns="http://jabber.org/protocol/disco#items">
 | 
						|
            <item jid="chat.example.com"
 | 
						|
                  node="xmppdev"
 | 
						|
                  name="XMPP Dev" />
 | 
						|
            <item jid="chat.example.com"
 | 
						|
                  node="sleekdev"
 | 
						|
                  name="SleekXMPP Dev" />
 | 
						|
          </query>
 | 
						|
        </iq>
 | 
						|
 | 
						|
    Stanza Interface:
 | 
						|
        node  -- The name of the node to either
 | 
						|
                 query or return info from.
 | 
						|
        items -- A list of 3-tuples, where each tuple contains
 | 
						|
                 the JID, node, and name of an item.
 | 
						|
 | 
						|
    Methods:
 | 
						|
        add_item  -- Add a single new item.
 | 
						|
        del_item  -- Remove a single item.
 | 
						|
        get_items -- Return all items.
 | 
						|
        set_items -- Set or replace all items.
 | 
						|
        del_items -- Remove all items.
 | 
						|
    """
 | 
						|
 | 
						|
    name = 'query'
 | 
						|
    namespace = 'http://jabber.org/protocol/disco#items'
 | 
						|
    plugin_attrib = 'disco_items'
 | 
						|
    interfaces = set(('node', 'items'))
 | 
						|
 | 
						|
    # Cache items
 | 
						|
    _items = set()
 | 
						|
 | 
						|
    def setup(self, xml=None):
 | 
						|
        """
 | 
						|
        Populate the stanza object using an optional XML object.
 | 
						|
 | 
						|
        Overrides ElementBase.setup
 | 
						|
 | 
						|
        Caches item information.
 | 
						|
 | 
						|
        Arguments:
 | 
						|
            xml -- Use an existing XML object for the stanza's values.
 | 
						|
        """
 | 
						|
        ElementBase.setup(self, xml)
 | 
						|
        self._items = set([item[0:2] for item in self['items']])
 | 
						|
 | 
						|
    def add_item(self, jid, node=None, name=None):
 | 
						|
        """
 | 
						|
        Add a new item element. Each item is required to have a
 | 
						|
        JID, but may also specify a node value to reference
 | 
						|
        non-addressable entitities.
 | 
						|
 | 
						|
        Arguments:
 | 
						|
            jid  -- The JID for the item.
 | 
						|
            node -- Optional additional information to reference
 | 
						|
                    non-addressable items.
 | 
						|
            name -- Optional human readable name for the item.
 | 
						|
        """
 | 
						|
        if (jid, node) not in self._items:
 | 
						|
            self._items.add((jid, node))
 | 
						|
            item_xml = ET.Element('{%s}item' % self.namespace)
 | 
						|
            item_xml.attrib['jid'] = jid
 | 
						|
            if name:
 | 
						|
                item_xml.attrib['name'] = name
 | 
						|
            if node:
 | 
						|
                item_xml.attrib['node'] = node
 | 
						|
            self.xml.append(item_xml)
 | 
						|
            return True
 | 
						|
        return False
 | 
						|
 | 
						|
    def del_item(self, jid, node=None):
 | 
						|
        """
 | 
						|
        Remove a single item.
 | 
						|
 | 
						|
        Arguments:
 | 
						|
            jid  -- JID of the item to remove.
 | 
						|
            node -- Optional extra identifying information.
 | 
						|
        """
 | 
						|
        if (jid, node) in self._items:
 | 
						|
            for item_xml in self.findall('{%s}item' % self.namespace):
 | 
						|
                item = (item_xml.attrib['jid'],
 | 
						|
                        item_xml.attrib.get('node', None))
 | 
						|
                if item == (jid, node):
 | 
						|
                    self.xml.remove(item_xml)
 | 
						|
                    return True
 | 
						|
        return False
 | 
						|
 | 
						|
    def get_items(self):
 | 
						|
        """Return all items."""
 | 
						|
        items = set()
 | 
						|
        for item_xml in self.findall('{%s}item' % self.namespace):
 | 
						|
            item = (item_xml.attrib['jid'],
 | 
						|
                    item_xml.attrib.get('node'),
 | 
						|
                    item_xml.attrib.get('name'))
 | 
						|
            items.add(item)
 | 
						|
        return items
 | 
						|
 | 
						|
    def set_items(self, items):
 | 
						|
        """
 | 
						|
        Set or replace all items. The given items must be in a
 | 
						|
        list or set where each item is a tuple of the form:
 | 
						|
            (jid, node, name)
 | 
						|
 | 
						|
        Arguments:
 | 
						|
            items -- A series of items in tuple format.
 | 
						|
        """
 | 
						|
        self.del_items()
 | 
						|
        for item in items:
 | 
						|
            jid, node, name = item
 | 
						|
            self.add_item(jid, node, name)
 | 
						|
 | 
						|
    def del_items(self):
 | 
						|
        """Remove all items."""
 | 
						|
        self._items = set()
 | 
						|
        for item_xml in self.findall('{%s}item' % self.namespace):
 | 
						|
            self.xml.remove(item_xml)
 |