background_task.py not showing messages - Python

北慕城南 提交于 2019-12-31 04:14:13

问题


I noticed that when I ran a code snippet from the discord.py Github page it didn't show the intended message.

My slightly modified code:

import discord
import asyncio

import nest_asyncio
nest_asyncio.apply()

class MyClient(discord.Client):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # create the background task and run it in the background
        self.bg_task = self.loop.create_task(self.my_background_task())

    async def on_ready(self):
        print('Logged in as')
        print(self.user.name)
        print(self.user.id)
        print('------')

    async def my_background_task(self):
        counter = 0
        channel = self.get_channel(1234567890) # channel ID goes here
        while not self.is_closed():
            counter += 1
            await channel.send(counter)
            await asyncio.sleep(10) # task runs every 10 seconds


client = MyClient()
client.run('token')

When I check Discord nothing shows, however it does show output in the IDLE:

Logged in as
bot_name
1234567890
------

But in the Discord server, nothing happens. Is there anyway to fix this?


回答1:


The code fails because self.get_channel(1234567890) is used before the bot has properly connected, resulted in it always returning None. This is because client = MyClient() is done first, meaning the background task is created but the bot has not yet connected, which is done through client.run.

To fix this, move the creation of the loop to inside the on_ready event.

import discord
import asyncio

import nest_asyncio
nest_asyncio.apply()

class MyClient(discord.Client):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    async def on_ready(self):
        print('Logged in as')
        print(self.user.name)
        print(self.user.id)
        print('------')

        # create the background task and run it in the background
        self.bg_task = self.loop.create_task(self.my_background_task())

    async def my_background_task(self):
        counter = 0
        channel = self.get_channel(1234567890) # channel ID goes here
        while not self.is_closed():
            counter += 1
            await channel.send(counter)
            await asyncio.sleep(10) # task runs every 10 seconds


client = MyClient()
client.run('token')


来源:https://stackoverflow.com/questions/57667461/background-task-py-not-showing-messages-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!