Add option types for top-level commands
This commit is contained in:
@ -1,11 +1,13 @@
|
||||
use chrono_tz::Tz;
|
||||
use log::warn;
|
||||
use poise::{CreateReply, Modal};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
commands::autocomplete::{time_hint_autocomplete, timezone_autocomplete},
|
||||
models::reminder::create_reminder,
|
||||
ApplicationContext, Context, Error,
|
||||
utils::Extract,
|
||||
Context, Error,
|
||||
};
|
||||
|
||||
#[derive(poise::Modal)]
|
||||
@ -18,14 +20,61 @@ struct ContentModal {
|
||||
content: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Extract)]
|
||||
pub struct Options {
|
||||
time: String,
|
||||
channels: Option<String>,
|
||||
interval: Option<String>,
|
||||
expires: Option<String>,
|
||||
tts: Option<bool>,
|
||||
timezone: Option<String>,
|
||||
}
|
||||
|
||||
pub async fn multiline(ctx: Context<'_>, options: Options) -> Result<(), Error> {
|
||||
match ctx {
|
||||
Context::Application(app_ctx) => {
|
||||
let tz = options.timezone.map(|t| t.parse::<Tz>().ok()).flatten();
|
||||
let data_opt = ContentModal::execute(app_ctx).await?;
|
||||
|
||||
match data_opt {
|
||||
Some(data) => {
|
||||
create_reminder(
|
||||
ctx,
|
||||
options.time,
|
||||
data.content,
|
||||
options.channels,
|
||||
options.interval,
|
||||
options.expires,
|
||||
options.tts,
|
||||
tz,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
None => {
|
||||
warn!("Unexpected None encountered in /multiline");
|
||||
Ok(ctx
|
||||
.send(CreateReply::default().content("Unexpected error.").ephemeral(true))
|
||||
.await
|
||||
.map(|_| ())?)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_ => {
|
||||
warn!("Shouldn't be here");
|
||||
Ok(ctx
|
||||
.send(CreateReply::default().content("Unexpected error.").ephemeral(true))
|
||||
.await
|
||||
.map(|_| ())?)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a reminder with multi-line content. Press "+4 more" for other options.
|
||||
#[poise::command(
|
||||
slash_command,
|
||||
identifying_name = "multiline",
|
||||
default_member_permissions = "MANAGE_GUILD"
|
||||
)]
|
||||
pub async fn multiline(
|
||||
ctx: ApplicationContext<'_>,
|
||||
#[poise::command(slash_command, rename = "multiline", default_member_permissions = "MANAGE_GUILD")]
|
||||
pub async fn command(
|
||||
ctx: Context<'_>,
|
||||
#[description = "A description of the time to set the reminder for"]
|
||||
#[autocomplete = "time_hint_autocomplete"]
|
||||
time: String,
|
||||
@ -40,30 +89,5 @@ pub async fn multiline(
|
||||
#[autocomplete = "timezone_autocomplete"]
|
||||
timezone: Option<String>,
|
||||
) -> Result<(), Error> {
|
||||
let tz = timezone.map(|t| t.parse::<Tz>().ok()).flatten();
|
||||
let data_opt = ContentModal::execute(ctx).await?;
|
||||
|
||||
match data_opt {
|
||||
Some(data) => {
|
||||
create_reminder(
|
||||
Context::Application(ctx),
|
||||
time,
|
||||
data.content,
|
||||
channels,
|
||||
interval,
|
||||
expires,
|
||||
tts,
|
||||
tz,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
None => {
|
||||
warn!("Unexpected None encountered in /multiline");
|
||||
Ok(Context::Application(ctx)
|
||||
.send(CreateReply::default().content("Unexpected error.").ephemeral(true))
|
||||
.await
|
||||
.map(|_| ())?)
|
||||
}
|
||||
}
|
||||
multiline(ctx, Options { time, channels, interval, expires, tts, timezone }).await
|
||||
}
|
||||
|
Reference in New Issue
Block a user