1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
use super::GetChannelMessagesConfigured;
use crate::{
client::Client,
error::Error,
request::{Request, TryIntoRequest},
response::{marker::ListBody, Response, ResponseFuture},
routing::Route,
};
use std::future::IntoFuture;
use twilight_model::{
channel::Message,
id::{
marker::{ChannelMarker, MessageMarker},
Id,
},
};
use twilight_validate::request::{
get_channel_messages_limit as validate_get_channel_messages_limit, ValidationError,
};
struct GetChannelMessagesFields {
limit: Option<u16>,
}
/// Get channel messages, by [`Id<ChannelMarker>`].
///
/// Only one of [`after`], [`around`], and [`before`] can be specified at a time.
/// Once these are specified, the type returned is [`GetChannelMessagesConfigured`].
///
/// If [`limit`] is unspecified, the default set by Discord is 50.
///
/// # Examples
///
/// ```no_run
/// use twilight_http::Client;
/// use twilight_model::id::Id;
///
/// # #[tokio::main]
/// # async fn main() -> Result<(), Box<dyn std::error::Error>> {
/// let client = Client::new("my token".to_owned());
/// let channel_id = Id::new(123);
/// let message_id = Id::new(234);
///
/// let messages = client
/// .channel_messages(channel_id)
/// .before(message_id)
/// .limit(6u16)?
/// .await?;
///
/// # Ok(()) }
/// ```
///
/// [`after`]: Self::after
/// [`around`]: Self::around
/// [`before`]: Self::before
/// [`GetChannelMessagesConfigured`]: super::GetChannelMessagesConfigured
/// [`limit`]: Self::limit
#[must_use = "requests must be configured and executed"]
pub struct GetChannelMessages<'a> {
channel_id: Id<ChannelMarker>,
fields: GetChannelMessagesFields,
http: &'a Client,
}
impl<'a> GetChannelMessages<'a> {
pub(crate) const fn new(http: &'a Client, channel_id: Id<ChannelMarker>) -> Self {
Self {
channel_id,
fields: GetChannelMessagesFields { limit: None },
http,
}
}
pub const fn after(self, message_id: Id<MessageMarker>) -> GetChannelMessagesConfigured<'a> {
GetChannelMessagesConfigured::new(
self.http,
self.channel_id,
Some(message_id),
None,
None,
self.fields.limit,
)
}
pub const fn around(self, message_id: Id<MessageMarker>) -> GetChannelMessagesConfigured<'a> {
GetChannelMessagesConfigured::new(
self.http,
self.channel_id,
None,
Some(message_id),
None,
self.fields.limit,
)
}
pub const fn before(self, message_id: Id<MessageMarker>) -> GetChannelMessagesConfigured<'a> {
GetChannelMessagesConfigured::new(
self.http,
self.channel_id,
None,
None,
Some(message_id),
self.fields.limit,
)
}
/// Set the maximum number of messages to retrieve.
///
/// The minimum is 1 and the maximum is 100.
///
/// # Errors
///
/// Returns an error of type [`GetChannelMessages`] error type if the amount
/// is less than 1 or greater than 100.
///
/// [`GetChannelMessages`]: twilight_validate::request::ValidationErrorType::GetChannelMessages
pub const fn limit(mut self, limit: u16) -> Result<Self, ValidationError> {
#[allow(clippy::question_mark)]
if let Err(source) = validate_get_channel_messages_limit(limit) {
return Err(source);
}
self.fields.limit = Some(limit);
Ok(self)
}
/// Execute the request, returning a future resolving to a [`Response`].
#[deprecated(since = "0.14.0", note = "use `.await` or `into_future` instead")]
pub fn exec(self) -> ResponseFuture<ListBody<Message>> {
self.into_future()
}
}
impl IntoFuture for GetChannelMessages<'_> {
type Output = Result<Response<ListBody<Message>>, Error>;
type IntoFuture = ResponseFuture<ListBody<Message>>;
fn into_future(self) -> Self::IntoFuture {
let http = self.http;
match self.try_into_request() {
Ok(request) => http.request(request),
Err(source) => ResponseFuture::error(source),
}
}
}
impl TryIntoRequest for GetChannelMessages<'_> {
fn try_into_request(self) -> Result<Request, Error> {
Ok(Request::from_route(&Route::GetMessages {
after: None,
around: None,
before: None,
channel_id: self.channel_id.get(),
limit: self.fields.limit,
}))
}
}