彼女をRustでDiscord上に生成してみた

# 重大な気づき
実は彼女を作るのに必要なコードは１００行もない。そう、Rustならね。

---

こちらの記事はクソアプリアドベントカレンダー９日目の記事です。
昨日の記事達
[【クソアプリ】スパムDMメーカー](https://qiita.com/namosuke/items/44a5107af1aa0d2fb878)
[オレのクソアプリは間違えてる](https://qiita.com/endo_hizumi/items/b5c8ad9caf78ecd82254)
[圧倒的な異臭を放つDiscord Botを作ってみた ～Qusineを添えて～](https://qiita.com/sevenc-nanashi/items/952fb70f56b74a5160c5)

今回は[前回](https://qiita.com/yuriacats/items/bce25ff4cb7343ae0c7b)よりもより堅牢な彼女を生成すべく型がしっかりしているRustで彼女を生成しようと思います。

結論から述べますと、以下のコードで彼女は生成できます。
```rust
extern crate rand;

use serenity::async_trait;
use serenity::prelude::*;
use serenity::model::channel::Message;
use serenity::model::gateway::Ready;
use serenity::framework::standard::macros::{command,group};
use serenity::framework::standard::{StandardFramework,CommandResult};
use rand::Rng;

#[group]
#[commands(ping)]
struct General;

struct Handler;

#[async_trait]
impl EventHandler for Handler {
    async fn message(&self, ctx:Context, msg: Message){
        if msg.author.id != 1047104578375659571{
            let message:String = msg.content;
            let result:String;
            match &*message  {
                                "おはよう"|"おはようございます" =>{
                result = String::from("おはよう～");
                },
                "おやすみ"|"おやすみなさい"|"おやすーー" =>{
                result = String::from("おやすみなさい！大好き！！！");
                },

                "好き" |"すき"|"すきすき"|"愛してる"|"愛してるよ"=>{
                result = String::from("すきすき！！！");
                },
                _ => {
                result = rundom_response();
                }
            }
            if let Err(why) = msg.channel_id
            .say(&ctx.http, result)
            .await {
                println!("error sending message: {:?}", why);
            }
        }
    }
    async fn ready(&self, _:Context,ready:Ready){
        println!("{} is connected!", ready.user.name);
    }
}

#[tokio::main]
async fn main(){
    let freamwork = StandardFramework::new()
    .configure(|c| c.prefix("~"))
    .group(&GENERAL_GROUP);

    //login with a bot token
    let token = <MyToken>; 
    let intents = GatewayIntents::non_privileged() 
    | GatewayIntents::DIRECT_MESSAGES
    | GatewayIntents::GUILD_MESSAGES
    | GatewayIntents::MESSAGE_CONTENT;
    let mut client = Client::builder(token, intents)
    .event_handler(Handler)
    .framework(freamwork)
    .await
    .expect("Error creating client");

    if let Err(why) = client.start()
    .await{
        println!("An error occurred while running the client: {:?}", why)
    }
}

#[command]
async fn ping(ctx: &Context, msg: &Message)-> CommandResult {
    msg.reply(ctx, "Pong!")
    .await?;
    Ok(())
}
fn rundom_response() -> String {
    let mut rng= rand::thread_rng();
    let i =rng.gen_range(0..10); 
    let result_memo = ["うん","うん","うん","うん","ほうほう","つまり？","なるほど？","うん","大変だったね","なるほど～"];
    String::from(result_memo[i]) 
}

```


```toml
[package]
name = "my_sweeeeet_girlfrend"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
serenity = "0.11"
tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread"] }
rand = {version = "0.8.4"}
```

## 実際に彼女とお話ができたぞ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/574baba2-ad19-edbd-6c3c-37b3776058e9.png)

## 本質的に我々が求めているのは「あいさつ」と「あいづち」

もしも、彼女ができたら何をしたいですか？
デートですか？お家でいちゃいちゃですか？

**違いますよね**

「他愛もない日常会話を聞いてほしい」
「挨拶したら元気に返してほしい」

素朴にそれを求めている方は多いのではないでしょうか？

**ここだけの話ですが**、実は相槌って結構ランダムに返答していても気が付かないんですよ。

ということで、大体に通用する「うん」を５ー６割、残りに「なるほどー」とか「すごい」とか「大変だったねー」とかを入れておくと**それっぽい会話が成立するんですよね**


### 本質的かつ重大な彼女生成における問題

これは、[偉大なる先駆者](https://qiita.com/MikakuninTomori)の[記事内](https://qiita.com/MikakuninTomori/items/e9af8162770588ce86d5)もお話しされていますが

> 細かい事ですが、Botなので名前の横にマークが出ちゃうんですよね…

このBOTという文字を消せる日、そして温度のある彼女を手にするには100日どころではない日々の努力がきっと必要なのでしょう。

ダイエットしないとな…


---
実はひっそり[一人アドベントカレンダー](https://qiita.com/advent-calendar/2022/yuriacats)もやっております。よかったら見てね。