Wip commit
This commit is contained in:
		@@ -8,15 +8,8 @@ use log::warn;
 | 
			
		||||
use poise::{
 | 
			
		||||
    serenity_prelude as serenity,
 | 
			
		||||
    serenity_prelude::{
 | 
			
		||||
        builder::CreateEmbed,
 | 
			
		||||
        model::{
 | 
			
		||||
            application::interaction::{
 | 
			
		||||
                message_component::MessageComponentInteraction, InteractionResponseType,
 | 
			
		||||
                MessageFlags,
 | 
			
		||||
            },
 | 
			
		||||
            channel::Channel,
 | 
			
		||||
        },
 | 
			
		||||
        Context,
 | 
			
		||||
        builder::CreateEmbed, ComponentInteraction, ComponentInteractionDataKind, Context,
 | 
			
		||||
        CreateEmbedFooter, CreateInteractionResponse, CreateInteractionResponseMessage,
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
use rmp_serde::Serializer;
 | 
			
		||||
@@ -31,7 +24,7 @@ use crate::{
 | 
			
		||||
    component_models::pager::{DelPager, LookPager, MacroPager, Pager, TodoPager},
 | 
			
		||||
    consts::{EMBED_DESCRIPTION_MAX_LENGTH, THEME_COLOR},
 | 
			
		||||
    models::reminder::Reminder,
 | 
			
		||||
    utils::send_as_initial_response,
 | 
			
		||||
    utils::reply_to_interaction_response_message,
 | 
			
		||||
    Data,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -64,21 +57,23 @@ impl ComponentDataModel {
 | 
			
		||||
        rmp_serde::from_read(cur).unwrap()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn act(&self, ctx: &Context, data: &Data, component: &MessageComponentInteraction) {
 | 
			
		||||
    pub async fn act(&self, ctx: &Context, data: &Data, component: &ComponentInteraction) {
 | 
			
		||||
        match self {
 | 
			
		||||
            ComponentDataModel::LookPager(pager) => {
 | 
			
		||||
                let flags = pager.flags;
 | 
			
		||||
 | 
			
		||||
                let channel_opt = component.channel_id.to_channel_cached(&ctx);
 | 
			
		||||
                let channel_id = {
 | 
			
		||||
                    let channel_opt = component.channel_id.to_channel_cached(&ctx.cache);
 | 
			
		||||
 | 
			
		||||
                let channel_id = if let Some(Channel::Guild(channel)) = channel_opt {
 | 
			
		||||
                    if Some(channel.guild_id) == component.guild_id {
 | 
			
		||||
                        flags.channel_id.unwrap_or(component.channel_id)
 | 
			
		||||
                    if let Some(channel) = channel_opt {
 | 
			
		||||
                        if Some(channel.guild_id) == component.guild_id {
 | 
			
		||||
                            flags.channel_id.unwrap_or(component.channel_id)
 | 
			
		||||
                        } else {
 | 
			
		||||
                            component.channel_id
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        component.channel_id
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    component.channel_id
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                let reminders = Reminder::from_channel(&data.database, channel_id, &flags).await;
 | 
			
		||||
@@ -90,11 +85,7 @@ impl ComponentDataModel {
 | 
			
		||||
                    .div_ceil(EMBED_DESCRIPTION_MAX_LENGTH);
 | 
			
		||||
 | 
			
		||||
                let channel_name =
 | 
			
		||||
                    if let Some(Channel::Guild(channel)) = channel_id.to_channel_cached(&ctx) {
 | 
			
		||||
                        Some(channel.name)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        None
 | 
			
		||||
                    };
 | 
			
		||||
                    channel_id.to_channel_cached(&ctx.cache).map(|channel| channel.name.clone());
 | 
			
		||||
 | 
			
		||||
                let next_page = pager.next_page(pages);
 | 
			
		||||
 | 
			
		||||
@@ -107,7 +98,7 @@ impl ComponentDataModel {
 | 
			
		||||
                    .skip_while(|p| {
 | 
			
		||||
                        skip_char_count += p.len();
 | 
			
		||||
 | 
			
		||||
                        skip_char_count < EMBED_DESCRIPTION_MAX_LENGTH * next_page as usize
 | 
			
		||||
                        skip_char_count < EMBED_DESCRIPTION_MAX_LENGTH * next_page
 | 
			
		||||
                    })
 | 
			
		||||
                    .take_while(|p| {
 | 
			
		||||
                        char_count += p.len();
 | 
			
		||||
@@ -117,28 +108,24 @@ impl ComponentDataModel {
 | 
			
		||||
                    .collect::<Vec<String>>()
 | 
			
		||||
                    .join("");
 | 
			
		||||
 | 
			
		||||
                let mut embed = CreateEmbed::default();
 | 
			
		||||
                embed
 | 
			
		||||
                let embed = CreateEmbed::default()
 | 
			
		||||
                    .title(format!(
 | 
			
		||||
                        "Reminders{}",
 | 
			
		||||
                        channel_name.map_or(String::new(), |n| format!(" on #{}", n))
 | 
			
		||||
                    ))
 | 
			
		||||
                    .description(display)
 | 
			
		||||
                    .footer(|f| f.text(format!("Page {} of {}", next_page + 1, pages)))
 | 
			
		||||
                    .footer(CreateEmbedFooter::new(format!("Page {} of {}", next_page + 1, pages)))
 | 
			
		||||
                    .color(*THEME_COLOR);
 | 
			
		||||
 | 
			
		||||
                let _ = component
 | 
			
		||||
                    .create_interaction_response(&ctx, |r| {
 | 
			
		||||
                        r.kind(InteractionResponseType::UpdateMessage).interaction_response_data(
 | 
			
		||||
                            |response| {
 | 
			
		||||
                                response.set_embeds(vec![embed]).components(|comp| {
 | 
			
		||||
                                    pager.create_button_row(pages, comp);
 | 
			
		||||
 | 
			
		||||
                                    comp
 | 
			
		||||
                                })
 | 
			
		||||
                            },
 | 
			
		||||
                        )
 | 
			
		||||
                    })
 | 
			
		||||
                    .create_response(
 | 
			
		||||
                        &ctx,
 | 
			
		||||
                        CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                            CreateInteractionResponseMessage::new()
 | 
			
		||||
                                .embed(embed)
 | 
			
		||||
                                .components(vec![pager.create_button_row(pages)]),
 | 
			
		||||
                        ),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
            }
 | 
			
		||||
            ComponentDataModel::DelPager(pager) => {
 | 
			
		||||
@@ -155,55 +142,58 @@ impl ComponentDataModel {
 | 
			
		||||
                let resp = show_delete_page(&reminders, pager.next_page(max_pages), pager.timezone);
 | 
			
		||||
 | 
			
		||||
                let _ = component
 | 
			
		||||
                    .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                        f.kind(InteractionResponseType::UpdateMessage).interaction_response_data(
 | 
			
		||||
                            |d| {
 | 
			
		||||
                                send_as_initial_response(resp, d);
 | 
			
		||||
                                d
 | 
			
		||||
                            },
 | 
			
		||||
                        )
 | 
			
		||||
                    })
 | 
			
		||||
                    .create_response(
 | 
			
		||||
                        &ctx,
 | 
			
		||||
                        CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                            reply_to_interaction_response_message(resp),
 | 
			
		||||
                        ),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
            }
 | 
			
		||||
            ComponentDataModel::DelSelector(selector) => {
 | 
			
		||||
                let selected_id = component.data.values.join(",");
 | 
			
		||||
                if let ComponentInteractionDataKind::StringSelect { values } = &component.data.kind
 | 
			
		||||
                {
 | 
			
		||||
                    let selected_id = values.join(",");
 | 
			
		||||
 | 
			
		||||
                sqlx::query!(
 | 
			
		||||
                    "UPDATE reminders SET `status` = 'deleted' WHERE FIND_IN_SET(id, ?)",
 | 
			
		||||
                    selected_id
 | 
			
		||||
                )
 | 
			
		||||
                .execute(&data.database)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                    sqlx::query!(
 | 
			
		||||
                        "
 | 
			
		||||
                        UPDATE reminders SET `status` = 'deleted' WHERE FIND_IN_SET(id, ?)
 | 
			
		||||
                        ",
 | 
			
		||||
                        selected_id
 | 
			
		||||
                    )
 | 
			
		||||
                    .execute(&data.database)
 | 
			
		||||
                    .await
 | 
			
		||||
                    .unwrap();
 | 
			
		||||
 | 
			
		||||
                let reminders = Reminder::from_guild(
 | 
			
		||||
                    &ctx,
 | 
			
		||||
                    &data.database,
 | 
			
		||||
                    component.guild_id,
 | 
			
		||||
                    component.user.id,
 | 
			
		||||
                )
 | 
			
		||||
                .await;
 | 
			
		||||
 | 
			
		||||
                let resp = show_delete_page(&reminders, selector.page, selector.timezone);
 | 
			
		||||
 | 
			
		||||
                let _ = component
 | 
			
		||||
                    .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                        f.kind(InteractionResponseType::UpdateMessage).interaction_response_data(
 | 
			
		||||
                            |d| {
 | 
			
		||||
                                send_as_initial_response(resp, d);
 | 
			
		||||
                                d
 | 
			
		||||
                            },
 | 
			
		||||
                        )
 | 
			
		||||
                    })
 | 
			
		||||
                    let reminders = Reminder::from_guild(
 | 
			
		||||
                        &ctx,
 | 
			
		||||
                        &data.database,
 | 
			
		||||
                        component.guild_id,
 | 
			
		||||
                        component.user.id,
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
 | 
			
		||||
                    let resp = show_delete_page(&reminders, selector.page, selector.timezone);
 | 
			
		||||
 | 
			
		||||
                    let _ = component
 | 
			
		||||
                        .create_response(
 | 
			
		||||
                            &ctx,
 | 
			
		||||
                            CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                                reply_to_interaction_response_message(resp),
 | 
			
		||||
                            ),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            ComponentDataModel::TodoPager(pager) => {
 | 
			
		||||
                if Some(component.user.id.0) == pager.user_id || pager.user_id.is_none() {
 | 
			
		||||
                if Some(component.user.id.get()) == pager.user_id || pager.user_id.is_none() {
 | 
			
		||||
                    let values = if let Some(uid) = pager.user_id {
 | 
			
		||||
                        sqlx::query!(
 | 
			
		||||
                            "SELECT todos.id, value FROM todos
 | 
			
		||||
INNER JOIN users ON todos.user_id = users.id
 | 
			
		||||
WHERE users.user = ?",
 | 
			
		||||
                            "
 | 
			
		||||
                            SELECT todos.id, value FROM todos
 | 
			
		||||
                            INNER JOIN users ON todos.user_id = users.id
 | 
			
		||||
                            WHERE users.user = ?
 | 
			
		||||
                            ",
 | 
			
		||||
                            uid,
 | 
			
		||||
                        )
 | 
			
		||||
                        .fetch_all(&data.database)
 | 
			
		||||
@@ -214,9 +204,11 @@ WHERE users.user = ?",
 | 
			
		||||
                        .collect::<Vec<(usize, String)>>()
 | 
			
		||||
                    } else if let Some(cid) = pager.channel_id {
 | 
			
		||||
                        sqlx::query!(
 | 
			
		||||
                            "SELECT todos.id, value FROM todos
 | 
			
		||||
INNER JOIN channels ON todos.channel_id = channels.id
 | 
			
		||||
WHERE channels.channel = ?",
 | 
			
		||||
                            "
 | 
			
		||||
                            SELECT todos.id, value FROM todos
 | 
			
		||||
                            INNER JOIN channels ON todos.channel_id = channels.id
 | 
			
		||||
                            WHERE channels.channel = ?
 | 
			
		||||
                            ",
 | 
			
		||||
                            cid,
 | 
			
		||||
                        )
 | 
			
		||||
                        .fetch_all(&data.database)
 | 
			
		||||
@@ -227,9 +219,11 @@ WHERE channels.channel = ?",
 | 
			
		||||
                        .collect::<Vec<(usize, String)>>()
 | 
			
		||||
                    } else {
 | 
			
		||||
                        sqlx::query!(
 | 
			
		||||
                            "SELECT todos.id, value FROM todos
 | 
			
		||||
INNER JOIN guilds ON todos.guild_id = guilds.id
 | 
			
		||||
WHERE guilds.guild = ?",
 | 
			
		||||
                            "
 | 
			
		||||
                            SELECT todos.id, value FROM todos
 | 
			
		||||
                            INNER JOIN guilds ON todos.guild_id = guilds.id
 | 
			
		||||
                            WHERE guilds.guild = ?
 | 
			
		||||
                            ",
 | 
			
		||||
                            pager.guild_id,
 | 
			
		||||
                        )
 | 
			
		||||
                        .fetch_all(&data.database)
 | 
			
		||||
@@ -251,79 +245,86 @@ WHERE guilds.guild = ?",
 | 
			
		||||
                    );
 | 
			
		||||
 | 
			
		||||
                    let _ = component
 | 
			
		||||
                        .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                            f.kind(InteractionResponseType::UpdateMessage)
 | 
			
		||||
                                .interaction_response_data(|d| {
 | 
			
		||||
                                    send_as_initial_response(resp, d);
 | 
			
		||||
                                    d
 | 
			
		||||
                                })
 | 
			
		||||
                        })
 | 
			
		||||
                        .create_response(
 | 
			
		||||
                            &ctx,
 | 
			
		||||
                            CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                                reply_to_interaction_response_message(resp),
 | 
			
		||||
                            ),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                } else {
 | 
			
		||||
                    let _ = component
 | 
			
		||||
                        .create_interaction_response(&ctx, |r| {
 | 
			
		||||
                            r.kind(InteractionResponseType::ChannelMessageWithSource)
 | 
			
		||||
                                .interaction_response_data(|d| {
 | 
			
		||||
                                    d.flags(
 | 
			
		||||
                                        MessageFlags::EPHEMERAL,
 | 
			
		||||
                                    )
 | 
			
		||||
                        .create_response(
 | 
			
		||||
                            &ctx,
 | 
			
		||||
                            CreateInteractionResponse::Message(
 | 
			
		||||
                                CreateInteractionResponseMessage::new()
 | 
			
		||||
                                    .ephemeral(true)
 | 
			
		||||
                                    .content("Only the user who performed the command can use these components")
 | 
			
		||||
                                })
 | 
			
		||||
                        })
 | 
			
		||||
                            )
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            ComponentDataModel::TodoSelector(selector) => {
 | 
			
		||||
                if Some(component.user.id.0) == selector.user_id || selector.user_id.is_none() {
 | 
			
		||||
                    let selected_id = component.data.values.join(",");
 | 
			
		||||
                if Some(component.user.id.get()) == selector.user_id || selector.user_id.is_none() {
 | 
			
		||||
                    if let ComponentInteractionDataKind::StringSelect { values } =
 | 
			
		||||
                        &component.data.kind
 | 
			
		||||
                    {
 | 
			
		||||
                        let selected_id = values.join(",");
 | 
			
		||||
 | 
			
		||||
                    sqlx::query!("DELETE FROM todos WHERE FIND_IN_SET(id, ?)", selected_id)
 | 
			
		||||
                        sqlx::query!(
 | 
			
		||||
                            "
 | 
			
		||||
                            DELETE FROM todos WHERE FIND_IN_SET(id, ?)
 | 
			
		||||
                            ",
 | 
			
		||||
                            selected_id
 | 
			
		||||
                        )
 | 
			
		||||
                        .execute(&data.database)
 | 
			
		||||
                        .await
 | 
			
		||||
                        .unwrap();
 | 
			
		||||
 | 
			
		||||
                    let values = sqlx::query!(
 | 
			
		||||
                    // fucking braindead mysql use <=> instead of = for null comparison
 | 
			
		||||
                    "SELECT id, value FROM todos WHERE user_id <=> ? AND channel_id <=> ? AND guild_id <=> ?",
 | 
			
		||||
                    selector.user_id,
 | 
			
		||||
                    selector.channel_id,
 | 
			
		||||
                    selector.guild_id,
 | 
			
		||||
                )
 | 
			
		||||
                .fetch_all(&data.database)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap()
 | 
			
		||||
                .iter()
 | 
			
		||||
                .map(|row| (row.id as usize, row.value.clone()))
 | 
			
		||||
                .collect::<Vec<(usize, String)>>();
 | 
			
		||||
                        let values = sqlx::query!(
 | 
			
		||||
                            // fucking braindead mysql use <=> instead of = for null comparison
 | 
			
		||||
                            "
 | 
			
		||||
                            SELECT id, value FROM todos WHERE user_id <=> ? AND channel_id <=> ? AND guild_id <=> ?
 | 
			
		||||
                            ",
 | 
			
		||||
                            selector.user_id,
 | 
			
		||||
                            selector.channel_id,
 | 
			
		||||
                            selector.guild_id,
 | 
			
		||||
                        )
 | 
			
		||||
                        .fetch_all(&data.database)
 | 
			
		||||
                        .await
 | 
			
		||||
                        .unwrap()
 | 
			
		||||
                        .iter()
 | 
			
		||||
                        .map(|row| (row.id as usize, row.value.clone()))
 | 
			
		||||
                        .collect::<Vec<(usize, String)>>();
 | 
			
		||||
 | 
			
		||||
                    let resp = show_todo_page(
 | 
			
		||||
                        &values,
 | 
			
		||||
                        selector.page,
 | 
			
		||||
                        selector.user_id,
 | 
			
		||||
                        selector.channel_id,
 | 
			
		||||
                        selector.guild_id,
 | 
			
		||||
                    );
 | 
			
		||||
                        let resp = show_todo_page(
 | 
			
		||||
                            &values,
 | 
			
		||||
                            selector.page,
 | 
			
		||||
                            selector.user_id,
 | 
			
		||||
                            selector.channel_id,
 | 
			
		||||
                            selector.guild_id,
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                    let _ = component
 | 
			
		||||
                        .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                            f.kind(InteractionResponseType::UpdateMessage)
 | 
			
		||||
                                .interaction_response_data(|d| {
 | 
			
		||||
                                    send_as_initial_response(resp, d);
 | 
			
		||||
                                    d
 | 
			
		||||
                                })
 | 
			
		||||
                        })
 | 
			
		||||
                        .await;
 | 
			
		||||
                        let _ = component
 | 
			
		||||
                            .create_response(
 | 
			
		||||
                                &ctx,
 | 
			
		||||
                                CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                                    reply_to_interaction_response_message(resp),
 | 
			
		||||
                                ),
 | 
			
		||||
                            )
 | 
			
		||||
                            .await;
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    let _ = component
 | 
			
		||||
                        .create_interaction_response(&ctx, |r| {
 | 
			
		||||
                            r.kind(InteractionResponseType::ChannelMessageWithSource)
 | 
			
		||||
                                .interaction_response_data(|d| {
 | 
			
		||||
                                    d.flags(
 | 
			
		||||
                                        MessageFlags::EPHEMERAL,
 | 
			
		||||
                                    )
 | 
			
		||||
                        .create_response(
 | 
			
		||||
                            &ctx,
 | 
			
		||||
                            CreateInteractionResponse::Message(
 | 
			
		||||
                                CreateInteractionResponseMessage::new()
 | 
			
		||||
                                    .ephemeral(true)
 | 
			
		||||
                                    .content("Only the user who performed the command can use these components")
 | 
			
		||||
                                })
 | 
			
		||||
                        })
 | 
			
		||||
                            )
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -336,14 +337,12 @@ WHERE guilds.guild = ?",
 | 
			
		||||
                let resp = show_macro_page(¯os, page);
 | 
			
		||||
 | 
			
		||||
                let _ = component
 | 
			
		||||
                    .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                        f.kind(InteractionResponseType::UpdateMessage).interaction_response_data(
 | 
			
		||||
                            |d| {
 | 
			
		||||
                                send_as_initial_response(resp, d);
 | 
			
		||||
                                d
 | 
			
		||||
                            },
 | 
			
		||||
                        )
 | 
			
		||||
                    })
 | 
			
		||||
                    .create_response(
 | 
			
		||||
                        &ctx,
 | 
			
		||||
                        CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                            reply_to_interaction_response_message(resp),
 | 
			
		||||
                        ),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
            }
 | 
			
		||||
            ComponentDataModel::UndoReminder(undo_reminder) => {
 | 
			
		||||
@@ -355,58 +354,56 @@ WHERE guilds.guild = ?",
 | 
			
		||||
                        match reminder.delete(&data.database).await {
 | 
			
		||||
                            Ok(()) => {
 | 
			
		||||
                                let _ = component
 | 
			
		||||
                                    .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                                        f.kind(InteractionResponseType::UpdateMessage)
 | 
			
		||||
                                            .interaction_response_data(|d| {
 | 
			
		||||
                                                d.embed(|e| {
 | 
			
		||||
                                                    e.title("Reminder Canceled")
 | 
			
		||||
                                                        .description(
 | 
			
		||||
                                                            "This reminder has been canceled.",
 | 
			
		||||
                                                        )
 | 
			
		||||
                                                        .color(*THEME_COLOR)
 | 
			
		||||
                                                })
 | 
			
		||||
                                                .components(|c| c)
 | 
			
		||||
                                            })
 | 
			
		||||
                                    })
 | 
			
		||||
                                    .create_response(
 | 
			
		||||
                                        &ctx,
 | 
			
		||||
                                        CreateInteractionResponse::UpdateMessage(
 | 
			
		||||
                                            CreateInteractionResponseMessage::new().embed(
 | 
			
		||||
                                                CreateEmbed::new()
 | 
			
		||||
                                                    .title("Reminder Canceled")
 | 
			
		||||
                                                    .description("This reminder has been canceled.")
 | 
			
		||||
                                                    .color(*THEME_COLOR),
 | 
			
		||||
                                            ),
 | 
			
		||||
                                        ),
 | 
			
		||||
                                    )
 | 
			
		||||
                                    .await;
 | 
			
		||||
                            }
 | 
			
		||||
                            Err(e) => {
 | 
			
		||||
                                warn!("Error canceling reminder: {:?}", e);
 | 
			
		||||
 | 
			
		||||
                                let _ = component
 | 
			
		||||
                                    .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                                        f.kind(InteractionResponseType::ChannelMessageWithSource)
 | 
			
		||||
                                            .interaction_response_data(|d| {
 | 
			
		||||
                                                d.content(
 | 
			
		||||
                                                    "The reminder could not be canceled: it may have already been deleted. Check `/del`!")
 | 
			
		||||
                                                    .ephemeral(true)
 | 
			
		||||
                                            })
 | 
			
		||||
                                    })
 | 
			
		||||
                                    .create_response(
 | 
			
		||||
                                        &ctx,
 | 
			
		||||
                                        CreateInteractionResponse::Message(
 | 
			
		||||
                                            CreateInteractionResponseMessage::new().content(
 | 
			
		||||
                                                "An error occurred trying to cancel this reminder.",
 | 
			
		||||
                                            ).ephemeral(true),
 | 
			
		||||
                                        ),
 | 
			
		||||
                                    )
 | 
			
		||||
                                    .await;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        let _ = component
 | 
			
		||||
                            .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                                f.kind(InteractionResponseType::ChannelMessageWithSource)
 | 
			
		||||
                                    .interaction_response_data(|d| {
 | 
			
		||||
                                        d.content(
 | 
			
		||||
                                            "The reminder could not be canceled: it may have already been deleted. Check `/del`!")
 | 
			
		||||
                                            .ephemeral(true)
 | 
			
		||||
                                    })
 | 
			
		||||
                            })
 | 
			
		||||
                            .create_response(
 | 
			
		||||
                                &ctx,
 | 
			
		||||
                                CreateInteractionResponse::Message(
 | 
			
		||||
                                    CreateInteractionResponseMessage::new().content(
 | 
			
		||||
                                        "The reminder could not be canceled. It may have already been deleted.",
 | 
			
		||||
                                    ).ephemeral(true),
 | 
			
		||||
                                ),
 | 
			
		||||
                            )
 | 
			
		||||
                            .await;
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    let _ = component
 | 
			
		||||
                        .create_interaction_response(&ctx, |f| {
 | 
			
		||||
                            f.kind(InteractionResponseType::ChannelMessageWithSource)
 | 
			
		||||
                                .interaction_response_data(|d| {
 | 
			
		||||
                                    d.content(
 | 
			
		||||
                                        "Only the user who performed the command can use this button.")
 | 
			
		||||
                                        .ephemeral(true)
 | 
			
		||||
                                })
 | 
			
		||||
                        })
 | 
			
		||||
                        .create_response(
 | 
			
		||||
                            &ctx,
 | 
			
		||||
                            CreateInteractionResponse::Message(
 | 
			
		||||
                                CreateInteractionResponseMessage::new()
 | 
			
		||||
                                    .content("Only the user who performed the command can use these components")
 | 
			
		||||
                                    .ephemeral(true),
 | 
			
		||||
                            ),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user