xep_0256.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. """
  2. SleekXMPP: The Sleek XMPP Library
  3. Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
  4. This file is part of SleekXMPP.
  5. See the file LICENSE for copying permission.
  6. """
  7. import logging
  8. from sleekxmpp import Presence
  9. from sleekxmpp.exceptions import XMPPError
  10. from sleekxmpp.plugins import BasePlugin, register_plugin
  11. from sleekxmpp.xmlstream import register_stanza_plugin
  12. from sleekxmpp.plugins.xep_0012 import stanza, LastActivity
  13. log = logging.getLogger(__name__)
  14. class XEP_0256(BasePlugin):
  15. name = 'xep_0256'
  16. description = 'XEP-0256: Last Activity in Presence'
  17. dependencies = set(['xep_0012'])
  18. stanza = stanza
  19. default_config = {
  20. 'auto_last_activity': False
  21. }
  22. def plugin_init(self):
  23. register_stanza_plugin(Presence, LastActivity)
  24. self.xmpp.add_filter('out', self._initial_presence_activity)
  25. self.xmpp.add_event_handler('connected', self._reset_presence_activity)
  26. self._initial_presence = set()
  27. def plugin_end(self):
  28. self.xmpp.del_filter('out', self._initial_presence_activity)
  29. self.xmpp.del_event_handler('connected', self._reset_presence_activity)
  30. def _reset_presence_activity(self, e):
  31. self._initial_presence = set()
  32. def _initial_presence_activity(self, stanza):
  33. if isinstance(stanza, Presence):
  34. use_last_activity = False
  35. if self.auto_last_activity and stanza['show'] in ('xa', 'away'):
  36. use_last_activity = True
  37. if stanza['from'] not in self._initial_presence:
  38. self._initial_presence.add(stanza['from'])
  39. use_last_activity = True
  40. if use_last_activity:
  41. plugin = self.xmpp['xep_0012']
  42. try:
  43. result = plugin.api['get_last_activity'](stanza['from'],
  44. None,
  45. stanza['to'])
  46. seconds = result['last_activity']['seconds']
  47. except XMPPError:
  48. seconds = None
  49. if seconds is not None:
  50. stanza['last_activity']['seconds'] = seconds
  51. return stanza
  52. register_plugin(XEP_0256)