Compare commits

...

8 Commits

Author SHA1 Message Date
mathieui
0dd32be7f5 Update version to 1.5.1
1.5.0 changed what could be expected to be sent before calling
  disconnect(), this fixes it.
2020-05-02 19:39:21 +02:00
Maxime Buquet
bf69698af1 Merge branch 'add-forever-false-examples' into 'master'
Add forever=False to some examples to make them terminate

See merge request poezio/slixmpp!46
2020-05-02 17:54:50 +02:00
Maxime Buquet
aa732b3c94 Merge branch 'fix-disconnect-send-queue' into 'master'
Fix a regression introduced in 1.5.0

See merge request poezio/slixmpp!45
2020-05-02 17:35:17 +02:00
mathieui
d076cef023 Add forever=False to some examples to make them terminate 2020-05-02 17:34:11 +02:00
mathieui
f884b67b8b Fix a regression introduced in 1.5.0
Due to the send queue, messages sent immediatly before calling
"disconnect" would not be sent.
2020-05-02 17:17:08 +02:00
Maxime Buquet
0d3116dbdf Merge branch 'fix-start-handlers' into 'master'
Change session_start callback to async in most examples

See merge request poezio/slixmpp!44
2020-05-02 16:51:51 +02:00
mathieui
f1ab9ab964 Change session_start callback to async in most examples
If we fetch the roster, we should probably wait until we get it back
2020-05-02 16:47:04 +02:00
mathieui
e520ab1f5e Merge branch 'release-1.5.0' into 'master'
Update version to 1.5.0

See merge request poezio/slixmpp!43
2020-05-01 16:00:58 +02:00
23 changed files with 68 additions and 54 deletions

View File

@@ -33,7 +33,7 @@ class CommandBot(slixmpp.ClientXMPP):
# our roster.
self.add_event_handler("session_start", self.start)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -47,7 +47,7 @@ class CommandBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
# We add the command after session_start has fired
# to ensure that the correct full JID is used.

View File

@@ -37,7 +37,7 @@ class CommandUserBot(slixmpp.ClientXMPP):
self.add_event_handler("session_start", self.start)
self.add_event_handler("message", self.message)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -51,7 +51,7 @@ class CommandUserBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
# We first create a session dictionary containing:
# 'next' -- the handler to execute on a successful response
@@ -176,4 +176,4 @@ if __name__ == '__main__':
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
xmpp.process(forever=False)

View File

@@ -30,7 +30,7 @@ class AdminCommands(slixmpp.ClientXMPP):
self.add_event_handler("session_start", self.start)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -44,7 +44,7 @@ class AdminCommands(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
def command_success(iq, session):
print('Command completed')

View File

@@ -69,7 +69,7 @@ class Disco(slixmpp.ClientXMPP):
event does not provide any additional
data.
"""
self.get_roster()
await self.get_roster()
self.send_presence()
try:

View File

@@ -159,4 +159,4 @@ if __name__ == '__main__':
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
xmpp.process(forever=False)

View File

@@ -38,7 +38,7 @@ class EchoBot(slixmpp.ClientXMPP):
# MUC messages and error messages.
self.add_event_handler("message", self.message)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -52,7 +52,7 @@ class EchoBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
def message(self, msg):
"""

View File

@@ -58,7 +58,7 @@ class GTalkBot(slixmpp.ClientXMPP):
logging.error(err.message)
self.disconnect()
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -72,7 +72,7 @@ class GTalkBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
def message(self, msg):
"""

View File

@@ -39,7 +39,7 @@ class EchoBot(slixmpp.ClientXMPP):
# MUC messages and error messages.
self.add_event_handler("message", self.message)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -53,7 +53,7 @@ class EchoBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
def message(self, msg):
"""

View File

@@ -104,4 +104,4 @@ def on_session2(event):
new_xmpp.add_event_handler('session_start', on_session2)
new_xmpp.connect()
new_xmpp.process()
new_xmpp.process(forever=False)

View File

@@ -52,7 +52,7 @@ class MUCBot(slixmpp.ClientXMPP):
self.muc_online)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -65,7 +65,7 @@ class MUCBot(slixmpp.ClientXMPP):
event does not provide any additional
data.
"""
self.get_roster()
await self.get_roster()
self.send_presence()
self.plugin['xep_0045'].join_muc(self.room,
self.nick,

View File

@@ -51,7 +51,7 @@ class PingTest(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
try:
rtt = await self['xep_0199'].ping(self.pingjid,
@@ -109,4 +109,4 @@ if __name__ == '__main__':
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
xmpp.process(forever=False)

View File

@@ -38,7 +38,7 @@ class EchoBot(slixmpp.ClientXMPP):
# MUC messages and error messages.
self.add_event_handler("message", self.message)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -52,7 +52,7 @@ class EchoBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
def message(self, msg):
"""

View File

@@ -32,7 +32,7 @@ class PubsubClient(slixmpp.ClientXMPP):
self.add_event_handler('session_start', self.start)
async def start(self, event):
self.get_roster()
await self.get_roster()
self.send_presence()
try:

View File

