XEP-0047: fix examples.

This commit is contained in:
Emmanuel Gil Peyrot 2015-04-10 22:29:44 +02:00
parent 4415d3be1a
commit 474405ab90
2 changed files with 51 additions and 44 deletions

View file

@ -22,13 +22,10 @@ class IBBReceiver(slixmpp.ClientXMPP):
A basic example of creating and using an in-band bytestream. A basic example of creating and using an in-band bytestream.
""" """
def __init__(self, jid, password): def __init__(self, jid, password, filename):
slixmpp.ClientXMPP.__init__(self, jid, password) slixmpp.ClientXMPP.__init__(self, jid, password)
self.register_plugin('xep_0030') # Service Discovery self.file = open(filename, 'wb')
self.register_plugin('xep_0047', {
'auto_accept': True
}) # In-band Bytestreams
# The session_start event will be triggered when # The session_start event will be triggered when
# the bot establishes its connection with the server # the bot establishes its connection with the server
@ -39,6 +36,7 @@ class IBBReceiver(slixmpp.ClientXMPP):
self.add_event_handler("ibb_stream_start", self.stream_opened) self.add_event_handler("ibb_stream_start", self.stream_opened)
self.add_event_handler("ibb_stream_data", self.stream_data) self.add_event_handler("ibb_stream_data", self.stream_data)
self.add_event_handler("ibb_stream_end", self.stream_closed)
def start(self, event): def start(self, event):
""" """
@ -56,29 +54,16 @@ class IBBReceiver(slixmpp.ClientXMPP):
self.send_presence() self.send_presence()
self.get_roster() self.get_roster()
def accept_stream(self, iq):
"""
Check that it is ok to accept a stream request.
Controlling stream acceptance can be done via either:
- setting 'auto_accept' to False in the plugin
configuration. The default is True.
- setting 'accept_stream' to a function which accepts
an Iq stanza as its argument, like this one.
The accept_stream function will be used if it exists, and the
auto_accept value will be used otherwise.
"""
return True
def stream_opened(self, stream): def stream_opened(self, stream):
print('Stream opened: %s from %s' % (stream.sid, stream.peer_jid)) print('Stream opened: %s from %s' % (stream.sid, stream.peer_jid))
# You could run a loop reading from the stream using stream.recv(), def stream_data(self, stream):
# or use the ibb_stream_data event. self.file.write(stream.read())
def stream_data(self, event): def stream_closed(self, stream):
print(event['data']) print('Stream closed: %s from %s' % (stream.sid, stream.peer_jid))
self.file.close()
self.disconnect()
if __name__ == '__main__': if __name__ == '__main__':
# Setup the command line arguments. # Setup the command line arguments.
@ -97,6 +82,8 @@ if __name__ == '__main__':
help="JID to use") help="JID to use")
parser.add_argument("-p", "--password", dest="password", parser.add_argument("-p", "--password", dest="password",
help="password to use") help="password to use")
parser.add_argument("-o", "--out", dest="filename",
help="file to save to")
args = parser.parse_args() args = parser.parse_args()
@ -108,9 +95,18 @@ if __name__ == '__main__':
args.jid = input("Username: ") args.jid = input("Username: ")
if args.password is None: if args.password is None:
args.password = getpass("Password: ") args.password = getpass("Password: ")
if args.filename is None:
args.filename = input("File path: ")
xmpp = IBBReceiver(args.jid, args.password) # Setup the IBBReceiver and register plugins. Note that while plugins may
# have interdependencies, the order in which you register them does
# not matter.
xmpp = IBBReceiver(args.jid, args.password, args.filename)
xmpp.register_plugin('xep_0030') # Service Discovery
xmpp.register_plugin('xep_0047', {
'auto_accept': True
}) # In-band Bytestreams
# Connect to the XMPP server and start processing XMPP stanzas. # Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect() xmpp.connect()
xmpp.process() xmpp.process(forever=False)

View file

