Discord-py Rewrite - Базовый веб-сервер aiohttp в Cog - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь интегрировать базовый веб-сервер aiohttp в Cog (с использованием переписывания discord-py). Я использую следующий код для Cog:

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())

Отлично работает при запуске бота. Но если я перезагружаю винтик во время работы бота, я сталкиваюсь с проблемой:

OSError: ошибка [Errno 10048] при попытке привязки к адресу ('192.168.1.111', 8999): только одно использование каждого адреса сокета (протокол / сетевой адрес / порт) обычно разрешен

Я не могу придумать простой / элегантный способ освобождения и повторной привязки при каждой перезагрузке Cog.
Я хотел бы некоторые предложения по этому вопросу. Конечная цель состоит в том, чтобы иметь Cog, который поддерживает подписки на YouTube.

Может быть, есть лучший способ интегрировать базовый веб-сервер в мой бот. Я мог бы использовать deamon (fork) при запуске бота, например (у меня уже есть веб-сервер, написанный с использованием HTTPServer с BaseHTTPRequestHandler, который может обрабатывать подписки на pubsubhubbub на youtube), но каким-то образом я собираюсь объединить его в cog с помощью aiohttp :)

1 Ответ

0 голосов
/ 14 сентября 2018
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())

Спасибо Патрик Хау !!

...