@@ -38,8 +38,8 @@ class PubsubEvents(slixmpp.ClientXMPP):
# self.add_event_handler('event_prefix_purge', handler)
# self.add_event_handler('event_prefix_delete', handler)
def start(self, event):
self.get_roster()
async def start(self, event):
await self.get_roster()
self.send_presence()
def _publish(self, msg):

View File

@@ -47,7 +47,7 @@ class RegisterBot(slixmpp.ClientXMPP):
# for data forms and OOB links that will make that easier.
self.add_event_handler("register", self.register)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -61,7 +61,7 @@ class RegisterBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
# We're only concerned about registering, so nothing more to do here.
self.disconnect()

View File

@@ -51,12 +51,8 @@ class RosterBrowser(slixmpp.ClientXMPP):
event does not provide any additional
data.
"""
future = asyncio.Future()
def callback(result):
future.set_result(None)
try:
self.get_roster(callback=callback)
await future
await self.get_roster()
except IqError as err:
print('Error: %s' % err.iq['error']['condition'])
except IqTimeout:
@@ -138,4 +134,4 @@ if __name__ == '__main__':
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
xmpp.process(forever=False)

View File

@@ -38,7 +38,7 @@ class SendMsgBot(slixmpp.ClientXMPP):
# our roster.
self.add_event_handler("session_start", self.start)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -52,7 +52,7 @@ class SendMsgBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
self.send_message(mto=self.recipient,
mbody=self.msg,
@@ -107,4 +107,4 @@ if __name__ == '__main__':
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
xmpp.process(forever=False)

View File

@@ -46,7 +46,7 @@ class AvatarSetter(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
avatar_file = None
try:
@@ -137,4 +137,4 @@ if __name__ == '__main__':
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
xmpp.process(forever=False)

View File

@@ -60,7 +60,7 @@ class ThirdPartyAuthBot(slixmpp.ClientXMPP):
# MUC messages and error messages.
self.add_event_handler("message", self.message)
def start(self, event):
async def start(self, event):
"""
Process the session_start event.
@@ -74,7 +74,7 @@ class ThirdPartyAuthBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
self.get_roster()
await self.get_roster()
def message(self, msg):
"""

View File

@@ -38,9 +38,9 @@ class LocationBot(ClientXMPP):
self.current_tune = None
def start(self, event):
async def start(self, event):
self.send_presence()
self.get_roster()
await self.get_roster()
self['xep_0115'].update_caps()
print("Using freegeoip.net to get geolocation.")

View File

@@ -35,9 +35,9 @@ class TuneBot(ClientXMPP):
self.current_tune = None
def start(self, event):
async def start(self, event):
self.send_presence()
self.get_roster()
await self.get_roster()
self['xep_0115'].update_caps()
def _update_tune(self):

View File

@@ -9,5 +9,5 @@
# We don't want to have to import the entire library
# just to get the version info for setup.py
__version__ = '1.5.0'
__version_info__ = (1, 5, 0)
__version__ = '1.5.1'
__version_info__ = (1, 5, 1)

View File

@@ -475,7 +475,7 @@ class XMLStream(asyncio.BaseProtocol):
self._current_connection_attempt.cancel()
self._current_connection_attempt = None
def disconnect(self, wait: float = 2.0, reason: Optional[str] = None) -> None:
def disconnect(self, wait: float = 2.0, reason: Optional[str] = None, ignore_send_queue: bool = False) -> None:
"""Close the XML stream and wait for an acknowldgement from the server for
at most `wait` seconds. After the given number of seconds has
passed without a response from the server, or when the server
@@ -495,16 +495,32 @@ class XMLStream(asyncio.BaseProtocol):
if wait == True:
wait = 2.0
self.disconnect_reason = reason
self.cancel_connection_attempt()
if self.transport:
if wait > 0.0:
self.send_raw(self.stream_footer)
self.schedule('Disconnect wait', wait,
self.abort, repeat=False)
if self.waiting_queue.empty() or ignore_send_queue:
self.disconnect_reason = reason
self.cancel_connection_attempt()
if wait > 0.0:
self.send_raw(self.stream_footer)
self.schedule('Disconnect wait', wait,
self.abort, repeat=False)
else:
asyncio.ensure_future(
self._consume_send_queue_before_disconnecting(reason, wait),
loop=self.loop,
)
else:
self.event("disconnected", reason)
async def _consume_send_queue_before_disconnecting(self, reason: Optional[str], wait: float):
"""Wait until the send queue is empty before disconnecting"""
await self.waiting_queue.join()
self.disconnect_reason = reason
self.cancel_connection_attempt()
if wait > 0.0:
self.send_raw(self.stream_footer)
self.schedule('Disconnect wait', wait,
self.abort, repeat=False)
def abort(self):
"""
Forcibly close the connection
@@ -899,7 +915,9 @@ class XMLStream(asyncio.BaseProtocol):
Execute the callback and remove the handler for it.
"""
self._safe_cb_run(name, cb)
del self.scheduled_events[name]
# workaround for specific events which unschedule themselves
if name in self.scheduled_events:
del self.scheduled_events[name]
def incoming_filter(self, xml):
"""Filter incoming XML objects before they are processed.