web-dev-qa-db-ja.com

Discord.jsのping番号に関する問題

それで私は最近 Discord ボットを作ることに決め、問題なくいくつかのチュートリアルを行っていました。しかし、pingコマンド(「あなたのpingは_137 ms_」と表示される種類)を作成しようとすると、意味のない番号が表示されました。

_-627 ms_、_32 ms_、_1001 ms_、_-10 ms_、_238 ms_などの番号。基本的に、_-1000_と_1000_の間のすべてのもの。

私が間違っている場合は訂正してください。ただし、負の数を取得するということは、要求する前に応答を送信することを意味すると確信しています。また、予知ボットを作成しなかったとほぼ確信しています:P

奇妙なping番号が表示される理由をオンラインで探していましたが、zilchを思いつきました。 「うーん……多分間違って生成しているのかもしれない」と思いました。だから私は他の人がdiscord.jsで彼らの番号をどのように生成したかを見ました...

... aaaそして私は壁にぶつかった。私の知る限り、discord.jsでping番号を生成しようとした人は誰もいません。もしそうなら、彼らは彼らの貴重な発見をオンラインで共有していません。少なくとも、それは私にはそれがどのように見えるかです。 (そのようなチュートリアルや投稿へのリンクがある場合は、私に送ってください)

私は${Date.now() - message.createdTimestamp}で数値を生成しています。これが私がそれらを生成するために見つけた唯一の方法なので、誰かがより良い方法を持っているなら、私はそれを見たいと思います。

そのスニペットは私のコードの残りの部分にぴったり合います(そして、はい、それは非常に退屈なボットです):

_const Discord = require('discord.js');
const client = new Discord.Client();
const token = require('./token.json').token;

client.on('ready', () => {
    console.log('Bot is up and running!');
});

var prefix = "?"

client.on('message', message => {
    if (message.author.bot) return;
    if (!message.content.startsWith(prefix)) return;

    if (message.content.startsWith(prefix + 'ping')) {
        message.channel.sendMessage('Pong! Your ping is `' + `${Date.now() - message.createdTimestamp}` + ' ms`');
    }
});

client.login(token);
_

誰かが私が負の数を取得している理由を教えてくれたり、それらを生成するためのより良い方法を教えてくれたら、私は非常に感謝しています。前もって感謝します。

4
user7890094

発生しているpingの変動は、クロックとリモートクロックの間の変動、およびタイムスタンプの計算に使用されるメッセージIDがそれほど正確ではないためです。

Pingの1つの意味にジャンプする前に、何を測定するかを決定する必要があります。メッセージを送信し、同じメッセージを不和から戻すためのラウンドトリップ時間を測定する場合は、不和メッセージを送信してタイマーを開始する可能性があります。次に、約束が解決したら、どれだけの時間が経過したかを確認します。

ハートビートpingの別の回答で提案されているように、.pingを使用することもできます。

おそらくcloudflareへの遅延を測定するだけですが、APIエンドポイントにpingを実行することもできます...

1
macdja38

これを試して:

client.on('message', message => {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
if (message.content.startsWith(prefix + 'ping')) {
    msg.channel.send({embed: {
        color: 0x2ed32e,
        fields: [{
            name: "Pong",
            value: "My Ping: " + Math.round(client.ping) + ' ms'
      }
     ],
}
})
}})

これがcに役立つことを願っています:

0
Coding Panda

他のユーザーの実際のpingを取得することはできません。しかし、あなたはかなり近づくことができます。

システムの時計は実際のサーバーと同期していないため、使用しても機能しないことをご存知でしょう。

ボットはメッセージを送信し、その後編集することができます。次に、2つのタイムスタンプがあります。

var resMsg = await msg.channel.send('Ping is being appreciated... :bar_chart:');
    resMsg.edit('Ping: ' + Math.round((resMsg.createdTimestamp - msg.createdTimestamp) - bot.ping)));

ボットのpingを差し引くと、メッセージの送信中にAPIへの待ち時間がなくなります。

私が助けることができることを願っています!

0
Sprax2013

Date.nowはコンピューターの時計に基づいており、message.createdTimestampは(コンピューターではなく)Discordサーバーの時計からのものであるため、異なる結果が得られる場合があります。

誰もping機能を共有していない理由は、クライアントオブジェクトのプロパティclient.pingを読み取っているだけだからです。

https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=ping

0
Buszmen