🤖
[Rust] DiscordのBOT作成 < serenity > - ②
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の無限応答
クレートの設定
-
serenity
のfeatures
内に"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
- メッセージ送信者がBOTであるかどうか判断し、BOTであれば
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の末の番号」で取得できる
- メッセージ送信があったチャンネルのIDと指定のチャンネルのIDが同じであるかを判断し、異なれば
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