import asyncio import signal import discord __all__ = ('serve',) def serve(main, client: discord.Client, loop: asyncio.AbstractEventLoop): async def aclose(): if not client.is_closed(): await client.change_presence(status=discord.Status.offline) await client.close() def close(): loop.run_until_complete(aclose()) def sigtermed(*_args): loop.create_task(aclose()) signal.signal(signal.SIGTERM, sigtermed) task = loop.create_task(main) try: loop.run_until_complete(task) except (KeyboardInterrupt, InterruptedError, RuntimeError): close() loop.run_until_complete(task) finally: close()