implement Last Activity (XEP-012)
darcs-hash:20080528171120-86b55-bcb3bc0c25cb2ea16f90db428b340842cdff941b.gz
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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"""
|
||||||
|
|
||||||
|
|||||||
@@ -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'))
|
||||||
|
|||||||
Reference in New Issue
Block a user