Open64

Rustのserenityでdiscord bot作りたい

So_heySo_hey

songbirdなるものを使えばボイスチャットで無双できるらしいけどまずはチャットだけにしておく

So_heySo_hey

cargo-shuttleってなんだ?
npmみたいなもんか?(npmもよくわかっていない)

So_heySo_hey

cargo shuttleするだけである程度コード書いてたから,これをいろいろいじればいいんだな

So_heySo_hey

EventHandlerトレイトはたくさんの非同期メソッドがあって、それぞれどのタイミングで呼び出されるかが名前からわかるようになってる。
「メッセージが送られたとき」みたいな当たり前のものから「誰かがタイプしているとき」みたいなニッチなものまで用意されててすごい

So_heySo_hey

webhookとstage instanceの意味がわからん

So_heySo_hey

自分は直感で理解するタイプだからこういう説明は非常に助かる

So_heySo_hey

今までアプリの通知とかってずっと変化がないか受け取る側がチラチラ確認するもんだと思ってた
このwebhookとやらを使えば簡単なんだ

So_heySo_hey

EventHandlerのready, message, voice_state_updateあたりを使って簡単なものを作ろう

So_heySo_hey

shardってなんだ

So_heySo_hey

データベースをいくつかに水平分割して保管する仕組み、またはその分割されたそれぞれのデータベースについてを指すもの

So_heySo_hey

マクロで作られたトレイトメソッドが読めないので、--pretty=expandedで実行したい(いまパソコンを使えない)

So_heySo_hey

今のレベルではcargo expandはあんまりするもんじゃないな
分からないことがふえるだけだ

So_heySo_hey

messageで全部条件分岐するんじゃなくて,ちゃんとコマンドとして関数を定義するには#[command]を使う

So_heySo_hey

これするためにはプレフィックスとかつけないと

So_heySo_hey

色々調べているとSlash Commandsなるものがあって,これを実装するとユーザーは"/"を打つだけですべてのコマンドとその機能のリストを見ることができるらしい.
自分が利用しているbotもプレフィックスが"!"から"/"に変更していたけどこういうことか.

So_heySo_hey

そしてSerenityはこれに対応しておらず,Poiseなるライブラリは対応しているらしい.
後で使ってみる.

So_heySo_hey

serenity/examplesのownerの意味が分からん
色々検証してみたけど,そのギルドの管理者でもないし招待した人でもなさそう

So_heySo_hey
async fn voice_state_update(
    &self,
    ctx: Context,
    _old: Option<VoiceState>,
    new: VoiceState
){
    println!("voice state update");
    if let Some(channel_id) = new.channel_id {
        println!(
            "{:?}",
            channel_id
                .name((&ctx.cache, ctx.http.as_ref()))
                .unwrap_or_else(|_| "No Name".to_string())
                .await
        );
    }
}

これでボイスチャンネルに入ったタイミングでそのボイスチャンネルの名前を出力できた

So_heySo_hey

コードの見た目以上に大変な作業って多いよね...

So_heySo_hey

自らボイスチャンネルに対して操作をするのってどうやるんだ?

So_heySo_hey

voice_state_updateはボイスチャンネルに動きがないと無理だよな...

So_heySo_hey

voice_state_updateで得たvoice stateを保持しておくとかかな

So_heySo_hey
async fn message(&self, ctx: Context, msg: Message) {
    if let Some(guild_id) = msg.guild_id {
        let guild = guild_id
            .to_partial_guild((&ctx.cache, ctx.http.as_ref()))
            .get_guild((&ctx.cache, ctx.http.as_ref()));
        let voice_state = guild.voice_state;
    }
}
So_heySo_hey
if let Some(cache_ref) = msg.guild(&ctx.cache) {
    let guild = cache_ref.clone();
    let voice_state = guild.voice_state;
}

これでええんか

So_heySo_hey

EventHandlerのreadyでコマンドを設定して、概要をメッセージで送るということをしてるけど、例のコードが古いバージョンやからなんとか今のバージョンに合わせる

So_heySo_hey

今までimpl CacheHttpが想定されてる引数には(&Arc<Cache>, &Http)を渡してきたけど、ContextとかHttpでもなんとかしてくれる

So_heySo_hey

pub(crate)はそのグレード内にだけ公開したいもの

So_heySo_hey

スラッシュコマンド使いたかったらpoiseしかないのか