pikadick/commands/
yodaspeak.rs1use crate::ClientDataKey;
2use anyhow::Context as _;
3use pikadick_slash_framework::FromOptions;
4use serenity::builder::{
5 CreateInteractionResponse,
6 CreateInteractionResponseMessage,
7};
8use tracing::error;
9
10#[derive(Debug, pikadick_slash_framework::FromOptions)]
12struct Options {
13 #[pikadick_slash_framework(description = "the message to translate")]
14 message: String,
15}
16
17pub 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}