1

!notice [MM/DD/YY HH:mm], message, targetという形式のメッセージを受け取るスクリプトを作成した後、threading.Timerを使用して関数を呼び出し、UTCのメッセージで指定された時刻に呼び出します。関数からDiscord.py経由でメッセージを送信できないのはなぜですか?

この機能からメッセージを送信できない場合は、メッセージの入力に関係なく機能から送信するメッセージを受け取れないようです。

は、下記を参照してください:これは"Func called"を返し

import discord 
import asyncio 
from datetime import * 
import threading 

client = discord.Client() 

@client.event 
async def on_message(message): 
    if message.content[:7].lower() == "!notice".lower(): 
     try: 
      notice = [datetime.strptime(message.content[message.content.find("[")+1:message.content.find("]")], "%m/%d/%y %H:%M"), message.content.split(", ")[1], message.content.split(", ")[2]] 
      await client.send_message(message.channel, 'Created notice "'+notice[1]+'" to be sent to '+notice[2]+' at '+str(notice[0])+' UTC.') 
      threading.Timer((notice[0] - datetime.utcnow()).total_seconds(), lambda a=notice[1], b=notice[2]: func(a, b)).start() 
      print(str((notice[0] - datetime.utcnow()).total_seconds())+" seconds until message is sent") 
     except (ValueError, IndexError): 
      await client.send_message(message.channel, 'Incorrect Notice Format.\nMust be "!notice [MM/DD/YY HH:mm], Notice contents, Target".\nEG: "!notice [01/01/2017 12:00], This is a notice, Siren Raid Team".') 

def func(message, target): 
    print("Func called") 
    for i in client.servers: 
     for c in i.channels: 
      client.send_message(c, target+message) 

client.run(MY_SESSION_KEY) 

ので、私は、関数が呼び出されている知っているが、何の例外は発生しませんし、何のメッセージは、私のチャットに掲載されていません。コルーチン 'FUNC' を

は、率直に言って、私は」待っていませんでした:

RuntimeWarning:

async def func(message, target): 
    print("Func called") 
    for i in client.servers: 
     for c in i.channels: 
      await client.send_message(c, target+message) 

は、しかし、これは例外をスローします。

は、私はまたしてfuncに置き換えてみましたここで私の深さからm。これがうまくいかない理由はありますか?

asyncioはスレッドセーフではないことがオンラインでわかりました。しかし、私が誤解していない限り、私の最初の例ではそのライブラリをその関数で使用していませんでした。それでも問題が発生している可能性はありますか?

+0

今、あなたの 'funcが()'すべてのサーバーですべてのチャンネルにメッセージを送信しようとします。実際に送信するターゲットを見つけるには、['discord.utils.get'](https://discordpy.readthedocs.io/en/latest/api.html#discord.utils.get)を使って調べてください。 – squaswin

+0

@squaswinこれは、私が関数に 'message'オブジェクトを渡して、' message.channel'に通知を送信しようとする前に、どのチャネルでもメッセージを取得できたかどうかを調べるためのトラブルシューティングのためです。また、何がうまくいかないのかについての情報を得るために 'logging'を設定すると、音声チャンネルやチャンネルに私がアクセス権を持っていないと伝えようとすると、通常は何のエラーも出ません。 –

答えて

1

discord.pyのdiscord.Client.send_messageはコルーチンであり、2番目のコードスニペットと同じようにawaitedである必要があります。ただし、threading.Timerはコルーチンをサポートしていません。 あなたが探しているものはcreate_taskです。イベントループでコルーチンを実行できます。あなたのコルーチンがしているもののほとんどが眠っています(threading.Timerを模倣する)ので、asyncio.sleepを使用し、time.sleepではなく、あなたがon_messageを実行すると、後者はイベントループをブロックします。ここでの例では、関数に引数を渡すなど、です:それはそれはに送信することはできません1やクラッシュに遭遇するまで

関連する問題