pikadick/commands/
yodaspeak.rs

1use crate::ClientDataKey;
2use anyhow::Context as _;
3use pikadick_slash_framework::FromOptions;
4use serenity::builder::{
5    CreateInteractionResponse,
6    CreateInteractionResponseMessage,
7};
8use tracing::error;
9
10/// Options for yodaspeak
11#[derive(Debug, pikadick_slash_framework::FromOptions)]
12struct Options {
13    #[pikadick_slash_framework(description = "the message to translate")]
14    message: String,
15}
16
17/// Create a slash command
18pub fn create_slash_command() -> anyhow::Result<pikadick_slash_framework::Command> {
19    pikadick_slash_framework::CommandBuilder::new()
20        .name("yodaspeak")
21        .description("Translate into what yoda would say.")
22        .arguments(Options::get_argument_params()?.into_iter())
23        .on_process(|ctx, interaction, args: Options| async move {
24            let data_lock = ctx.data.read().await;
25            let client_data = data_lock.get::<ClientDataKey>().unwrap();
26            let client = client_data.yodaspeak.clone();
27            drop(data_lock);
28
29            let result = client
30                .translate(args.message.as_str())
31                .await
32                .context("failed to translate");
33
34            let mut message_builder = CreateInteractionResponseMessage::new();
35            match result {
36                Ok(translated) => {
37                    message_builder = message_builder.content(translated);
38                }
39                Err(error) => {
40                    error!("{error:?}");
41                    message_builder = message_builder.content(format!("{error:?}"));
42                }
43            }
44
45            let response = CreateInteractionResponse::Message(message_builder);
46            interaction.create_response(&ctx.http, response).await?;
47
48            Ok(())
49        })
50        .build()
51        .context("failed to build command")
52}