summaryrefslogtreecommitdiff
path: root/sleekxmpp/plugins
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2011-02-24 16:19:35 -0500
committerLance Stout <lancestout@gmail.com>2011-02-24 16:19:35 -0500
commitc2161ca56b4c9c1ce8dabd32ed36cd4902b4eefc (patch)
tree500caa5f1ebaaf24044b4c81ed03d63ee464572c /sleekxmpp/plugins
parentd5b3a5282763e4f74816ff392bd8cd47dd9f7a95 (diff)
parent45ccb313560fbfbc0354ebac9116ecb9ff963a47 (diff)
downloadslixmpp-c2161ca56b4c9c1ce8dabd32ed36cd4902b4eefc.tar.gz
slixmpp-c2161ca56b4c9c1ce8dabd32ed36cd4902b4eefc.tar.bz2
slixmpp-c2161ca56b4c9c1ce8dabd32ed36cd4902b4eefc.tar.xz
slixmpp-c2161ca56b4c9c1ce8dabd32ed36cd4902b4eefc.zip
Merge branch 'develop' into stream_features
Diffstat (limited to 'sleekxmpp/plugins')
-rw-r--r--sleekxmpp/plugins/xep_0030/disco.py2
-rw-r--r--sleekxmpp/plugins/xep_0085.py104
-rw-r--r--sleekxmpp/plugins/xep_0085/__init__.py10
-rw-r--r--sleekxmpp/plugins/xep_0085/chat_states.py49
-rw-r--r--sleekxmpp/plugins/xep_0085/stanza.py73
-rw-r--r--sleekxmpp/plugins/xep_0199/ping.py6
6 files changed, 136 insertions, 108 deletions
diff --git a/sleekxmpp/plugins/xep_0030/disco.py b/sleekxmpp/plugins/xep_0030/disco.py
index 45d6931b..1c967bd5 100644
--- a/sleekxmpp/plugins/xep_0030/disco.py
+++ b/sleekxmpp/plugins/xep_0030/disco.py
@@ -119,7 +119,7 @@ class xep_0030(base_plugin):
def post_init(self):
"""Handle cross-plugin dependencies."""
base_plugin.post_init(self)
- if self.xmpp['xep_0059']:
+ if 'xep_0059' in self.xmpp.plugin:
register_stanza_plugin(DiscoItems,
self.xmpp['xep_0059'].stanza.Set)
diff --git a/sleekxmpp/plugins/xep_0085.py b/sleekxmpp/plugins/xep_0085.py
deleted file mode 100644
index 3627e718..00000000
--- a/sleekxmpp/plugins/xep_0085.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""
- 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 permissio
-"""
-
-import logging
-from . import base
-from .. xmlstream.handler.callback import Callback
-from .. xmlstream.matcher.xpath import MatchXPath
-from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET, JID
-from .. stanza.message import Message
-
-
-log = logging.getLogger(__name__)
-
-
-class ChatState(ElementBase):
- namespace = 'http://jabber.org/protocol/chatstates'
- plugin_attrib = 'chat_state'
- interface = set(('state',))
- states = set(('active', 'composing', 'gone', 'inactive', 'paused'))
-
- def active(self):
- self.setState('active')
-
- def composing(self):
- self.setState('composing')
-
- def gone(self):
- self.setState('gone')
-
- def inactive(self):
- self.setState('inactive')
-
- def paused(self):
- self.setState('paused')
-
- def setState(self, state):
- if state in self.states:
- self.name = state
- self.xml.tag = '{%s}%s' % (self.namespace, state)
- else:
- raise ValueError('Invalid chat state')
-
- def getState(self):
- return self.name
-
-# In order to match the various chat state elements,
-# we need one stanza object per state, even though
-# they are all the same except for the initial name
-# value. Do not depend on the type of the chat state
-# stanza object for the actual state.
-
-class Active(ChatState):
- name = 'active'
-class Composing(ChatState):
- name = 'composing'
-class Gone(ChatState):
- name = 'gone'
-class Inactive(ChatState):
- name = 'inactive'
-class Paused(ChatState):
- name = 'paused'
-
-
-class xep_0085(base.base_plugin):
- """
- XEP-0085 Chat State Notifications
- """
-
- def plugin_init(self):
- self.xep = '0085'
- self.description = 'Chat State Notifications'
-
- handlers = [('Active Chat State', 'active'),
- ('Composing Chat State', 'composing'),
- ('Gone Chat State', 'gone'),
- ('Inactive Chat State', 'inactive'),
- ('Paused Chat State', 'paused')]
- for handler in handlers:
- self.xmpp.registerHandler(
- Callback(handler[0],
- MatchXPath("{%s}message/{%s}%s" % (self.xmpp.default_ns,
- ChatState.namespace,
- handler[1])),
- self._handleChatState))
-
- registerStanzaPlugin(Message, Active)
- registerStanzaPlugin(Message, Composing)
- registerStanzaPlugin(Message, Gone)
- registerStanzaPlugin(Message, Inactive)
- registerStanzaPlugin(Message, Paused)
-
- def post_init(self):
- base.base_plugin.post_init(self)
- self.xmpp.plugin['xep_0030'].add_feature('http://jabber.org/protocol/chatstates')
-
- def _handleChatState(self, msg):
- state = msg['chat_state'].name
- log.debug("Chat State: %s, %s" % (state, msg['from'].jid))
- self.xmpp.event('chatstate_%s' % state, msg)
diff --git a/sleekxmpp/plugins/xep_0085/__init__.py b/sleekxmpp/plugins/xep_0085/__init__.py
new file mode 100644
index 00000000..ff882f05
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0085/__init__.py
@@ -0,0 +1,10 @@
+"""
+ SleekXMPP: The Sleek XMPP Library
+ Copyright (C) 2011 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of SleekXMPP.
+
+ See the file LICENSE for copying permissio
+"""
+
+from sleekxmpp.plugins.xep_0085.stanza import ChatState
+from sleekxmpp.plugins.xep_0085.chat_states import xep_0085
diff --git a/sleekxmpp/plugins/xep_0085/chat_states.py b/sleekxmpp/plugins/xep_0085/chat_states.py
new file mode 100644
index 00000000..4fb21ba0
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0085/chat_states.py
@@ -0,0 +1,49 @@
+"""
+ SleekXMPP: The Sleek XMPP Library
+ Copyright (C) 2011 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of SleekXMPP.
+
+ See the file LICENSE for copying permissio
+"""
+
+import logging
+
+import sleekxmpp
+from sleekxmpp.stanza import Message
+from sleekxmpp.xmlstream.handler import Callback
+from sleekxmpp.xmlstream.matcher import StanzaPath
+from sleekxmpp.xmlstream import register_stanza_plugin, ElementBase, ET
+from sleekxmpp.plugins.base import base_plugin
+from sleekxmpp.plugins.xep_0085 import stanza, ChatState
+
+
+log = logging.getLogger(__name__)
+
+
+class xep_0085(base_plugin):
+
+ """
+ XEP-0085 Chat State Notifications
+ """
+
+ def plugin_init(self):
+ self.xep = '0085'
+ self.description = 'Chat State Notifications'
+ self.stanza = stanza
+
+ for state in ChatState.states:
+ self.xmpp.register_handler(
+ Callback('Chat State: %s' % state,
+ StanzaPath('message@chat_state=%s' % state),
+ self._handle_chat_state))
+
+ register_stanza_plugin(Message, ChatState)
+
+ def post_init(self):
+ base_plugin.post_init(self)
+ self.xmpp.plugin['xep_0030'].add_feature(ChatState.namespace)
+
+ def _handle_chat_state(self, msg):
+ state = msg['chat_state']
+ log.debug("Chat State: %s, %s" % (state, msg['from'].jid))
+ self.xmpp.event('chatstate_%s' % state, msg)
diff --git a/sleekxmpp/plugins/xep_0085/stanza.py b/sleekxmpp/plugins/xep_0085/stanza.py
new file mode 100644
index 00000000..8c46758c
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0085/stanza.py
@@ -0,0 +1,73 @@
+"""
+ SleekXMPP: The Sleek XMPP Library
+ Copyright (C) 2011 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of SleekXMPP.
+
+ See the file LICENSE for copying permissio
+"""
+
+import sleekxmpp
+from sleekxmpp.xmlstream import ElementBase, ET
+
+
+class ChatState(ElementBase):
+
+ """
+ Example chat state stanzas:
+ <message>
+ <active xmlns="http://jabber.org/protocol/chatstates" />
+ </message>
+
+ <message>
+ <paused xmlns="http://jabber.org/protocol/chatstates" />
+ </message>
+
+ Stanza Interfaces:
+ chat_state
+
+ Attributes:
+ states
+
+ Methods:
+ get_chat_state
+ set_chat_state
+ del_chat_state
+ """
+
+ name = ''
+ namespace = 'http://jabber.org/protocol/chatstates'
+ plugin_attrib = 'chat_state'
+ interfaces = set(('chat_state',))
+ is_extension = True
+
+ states = set(('active', 'composing', 'gone', 'inactive', 'paused'))
+
+ def setup(self, xml=None):
+ self.xml = ET.Element('')
+ return True
+
+ def get_chat_state(self):
+ parent = self.parent()
+ for state in self.states:
+ state_xml = parent.find('{%s}%s' % (self.namespace, state))
+ if state_xml is not None:
+ self.xml = state_xml
+ return state
+ return ''
+
+ def set_chat_state(self, state):
+ self.del_chat_state()
+ parent = self.parent()
+ if state in self.states:
+ self.xml = ET.Element('{%s}%s' % (self.namespace, state))
+ parent.append(self.xml)
+ elif state not in [None, '']:
+ raise ValueError('Invalid chat state')
+
+ def del_chat_state(self):
+ parent = self.parent()
+ for state in self.states:
+ state_xml = parent.find('{%s}%s' % (self.namespace, state))
+ if state_xml is not None:
+ self.xml = ET.Element('')
+ parent.xml.remove(state_xml)
diff --git a/sleekxmpp/plugins/xep_0199/ping.py b/sleekxmpp/plugins/xep_0199/ping.py
index 064af4ca..d1e08e61 100644
--- a/sleekxmpp/plugins/xep_0199/ping.py
+++ b/sleekxmpp/plugins/xep_0199/ping.py
@@ -54,7 +54,7 @@ class xep_0199(base_plugin):
self.xep = '0199'
self.stanza = stanza
- self.keepalive = self.config.get('keepalive', True)
+ self.keepalive = self.config.get('keepalive', False)
self.frequency = float(self.config.get('frequency', 300))
self.timeout = self.config.get('timeout', 30)
@@ -90,7 +90,7 @@ class xep_0199(base_plugin):
"""Send ping request to the server."""
log.debug("Pinging...")
resp = self.send_ping(self.xmpp.boundjid.host, self.timeout)
- if not resp:
+ if resp is None or resp is False:
log.debug("Did not recieve ping back in time." + \
"Requesting Reconnect.")
self.xmpp.reconnect()
@@ -160,4 +160,4 @@ class xep_0199(base_plugin):
# Backwards compatibility for names
-Ping.sendPing = Ping.send_ping
+xep_0199.sendPing = xep_0199.send_ping