From 7d9c2206bcc247dc815352360076003623adf2a6 Mon Sep 17 00:00:00 2001 From: Tristan Gosselin-Hane Date: Fri, 11 Oct 2019 17:22:34 -0400 Subject: [PATCH 1/2] Shutdown all threads cleanly on KeyboardInterrupt Fixes #55 --- .../minecraft_discord_bridge.py | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/minecraft_discord_bridge/minecraft_discord_bridge.py b/minecraft_discord_bridge/minecraft_discord_bridge.py index 68aa2cd..3cc55d5 100755 --- a/minecraft_discord_bridge/minecraft_discord_bridge.py +++ b/minecraft_discord_bridge/minecraft_discord_bridge.py @@ -461,8 +461,8 @@ class MinecraftDiscordBridge(): del session def run(self): - reactor_thread = Thread(target=self.run_auth_server, args=(self.config.auth_port,)) - reactor_thread.start() + self.reactor_thread = Thread(target=self.run_auth_server, args=(self.config.auth_port,)) + self.reactor_thread.start() self.logger.debug("Checking if the server {} is online before connecting.") @@ -493,7 +493,22 @@ class MinecraftDiscordBridge(): self.register_handlers(self.connection) self.connection.connect() - self.discord_bot.run(self.config.discord_token) + self.aioloop = asyncio.get_event_loop() + try: + self.aioloop.run_until_complete(self.discord_bot.start(self.config.discord_token)) + except KeyboardInterrupt: + # log out of discord + self.aioloop.run_until_complete(self.discord_bot.logout()) + # log out of minecraft + self.connection.disconnect() + # shut down auth server + from twisted.internet import reactor + reactor.callFromThread(reactor.stop) + # clean up auth server thread + self.reactor_thread.join() + finally: + # close the asyncio event loop discord uses + self.aioloop.close() def mc_uuid_to_username(self, mc_uuid: str): if mc_uuid not in self.uuid_cache: @@ -612,10 +627,7 @@ class MinecraftDiscordBridge(): self.logger.info("Starting authentication server on port %d", port) factory.listen("", port) - try: - reactor.run(installSignalHandlers=False) - except KeyboardInterrupt: - reactor.stop() + reactor.run(installSignalHandlers=False) def generate_random_auth_token(self, length): letters = string.ascii_lowercase + string.digits + string.ascii_uppercase From ec026331a0ef5560ebfdea5751774e6ce5b0901a Mon Sep 17 00:00:00 2001 From: Tristan Gosselin-Hane Date: Fri, 11 Oct 2019 17:30:02 -0400 Subject: [PATCH 2/2] Move thread and event loop initializations to constructor --- minecraft_discord_bridge/minecraft_discord_bridge.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minecraft_discord_bridge/minecraft_discord_bridge.py b/minecraft_discord_bridge/minecraft_discord_bridge.py index 3cc55d5..16b6aa7 100755 --- a/minecraft_discord_bridge/minecraft_discord_bridge.py +++ b/minecraft_discord_bridge/minecraft_discord_bridge.py @@ -75,6 +75,8 @@ class MinecraftDiscordBridge(): self.bot_perms.update(manage_messages=True, manage_webhooks=True) # Async http request pool self.req_future_session = FuturesSession(max_workers=100) + self.reactor_thread = Thread(target=self.run_auth_server, args=(self.config.auth_port,)) + self.aioloop = asyncio.get_event_loop() # We need to import twisted after setting up the logger because twisted hijacks our logging from . import auth_server auth_server.DATABASE_SESSION = self.database_session @@ -461,7 +463,6 @@ class MinecraftDiscordBridge(): del session def run(self): - self.reactor_thread = Thread(target=self.run_auth_server, args=(self.config.auth_port,)) self.reactor_thread.start() self.logger.debug("Checking if the server {} is online before connecting.") @@ -493,7 +494,6 @@ class MinecraftDiscordBridge(): self.register_handlers(self.connection) self.connection.connect() - self.aioloop = asyncio.get_event_loop() try: self.aioloop.run_until_complete(self.discord_bot.start(self.config.discord_token)) except KeyboardInterrupt: