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

Discord-py Rewrite - Basic aiohttp webserver in a Cog(Discord-py Rewrite - Cog 中的基本 aiohttp 网络服务器)
本文介绍了Discord-py Rewrite - Cog 中的基本 aiohttp 网络服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

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

I am trying to integrate a basic aiohttp webserver in a Cog (using discord-py rewrite). I am using the following code for the 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())

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

It works fine upon starting the bot. But if I reload the cog while the bot is running, I encounter an issue:

OSError: [Errno 10048] 尝试绑定地址时出错('192.168.1.111', 8999):每个socket地址只使用一次(协议/网络地址/端口)通常是允许的

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

每次重新加载 cog 时,我都想不出一种简单/优雅的方式来释放和重新绑定.
我很想对此提出一些建议.最终目标是拥有一个支持 youtube pubsubhubbub 订阅的 cog.

I cannot think of an simple/elegant way to release and re bind every time the cog is reloaded.
I would love some suggestions on this. The end goal is to have a cog that supports youtube pubsubhubbub subscriptions.

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

It might just be that there is a better way to integrate a basic webserver to my bot. I could use a deamon (fork) upon starting the bot for example (I already have a webserver written using HTTPServer with a BaseHTTPRequestHandler that can handle pubsubhubbub youtube subscriptions) but somehow I have my mind set on integrating it in a cog using aiohttp :)

推荐答案

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

谢谢帕特里克·豪!!

这篇关于Discord-py Rewrite - Cog 中的基本 aiohttp 网络服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do I make a list of all members in a discord server using discord.py?(如何使用 discord.py 列出不和谐服务器中的所有成员?)
how to change discord.py bot activity(如何更改 discord.py 机器人活动)
Issues with getting VoiceChannel.members and Guild.members to return a full list(让 VoiceChannel.members 和 Guild.members 返回完整列表的问题)
Add button components to a message (discord.py)(将按钮组件添加到消息(discord.py))
on_message() and @bot.command issue(on_message() 和@bot.command 问题)
How to edit a message in discord.py(如何在 discord.py 中编辑消息)