From 72dca066264f547651908bbc16ab4e7d1020bd39 Mon Sep 17 00:00:00 2001 From: jesopo Date: Tue, 27 Nov 2018 11:56:03 +0000 Subject: Add a way to catch when a writebuffer is emptied so we can e.g. assure a QUIT is sent before shutting down the bot --- modules/signals.py | 3 ++- src/IRCBot.py | 6 +++++- src/IRCServer.py | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/signals.py b/modules/signals.py index 627becfe..9bf2c9a8 100644 --- a/modules/signals.py +++ b/modules/signals.py @@ -21,7 +21,8 @@ class Module(ModuleManager.BaseModule): server.send_quit(reason) self.bot.trigger() - self.bot.running = False + self.events.on("writebuffer.empty").hook( + lambda event: self.bot.disconnect(event["server"])) def SIGUSR1(self, signum, frame): self.bot.log.info("Reloading config file", []) diff --git a/src/IRCBot.py b/src/IRCBot.py index 16ee3007..62594404 100644 --- a/src/IRCBot.py +++ b/src/IRCBot.py @@ -157,6 +157,9 @@ class Bot(object): def run(self): while self.running: + if not self.servers: + break + events = self.poll.poll(self.get_poll_timeout()) self.lock.acquire() self._timers.call() @@ -189,7 +192,8 @@ class Bot(object): sock.parse_data(piece) elif event & select.EPOLLOUT: sock._send() - self.register_read(sock) + if sock.fileno() in self.servers: + self.register_read(sock) elif event & select.EPULLHUP: print("hangup") sock.disconnect() diff --git a/src/IRCServer.py b/src/IRCServer.py index c52c32d6..2379ecc2 100644 --- a/src/IRCServer.py +++ b/src/IRCServer.py @@ -299,6 +299,9 @@ class Server(IRCObject.Object): self.bytes_written += bytes_written self.write_buffer = self.write_buffer[bytes_written:] + if not self.waiting_send(): + self.events.on("writebuffer.empty").call(server=self) + now = time.monotonic() self.recent_sends.append(now) self.last_send = now -- cgit v1.3.1-10-gc9f91