@ -9,11 +9,13 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
import asyncio
import logging import logging
from getpass import getpass from getpass import getpass
from argparse import ArgumentParser from argparse import ArgumentParser
import slixmpp import slixmpp
from slixmpp.exceptions import IqError, IqTimeout
class IBBSender(slixmpp.ClientXMPP): class IBBSender(slixmpp.ClientXMPP):
@ -22,11 +24,13 @@ class IBBSender(slixmpp.ClientXMPP):
A basic example of creating and using an in-band bytestream. A basic example of creating and using an in-band bytestream.
""" """
def __init__(self, jid, password, receiver, filename): def __init__(self, jid, password, receiver, filename, use_messages=False):
slixmpp.ClientXMPP.__init__(self, jid, password) slixmpp.ClientXMPP.__init__(self, jid, password)
self.receiver = receiver self.receiver = receiver
self.filename = filename
self.file = open(filename, 'rb')
self.use_messages = use_messages
# The session_start event will be triggered when # The session_start event will be triggered when
# the bot establishes its connection with the server # the bot establishes its connection with the server
@ -35,6 +39,7 @@ class IBBSender(slixmpp.ClientXMPP):
# our roster. # our roster.
self.add_event_handler("session_start", self.start) self.add_event_handler("session_start", self.start)
@asyncio.coroutine
def start(self, event): def start(self, event):
""" """
Process the session_start event. Process the session_start event.
@ -51,15 +56,22 @@ class IBBSender(slixmpp.ClientXMPP):
self.send_presence() self.send_presence()
self.get_roster() self.get_roster()
# For the purpose of demonstration, we'll set a very small block try:
# size. The default block size is 4096. We'll also use a window # Open the IBB stream in which to write to.
# allowing sending multiple blocks at a time; in this case, three stream = yield from self['xep_0047'].open_stream(self.receiver, use_messages=self.use_messages)
# block transfers may be in progress at any time.
stream = self['xep_0047'].open_stream(self.receiver)
with open(self.filename) as f: # If you want to send in-memory bytes, use stream.sendall() instead.
data = f.read() yield from stream.sendfile(self.file, timeout=10)
stream.sendall(data)
# And finally close the stream.
yield from stream.close(timeout=10)
except (IqError, IqTimeout):
print('File transfer errored')
else:
print('File transfer finished')
finally:
self.file.close()
self.disconnect()
if __name__ == '__main__': if __name__ == '__main__':
@ -80,9 +92,11 @@ if __name__ == '__main__':
parser.add_argument("-p", "--password", dest="password", parser.add_argument("-p", "--password", dest="password",
help="password to use") help="password to use")
parser.add_argument("-r", "--receiver", dest="receiver", parser.add_argument("-r", "--receiver", dest="receiver",
help="JID to use") help="JID of the receiver")
parser.add_argument("-f", "--file", dest="filename", parser.add_argument("-f", "--file", dest="filename",
help="JID to use") help="file to send")
parser.add_argument("-m", "--use-messages", action="store_true",
help="use messages instead of iqs for file transfer")
args = parser.parse_args() args = parser.parse_args()
@ -99,16 +113,13 @@ if __name__ == '__main__':
if args.filename is None: if args.filename is None:
args.filename = input("File path: ") args.filename = input("File path: ")
# Setup the EchoBot and register plugins. Note that while plugins may # Setup the IBBSender and register plugins. Note that while plugins may
# have interdependencies, the order in which you register them does # have interdependencies, the order in which you register them does
# not matter. # not matter.
xmpp = IBBSender(args.jid, args.password, args.receiver, args.filename) xmpp = IBBSender(args.jid, args.password, args.receiver, args.filename, args.use_messages)
xmpp.register_plugin('xep_0030') # Service Discovery xmpp.register_plugin('xep_0030') # Service Discovery
xmpp.register_plugin('xep_0004') # Data Forms
xmpp.register_plugin('xep_0047') # In-band Bytestreams xmpp.register_plugin('xep_0047') # In-band Bytestreams
xmpp.register_plugin('xep_0060') # PubSub
xmpp.register_plugin('xep_0199') # XMPP Ping
# Connect to the XMPP server and start processing XMPP stanzas. # Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect() xmpp.connect()
xmpp.process() xmpp.process(forever=False)