From 41b75be2fb9fe65ef3c663ec1e87f2aa59514494 Mon Sep 17 00:00:00 2001 From: kozabrada123 <“kozabrada123@users.noreply.github.com”> Date: Sat, 13 May 2023 16:24:34 +0200 Subject: [PATCH] Add a few more gateway events --- Cargo.toml | 2 +- src/api/types.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/gateway.rs | 20 ++++++++++++++++---- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7f30de7..f346a21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ serde = {version = "1.0.159", features = ["derive"]} serde_json = "1.0.95" reqwest = {version = "0.11.16", features = ["multipart"]} url = "2.3.1" -chrono = "0.4.24" +chrono = {version = "0.4.24", features = ["serde"]} regex = "1.7.3" custom_error = "1.9.2" native-tls = "0.2.11" diff --git a/src/api/types.rs b/src/api/types.rs index 784cb73..fc55061 100644 --- a/src/api/types.rs +++ b/src/api/types.rs @@ -4,6 +4,7 @@ https://discord.com/developers/docs . I do not feel like re-documenting all of this, as everything is already perfectly explained there. */ +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use crate::{api::limits::Limits, instance::Instance}; @@ -857,6 +858,43 @@ pub struct GatewayHeartbeatAck { impl WebSocketEvent for GatewayHeartbeatAck {} +#[derive(Debug, Default, Deserialize, Serialize)] +/// See https://discord.com/developers/docs/topics/gateway-events#channel-pins-update +pub struct ChannelPinsUpdate { + pub guild_id: Option, + pub channel_id: String, + pub last_pin_timestamp: Option> +} + +impl WebSocketEvent for ChannelPinsUpdate {} + +#[derive(Debug, Default, Deserialize, Serialize)] +/// See https://discord.com/developers/docs/topics/gateway-events#guild-ban-add-guild-ban-add-event-fields +pub struct GuildBanAdd { + pub guild_id: String, + pub user: UserObject, +} + +impl WebSocketEvent for GuildBanAdd {} + +#[derive(Debug, Default, Deserialize, Serialize)] +/// See https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove +pub struct GuildBanRemove { + pub guild_id: String, + pub user: UserObject, +} + +impl WebSocketEvent for GuildBanRemove {} + +#[derive(Debug, Default, Deserialize, Serialize)] +/// See https://discord.com/developers/docs/topics/gateway-events#user-update +/// Not directly serialized, as the inner payload is the user object +pub struct UserUpdate { + pub user: UserObject, +} + +impl WebSocketEvent for UserUpdate {} + #[derive(Debug, Default, Deserialize, Serialize)] pub struct GatewayPayload { pub op: u8, diff --git a/src/gateway.rs b/src/gateway.rs index 964ac01..ca8bd6c 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -183,6 +183,7 @@ impl<'a> Gateway { "READY" => { let data: GatewayReady = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); } + "RESUMED" => {} "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {} "AUTO_MODERATION_RULE_CREATE" => {} "AUTO_MODERATION_RULE_UPDATE" => {} @@ -200,10 +201,16 @@ impl<'a> Gateway { "THREAD_MEMBERS_UPDATE" => {} "GUILD_CREATE" => {} "GUILD_UPDATE" => {} - "GUILD_DELETE" => {} + "GUILD_DELETE" => { + let new_data: UnavailableGuild = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); + } "GUILD_AUDIT_LOG_ENTRY_CREATE" => {} - "GUILD_BAN_ADD" => {} - "GUILD_BAN_REMOVE" => {} + "GUILD_BAN_ADD" => { + let new_data: GuildBanAdd = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); + } + "GUILD_BAN_REMOVE" => { + let new_data: GuildBanRemove = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); + } "GUILD_EMOJIS_UPDATE" => {} "GUILD_STICKERS_UPDATE" => {} "GUILD_INTEGRATIONS_UPDATE" => {} @@ -270,7 +277,11 @@ impl<'a> Gateway { let new_data: TypingStartEvent = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); self.events.lock().await.user.typing_start_event.update_data(new_data).await; } - "USER_UPDATE" => {} + "USER_UPDATE" => { + let user: UserObject = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); + let new_data = UserUpdate {user}; + self.events.lock().await.user.user_update.update_data(new_data).await; + } "VOICE_STATE_UPDATE" => {} "VOICE_SERVER_UPDATE" => {} "WEBHOOKS_UPDATE" => {} @@ -531,6 +542,7 @@ mod events { #[derive(Default, Debug)] pub struct User { + pub user_update: GatewayEvent, pub presence_update: GatewayEvent, pub typing_start_event: GatewayEvent, }