Bot Discord Python - 在后台循环中更新频道名称

Bot Discord Python - Update channel name in a background loop

我正在开发一个小小的 Discord Bot,但遇到了一些问题。

要更新频道名称,我需要 bot 上下文

但是在我的后台任务中,根本没有上下文,所以我不知道如何实现我需要的东西。 所以上面的代码不能工作,因为第 23 行,其中 ctx 不存在

selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)

我尝试将 ctx 变量设为全局变量,并尝试将通道放入变量中,但第一次更改名称后,第二次不再起作用。这就是为什么我试图用 discord.utils.get.

在所有循环中获取它

(VcChannelName 是在另一个函数中设置的,这里没有显示,不用担心)。

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')

selectedVcChannel = None
VcChannelName = None

bot = commands.Bot(command_prefix="!")

# Background task
async def background_task():
    await bot.wait_until_ready()

    while not bot.is_closed():
        await call_api()
        await asyncio.sleep(10)

# Call of the web page and update channel name
async def call_api():
    global selectedVcChannel
    global VcChannelName

    if VcChannelName:
        selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)
        response = requests.get('https://MyAPI')
        respDecoded = response.content.decode("utf-8")
        VcChannelName = TranslationChannelName + respDecoded
        await selectedVcChannel.edit(name=VcChannelName)

# Start bot
bot.loop.create_task(background_task())
bot.run(TOKEN)

如何在后台循环中轻松使用上下文命令?

谢谢

您可以试试这个,通过 bot.guilds 循环访问您的机器人所属的公会,并在每个公会的频道上调用 discord.utils.get。尽管使用 id 而不是 name 可能会更好。您也许可以将 ID 保存在数据库中。

您无法在后台任务中获得 context,因为它是机器人命令独有的内容。


if VcChannelName:
    for guild in bot.guilds:
        # if you want to find the channel by id
        # selectedVcChannel = discord.utils.get(guild.channels, id=voice_channel_id)
        selectedVcChannel = discord.utils.get(guild.channels, name=VcChannelName)
        # If you want the first channel found with the name of 'VcChannelName' 
        # you can add this condition with a break statement,
        # you obviously don't need this if you use id
        if selectedVcChannel:
           break

    if selectedVcChannel:
        response = requests.get('https://MyAPI')
        respDecoded = response.content.decode("utf-8")
        VcChannelName = TranslationChannelName + respDecoded
        await selectedVcChannel.edit(name=VcChannelName)