web-dev-qa-db-fra.com

Faire un bot discord changer le statut de lecture toutes les 10 secondes

J'essaie de faire en sorte que l'état d'un test discord soit modifié entre deux messages toutes les dix secondes. J'ai besoin du reste du script à exécuter pendant que le message d'état change, mais une erreur se répète chaque fois que j'essaie de le faire fonctionner. Il y a du filetage dans mon script, mais je ne suis pas tout à fait sûr de l'utiliser dans ces circonstances.

@test_bot.event
async def on_ready():
    print('Logged in as')
    print(test_bot.user.name)
    print(test_bot.user.id)
    print('------')
    await change_playing()


@test_bot.event
async def change_playing():
    threading.Timer(10, change_playing).start()
    await test_bot.change_presence(game=discord.Game(name='Currently on ' + str(len(test_bot.servers)) +
                                                          ' servers'))
    threading.Timer(10, change_playing).start()
    await test_bot.change_presence(game=discord.Game(name='Say test.help'))

Le message d'erreur se lit comme suit:

C:\Python\Python36-32\lib\threading.py:1182: RuntimeWarning: coroutine 'change_playing' was never awaited
  self.function(*self.args, **self.kwargs)
6
luigiisgreeny

Threading et asyncio ne jouent pas bien ensemble, malheureusement. Vous devez sauter à travers des cerceaux supplémentaires pour attendre des coroutines à l’intérieur des discussions. La solution la plus simple est simplement de ne pas utiliser le threading.

Ce que vous essayez de faire est d’attendre une durée, puis de lancer une coroutine. Cela peut être fait avec une tâche en arrière-plan ( exemple )

async def status_task():
    while True:
        await test_bot.change_presence(...)
        await asyncio.sleep(10)
        await test_bot.change_presence(...)
        await asyncio.sleep(10)

@test_bot.event
async def on_ready():
    ...
    bot.loop.create_task(status_task())

Vous ne pouvez pas utiliser time.sleep () car cela bloquerait l'exécution du bot. asyncio.sleep () est cependant un coroutine comme tout le reste et en tant que tel est non bloquant.

Enfin, le décorateur @client.event ne devrait être utilisé que sur les fonctions que le bot reconnaît en tant que events . Tels que on_ready et on_message.

7
Sam Rockett

Regarde ça:

https://github.com/Rapptz/discord.py/blob/master/examples/background_task.py

import discord
import asyncio
client = discord.Client()
async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = discord.Object(id='channel_id_here')
    while not client.is_closed:
        counter += 1
        await client.send_message(channel, counter)
        await asyncio.sleep(60) # task runs every 60 seconds
@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')
client.loop.create_task(my_background_task())
client.run('token')

Discord.py est livré avec une fonction de tâche de fond intégrée,

0
ADug