implement Last Activity (XEP-012)

darcs-hash:20080528171120-86b55-bcb3bc0c25cb2ea16f90db428b340842cdff941b.gz
This commit is contained in:
David Rousselie
2008-05-28 19:11:20 +02:00
parent c54690435d
commit 6b8e85e6da
3 changed files with 49 additions and 3 deletions

View File

@@ -35,6 +35,7 @@ import signal
import re import re
import traceback import traceback
import string import string
import time
from Queue import Queue from Queue import Queue
@@ -59,7 +60,7 @@ from jcl.jabber.presence import AccountPresenceAvailableHandler, \
RootPresenceAvailableHandler, AccountPresenceUnavailableHandler, \ RootPresenceAvailableHandler, AccountPresenceUnavailableHandler, \
RootPresenceUnavailableHandler, AccountPresenceSubscribeHandler, \ RootPresenceUnavailableHandler, AccountPresenceSubscribeHandler, \
RootPresenceSubscribeHandler, AccountPresenceUnsubscribeHandler, \ RootPresenceSubscribeHandler, AccountPresenceUnsubscribeHandler, \
RootPresenceUnsubscribeHandler RootPresenceUnsubscribeHandler, DefaultIQLastHandler
from jcl.jabber.register import RootSetRegisterHandler, \ from jcl.jabber.register import RootSetRegisterHandler, \
AccountSetRegisterHandler, AccountTypeSetRegisterHandler AccountSetRegisterHandler, AccountTypeSetRegisterHandler
from jcl.jabber.vcard import DefaultVCardHandler from jcl.jabber.vcard import DefaultVCardHandler
@@ -646,12 +647,14 @@ class JCLComponent(Component, object):
AccountSetRegisterHandler(self), AccountSetRegisterHandler(self),
AccountTypeSetRegisterHandler(self)]] AccountTypeSetRegisterHandler(self)]]
self.vcard_handlers = [[DefaultVCardHandler(self)]] self.vcard_handlers = [[DefaultVCardHandler(self)]]
self.iqlast_handlers = [[DefaultIQLastHandler(self)]]
self.__logger = logging.getLogger("jcl.jabber.JCLComponent") self.__logger = logging.getLogger("jcl.jabber.JCLComponent")
self.lang = lang self.lang = lang
self.running = False self.running = False
self.wait_event = threading.Event() self.wait_event = threading.Event()
self._restart = False self._restart = False
self.last_activity = int(time.time())
signal.signal(signal.SIGINT, self.signal_handler) signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler) signal.signal(signal.SIGTERM, self.signal_handler)
@@ -666,6 +669,7 @@ class JCLComponent(Component, object):
""" """
self.spool_dir += "/" + unicode(self.jid) self.spool_dir += "/" + unicode(self.jid)
self.running = True self.running = True
self.last_activity = int(time.time())
self.connect() self.connect()
timer_thread = threading.Thread(target=self.time_handler, timer_thread = threading.Thread(target=self.time_handler,
name="TimerThread") name="TimerThread")
@@ -867,7 +871,8 @@ class JCLComponent(Component, object):
""" """
Handle IQ-get "jabber:iq:last" requests. Handle IQ-get "jabber:iq:last" requests.
""" """
# TODO self.__logger.debug("IQ:Last request")
self.apply_registered_behavior(self.iqlast_handlers, info_query)
return 1 return 1
def handle_get_gateway(self, info_query): def handle_get_gateway(self, info_query):

View File

@@ -21,6 +21,8 @@
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## ##
import time
from pyxmpp.presence import Presence from pyxmpp.presence import Presence
from pyxmpp.message import Message from pyxmpp.message import Message
@@ -28,6 +30,17 @@ from jcl.jabber import Handler
from jcl.model import account from jcl.model import account
import jcl.jabber as jabber import jcl.jabber as jabber
class DefaultIQLastHandler(Handler):
"""Handle jabber:iq:last request"""
def handle(self, stanza, lang_class, data):
"""Return same presence as receive one"""
result = stanza.make_result_response()
query = result.new_query("jabber:iq:last")
query.setProp("seconds",
unicode(int(time.time()) - self.component.last_activity))
return [result]
class DefaultPresenceHandler(Handler): class DefaultPresenceHandler(Handler):
"""Handle presence""" """Handle presence"""

View File

@@ -24,20 +24,47 @@ import unittest
import tempfile import tempfile
import os import os
from ConfigParser import ConfigParser from ConfigParser import ConfigParser
import time
from pyxmpp.presence import Presence from pyxmpp.presence import Presence
from pyxmpp.message import Message from pyxmpp.message import Message
from pyxmpp.iq import Iq
from jcl.jabber.component import JCLComponent from jcl.jabber.component import JCLComponent
from jcl.jabber.presence import DefaultSubscribeHandler, \ from jcl.jabber.presence import DefaultSubscribeHandler, \
DefaultUnsubscribeHandler, DefaultPresenceHandler, \ DefaultUnsubscribeHandler, DefaultPresenceHandler, \
RootPresenceAvailableHandler, AccountPresenceAvailableHandler, \ RootPresenceAvailableHandler, AccountPresenceAvailableHandler, \
AccountPresenceUnavailableHandler AccountPresenceUnavailableHandler, DefaultIQLastHandler
from jcl.model.account import User, LegacyJID, Account from jcl.model.account import User, LegacyJID, Account
from jcl.lang import Lang from jcl.lang import Lang
from jcl.tests import JCLTestCase from jcl.tests import JCLTestCase
class DefaultIQLastHandler_TestCase(JCLTestCase):
def setUp(self):
JCLTestCase.setUp(self, tables=[User, LegacyJID, Account])
self.comp = JCLComponent("jcl.test.com",
"password",
"localhost",
"5347",
None)
self.handler = DefaultIQLastHandler(self.comp)
def test_handle(self):
info_query = Iq(from_jid="user1@test.com",
to_jid="jcl.test.com",
stanza_type="get")
self.comp.last_activity = int(time.time())
time.sleep(1)
result = self.handler.handle(info_query, None, [])
self.assertEquals(len(result), 1)
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_from(), "jcl.test.com")
self.assertEquals(result[0].get_type(), "result")
self.assertNotEquals(result[0].xmlnode.children, None)
self.assertEquals(result[0].xmlnode.children.name, "query")
self.assertEquals(int(result[0].xmlnode.children.prop("seconds")), 1)
class DefaultSubscribeHandler_TestCase(unittest.TestCase): class DefaultSubscribeHandler_TestCase(unittest.TestCase):
def setUp(self): def setUp(self):
self.handler = DefaultSubscribeHandler(None) self.handler = DefaultSubscribeHandler(None)
@@ -362,6 +389,7 @@ class AccountPresenceUnavailableHandler_TestCase(JCLTestCase):
def suite(): def suite():
test_suite = unittest.TestSuite() test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(DefaultIQLastHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(DefaultSubscribeHandler_TestCase, 'test')) test_suite.addTest(unittest.makeSuite(DefaultSubscribeHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(DefaultUnsubscribeHandler_TestCase, 'test')) test_suite.addTest(unittest.makeSuite(DefaultUnsubscribeHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(DefaultPresenceHandler_TestCase, 'test')) test_suite.addTest(unittest.makeSuite(DefaultPresenceHandler_TestCase, 'test'))