2011-07-03 22:30:06 +00:00
|
|
|
"""
|
|
|
|
SleekXMPP: The Sleek XMPP Library
|
|
|
|
Copyright (C) 2010 Nathanael C. Fritz
|
|
|
|
This file is part of SleekXMPP.
|
|
|
|
|
|
|
|
See the file LICENSE for copying permission.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from sleekxmpp.stanza.iq import Iq
|
|
|
|
from sleekxmpp.xmlstream import register_stanza_plugin
|
|
|
|
from sleekxmpp.xmlstream.handler import Callback
|
|
|
|
from sleekxmpp.xmlstream.matcher import StanzaPath
|
|
|
|
from sleekxmpp.plugins.base import base_plugin
|
|
|
|
from sleekxmpp.plugins import xep_0082
|
|
|
|
from sleekxmpp.plugins.xep_0202 import stanza
|
|
|
|
|
|
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class xep_0202(base_plugin):
|
|
|
|
|
|
|
|
"""
|
|
|
|
XEP-0202: Entity Time
|
|
|
|
"""
|
|
|
|
|
|
|
|
def plugin_init(self):
|
|
|
|
"""Start the XEP-0203 plugin."""
|
|
|
|
self.xep = '0202'
|
|
|
|
self.description = 'Entity Time'
|
|
|
|
self.stanza = stanza
|
|
|
|
|
2011-07-03 22:41:22 +00:00
|
|
|
self.tz_offset = self.config.get('tz_offset', 0)
|
|
|
|
|
2011-07-03 22:30:06 +00:00
|
|
|
# As a default, respond to time requests with the
|
|
|
|
# local time returned by XEP-0082. However, a
|
|
|
|
# custom function can be supplied which accepts
|
|
|
|
# the JID of the entity to query for the time.
|
|
|
|
self.local_time = self.config.get('local_time', None)
|
|
|
|
if not self.local_time:
|
2011-07-03 22:41:22 +00:00
|
|
|
self.local_time = lambda x: xep_0082.datetime(offset=self.tz_offset)
|
2011-07-03 22:30:06 +00:00
|
|
|
|
|
|
|
self.xmpp.registerHandler(
|
|
|
|
Callback('Entity Time',
|
|
|
|
StanzaPath('iq/entity_time'),
|
|
|
|
self._handle_time_request))
|
|
|
|
register_stanza_plugin(Iq, stanza.EntityTime)
|
|
|
|
|
|
|
|
def post_init(self):
|
|
|
|
"""Handle cross-plugin interactions."""
|
|
|
|
base_plugin.post_init(self)
|
|
|
|
self.xmpp['xep_0030'].add_feature('urn:xmpp:time')
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_time_request(self, iq):
|
|
|
|
"""
|
|
|
|
Respond to a request for the local time.
|
|
|
|
|
|
|
|
The time is taken from self.local_time(), which may be replaced
|
|
|
|
during plugin configuration with a function that maps JIDs to
|
|
|
|
times.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
iq -- The Iq time request stanza.
|
|
|
|
"""
|
|
|
|
iq.reply()
|
|
|
|
iq['entity_time']['time'] = self.local_time(iq['to'])
|
|
|
|
iq.send()
|
|
|
|
|
|
|
|
def get_entity_time(self, to, ifrom=None, **iqargs):
|
|
|
|
"""
|
|
|
|
Request the time from another entity.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
to -- JID of the entity to query.
|
|
|
|
ifrom -- Specifiy the sender's JID.
|
|
|
|
block -- If true, block and wait for the stanzas' reply.
|
|
|
|
timeout -- The time in seconds to block while waiting for
|
|
|
|
a reply. If None, then wait indefinitely.
|
|
|
|
callback -- Optional callback to execute when a reply is
|
|
|
|
received instead of blocking and waiting for
|
|
|
|
the reply.
|
|
|
|
"""
|
|
|
|
iq = self.xmpp.Iq()
|
|
|
|
iq['type'] = 'get'
|
2011-08-27 05:04:06 +00:00
|
|
|
iq['to'] = to
|
|
|
|
iq['from'] = ifrom
|
2011-07-03 22:30:06 +00:00
|
|
|
iq.enable('entity_time')
|
|
|
|
return iq.send(**iqargs)
|