Discord-py Rewrite - Cog 中的基本 aiohttp 网络服务器

Discord-py Rewrite - Basic aiohttp webserver in a Cog

我正在尝试在 Cog 中集成一个基本的 aiohttp 网络服务器(使用 discord-py 重写)。我正在为齿轮使用以下代码:

from aiohttp import web
import discord
from discord.ext import commands

class Youtube():

    def __init__(self, bot):
        self.bot = bot

    async def webserver(self):
        async def handler(request):
            return web.Response(text="Hello, world")

        app = web.Application()
        app.router.add_get('/', handler)
        runner = web.AppRunner(app)
        await runner.setup()
        site = web.TCPSite(runner, '192.168.1.111', 8999)
        await self.bot.wait_until_ready()
        await site.start()

def setup(bot):
    yt = Youtube(bot)
    bot.add_cog(yt)
    bot.loop.create_task(yt.webserver())

启动机器人后它工作正常。 但是如果我在机器人 运行 时重新加载 cog,我会遇到一个问题:

OSError: [Errno 10048] error while attempting to bind on address ('192.168.1.111', 8999): only one usage of each socket address (protocol/network address/port) is normally permitted

我想不出 simple/elegant 每次重新加载 cog 时释放和重新绑定的方法。
我希望对此提出一些建议。最终目标是拥有一个支持 youtube pubsubhubbub 订阅的 cog。

可能只是有更好的方法可以将基本网络服务器集成到我的机器人中。例如,我可以在启动机器人时使用 deamon(fork)(我已经有一个使用 HTTPServer 编写的网络服务器和一个可以处理 pubsubhubbub youtube 订阅的 BaseHTTPRequestHandler)但不知何故我决定使用 aiohttp 将它集成到一个 cog :)

    from aiohttp import web
    import asyncio
    import discord 
    from discord.ext import commands
        
        class Youtube():
        
            def __init__(self, bot):
                self.bot = bot
        
            async def webserver(self):
                async def handler(request):
                    return web.Response(text="Hello, world")
        
                app = web.Application()
                app.router.add_get('/', handler)
                runner = web.AppRunner(app)
                await runner.setup()
                self.site = web.TCPSite(runner, '192.168.1.111', 8999)
                await self.bot.wait_until_ready()
                await self.site.start()
    
            def __unload(self):
                asyncio.ensure_future(self.site.stop())
        
        def setup(bot):
            yt = Youtube(bot)
            bot.add_cog(yt)
            bot.loop.create_task(yt.webserver())

谢谢Patrick Haugh!!