mod member;
pub use member::*;
mod message;
pub use message::*;
mod user;
pub use user::*;
mod channel;
pub use channel::*;
#[cfg(feature = "cache")]
mod guild;
#[cfg(feature = "cache")]
pub use guild::*;
mod role;
pub use role::*;
mod emoji;
pub use emoji::*;
use super::DOMAINS;
use crate::model::prelude::*;
use crate::prelude::*;
#[async_trait::async_trait]
pub trait ArgumentConvert: Sized {
type Err;
async fn convert(
ctx: impl CacheHttp,
guild_id: Option<GuildId>,
channel_id: Option<ChannelId>,
s: &str,
) -> Result<Self, Self::Err>;
}
#[async_trait::async_trait]
impl<T: std::str::FromStr> ArgumentConvert for T {
type Err = <T as std::str::FromStr>::Err;
async fn convert(
_: impl CacheHttp,
_: Option<GuildId>,
_: Option<ChannelId>,
s: &str,
) -> Result<Self, Self::Err> {
T::from_str(s)
}
}
#[must_use]
pub fn parse_message_id_pair(s: &str) -> Option<(ChannelId, MessageId)> {
let mut parts = s.splitn(2, '-');
let channel_id = parts.next()?.parse().ok()?;
let message_id = parts.next()?.parse().ok()?;
Some((channel_id, message_id))
}
#[must_use]
pub fn parse_message_url(s: &str) -> Option<(GuildId, ChannelId, MessageId)> {
for domain in DOMAINS {
if let Some(parts) = s.strip_prefix(&format!("https://{domain}/channels/")) {
let mut parts = parts.splitn(3, '/');
let guild_id = parts.next()?.parse().ok()?;
let channel_id = parts.next()?.parse().ok()?;
let message_id = parts.next()?.parse().ok()?;
return Some((guild_id, channel_id, message_id));
}
}
None
}