concord 2.5.0

A terminal user interface client for Discord
use crate::discord::ids::{Id, marker::MessageMarker};
use crate::{DiscordClient, discord::AppEvent, logging};

const INBOX_PAGE_LIMIT: u16 = 25;

pub(super) async fn load_mentions(
    client: DiscordClient,
    request_id: u64,
    before: Option<Id<MessageMarker>>,
) {
    match client.load_recent_mentions(before, INBOX_PAGE_LIMIT).await {
        Ok(messages) => {
            let has_more = messages.len() >= usize::from(INBOX_PAGE_LIMIT);
            client
                .publish_event(AppEvent::InboxMentionsLoaded {
                    request_id,
                    before,
                    messages,
                    has_more,
                })
                .await;
        }
        Err(error) => {
            log_inbox_error("load recent mentions", &error);
            client
                .publish_event(AppEvent::InboxMentionsLoadFailed { request_id, before })
                .await;
        }
    }
}

pub(super) async fn delete_mention(client: DiscordClient, message_id: Id<MessageMarker>) {
    match client.delete_recent_mention(message_id).await {
        Ok(()) => {
            client
                .publish_event(AppEvent::InboxRecentMentionDeleted { message_id })
                .await;
        }
        Err(error) => {
            let message = format!("delete recent mention failed: {error}");
            log_inbox_error("delete recent mention", &error);
            client
                .publish_event(AppEvent::InboxRecentMentionDeleteFailed {
                    message_id,
                    message,
                })
                .await;
        }
    }
}

fn log_inbox_error(context: &str, error: &crate::AppError) {
    logging::error(
        "inbox",
        format!("{context} failed: {error}; detail={}", error.log_detail()),
    );
}