🤖

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

2022/09/06に公開

埋め込みメッセージの作成

埋め込みメッセージを送信する

  • 下記のような埋め込みメッセージを作成し送信する


埋め込みメッセージ

ソースコード

main.rs
use serenity::utils::Colour;            // カラー
use serenity::model::Timestamp;         // タイムスタンプ

~~~~~~~~~~中略~~~~~~~~~~

if msg.content == "!embed" {

    let m = msg.channel_id.send_message(&ctx.http, |m| {
            m.embed(|e| {
                e.author(|a| { a.name(&msg.author.name).icon_url(&msg.author.face()) })     // 作成者
                    .color(Colour(0x8642a4))                                // 色
                    .title("タイトル")                                       // タイトル
                    .url("https://zenn.dev/")                               // リンク(タイトル)
                    .description("説明文")                                  // 説明文
                    .field("フィールド1", "内容1", false)                    // フィールド(単体)
                    .fields(vec![                                           // フィールド(複数)
                        ("フィールド2", "内容2", true),
                        ("フィールド3", "内容3", true),
                        ("フィールド4", "内容4", true),
                        ("フィールド5", "内容5", false),
                        ("フィールド6", "内容6", true),
                        ("フィールド7", "内容7", true),
                    ])
                    .thumbnail("https://zenn.dev/images/icon.png")          // サムネイル 
                    .image("https://zenn.dev/images/logo-only-dark.png")    // イメージ
                    .footer(|f| f.text("フッター"))                          // フッター
                    .timestamp(Timestamp::now())        // タイムスタンプ
            })
        })
        .await
        .expect("エラー");
}

ソースコード解説

埋め込みメッセージの構成

  • 埋め込みメッセージの送信には.send_message()を使う
  • .send_message()内に.embed()を使って埋め込みをセットする
  • 埋め込みメッセージの内容は.embed()内にパーツを追加する形で作成する
埋め込みメッセージの構成
let m = msg.channel_id.send_message(&ctx.http, |m| {
        m.embed(|e| {
	
	    // ここに埋め込みメッセージのパーツを追加していく
	    
        })
    })
    .await
    .expect("エラー");

作成者

  • .author()
    • 埋め込みメッセージの作成者の表示を設定する

  • .name()
    • 作成者の名前を設定する
    • msg.author.nameはメッセージ送信者の名前

  • .icon_url()
    • 作成者のアイコンのURLを設定する
    • msg.author.face()はメッセージ送信者のアイコンを取得する
作成者
.author(|a| { a.name(&msg.author.name).icon_url(&msg.author.face()) })


作成者

  • .color()
    • 埋め込み左側の色を設定する(デフォルトは黒)
    • 色はColour()で指定する

  • Colour()
    • 色を設定するためのタプル型
    • 色は16進数で指定する
    • 使用にはuse serenity::utils::Colourが必要
use serenity::utils::Colour;

.color(Colour(0xffffff))    // 白色に設定


白色

タイトル・リンク

  • .title()
    • 埋め込みのタイトルを設定する

  • .url()
    • 埋め込みのタイトルをクリックしたときのリンクのURLを設定する
タイトル(リンク無し)
.title("<<ココにタイトル>>")


タイトル(リンク無し)


  • リンクを付けるとタイトルの文字が青くなる
タイトル(リンク有り)
.title("<<ココにタイトル>>")
.url("https://zenn.dev/")


タイトル(リンク有り)

説明文

  • .description()
    • 埋め込みの説明文を設定する
説明文
.description("<<ココに説明文>>")


説明文

フィールド

  • .field()
    • 埋め込みの内の項目を追加・設定する
    • 第三引数は項目の並びを設定する
      • trueで横に並べることを許可
      • falseで横に並べることを禁止(独立させる)

  • .fields()
    • .field()を一括で追加・設定できるようにしたもの
フィールドの例1
.field("フィールド1", "内容1", true)
.field("フィールド2", "内容2", true)
.field("フィールド3", "内容3", false)
.field("フィールド4", "内容4", true)
.field("フィールド5", "内容5", false)
.field("フィールド6", "内容6", true)
.field("フィールド7", "内容7", true)


フィールドの例1


フィールドの例2
.fields(vec![
    ("フィールド1", "内容1", false),
    ("フィールド2", "内容2", false),
    ("フィールド3", "内容3", false),
    ("フィールド4", "内容4", false),
    ("フィールド5", "内容5", false),
])


フィールドの例2

サムネイル・イメージ

  • .thumbnail()
    • サムネイル(右上の画像)のURLを設定する

  • .image()
    • 画像(下中央の画像)のURLを設定する
サムネイル・画像
.thumbnail("https://zenn.dev/images/icon.png")
.image("https://zenn.dev/images/logo-only-dark.png") 


サムネイル・画像

フッター

  • .footer()
    • フッターを設定する

  • .text()
    • フッターのテキストを設定する
フィールド
.footer(|f| f.text("<<ココにフッター>>"))


フッター

タイムスタンプ

  • タイムスタンプの有無を設定する
  • Timestamp::now()で現在時刻を取得する
  • 使用にはuse serenity::model::Timestampが必要
フィールド
use serenity::model::Timestamp;

.timestamp(Timestamp::now())

ローカルの画像ファイルを使う

  • 画像やサムネイル、作成者のアイコンにローカルの画像を使用することも可能

  • ローカルの画像を使用する場合はattachment:// + ファイル名とし、.embed()の後に.add_file()で画像ファイルのパスを追加する

サムネイル・画像(ローカル)
m.embed(|e| {  
    e.author(|a| { a.name("作成者".to_string()).icon_url("attachment://icon.png") })    // attachment:// + ファイル名
        .thumbnail("attachment://thumbnail.png")                                        // 
        .image("attachment://image.png")                                                // 
	
~~~~~~~~~~中略~~~~~~~~~~

})
.add_file("./icon.png")             // 画像ファイルのパス
.add_file("./thumbnail.png")        //
.add_file("./image.png")            //


ローカルの画像ファイルを使う

Discussion