16
7

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-10

重大な気づき

実は彼女を作るのに必要なコードは100行もない。そう、Rustならね。


こちらの記事はクソアプリアドベントカレンダー9日目の記事です。
昨日の記事達
【クソアプリ】スパムDMメーカー
オレのクソアプリは間違えてる
圧倒的な異臭を放つDiscord Botを作ってみた ~Qusineを添えて~

今回は前回よりもより堅牢な彼女を生成すべく型がしっかりしている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]) 
}

[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

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

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

違いますよね

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

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

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

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

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

これは、偉大なる先駆者記事内もお話しされていますが

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

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

ダイエットしないとな…


実はひっそり一人アドベントカレンダーもやっております。よかったら見てね。

16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7