diff idavoll/idavoll.py @ 8:688992a789e4

Add disco support
author Ralph Meijer <ralphm@ik.nu>
date Thu, 01 Jul 2004 15:48:06 +0000
parents 4cc41776b7d7
children d599da9179ab
line wrap: on
line diff
--- a/idavoll/idavoll.py	Sun Jun 27 15:08:24 2004 +0000
+++ b/idavoll/idavoll.py	Thu Jul 01 15:48:06 2004 +0000
@@ -1,22 +1,36 @@
 from twisted.protocols.jabber import component
 from twisted.application import service
+from twisted.python import components
 import backend
 import pubsub
 import xmpp_error
 
 import sys
 
+NS_DISCO = 'http://jabber.org/protocol/disco'
+NS_DISCO_INFO = NS_DISCO + '#info'
+NS_DISCO_ITEMS = NS_DISCO + '#items'
+NS_VERSION = 'jabber:iq:version'
+
 IQ_GET = '/iq[@type="get"]'
 IQ_SET = '/iq[@type="set"]'
-VERSION = IQ_GET + '/query[@xmlns="jabber:iq:version"]'
+VERSION = IQ_GET + '/query[@xmlns="' + NS_VERSION + '"]'
+DISCO_INFO = IQ_GET + '/query[@xmlns="' + NS_DISCO_INFO + '"]'
+DISCO_ITEMS = IQ_GET + '/query[@xmlns="' + NS_DISCO_ITEMS + '"]'
 
 class IdavollService(component.Service):
 
 	def componentConnected(self, xmlstream):
 		self.xmlstream = xmlstream
 		xmlstream.addObserver(VERSION, self.onVersion, 1)
+		xmlstream.addObserver(DISCO_INFO, self.onDiscoInfo, 1)
+		xmlstream.addObserver(DISCO_ITEMS, self.onDiscoItems, 1)
 		xmlstream.addObserver(IQ_GET, self.iqFallback, -1)
 		xmlstream.addObserver(IQ_SET, self.iqFallback, -1)
+
+	def getFeatures(self, node):
+		if not node:
+			return [NS_DISCO_INFO, NS_DISCO_ITEMS, NS_VERSION]
 	
 	def onVersion(self, iq):
 		print "version?"
@@ -27,6 +41,40 @@
 		self.send(iq)
 		iq.handled = True
 
+	def onDiscoInfo(self, iq):
+		identities = []
+		features = []
+		node = iq.query.getAttribute("node")
+
+		for c in self.parent:
+			if components.implements(c, component.IService):
+				if hasattr(c, "getIdentities"):
+					identities.extend(c.getIdentities(node))
+				if hasattr(c, "getFeatures"):
+					features.extend(c.getFeatures(node))
+
+		if not features and not identities and not node:
+			xmpp_error.error_from_iq(iq, 'item-not-found')
+		else:
+			iq.swapAttributeValues("to", "from")
+			iq["type"] = "result"
+			for identity in identities:
+				iq.query.addElement("identity", None)
+				iq.query.identity.attributes = identity
+			print features
+			for feature in features:
+				f = iq.query.addElement("feature", None)
+				f["var"] = feature
+
+		self.send(iq)
+		iq.handled = True
+
+	def onDiscoItems(self, iq):
+		iq.swapAttributeValues("to", "from")
+		iq["type"] = "result"
+		iq.query.children = []
+		self.send(iq)
+	
 	def iqFallback(self, iq):
 		if iq.handled == True:
 			return