🤖

[Rust] DiscordのBOT作成 < serenity > - ②

2022/09/02に公開

BOT自身のメッセージ回避

BOTの無限応答

  • 仮に下記のようにBOT自身のメッセージにコマンドが含まれている場合、BOTが自身のメッセージに反応し無限に応答するようになってしまう
  • メッセージ送信者を判別し、BOTであれば応答しないようにする必要がある
main.rs
//====================メッセージへの応答====================
async fn message(&self, ctx: Context, msg: Message) {

    if msg.content == "!hello" {
        if let Err(why) = msg.channel_id.say(&ctx.http, "!hello").await {
            println!("メッセージ送信エラー : {:?}", why);
        }
    }
}


BOTの無限応答

クレートの設定

  • serenityfeatures内に"cache"を追加する
Cargo.toml
serenity = { version = "0.11.5", default-features = false, features = ["cache", "client", "gateway", "rustls_backend", "model"] }

ソースコード

  • if msg.author.id == ctx.cache.current_user_id()
    • メッセージ送信者がBOTであるかどうか判断し、BOTであればreturnで終了する
    • msg.author.idはメッセージ送信者のID
    • ctx.cache.current_user_idはBOTのID
main.rs
//====================メッセージへの応答====================
async fn message(&self, ctx: Context, msg: Message) {
        
    if msg.author.id == ctx.cache.current_user_id() {       // メッセージがBOTか判断
        return
    }

    if msg.content == "!hello" {
        if let Err(why) = msg.channel_id.say(&ctx.http, "!hello").await {
            println!("メッセージ送信エラー : {:?}", why);
        }
    }
}

チャンネルの制限

BOTの有効範囲

  • BOTは招待されたサーバー内であれば基本的にどのチャンネルでも呼び出すことが可能
  • Discord側の設定でBOTのチャンネルを制限することが可能
  • ここでは敢えてBOTのプログラム側で、BOTのチャンネルを制限する

ソースコード

  • if msg.channel_id.0 != ここにチャンネルID
    • メッセージ送信があったチャンネルのIDと指定のチャンネルのIDが同じであるかを判断し、異なればreturnで終了する
    • msg.channel_id.0はメッセージ送信があったチャンネルのID
    • チャンネルのIDは「Discord内のチャンネルを右クリック → リンクをコピー → URLの末の番号」で取得できる
main.rs
//====================メッセージへの応答====================
async fn message(&self, ctx: Context, msg: Message) {
        
    if msg.author.id == ctx.cache.current_user_id() {
        return
    }

    if msg.channel_id.0 != ここにチャンネルID {       // 指定チャンネル内のメッセージか判断
        return
    }

    if msg.content == "!hello" {
        if let Err(why) = msg.channel_id.say(&ctx.http, "!hello").await {
            println!("メッセージ送信エラー : {:?}", why);
        }
    }
}

Discussion