101 lines
3.1 KiB
Python
101 lines
3.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 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
|
|
|
|
|
|
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
|
|
logging.debug("Chat State: %s, %s" % (state, msg['from'].jid))
|
|
self.xmpp.event('chatstate_%s' % state, msg)
|