diff --git a/sleekxmpp/plugins/xep_0249/__init__.py b/sleekxmpp/plugins/xep_0249/__init__.py index 4af19a2b..e88d87ac 100644 --- a/sleekxmpp/plugins/xep_0249/__init__.py +++ b/sleekxmpp/plugins/xep_0249/__init__.py @@ -1,2 +1,10 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2011 Nathanael C. Fritz, Dalek + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + from sleekxmpp.plugins.xep_0249.stanza import Invite from sleekxmpp.plugins.xep_0249.invite import xep_0249 diff --git a/sleekxmpp/plugins/xep_0249/invite.py b/sleekxmpp/plugins/xep_0249/invite.py index 7c966f15..fdeffdea 100644 --- a/sleekxmpp/plugins/xep_0249/invite.py +++ b/sleekxmpp/plugins/xep_0249/invite.py @@ -1,5 +1,10 @@ -"""Direct MUC Invitation.""" +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2011 Nathanael C. Fritz, Dalek + This file is part of SleekXMPP. + See the file LICENSE for copying permission. +""" import logging @@ -11,6 +16,7 @@ from sleekxmpp.xmlstream.handler import Callback from sleekxmpp.xmlstream.matcher import StanzaPath from sleekxmpp.plugins.xep_0249 import Invite + log = logging.getLogger(__name__) @@ -34,15 +40,14 @@ class xep_0249(base_plugin): def post_init(self): base_plugin.post_init(self) - self.xmpp.plugin['xep_0030'].add_feature(Invite.namespace) + self.xmpp['xep_0030'].add_feature(Invite.namespace) - def _handle_invite(self, message): + def _handle_invite(self, msg): """ Raise an event for all invitations received. - """ log.debug("Received direct muc invitation from %s to room %s", - message['from'], message['groupchat_invite']['jid']) + msg['from'], msg['groupchat_invite']['jid']) self.xmpp.event('groupchat_direct_invite', message) @@ -52,24 +57,23 @@ class xep_0249(base_plugin): Send a direct MUC invitation to an XMPP entity. Arguments: - jid -- The jid of the entity to which the inviation - is sent - roomjid -- the address of the groupchat room to be joined - password -- a password needed for entry into a - password-protected room (OPTIONAL). - reason -- a human-readable purpose for the invitation - (OPTIONAL). - + jid -- The JID of the entity that will receive + the invitation + roomjid -- the address of the groupchat room to be joined + password -- a password needed for entry into a + password-protected room (OPTIONAL). + reason -- a human-readable purpose for the invitation + (OPTIONAL). """ - message = self.xmpp.Message() - message['to'] = jid + msg = self.xmpp.Message() + msg['to'] = jid if ifrom is not None: - message['from'] = ifrom - message['groupchat_invite']['jid'] = roomjid + msg['from'] = ifrom + msg['groupchat_invite']['jid'] = roomjid if password is not None: - message['groupchat_invite']['password'] = password + msg['groupchat_invite']['password'] = password if reason is not None: - message['groupchat_invite']['reason'] = reason + msg['groupchat_invite']['reason'] = reason - return message.send() + return msg.send() diff --git a/sleekxmpp/plugins/xep_0249/stanza.py b/sleekxmpp/plugins/xep_0249/stanza.py index 43bb65d0..ba4060d7 100644 --- a/sleekxmpp/plugins/xep_0249/stanza.py +++ b/sleekxmpp/plugins/xep_0249/stanza.py @@ -1,7 +1,16 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2011 Nathanael C. Fritz, Dalek + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + from sleekxmpp.xmlstream import ElementBase class Invite(ElementBase): + """ XMPP allows for an agent in an MUC room to directly invite another user to join the chat room (as opposed to a mediated invitation @@ -17,13 +26,14 @@ class Invite(ElementBase): Stanza Interface: - jid -- The JID of the groupchat room - password -- The password used to gain entry in the room - (optional) - reason -- The reason for the invitation (optional) + jid -- The JID of the groupchat room + password -- The password used to gain entry in the room + (optional) + reason -- The reason for the invitation (optional) """ + name = "x" namespace = "jabber:x:conference" plugin_attrib = "groupchat_invite" - interfaces = ("jid", "password", "reason") \ No newline at end of file + interfaces = ("jid", "password", "reason") diff --git a/tests/test_stream_xep_0249.py b/tests/test_stream_xep_0249.py new file mode 100644 index 00000000..f49d1f7e --- /dev/null +++ b/tests/test_stream_xep_0249.py @@ -0,0 +1,64 @@ +import sys +import time +import threading + +from sleekxmpp.test import * +from sleekxmpp.xmlstream import ElementBase + + +class TestStreamDirectInvite(SleekTest): + + """ + Test using the XEP-0249 plugin. + """ + + def tearDown(self): + sys.excepthook = sys.__excepthook__ + self.stream_close() + + def testReceiveInvite(self): + self.stream_start(mode='client', + plugins=['xep_0030', + 'xep_0249']) + + events = [] + + def handle_invite(msg): + events.append(True) + + self.xmpp.add_event_handler('groupchat_direct_invite', + handle_invite) + + self.recv(""" + + + + """) + + time.sleep(.5) + + self.failUnless(events == [True], + "Event not raised: %s" % events) + + def testSentDirectInvite(self): + self.stream_start(mode='client', + plugins=['xep_0030', + 'xep_0249']) + + self.xmpp['xep_0249'].send_invitation('user@example.com', + 'sleek@conference.jabber.org', + reason='Need to test Sleek') + + self.send(""" + + + + """) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamDirectInvite)