use std::borrow::Cow;
use urlencoding;
#[derive(Debug, Clone)]
pub enum Route<'a> {
GetMe,
UpdateMe,
SettingsProto { version: u8 },
GetUserProfile { user_id: u64, guild_id: Option<u64> },
GetRelationships,
AddRelationship { user_id: u64 },
RemoveRelationship { user_id: u64 },
CreateDm,
GetChannel { channel_id: u64 },
EditChannel { channel_id: u64 },
DeleteChannel { channel_id: u64 },
CreateGuildChannel { guild_id: u64 },
GetGuildChannels { guild_id: u64 },
GetCurrentUserGuilds,
UpdateVoiceStatus { channel_id: u64 },
TriggerTyping { channel_id: u64 },
GetMessages { channel_id: u64, limit: Option<u32>, before: Option<u64>, after: Option<u64> },
GetPins { channel_id: u64 },
PinMessage { channel_id: u64, message_id: u64 },
UnpinMessage { channel_id: u64, message_id: u64 },
CrosspostMessage { channel_id: u64, message_id: u64 },
CreateMessage { channel_id: u64 },
GetMessage { channel_id: u64, message_id: u64 },
EditMessage { channel_id: u64, message_id: u64 },
DeleteMessage { channel_id: u64, message_id: u64 },
BulkDeleteMessages { channel_id: u64 },
AddReaction { channel_id: u64, message_id: u64, emoji: &'a str },
RemoveOwnReaction { channel_id: u64, message_id: u64, emoji: &'a str },
RemoveUserReaction { channel_id: u64, message_id: u64, emoji: &'a str, user_id: u64 },
GetGuild { guild_id: u64, with_counts: bool },
GetGuildRoles { guild_id: u64 },
CreateGuildRole { guild_id: u64 },
EditGuildRole { guild_id: u64, role_id: u64 },
DeleteGuildRole { guild_id: u64, role_id: u64 },
EditGuildMember { guild_id: u64, member_id: u64 },
CreateChannelInvite { channel_id: u64 },
GetGuildInvites { guild_id: u64 },
JoinGuild { code: &'a str },
DeleteInvite { code: &'a str },
GetGuildStickers { guild_id: u64 },
GetGuildSticker { guild_id: u64, sticker_id: u64 },
CreateGuildSticker { guild_id: u64 },
EditGuildSticker { guild_id: u64, sticker_id: u64 },
DeleteGuildSticker { guild_id: u64, sticker_id: u64 },
GetGuildAuditLogs { guild_id: u64, user_id: Option<u64>, action_type: Option<u32>, before: Option<u64>, after: Option<u64>, limit: Option<u8> },
SearchGuildMembers { guild_id: u64 },
GetGuildMembersByQuery { guild_id: u64, query: String, limit: u32 },
KickMember { guild_id: u64, user_id: u64 },
GetGuildBans { guild_id: u64 },
GetGuildBan { guild_id: u64, user_id: u64 },
CreateGuildBan { guild_id: u64, user_id: u64 },
RemoveGuildBan { guild_id: u64, user_id: u64 },
EditGuild { guild_id: u64 },
CreateThread { channel_id: u64 },
CreateThreadFromMessage { channel_id: u64, message_id: u64 },
JoinThread { channel_id: u64 },
LeaveThread { channel_id: u64 },
AddThreadMember { channel_id: u64, user_id: u64 },
RemoveThreadMember { channel_id: u64, user_id: u64 },
GetThreadMembers { channel_id: u64 },
GetActiveThreads { guild_id: u64 },
CreateGuild,
DeleteGuild { guild_id: u64 },
LeaveGuild { guild_id: u64 },
GetGuildEmojis { guild_id: u64 },
GetGuildEmoji { guild_id: u64, emoji_id: u64 },
CreateGuildEmoji { guild_id: u64 },
EditGuildEmoji { guild_id: u64, emoji_id: u64 },
DeleteGuildEmoji { guild_id: u64, emoji_id: u64 },
GetChannelWebhooks { channel_id: u64 },
GetGuildWebhooks { guild_id: u64 },
CreateWebhook { channel_id: u64 },
GetWebhook { webhook_id: u64 },
GetWebhookWithToken { webhook_id: u64, token: &'a str },
EditWebhook { webhook_id: u64 },
EditWebhookWithToken { webhook_id: u64, token: &'a str },
DeleteWebhook { webhook_id: u64 },
DeleteWebhookWithToken { webhook_id: u64, token: &'a str },
ExecuteWebhook { webhook_id: u64, token: &'a str },
GetGlobalCommands { application_id: u64 },
CreateGlobalCommand { application_id: u64 },
GetGlobalCommand { application_id: u64, command_id: u64 },
EditGlobalCommand { application_id: u64, command_id: u64 },
DeleteGlobalCommand { application_id: u64, command_id: u64 },
BulkOverwriteGlobalCommands { application_id: u64 },
GetGuildCommands { application_id: u64, guild_id: u64 },
CreateGuildCommand { application_id: u64, guild_id: u64 },
GetGuildCommand { application_id: u64, guild_id: u64, command_id: u64 },
EditGuildCommand { application_id: u64, guild_id: u64, command_id: u64 },
DeleteGuildCommand { application_id: u64, guild_id: u64, command_id: u64 },
BulkOverwriteGuildCommands { application_id: u64, guild_id: u64 },
CreateInteractionResponse { interaction_id: u64, interaction_token: &'a str },
GetOriginalInteractionResponse { application_id: u64, interaction_token: &'a str },
EditOriginalInteractionResponse { application_id: u64, interaction_token: &'a str },
DeleteOriginalInteractionResponse { application_id: u64, interaction_token: &'a str },
CreateFollowupMessage { application_id: u64, interaction_token: &'a str },
EditFollowupMessage { application_id: u64, interaction_token: &'a str, message_id: u64 },
DeleteFollowupMessage { application_id: u64, interaction_token: &'a str, message_id: u64 },
ListDefaultSoundboardSounds,
GetGuildSoundboardSounds { guild_id: u64 },
GetGuildSoundboardSound { guild_id: u64, sound_id: u64 },
CreateGuildSoundboardSound { guild_id: u64 },
EditGuildSoundboardSound { guild_id: u64, sound_id: u64 },
DeleteGuildSoundboardSound { guild_id: u64, sound_id: u64 },
SendSoundboardSound { channel_id: u64 },
GetPollAnswerVoters { channel_id: u64, message_id: u64, answer_id: u64 },
EndPoll { channel_id: u64, message_id: u64 },
GetAutoModerationRules { guild_id: u64 },
GetAutoModerationRule { guild_id: u64, rule_id: u64 },
CreateAutoModerationRule { guild_id: u64 },
EditAutoModerationRule { guild_id: u64, rule_id: u64 },
DeleteAutoModerationRule { guild_id: u64, rule_id: u64 },
GetGuildScheduledEvents { guild_id: u64 },
GetGuildScheduledEvent { guild_id: u64, event_id: u64 },
CreateGuildScheduledEvent { guild_id: u64 },
EditGuildScheduledEvent { guild_id: u64, event_id: u64 },
DeleteGuildScheduledEvent { guild_id: u64, event_id: u64 },
GetGuildScheduledEventUsers { guild_id: u64, event_id: u64 },
GetStageInstance { channel_id: u64 },
CreateStageInstance,
EditStageInstance { channel_id: u64 },
DeleteStageInstance { channel_id: u64 },
GetGuildMembers { guild_id: u64, limit: u32 },
SearchGuildMessages { guild_id: u64, content: &'a str, channel_id: Option<u64>, limit: Option<u32> },
GetVoiceRegions,
GetGuildVoiceRegions { guild_id: u64 },
EditMyVoiceState { guild_id: u64 },
EditVoiceState { guild_id: u64, user_id: u64 },
GetReactions { channel_id: u64, message_id: u64, emoji: Cow<'a, str>, after: Option<u64>, limit: Option<u32>, reaction_type: Option<u8> },
GetChannelInvites { channel_id: u64 },
EditChannelPermissions { channel_id: u64, overwrite_id: u64 },
DeleteChannelPermission { channel_id: u64, overwrite_id: u64 },
FollowAnnouncementChannel { channel_id: u64 },
GroupDmAddRecipient { channel_id: u64, user_id: u64 },
GroupDmRemoveRecipient { channel_id: u64, user_id: u64 },
BulkBan { guild_id: u64 },
AddGuildMember { guild_id: u64, user_id: u64 },
ModifyCurrentMember { guild_id: u64 },
GuildPreview { guild_id: u64 },
WelcomeScreen { guild_id: u64 },
GuildOnboarding { guild_id: u64 },
GuildTemplate { code: Cow<'a, str> },
GuildTemplates { guild_id: u64 },
GuildSpecificTemplate { guild_id: u64, code: Cow<'a, str> },
GuildWidgetSettings { guild_id: u64 },
GuildWidgetJson { guild_id: u64 },
GuildWidgetImage { guild_id: u64, style: Option<Cow<'a, str>> },
GuildVanityUrl { guild_id: u64 },
GuildIntegrations { guild_id: u64 },
DeleteGuildIntegration { guild_id: u64, integration_id: u64 },
GuildPrune { guild_id: u64, days: Option<u32>, include_roles: Option<Cow<'a, str>> },
AddGuildMemberRole { guild_id: u64, user_id: u64, role_id: u64 },
RemoveGuildMemberRole { guild_id: u64, user_id: u64, role_id: u64 },
GetThreadMember { channel_id: u64, user_id: u64, with_member: bool },
ListThreadMembers { channel_id: u64, with_member: bool, after: Option<u64>, limit: Option<u32> },
PublicArchivedThreads { channel_id: u64, before: Option<Cow<'a, str>>, limit: Option<u32> },
PrivateArchivedThreads { channel_id: u64, before: Option<Cow<'a, str>>, limit: Option<u32> },
JoinedPrivateArchivedThreads { channel_id: u64, before: Option<u64>, limit: Option<u32> },
StartThreadInForumChannel { channel_id: u64 },
GetUser { user_id: u64 },
CurrentUserGuildMember { guild_id: u64 },
CreateGroupDm,
UserConnections,
ApplicationRoleConnection { application_id: u64 },
ExecuteWebhookSlack { webhook_id: u64, token: Cow<'a, str>, wait: bool, thread_id: Option<u64> },
ExecuteWebhookGithub { webhook_id: u64, token: Cow<'a, str>, wait: bool, thread_id: Option<u64> },
WebhookMessage { webhook_id: u64, token: Cow<'a, str>, message_id: u64, thread_id: Option<u64> },
ApplicationEmojis { application_id: u64 },
ApplicationEmoji { application_id: u64, emoji_id: u64 },
Sticker { sticker_id: u64 },
StickerPacks,
StickerPack { pack_id: u64 },
Invite { code: Cow<'a, str>, with_counts: Option<bool>, with_expiration: Option<bool>, guild_scheduled_event_id: Option<u64> },
ApplicationCommandPermissions { application_id: u64, guild_id: u64, command_id: Option<u64> },
BatchEditApplicationCommandPermissions { application_id: u64, guild_id: u64 },
CurrentApplication,
ApplicationActivityInstance { application_id: u64, instance_id: Cow<'a, str> },
ApplicationSkus { application_id: u64 },
ApplicationEntitlements { application_id: u64, user_id: Option<u64>, sku_ids: Option<Cow<'a, str>>, before: Option<u64>, after: Option<u64>, limit: Option<u32>, guild_id: Option<u64>, exclude_ended: Option<bool>, exclude_deleted: Option<bool> },
ApplicationEntitlement { application_id: u64, entitlement_id: u64 },
ConsumeEntitlement { application_id: u64, entitlement_id: u64 },
SkuSubscriptions { sku_id: u64, before: Option<u64>, after: Option<u64>, limit: Option<u32>, user_id: Option<u64> },
SkuSubscription { sku_id: u64, subscription_id: u64 },
ApplicationRoleConnectionMetadata { application_id: u64 },
Lobbies,
Lobby { lobby_id: u64 },
LobbyMembers { lobby_id: u64 },
LobbyMember { lobby_id: u64, user_id: u64 },
LeaveLobby { lobby_id: u64 },
LobbyChannelLink { lobby_id: u64 },
GetCurrentUserVoiceState { guild_id: u64 },
GetUserVoiceState { guild_id: u64, user_id: u64 },
ChannelPinsV2 { channel_id: u64, before: Option<Cow<'a, str>>, after: Option<Cow<'a, str>>, limit: Option<u32> },
GuildStageInstances { guild_id: u64 },
GuildIncidentActions { guild_id: u64 },
BulkChannelPositions { guild_id: u64 },
}
impl<'a> Route<'a> {
pub fn path(&self) -> Cow<'_, str> {
match self {
Route::GetMe | Route::UpdateMe => Cow::Borrowed("users/@me"),
Route::SettingsProto { version } => Cow::Owned(format!("users/@me/settings-proto/{}", version)),
Route::GetUserProfile { user_id, guild_id } => {
let mut url = format!("users/{}/profile?with_mutual_guilds=true&with_mutual_friends=true", user_id);
if let Some(gid) = guild_id {
url.push_str(&format!("&guild_id={}", gid));
}
Cow::Owned(url)
}
Route::GetRelationships => Cow::Borrowed("users/@me/relationships"),
Route::AddRelationship { user_id } | Route::RemoveRelationship { user_id } => Cow::Owned(format!("users/@me/relationships/{}", user_id)),
Route::CreateDm => Cow::Borrowed("users/@me/channels"),
Route::GetCurrentUserGuilds => Cow::Borrowed("users/@me/guilds"),
Route::GetChannel { channel_id } | Route::EditChannel { channel_id } | Route::DeleteChannel { channel_id } => Cow::Owned(format!("channels/{}", channel_id)),
Route::CreateGuildChannel { guild_id } | Route::GetGuildChannels { guild_id } => Cow::Owned(format!("guilds/{}/channels", guild_id)),
Route::UpdateVoiceStatus { channel_id } => Cow::Owned(format!("channels/{}/voice-status", channel_id)),
Route::TriggerTyping { channel_id } => Cow::Owned(format!("channels/{}/typing", channel_id)),
Route::GetMessages { channel_id, limit, before, after } => {
let mut url = format!("channels/{}/messages", channel_id);
let mut params = Vec::new();
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if let Some(b) = before {
params.push(format!("before={}", b));
}
if let Some(a) = after {
params.push(format!("after={}", a));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::CreateMessage { channel_id } | Route::BulkDeleteMessages { channel_id } => {
let suffix = if matches!(self, Route::BulkDeleteMessages { .. }) { "/bulk-delete" } else { "" };
Cow::Owned(format!("channels/{}/messages{}", channel_id, suffix))
}
Route::GetMessage { channel_id, message_id } | Route::EditMessage { channel_id, message_id } | Route::DeleteMessage { channel_id, message_id } => Cow::Owned(format!("channels/{}/messages/{}", channel_id, message_id)),
Route::GetPins { channel_id } => Cow::Owned(format!("channels/{}/pins", channel_id)),
Route::PinMessage { channel_id, message_id } | Route::UnpinMessage { channel_id, message_id } => Cow::Owned(format!("channels/{}/pins/{}", channel_id, message_id)),
Route::CrosspostMessage { channel_id, message_id } => Cow::Owned(format!("channels/{}/messages/{}/crosspost", channel_id, message_id)),
Route::AddReaction { channel_id, message_id, emoji } => Cow::Owned(format!("channels/{}/messages/{}/reactions/{}/@me?location=Message&type=0", channel_id, message_id, emoji)),
Route::RemoveOwnReaction { channel_id, message_id, emoji } => Cow::Owned(format!("channels/{}/messages/{}/reactions/{}/@me", channel_id, message_id, emoji)),
Route::RemoveUserReaction { channel_id, message_id, emoji, user_id } => Cow::Owned(format!("channels/{}/messages/{}/reactions/{}/{}", channel_id, message_id, emoji, user_id)),
Route::GetGuild { guild_id, with_counts } => {
if *with_counts {
Cow::Owned(format!("guilds/{}?with_counts=true", guild_id))
} else {
Cow::Owned(format!("guilds/{}", guild_id))
}
}
Route::GetGuildRoles { guild_id } | Route::CreateGuildRole { guild_id } => Cow::Owned(format!("guilds/{}/roles", guild_id)),
Route::EditGuildRole { guild_id, role_id } | Route::DeleteGuildRole { guild_id, role_id } => Cow::Owned(format!("guilds/{}/roles/{}", guild_id, role_id)),
Route::EditGuildMember { guild_id, member_id } => Cow::Owned(format!("guilds/{}/members/{}", guild_id, member_id)),
Route::CreateChannelInvite { channel_id } => Cow::Owned(format!("channels/{}/invites", channel_id)),
Route::GetGuildInvites { guild_id } => Cow::Owned(format!("guilds/{}/invites", guild_id)),
Route::JoinGuild { code } | Route::DeleteInvite { code } => Cow::Owned(format!("invites/{}", code)),
Route::GetGuildStickers { guild_id } | Route::CreateGuildSticker { guild_id } => Cow::Owned(format!("guilds/{}/stickers", guild_id)),
Route::GetGuildSticker { guild_id, sticker_id } | Route::EditGuildSticker { guild_id, sticker_id } | Route::DeleteGuildSticker { guild_id, sticker_id } => Cow::Owned(format!("guilds/{}/stickers/{}", guild_id, sticker_id)),
Route::GetGuildAuditLogs { guild_id, user_id, action_type, before, after, limit } => {
let mut url = format!("guilds/{}/audit-logs", guild_id);
let mut params: Vec<String> = Vec::new();
if let Some(u) = user_id {
params.push(format!("user_id={}", u));
}
if let Some(a) = action_type {
params.push(format!("action_type={}", a));
}
if let Some(b) = before {
params.push(format!("before={}", b));
}
if let Some(a) = after {
params.push(format!("after={}", a));
}
if let Some(l) = limit {
params.push(format!("limit={}", (*l).min(100u8)));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::SearchGuildMembers { guild_id } => Cow::Owned(format!("guilds/{}/members-search", guild_id)),
Route::GetGuildMembersByQuery { guild_id, query, limit } => Cow::Owned(format!("guilds/{}/members/search?query={}&limit={}", guild_id, urlencoding::encode(query), limit)),
Route::EditGuild { guild_id } => Cow::Owned(format!("guilds/{}", guild_id)),
Route::KickMember { guild_id, user_id } => Cow::Owned(format!("guilds/{}/members/{}", guild_id, user_id)),
Route::GetGuildBans { guild_id } => Cow::Owned(format!("guilds/{}/bans", guild_id)),
Route::GetGuildBan { guild_id, user_id } | Route::CreateGuildBan { guild_id, user_id } | Route::RemoveGuildBan { guild_id, user_id } => Cow::Owned(format!("guilds/{}/bans/{}", guild_id, user_id)),
Route::CreateThread { channel_id } => Cow::Owned(format!("channels/{}/threads", channel_id)),
Route::CreateThreadFromMessage { channel_id, message_id } => Cow::Owned(format!("channels/{}/messages/{}/threads", channel_id, message_id)),
Route::JoinThread { channel_id } => Cow::Owned(format!("channels/{}/thread-members/@me", channel_id)),
Route::LeaveThread { channel_id } => Cow::Owned(format!("channels/{}/thread-members/@me", channel_id)),
Route::AddThreadMember { channel_id, user_id } => Cow::Owned(format!("channels/{}/thread-members/{}", channel_id, user_id)),
Route::RemoveThreadMember { channel_id, user_id } => Cow::Owned(format!("channels/{}/thread-members/{}", channel_id, user_id)),
Route::GetThreadMembers { channel_id } => Cow::Owned(format!("channels/{}/thread-members", channel_id)),
Route::GetActiveThreads { guild_id } => Cow::Owned(format!("guilds/{}/threads/active", guild_id)),
Route::CreateGuild => Cow::Borrowed("guilds"),
Route::DeleteGuild { guild_id } => Cow::Owned(format!("guilds/{}", guild_id)),
Route::LeaveGuild { guild_id } => Cow::Owned(format!("users/@me/guilds/{}", guild_id)),
Route::GetGuildEmojis { guild_id } | Route::CreateGuildEmoji { guild_id } => Cow::Owned(format!("guilds/{}/emojis", guild_id)),
Route::GetGuildEmoji { guild_id, emoji_id } | Route::EditGuildEmoji { guild_id, emoji_id } | Route::DeleteGuildEmoji { guild_id, emoji_id } => Cow::Owned(format!("guilds/{}/emojis/{}", guild_id, emoji_id)),
Route::GetChannelWebhooks { channel_id } | Route::CreateWebhook { channel_id } => Cow::Owned(format!("channels/{}/webhooks", channel_id)),
Route::GetGuildWebhooks { guild_id } => Cow::Owned(format!("guilds/{}/webhooks", guild_id)),
Route::GetWebhook { webhook_id } | Route::EditWebhook { webhook_id } | Route::DeleteWebhook { webhook_id } => Cow::Owned(format!("webhooks/{}", webhook_id)),
Route::GetWebhookWithToken { webhook_id, token } | Route::EditWebhookWithToken { webhook_id, token } | Route::DeleteWebhookWithToken { webhook_id, token } | Route::ExecuteWebhook { webhook_id, token } => Cow::Owned(format!("webhooks/{}/{}", webhook_id, token)),
Route::GetGlobalCommands { application_id } | Route::CreateGlobalCommand { application_id } | Route::BulkOverwriteGlobalCommands { application_id } => Cow::Owned(format!("applications/{}/commands", application_id)),
Route::GetGlobalCommand { application_id, command_id } | Route::EditGlobalCommand { application_id, command_id } | Route::DeleteGlobalCommand { application_id, command_id } => Cow::Owned(format!("applications/{}/commands/{}", application_id, command_id)),
Route::GetGuildCommands { application_id, guild_id } | Route::CreateGuildCommand { application_id, guild_id } | Route::BulkOverwriteGuildCommands { application_id, guild_id } => Cow::Owned(format!("applications/{}/guilds/{}/commands", application_id, guild_id)),
Route::GetGuildCommand { application_id, guild_id, command_id } | Route::EditGuildCommand { application_id, guild_id, command_id } | Route::DeleteGuildCommand { application_id, guild_id, command_id } => Cow::Owned(format!("applications/{}/guilds/{}/commands/{}", application_id, guild_id, command_id)),
Route::CreateInteractionResponse { interaction_id, interaction_token } => Cow::Owned(format!("interactions/{}/{}/callback", interaction_id, interaction_token)),
Route::GetOriginalInteractionResponse { application_id, interaction_token } | Route::EditOriginalInteractionResponse { application_id, interaction_token } | Route::DeleteOriginalInteractionResponse { application_id, interaction_token } => Cow::Owned(format!("webhooks/{}/{}/messages/@original", application_id, interaction_token)),
Route::CreateFollowupMessage { application_id, interaction_token } => Cow::Owned(format!("webhooks/{}/{}", application_id, interaction_token)),
Route::EditFollowupMessage { application_id, interaction_token, message_id } | Route::DeleteFollowupMessage { application_id, interaction_token, message_id } => Cow::Owned(format!("webhooks/{}/{}/messages/{}", application_id, interaction_token, message_id)),
Route::ListDefaultSoundboardSounds => Cow::Borrowed("soundboard-default-sounds"),
Route::GetGuildSoundboardSounds { guild_id } | Route::CreateGuildSoundboardSound { guild_id } => Cow::Owned(format!("guilds/{}/soundboard-sounds", guild_id)),
Route::GetGuildSoundboardSound { guild_id, sound_id } | Route::EditGuildSoundboardSound { guild_id, sound_id } | Route::DeleteGuildSoundboardSound { guild_id, sound_id } => Cow::Owned(format!("guilds/{}/soundboard-sounds/{}", guild_id, sound_id)),
Route::SendSoundboardSound { channel_id } => Cow::Owned(format!("channels/{}/send-soundboard-sound", channel_id)),
Route::GetPollAnswerVoters { channel_id, message_id, answer_id } => Cow::Owned(format!("channels/{}/polls/{}/answers/{}", channel_id, message_id, answer_id)),
Route::EndPoll { channel_id, message_id } => Cow::Owned(format!("channels/{}/polls/{}/expire", channel_id, message_id)),
Route::GetAutoModerationRules { guild_id } | Route::CreateAutoModerationRule { guild_id } => Cow::Owned(format!("guilds/{}/auto-moderation/rules", guild_id)),
Route::GetAutoModerationRule { guild_id, rule_id } | Route::EditAutoModerationRule { guild_id, rule_id } | Route::DeleteAutoModerationRule { guild_id, rule_id } => Cow::Owned(format!("guilds/{}/auto-moderation/rules/{}", guild_id, rule_id)),
Route::GetGuildScheduledEvents { guild_id } | Route::CreateGuildScheduledEvent { guild_id } => Cow::Owned(format!("guilds/{}/scheduled-events", guild_id)),
Route::GetGuildScheduledEvent { guild_id, event_id } | Route::EditGuildScheduledEvent { guild_id, event_id } | Route::DeleteGuildScheduledEvent { guild_id, event_id } => Cow::Owned(format!("guilds/{}/scheduled-events/{}", guild_id, event_id)),
Route::GetGuildScheduledEventUsers { guild_id, event_id } => Cow::Owned(format!("guilds/{}/scheduled-events/{}/users", guild_id, event_id)),
Route::GetStageInstance { channel_id } | Route::EditStageInstance { channel_id } | Route::DeleteStageInstance { channel_id } => Cow::Owned(format!("stage-instances/{}", channel_id)),
Route::CreateStageInstance => Cow::Borrowed("stage-instances"),
Route::GetGuildMembers { guild_id, limit } => Cow::Owned(format!("guilds/{}/members?limit={}", guild_id, limit)),
Route::SearchGuildMessages { guild_id, content, channel_id, limit } => {
let mut url = format!("guilds/{}/messages/search?content={}", guild_id, urlencoding::encode(content));
if let Some(cid) = channel_id {
url.push_str(&format!("&channel_id={}", cid));
}
if let Some(l) = limit {
url.push_str(&format!("&limit={}", l));
}
Cow::Owned(url)
}
Route::GetVoiceRegions => Cow::Borrowed("voice/regions"),
Route::GetGuildVoiceRegions { guild_id } => Cow::Owned(format!("guilds/{}/regions", guild_id)),
Route::EditMyVoiceState { guild_id } => Cow::Owned(format!("guilds/{}/voice-states/@me", guild_id)),
Route::EditVoiceState { guild_id, user_id } => Cow::Owned(format!("guilds/{}/voice-states/{}", guild_id, user_id)),
Route::GetReactions { channel_id, message_id, emoji, after, limit, reaction_type } => {
let mut url = format!("channels/{}/messages/{}/reactions/{}", channel_id, message_id, urlencoding::encode(emoji));
let mut params: Vec<String> = Vec::new();
if let Some(a) = after {
params.push(format!("after={}", a));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if let Some(t) = reaction_type {
params.push(format!("type={}", t));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::GetChannelInvites { channel_id } => Cow::Owned(format!("channels/{}/invites", channel_id)),
Route::EditChannelPermissions { channel_id, overwrite_id } | Route::DeleteChannelPermission { channel_id, overwrite_id } => Cow::Owned(format!("channels/{}/permissions/{}", channel_id, overwrite_id)),
Route::FollowAnnouncementChannel { channel_id } => Cow::Owned(format!("channels/{}/followers", channel_id)),
Route::GroupDmAddRecipient { channel_id, user_id } | Route::GroupDmRemoveRecipient { channel_id, user_id } => Cow::Owned(format!("channels/{}/recipients/{}", channel_id, user_id)),
Route::BulkBan { guild_id } => Cow::Owned(format!("guilds/{}/bulk-ban", guild_id)),
Route::AddGuildMember { guild_id, user_id } => Cow::Owned(format!("guilds/{}/members/{}", guild_id, user_id)),
Route::ModifyCurrentMember { guild_id } => Cow::Owned(format!("guilds/{}/members/@me", guild_id)),
Route::GuildPreview { guild_id } => Cow::Owned(format!("guilds/{}/preview", guild_id)),
Route::WelcomeScreen { guild_id } => Cow::Owned(format!("guilds/{}/welcome-screen", guild_id)),
Route::GuildOnboarding { guild_id } => Cow::Owned(format!("guilds/{}/onboarding", guild_id)),
Route::GuildTemplate { code } => Cow::Owned(format!("guilds/templates/{}", urlencoding::encode(code))),
Route::GuildTemplates { guild_id } => Cow::Owned(format!("guilds/{}/templates", guild_id)),
Route::GuildSpecificTemplate { guild_id, code } => Cow::Owned(format!("guilds/{}/templates/{}", guild_id, urlencoding::encode(code))),
Route::GuildWidgetSettings { guild_id } => Cow::Owned(format!("guilds/{}/widget", guild_id)),
Route::GuildWidgetJson { guild_id } => Cow::Owned(format!("guilds/{}/widget.json", guild_id)),
Route::GuildWidgetImage { guild_id, style } => {
let mut url = format!("guilds/{}/widget.png", guild_id);
if let Some(s) = style {
url.push_str(&format!("?style={}", urlencoding::encode(s)));
}
Cow::Owned(url)
}
Route::GuildVanityUrl { guild_id } => Cow::Owned(format!("guilds/{}/vanity-url", guild_id)),
Route::GuildIntegrations { guild_id } => Cow::Owned(format!("guilds/{}/integrations", guild_id)),
Route::DeleteGuildIntegration { guild_id, integration_id } => Cow::Owned(format!("guilds/{}/integrations/{}", guild_id, integration_id)),
Route::GuildPrune { guild_id, days, include_roles } => {
let mut url = format!("guilds/{}/prune", guild_id);
let mut params: Vec<String> = Vec::new();
if let Some(d) = days {
params.push(format!("days={}", d));
}
if let Some(r) = include_roles {
params.push(format!("include_roles={}", urlencoding::encode(r)));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::AddGuildMemberRole { guild_id, user_id, role_id } | Route::RemoveGuildMemberRole { guild_id, user_id, role_id } => Cow::Owned(format!("guilds/{}/members/{}/roles/{}", guild_id, user_id, role_id)),
Route::GetThreadMember { channel_id, user_id, with_member } => {
let mut url = format!("channels/{}/thread-members/{}", channel_id, user_id);
if *with_member {
url.push_str("?with_member=true");
}
Cow::Owned(url)
}
Route::ListThreadMembers { channel_id, with_member, after, limit } => {
let mut url = format!("channels/{}/thread-members", channel_id);
let mut params: Vec<String> = Vec::new();
if *with_member {
params.push("with_member=true".to_string());
}
if let Some(a) = after {
params.push(format!("after={}", a));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::PublicArchivedThreads { channel_id, before, limit } => {
let mut url = format!("channels/{}/threads/archived/public", channel_id);
let mut params: Vec<String> = Vec::new();
if let Some(b) = before {
params.push(format!("before={}", urlencoding::encode(b)));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::PrivateArchivedThreads { channel_id, before, limit } => {
let mut url = format!("channels/{}/threads/archived/private", channel_id);
let mut params: Vec<String> = Vec::new();
if let Some(b) = before {
params.push(format!("before={}", urlencoding::encode(b)));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::JoinedPrivateArchivedThreads { channel_id, before, limit } => {
let mut url = format!("channels/{}/users/@me/threads/archived/private", channel_id);
let mut params: Vec<String> = Vec::new();
if let Some(b) = before {
params.push(format!("before={}", b));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::StartThreadInForumChannel { channel_id } => Cow::Owned(format!("channels/{}/threads", channel_id)),
Route::GetUser { user_id } => Cow::Owned(format!("users/{}", user_id)),
Route::CurrentUserGuildMember { guild_id } => Cow::Owned(format!("users/@me/guilds/{}/member", guild_id)),
Route::CreateGroupDm => Cow::Borrowed("users/@me/channels"),
Route::UserConnections => Cow::Borrowed("users/@me/connections"),
Route::ApplicationRoleConnection { application_id } => Cow::Owned(format!("users/@me/applications/{}/role-connection", application_id)),
Route::ExecuteWebhookSlack { webhook_id, token, wait, thread_id } => {
let mut url = format!("webhooks/{}/{}/slack", webhook_id, token);
let mut params: Vec<String> = Vec::new();
if *wait {
params.push("wait=true".to_string());
}
if let Some(t) = thread_id {
params.push(format!("thread_id={}", t));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::ExecuteWebhookGithub { webhook_id, token, wait, thread_id } => {
let mut url = format!("webhooks/{}/{}/github", webhook_id, token);
let mut params: Vec<String> = Vec::new();
if *wait {
params.push("wait=true".to_string());
}
if let Some(t) = thread_id {
params.push(format!("thread_id={}", t));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::WebhookMessage { webhook_id, token, message_id, thread_id } => {
let mut url = format!("webhooks/{}/{}/messages/{}", webhook_id, token, message_id);
if let Some(t) = thread_id {
url.push_str(&format!("?thread_id={}", t));
}
Cow::Owned(url)
}
Route::ApplicationEmojis { application_id } => Cow::Owned(format!("applications/{}/emojis", application_id)),
Route::ApplicationEmoji { application_id, emoji_id } => Cow::Owned(format!("applications/{}/emojis/{}", application_id, emoji_id)),
Route::Sticker { sticker_id } => Cow::Owned(format!("stickers/{}", sticker_id)),
Route::StickerPacks => Cow::Borrowed("sticker-packs"),
Route::StickerPack { pack_id } => Cow::Owned(format!("sticker-packs/{}", pack_id)),
Route::Invite { code, with_counts, with_expiration, guild_scheduled_event_id } => {
let mut url = format!("invites/{}", urlencoding::encode(code));
let mut params: Vec<String> = Vec::new();
if let Some(c) = with_counts {
params.push(format!("with_counts={}", c));
}
if let Some(e) = with_expiration {
params.push(format!("with_expiration={}", e));
}
if let Some(g) = guild_scheduled_event_id {
params.push(format!("guild_scheduled_event_id={}", g));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::ApplicationCommandPermissions { application_id, guild_id, command_id } => {
match command_id {
Some(cid) => Cow::Owned(format!("applications/{}/guilds/{}/commands/{}/permissions", application_id, guild_id, cid)),
None => Cow::Owned(format!("applications/{}/guilds/{}/commands/permissions", application_id, guild_id)),
}
}
Route::BatchEditApplicationCommandPermissions { application_id, guild_id } => Cow::Owned(format!("applications/{}/guilds/{}/commands/permissions", application_id, guild_id)),
Route::CurrentApplication => Cow::Borrowed("applications/@me"),
Route::ApplicationActivityInstance { application_id, instance_id } => Cow::Owned(format!("applications/{}/activity-instances/{}", application_id, urlencoding::encode(instance_id))),
Route::ApplicationSkus { application_id } => Cow::Owned(format!("applications/{}/skus", application_id)),
Route::ApplicationEntitlements { application_id, user_id, sku_ids, before, after, limit, guild_id, exclude_ended, exclude_deleted } => {
let mut url = format!("applications/{}/entitlements", application_id);
let mut params: Vec<String> = Vec::new();
if let Some(u) = user_id {
params.push(format!("user_id={}", u));
}
if let Some(s) = sku_ids {
params.push(format!("sku_ids={}", urlencoding::encode(s)));
}
if let Some(b) = before {
params.push(format!("before={}", b));
}
if let Some(a) = after {
params.push(format!("after={}", a));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if let Some(g) = guild_id {
params.push(format!("guild_id={}", g));
}
if let Some(e) = exclude_ended {
params.push(format!("exclude_ended={}", e));
}
if let Some(e) = exclude_deleted {
params.push(format!("exclude_deleted={}", e));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::ApplicationEntitlement { application_id, entitlement_id } => Cow::Owned(format!("applications/{}/entitlements/{}", application_id, entitlement_id)),
Route::ConsumeEntitlement { application_id, entitlement_id } => Cow::Owned(format!("applications/{}/entitlements/{}/consume", application_id, entitlement_id)),
Route::SkuSubscriptions { sku_id, before, after, limit, user_id } => {
let mut url = format!("skus/{}/subscriptions", sku_id);
let mut params: Vec<String> = Vec::new();
if let Some(b) = before {
params.push(format!("before={}", b));
}
if let Some(a) = after {
params.push(format!("after={}", a));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if let Some(u) = user_id {
params.push(format!("user_id={}", u));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::SkuSubscription { sku_id, subscription_id } => Cow::Owned(format!("skus/{}/subscriptions/{}", sku_id, subscription_id)),
Route::ApplicationRoleConnectionMetadata { application_id } => Cow::Owned(format!("applications/{}/role-connections/metadata", application_id)),
Route::Lobbies => Cow::Borrowed("lobbies"),
Route::Lobby { lobby_id } => Cow::Owned(format!("lobbies/{}", lobby_id)),
Route::LobbyMembers { lobby_id } => Cow::Owned(format!("lobbies/{}/members", lobby_id)),
Route::LobbyMember { lobby_id, user_id } => Cow::Owned(format!("lobbies/{}/members/{}", lobby_id, user_id)),
Route::LeaveLobby { lobby_id } => Cow::Owned(format!("lobbies/{}/members/@me", lobby_id)),
Route::LobbyChannelLink { lobby_id } => Cow::Owned(format!("lobbies/{}/channel-linking", lobby_id)),
Route::GetCurrentUserVoiceState { guild_id } => Cow::Owned(format!("guilds/{}/voice-states/@me", guild_id)),
Route::GetUserVoiceState { guild_id, user_id } => Cow::Owned(format!("guilds/{}/voice-states/{}", guild_id, user_id)),
Route::ChannelPinsV2 { channel_id, before, after, limit } => {
let mut url = format!("channels/{}/messages/pins", channel_id);
let mut params: Vec<String> = Vec::new();
if let Some(b) = before {
params.push(format!("before={}", urlencoding::encode(b)));
}
if let Some(a) = after {
params.push(format!("after={}", urlencoding::encode(a)));
}
if let Some(l) = limit {
params.push(format!("limit={}", l));
}
if !params.is_empty() {
url.push('?');
url.push_str(¶ms.join("&"));
}
Cow::Owned(url)
}
Route::GuildStageInstances { guild_id } => Cow::Owned(format!("guilds/{}/stage-instances", guild_id)),
Route::GuildIncidentActions { guild_id } => Cow::Owned(format!("guilds/{}/incident-actions", guild_id)),
Route::BulkChannelPositions { guild_id } => Cow::Owned(format!("guilds/{}/channels", guild_id)),
}
}
}