# Slixmpp: The Slick XMPP Library# Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout# This file is part of Slixmpp.# See the file LICENSE for copying permission.fromdatetimeimportdatetime,timezonefromtypingimportOptionalfromslixmppimportJIDfromslixmpp.stanzaimportPresencefromslixmpp.pluginsimportBasePluginfromslixmpp.xmlstreamimportregister_stanza_pluginfromslixmpp.xmlstream.handlerimportCallbackfromslixmpp.xmlstream.matcherimportStanzaPathfromslixmpp.plugins.xep_0319importstanzadefget_local_timezone():returndatetime.now(timezone.utc).astimezone().tzinfo
[docs]classXEP_0319(BasePlugin):name='xep_0319'description='XEP-0319: Last User Interaction in Presence'dependencies={'xep_0012'}stanza=stanzadefplugin_init(self):self._idle_stamps={}register_stanza_plugin(Presence,stanza.Idle)self.api.register(self._set_idle,'set_idle',default=True)self.api.register(self._get_idle,'get_idle',default=True)self.xmpp.register_handler(Callback('Idle Presence',StanzaPath('presence/idle'),self._idle_presence))self.xmpp.add_filter('out',self._stamp_idle_presence)defsession_bind(self,jid):self.xmpp['xep_0030'].add_feature('urn:xmpp:idle:1')defplugin_end(self):self.xmpp['xep_0030'].del_feature(feature='urn:xmpp:idle:1')self.xmpp.del_filter('out',self._stamp_idle_presence)self.xmpp.remove_handler('Idle Presence')
[docs]asyncdefidle(self,jid:Optional[JID]=None,since:Optional[datetime]=None):"""Set an idle duration for a JID .. versionchanged:: 1.8.0 This function is now a coroutine. """seconds=Nonetimezone=get_local_timezone()ifsinceisNone:since=datetime.now(timezone)else:seconds=datetime.now(timezone)-sinceawaitself.api['set_idle'](jid,None,None,since)awaitself.xmpp['xep_0012'].set_last_activity(jid=jid,seconds=seconds)
[docs]asyncdefactive(self,jid:Optional[JID]=None):"""Reset the idle timer. .. versionchanged:: 1.8.0 This function is now a coroutine. """awaitself.api['set_idle'](jid,None,None,None)awaitself.xmpp['xep_0012'].del_last_activity(jid)