Avoid infinite loop on version result
[slixmpp.git] / sleekxmpp / plugins / xep_0092 / version.py
blob46bb27f723595a2a6ac824816eb381df69c96f00
1 """
2 SleekXMPP: The Sleek XMPP Library
3 Copyright (C) 2010 Nathanael C. Fritz
4 This file is part of SleekXMPP.
6 See the file LICENSE for copying permission.
7 """
9 import logging
11 import sleekxmpp
12 from sleekxmpp import Iq
13 from sleekxmpp.xmlstream import register_stanza_plugin
14 from sleekxmpp.xmlstream.handler import Callback
15 from sleekxmpp.xmlstream.matcher import StanzaPath
16 from sleekxmpp.plugins.base import base_plugin
17 from sleekxmpp.plugins.xep_0092 import Version
20 log = logging.getLogger(__name__)
23 class xep_0092(base_plugin):
25 """
26 XEP-0092: Software Version
27 """
29 def plugin_init(self):
30 """
31 Start the XEP-0092 plugin.
32 """
33 self.xep = "0092"
34 self.description = "Software Version"
35 self.stanza = sleekxmpp.plugins.xep_0092.stanza
37 self.name = self.config.get('name', 'SleekXMPP')
38 self.version = self.config.get('version', '0.1-dev')
39 self.os = self.config.get('os', '')
41 self.getVersion = self.get_version
43 self.xmpp.register_handler(
44 Callback('Software Version',
45 StanzaPath('iq@=get/software_version'),
46 self._handle_version))
48 register_stanza_plugin(Iq, Version)
50 def post_init(self):
51 """
52 Handle cross-plugin dependencies.
53 """
54 base_plugin.post_init(self)
55 self.xmpp.plugin['xep_0030'].add_feature('jabber:iq:version')
57 def _handle_version(self, iq):
58 """
59 Respond to a software version query.
61 Arguments:
62 iq -- The Iq stanza containing the software version query.
63 """
64 iq.reply()
65 iq['software_version']['name'] = self.name
66 iq['software_version']['version'] = self.version
67 iq['software_version']['os'] = self.os
68 iq.send()
70 def get_version(self, jid, ifrom=None):
71 """
72 Retrieve the software version of a remote agent.
74 Arguments:
75 jid -- The JID of the entity to query.
76 """
77 iq = self.xmpp.Iq()
78 iq['to'] = jid
79 if ifrom:
80 iq['from'] = ifrom
81 iq['type'] = 'get'
82 iq['query'] = Version.namespace
84 result = iq.send()
86 if result and result['type'] != 'error':
87 return result['software_version'].values
88 return False