From 6f6713eb79c05a49072e80fe31dbf9c51ac0bd54 Mon Sep 17 00:00:00 2001 From: kozabrada123 <“kozabrada123@users.noreply.github.com”> Date: Sat, 27 May 2023 17:29:30 +0200 Subject: [PATCH] Add Application Command Permissions & Update event --- src/gateway.rs | 11 ++++++++++- src/types/entities/application.rs | 31 +++++++++++++++++++++++++++++++ src/types/events/application.rs | 12 ++++++++++++ src/types/events/mod.rs | 2 ++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/types/events/application.rs diff --git a/src/gateway.rs b/src/gateway.rs index 1c6734a..675a443 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -232,7 +232,10 @@ impl Gateway { self.events.lock().await.session.ready_supplimental.update_data(new_data).await; } "RESUMED" => {} - "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {} + "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => { + let new_data: types::ApplicationCommandPermissionsUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events.lock().await.application.command_permissions_update.update_data(new_data).await; + } "AUTO_MODERATION_RULE_CREATE" => { let new_data: types::AutoModerationRuleCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); self.events.lock().await.auto_moderation.rule_create.update_data(new_data).await; @@ -716,6 +719,7 @@ mod events { use super::*; #[derive(Default, Debug)] pub struct Events { + pub application: Application, pub auto_moderation: AutoModeration, pub session: Session, pub message: Message, @@ -735,6 +739,11 @@ mod events { pub gateway_resume: GatewayEvent, } + #[derive(Default, Debug)] + pub struct Application { + pub command_permissions_update: GatewayEvent, + } + #[derive(Default, Debug)] pub struct AutoModeration { pub rule_create: GatewayEvent, diff --git a/src/types/entities/application.rs b/src/types/entities/application.rs index 2ab3f99..96fda98 100644 --- a/src/types/entities/application.rs +++ b/src/types/entities/application.rs @@ -2,6 +2,7 @@ use crate::types::utils::Snowflake; use bitflags::{bitflags, Flags}; use serde::{Deserialize, Serialize}; use serde_json::Value; +use serde_repr::{Serialize_repr, Deserialize_repr}; #[cfg(feature = "sqlx")] use sqlx::FromRow; @@ -136,3 +137,33 @@ pub struct ApplicationCommandInteractionDataOption { pub value: Value, pub options: Vec, } + +#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] +/// See https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object-guild-application-command-permissions-structure +pub struct GuildApplicationCommandPermissions { + pub id: Snowflake, + pub application_id: Snowflake, + pub guild_id: Snowflake, + pub permissions: Vec, +} + +#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] +/// See https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object-application-command-permissions-structure +pub struct ApplicationCommandPermission { + pub id: Snowflake, + #[serde(rename = "type")] + pub permission_type: ApplicationCommandPermissionType, + /// true to allow, false, to disallow + pub permission: bool, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, PartialEq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[repr(u8)] +/// See https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object-application-command-permission-type +pub enum ApplicationCommandPermissionType { + #[default] + Role = 1, + User = 2, + Channel = 3 +} \ No newline at end of file diff --git a/src/types/events/application.rs b/src/types/events/application.rs new file mode 100644 index 0000000..b2bd042 --- /dev/null +++ b/src/types/events/application.rs @@ -0,0 +1,12 @@ +use serde::{Deserialize, Serialize}; + +use crate::types::{WebSocketEvent, GuildApplicationCommandPermissions}; + +#[derive(Debug, Deserialize, Serialize, Default)] +/// See https://discord.com/developers/docs/topics/gateway-events#application-command-permissions-update +pub struct ApplicationCommandPermissionsUpdate { + #[serde(flatten)] + pub permissions: GuildApplicationCommandPermissions, +} + +impl WebSocketEvent for ApplicationCommandPermissionsUpdate {} \ No newline at end of file diff --git a/src/types/events/mod.rs b/src/types/events/mod.rs index 53234b6..3dbf5a6 100644 --- a/src/types/events/mod.rs +++ b/src/types/events/mod.rs @@ -24,6 +24,7 @@ mod relationship; mod auto_moderation; mod stage_instance; mod interaction; +mod application; pub use channel::*; pub use guild::*; @@ -49,6 +50,7 @@ pub use relationship::*; pub use auto_moderation::*; pub use stage_instance::*; pub use interaction::*; +pub use application::*; pub trait WebSocketEvent {}