web-dev-qa-db-ja.com

不協和音ボットの再生ステータスを10秒ごとに変更する

テストの不一致ボットのステータスを、10秒ごとに2つのメッセージ間で変更しようとしています。ステータスメッセージの変更中にスクリプトの残りの部分を実行する必要がありますが、それを機能させようとするたびにエラーがポップアップし続けます。私のスクリプトにはスレッド化がありますが、この状況でどのように使用するのか完全にはわかりません。

@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'))

エラーメッセージは次のとおりです。

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

残念ながら、スレッド化とasyncioは一緒にNiceを再生しません。スレッド内のコルーチンを待機するには、余分なフープをジャンプする必要があります。最も簡単な解決策は、スレッドを使用しないことです。

あなたがやろうとしているのは、しばらく待ってからコルーチンを実行することです。これはバックグラウンドタスクで実行できます( example

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

Time.sleep()はボットの実行をブロックするため使用できません。ただし、asyncio.sleep()は他のすべてと同様にコルーチンであり、非ブロッキングです。

最後に、@client.eventデコレータは、ボットが events として認識する関数でのみ使用する必要があります。 on_readyやon_messageなど。

8
Sam Rockett

こちらをご覧ください:

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には、バックグラウンドタスク機能が組み込まれています。

0
ADug

discord.py バージョン1.1.0が導入されました discord.ext.tasks 。これは、説明したようなバックグラウンドタスクを簡単にし、接続に問題がある場合に不一致に再接続する潜在的に複雑なロジックを処理するように設計されています。

tasksを使用したタスクの例を次に示します。

from discord.ext import commands, tasks
from commands import Bot
from tasks import loop
from asyncio import sleep

bot = Bot("!")

@loop(seconds=10)
async def name_change():
    await bot.change_presence(...)
    await sleep(10)
    await bot.change_presence(...)

name_change.before_loop(bot.wait_until_ready())    
name_change.start()
bot.run("TOKEN")
0
Patrick Haugh