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 traceback
import string
import time
from Queue import Queue
@@ -59,7 +60,7 @@ from jcl.jabber.presence import AccountPresenceAvailableHandler, \
RootPresenceAvailableHandler, AccountPresenceUnavailableHandler, \
RootPresenceUnavailableHandler, AccountPresenceSubscribeHandler, \
RootPresenceSubscribeHandler, AccountPresenceUnsubscribeHandler, \
RootPresenceUnsubscribeHandler
RootPresenceUnsubscribeHandler, DefaultIQLastHandler
from jcl.jabber.register import RootSetRegisterHandler, \
AccountSetRegisterHandler, AccountTypeSetRegisterHandler
from jcl.jabber.vcard import DefaultVCardHandler
@@ -646,12 +647,14 @@ class JCLComponent(Component, object):
AccountSetRegisterHandler(self),
AccountTypeSetRegisterHandler(self)]]
self.vcard_handlers = [[DefaultVCardHandler(self)]]
self.iqlast_handlers = [[DefaultIQLastHandler(self)]]
self.__logger = logging.getLogger("jcl.jabber.JCLComponent")
self.lang = lang
self.running = False
self.wait_event = threading.Event()
self._restart = False
self.last_activity = int(time.time())
signal.signal(signal.SIGINT, 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.running = True
self.last_activity = int(time.time())
self.connect()
timer_thread = threading.Thread(target=self.time_handler,
name="TimerThread")
@@ -867,7 +871,8 @@ class JCLComponent(Component, object):
"""
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
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
##
import time
from pyxmpp.presence import Presence
from pyxmpp.message import Message
@@ -28,6 +30,17 @@ from jcl.jabber import Handler
from jcl.model import account
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):
"""Handle presence"""

View File

@@ -24,20 +24,47 @@ import unittest
import tempfile
import os
from ConfigParser import ConfigParser
import time
from pyxmpp.presence import Presence
from pyxmpp.message import Message
from pyxmpp.iq import Iq
from jcl.jabber.component import JCLComponent
from jcl.jabber.presence import DefaultSubscribeHandler, \
DefaultUnsubscribeHandler, DefaultPresenceHandler, \
RootPresenceAvailableHandler, AccountPresenceAvailableHandler, \
AccountPresenceUnavailableHandler
AccountPresenceUnavailableHandler, DefaultIQLastHandler
from jcl.model.account import User, LegacyJID, Account
from jcl.lang import Lang
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):
def setUp(self):
self.handler = DefaultSubscribeHandler(None)
@@ -362,6 +389,7 @@ class AccountPresenceUnavailableHandler_TestCase(JCLTestCase):
def suite():
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(DefaultUnsubscribeHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(DefaultPresenceHandler_TestCase, 'test'))