Added command for multiline reminders
This commit is contained in:
		@@ -581,8 +581,6 @@ pub fn show_macro_page<U, E>(macros: &[CommandMacro<U, E>], page: usize) -> Crea
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Alias {
 | 
					struct Alias {
 | 
				
			||||||
    id: u32,
 | 
					 | 
				
			||||||
    guild_id: u32,
 | 
					 | 
				
			||||||
    name: String,
 | 
					    name: String,
 | 
				
			||||||
    command: String,
 | 
					    command: String,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -601,7 +599,7 @@ pub async fn migrate_macro(ctx: Context<'_>) -> Result<(), Error> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let aliases = sqlx::query_as!(
 | 
					    let aliases = sqlx::query_as!(
 | 
				
			||||||
        Alias,
 | 
					        Alias,
 | 
				
			||||||
        "SELECT * FROM command_aliases WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)",
 | 
					        "SELECT name, command FROM command_aliases WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)",
 | 
				
			||||||
        guild_id.0
 | 
					        guild_id.0
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    .fetch_all(&mut transaction)
 | 
					    .fetch_all(&mut transaction)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ use num_integer::Integer;
 | 
				
			|||||||
use poise::{
 | 
					use poise::{
 | 
				
			||||||
    serenity::{builder::CreateEmbed, model::channel::Channel},
 | 
					    serenity::{builder::CreateEmbed, model::channel::Channel},
 | 
				
			||||||
    serenity_prelude::{component::ButtonStyle, ReactionType},
 | 
					    serenity_prelude::{component::ButtonStyle, ReactionType},
 | 
				
			||||||
    CreateReply,
 | 
					    CreateReply, Modal,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
@@ -36,7 +36,7 @@ use crate::{
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    time_parser::natural_parser,
 | 
					    time_parser::natural_parser,
 | 
				
			||||||
    utils::{check_guild_subscription, check_subscription},
 | 
					    utils::{check_guild_subscription, check_subscription},
 | 
				
			||||||
    Context, Error,
 | 
					    ApplicationContext, Context, Error,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Pause all reminders on the current channel until a certain time or indefinitely
 | 
					/// Pause all reminders on the current channel until a certain time or indefinitely
 | 
				
			||||||
@@ -548,6 +548,40 @@ pub async fn delete_timer(
 | 
				
			|||||||
    Ok(())
 | 
					    Ok(())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(poise::Modal)]
 | 
				
			||||||
 | 
					#[name = "Reminder"]
 | 
				
			||||||
 | 
					struct ContentModal {
 | 
				
			||||||
 | 
					    #[name = "Content"]
 | 
				
			||||||
 | 
					    #[placeholder = "Message..."]
 | 
				
			||||||
 | 
					    #[paragraph]
 | 
				
			||||||
 | 
					    #[max_length = 2000]
 | 
				
			||||||
 | 
					    content: String,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Create a new reminder with multiline content
 | 
				
			||||||
 | 
					#[poise::command(
 | 
				
			||||||
 | 
					    slash_command,
 | 
				
			||||||
 | 
					    rename = "multiline",
 | 
				
			||||||
 | 
					    identifying_name = "remind_multiline",
 | 
				
			||||||
 | 
					    default_member_permissions = "MANAGE_GUILD"
 | 
				
			||||||
 | 
					)]
 | 
				
			||||||
 | 
					pub async fn remind_multiline(
 | 
				
			||||||
 | 
					    ctx: ApplicationContext<'_>,
 | 
				
			||||||
 | 
					    #[description = "A description of the time to set the reminder for"] time: String,
 | 
				
			||||||
 | 
					    #[description = "Channel or user mentions to set the reminder for"] channels: Option<String>,
 | 
				
			||||||
 | 
					    #[description = "(Patreon only) Time to wait before repeating the reminder. Leave blank for one-shot reminder"]
 | 
				
			||||||
 | 
					    interval: Option<String>,
 | 
				
			||||||
 | 
					    #[description = "(Patreon only) For repeating reminders, the time at which the reminder will stop repeating"]
 | 
				
			||||||
 | 
					    expires: Option<String>,
 | 
				
			||||||
 | 
					    #[description = "Set the TTS flag on the reminder message, similar to the /tts command"]
 | 
				
			||||||
 | 
					    tts: Option<bool>,
 | 
				
			||||||
 | 
					) -> Result<(), Error> {
 | 
				
			||||||
 | 
					    let data = ContentModal::execute(ctx).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    create_reminder(Context::Application(ctx), time, data.content, channels, interval, expires, tts)
 | 
				
			||||||
 | 
					        .await
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Create a new reminder
 | 
					/// Create a new reminder
 | 
				
			||||||
#[poise::command(
 | 
					#[poise::command(
 | 
				
			||||||
    slash_command,
 | 
					    slash_command,
 | 
				
			||||||
@@ -561,10 +595,22 @@ pub async fn remind(
 | 
				
			|||||||
    #[description = "Channel or user mentions to set the reminder for"] channels: Option<String>,
 | 
					    #[description = "Channel or user mentions to set the reminder for"] channels: Option<String>,
 | 
				
			||||||
    #[description = "(Patreon only) Time to wait before repeating the reminder. Leave blank for one-shot reminder"]
 | 
					    #[description = "(Patreon only) Time to wait before repeating the reminder. Leave blank for one-shot reminder"]
 | 
				
			||||||
    interval: Option<String>,
 | 
					    interval: Option<String>,
 | 
				
			||||||
    #[description = "(Patreon only) For repeating reminders, the time at which the reminder will stop sending"]
 | 
					    #[description = "(Patreon only) For repeating reminders, the time at which the reminder will stop repeating"]
 | 
				
			||||||
    expires: Option<String>,
 | 
					    expires: Option<String>,
 | 
				
			||||||
    #[description = "Set the TTS flag on the reminder message, similar to the /tts command"]
 | 
					    #[description = "Set the TTS flag on the reminder message, similar to the /tts command"]
 | 
				
			||||||
    tts: Option<bool>,
 | 
					    tts: Option<bool>,
 | 
				
			||||||
 | 
					) -> Result<(), Error> {
 | 
				
			||||||
 | 
					    create_reminder(ctx, time, content, channels, interval, expires, tts).await
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async fn create_reminder(
 | 
				
			||||||
 | 
					    ctx: Context<'_>,
 | 
				
			||||||
 | 
					    time: String,
 | 
				
			||||||
 | 
					    content: String,
 | 
				
			||||||
 | 
					    channels: Option<String>,
 | 
				
			||||||
 | 
					    interval: Option<String>,
 | 
				
			||||||
 | 
					    expires: Option<String>,
 | 
				
			||||||
 | 
					    tts: Option<bool>,
 | 
				
			||||||
) -> Result<(), Error> {
 | 
					) -> Result<(), Error> {
 | 
				
			||||||
    if interval.is_none() && expires.is_some() {
 | 
					    if interval.is_none() && expires.is_some() {
 | 
				
			||||||
        ctx.say("`expires` can only be used with `interval`").await?;
 | 
					        ctx.say("`expires` can only be used with `interval`").await?;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
use std::{collections::HashMap, env, sync::atomic::Ordering};
 | 
					use std::{collections::HashMap, env};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use log::{error, info, warn};
 | 
					 | 
				
			||||||
use poise::{
 | 
					use poise::{
 | 
				
			||||||
    serenity::{model::application::interaction::Interaction, utils::shard_id},
 | 
					    serenity::{model::application::interaction::Interaction, utils::shard_id},
 | 
				
			||||||
    serenity_prelude as serenity,
 | 
					    serenity_prelude as serenity,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,6 @@ use std::{
 | 
				
			|||||||
    env,
 | 
					    env,
 | 
				
			||||||
    error::Error as StdError,
 | 
					    error::Error as StdError,
 | 
				
			||||||
    fmt::{Debug, Display, Formatter},
 | 
					    fmt::{Debug, Display, Formatter},
 | 
				
			||||||
    sync::atomic::AtomicBool,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use chrono_tz::Tz;
 | 
					use chrono_tz::Tz;
 | 
				
			||||||
@@ -44,14 +43,14 @@ type Database = MySql;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type Error = Box<dyn std::error::Error + Send + Sync>;
 | 
					type Error = Box<dyn std::error::Error + Send + Sync>;
 | 
				
			||||||
type Context<'a> = poise::Context<'a, Data, Error>;
 | 
					type Context<'a> = poise::Context<'a, Data, Error>;
 | 
				
			||||||
 | 
					type ApplicationContext<'a> = poise::ApplicationContext<'a, Data, Error>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct Data {
 | 
					pub struct Data {
 | 
				
			||||||
    database: Pool<Database>,
 | 
					    database: Pool<Database>,
 | 
				
			||||||
    http: reqwest::Client,
 | 
					    http: reqwest::Client,
 | 
				
			||||||
    recording_macros: RwLock<HashMap<(GuildId, UserId), CommandMacro<Data, Error>>>,
 | 
					    recording_macros: RwLock<HashMap<(GuildId, UserId), CommandMacro<Data, Error>>>,
 | 
				
			||||||
    popular_timezones: Vec<Tz>,
 | 
					    popular_timezones: Vec<Tz>,
 | 
				
			||||||
    is_loop_running: AtomicBool,
 | 
					    _broadcast: Sender<()>,
 | 
				
			||||||
    broadcast: Sender<()>,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Debug for Data {
 | 
					impl Debug for Data {
 | 
				
			||||||
@@ -135,6 +134,7 @@ async fn _main(tx: Sender<()>) -> Result<(), Box<dyn StdError + Send + Sync>> {
 | 
				
			|||||||
                ..reminder_cmds::timer_base()
 | 
					                ..reminder_cmds::timer_base()
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            reminder_cmds::remind(),
 | 
					            reminder_cmds::remind(),
 | 
				
			||||||
 | 
					            reminder_cmds::remind_multiline(),
 | 
				
			||||||
            poise::Command {
 | 
					            poise::Command {
 | 
				
			||||||
                subcommands: vec![
 | 
					                subcommands: vec![
 | 
				
			||||||
                    poise::Command {
 | 
					                    poise::Command {
 | 
				
			||||||
@@ -229,8 +229,7 @@ async fn _main(tx: Sender<()>) -> Result<(), Box<dyn StdError + Send + Sync>> {
 | 
				
			|||||||
                    database,
 | 
					                    database,
 | 
				
			||||||
                    popular_timezones,
 | 
					                    popular_timezones,
 | 
				
			||||||
                    recording_macros: Default::default(),
 | 
					                    recording_macros: Default::default(),
 | 
				
			||||||
                    is_loop_running: AtomicBool::new(false),
 | 
					                    _broadcast: tx,
 | 
				
			||||||
                    broadcast: tx,
 | 
					 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user