多くの場所を調べましたが、discord.py
を使用してping(レイテンシ)コマンドを作成する方法が見つかりませんでした。
@client.command(pass_context=True)
async def pong(ctx):
# Somehow find 'pingtime'
await client.say(pingtime)
実際には、この時点で、discord.pyの rewriteブランチを使用する必要があります
これはコマンド拡張を使用した私の解決策です。
@bot.command()
async def ping(ctx):
await ctx.send('Pong! {0}'.format(round(bot.latency, 1)))
このコードを使用
@bot.command(pass_context=True)
async def ping(ctx):
""" Pong! """
await delete_message(ctx.message)
before = time.monotonic()
message = await ctx.send("Pong!")
ping = (time.monotonic() - before) * 1000
await message.edit(content=f"Pong! `{int(ping)}ms`")
print(f'Ping {int(ping)}ms')
Discord.pyのrewriteブランチでは、以下を使用できます。
@bot.command()
def ping(ctx):
await ctx.send(f'My ping is {bot.latency}!')
もちろん、別の変数名を使用している場合は、bot
を変更する必要があります。
このpingコマンドは、ボットと不和の間の所要時間から応答を返します
import discord
import time
Client = commands.Bot(commands.when_mentioned_or('...'))
@Client.command(pass_context=True)
async def ping_ms(ctx):
t = await Client.say('Pong!')
ms = (t.timestamp-ctx.message.timestamp).total_seconds() * 1000
await Client.edit_message(t, new_content='Pong! Took: {}ms'.format(int(ms)))
import datetime
@client.command(pass_context=True)
async def ping(ctx):
now = datetime.datetime.utcnow()
delta = now - ctx.message.timestamp
await client.say('{}ms'.format(delta(microseconds=1)))
これは非常に効果的ではありません。正直に言いましょう。クライアントサイドでスクリプトを実行して時間を取得することができないため、実際にこれをテストする方法はありません。ただし、これにより、スクリプトが開始してからdiscordがメッセージを受け取ったと言うまでのシステムクロック間の時間がテストされます。実際にはpingではなく、どの定義でもありませんが、ボットの速度が低下した場合にヒントが得られます。
Discord.py rewriteの更新された回答:
_ async def latency(ctx):
time_1 = time.perf_counter()
await ctx.trigger_typing()
time_2 = time.perf_counter()
ping = round((time_2-time_1)*1000)
await ctx.send(f"ping = {ping}")
_
await ctx.trigger_typing()
は、_"Blank" is typing...
_テキストを表示します。これを行うことにより、送信待機時間ctx.trigger_typing()
に基づいてボットのpingを半正確に取得できます。もちろん、_import Time
_とボットコマンド全体を定義する必要があります。
わかりましたので、以前は簡単な方法を説明しました。今私は行ってそれを少し良くしましたそしてそれは次のようになります
Import discord
Import time
@Client.command(pass_context=True)
async def ms_ping(ctx):
channel = ctx.message.channel
try:
t1 = time.perf_counter()
await Client.send_typing(channel)
ta = t1
t2 = time.perf_counter()
await Client.send_typing(channel)
tb = t2
ra = round((tb - ta) * 1000)
finally:
pass
try:
t1a = time.perf_counter()
await Client.send_typing(channel)
ta1 = t1a
t2a = time.perf_counter()
await Client.send_typing(channel)
tb1 = t2a
ra1 = round((tb1 - ta1) * 1000)
finally:
pass
try:
t1b = time.perf_counter()
await Client.send_typing(channel)
ta2 = t1b
t2b = time.perf_counter()
await Client.send_typing(channel)
tb2 = t2b
ra2 = round((tb2 - ta2) * 1000)
finally:
pass
try:
t1c = time.perf_counter()
await Client.send_typing(channel)
ta3 = t1c
t2c = time.perf_counter()
await Client.send_typing(channel)
tb3 = t2c
ra3 = round((tb3 - ta3) * 1000)
finally:
pass
try:
t1d = time.perf_counter()
await Client.send_typing(channel)
ta4 = t1d
t2d = time.perf_counter()
await Client.send_typing(channel)
tb4 = t2d
ra4 = round((tb4 - ta4) * 1000)
finally:
pass
e = discord.Embed(title="Connection", colour = 909999)
e.add_field(name='Ping 1', value=str(ra))
e.add_field(name='Ping 2', value=str(ra2))
e.add_field(name='Ping 3', value=str(ra3))
e.add_field(name='Ping 4', value=str(ra4))
await Client.say(embed=e)
これが新しいバージョンです。ボットで自分で使用しているので、100%機能しています。
Discord.py
再書き込みではない非同期
EMBED
@bot.command(pass_context=True)
async def ping(ctx):
embed = discord.Embed(title="Pong! :ping_pong:")
await bot.say(embed=embed)
EMBED
なし
@bot.comand(pass_context=True)
async def ping(ctx):
await bot.say(":ping_pong: Pong!")
message.author.mentionを使用できます。例(これは、非同期を使用したコーディング方法とは異なる場合があります):
await client.send_message(message.channel, str(message.author.mention))
ほんの基本的な例:D
@client.command(pass_context=True)
async def ping(ctx):
"""Shows the Client Latency."""
t = await client.say('Pong!')
ms = (t.timestamp-ctx.message.timestamp).total_seconds() * 1000
await client.edit_message(t, new_content='Pong! Client Latency: {}ms'.format(int(ms)))