From 54c5cc6cc2b704023e15d007434c378ca1e2c3bd Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Tue, 22 Aug 2023 22:06:19 +0200 Subject: [PATCH] Add message acknowledge endpoint --- src/api/channels/messages.rs | 36 +++++++++++++++++++++++++++++++++++- src/types/schema/message.rs | 7 +++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/api/channels/messages.rs b/src/api/channels/messages.rs index 538cae6..36545ac 100644 --- a/src/api/channels/messages.rs +++ b/src/api/channels/messages.rs @@ -8,7 +8,7 @@ use crate::errors::{ChorusError, ChorusResult}; use crate::instance::UserMeta; use crate::ratelimiter::ChorusRequest; use crate::types::{ - Channel, CreateGreetMessage, Message, MessageSearchEndpoint, MessageSearchQuery, + Channel, CreateGreetMessage, Message, MessageAck, MessageSearchEndpoint, MessageSearchQuery, MessageSendSchema, Snowflake, }; @@ -248,6 +248,40 @@ impl Message { }; chorus_request.deserialize_response::(user).await } + + /// Sets the channel's latest acknowledged message (marks a message as read) for the current user. + /// The message ID parameter does not need to be a valid message ID, but it must be a valid snowflake. + /// If the message ID is being set to a message sent prior to the latest acknowledged one, + /// manual should be true or the resulting read state update should be ignored by clients (but is still saved), resulting in undefined behavior. + /// In this case, mention_count should also be set to the amount of mentions unacknowledged as it is not automatically calculated by Discord. + /// + /// Returns an optional token, which can be used as the new `ack` token for following `ack`s. + /// + /// # Reference: + /// See: + pub async fn acknowledge( + channel_id: Snowflake, + message_id: Snowflake, + schema: MessageAck, + user: &mut UserMeta, + ) -> ChorusResult> { + let chorus_request = ChorusRequest { + request: Client::new() + .post(format!( + "{}/channels/{}/messages/{}/ack", + user.belongs_to.borrow().urls.api, + channel_id, + message_id + )) + .header("Authorization", user.token()) + .header("Content-Type", "application/json") + .body(to_string(&schema).unwrap()), + limit_type: LimitType::Channel(channel_id), + }; + chorus_request + .deserialize_response::>(user) + .await + } } fn search_error(result_text: String) -> ChorusError { diff --git a/src/types/schema/message.rs b/src/types/schema/message.rs index bf9cddc..7603555 100644 --- a/src/types/schema/message.rs +++ b/src/types/schema/message.rs @@ -103,3 +103,10 @@ pub struct CreateGreetMessage { pub allowed_mentions: Option, pub message_reference: Option, } + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct MessageAck { + pub token: Option, + pub manual: Option, + pub mention_count: Option, +}