From 6cb28dda929acbb5728bcd41eb5b3d43c6225e97 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sat, 19 Aug 2023 01:13:07 +0200 Subject: [PATCH] Start implementing some UpdateMessages --- src/gateway.rs | 16 ++++++------ src/types/events/channel.rs | 51 +++++++++++++++++++++++++++++++++++-- src/types/events/thread.rs | 15 +++++++++-- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/gateway.rs b/src/gateway.rs index c482fb5..d3a748c 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -1,9 +1,9 @@ use crate::errors::GatewayError; use crate::gateway::events::Events; use crate::types::{ - self, AutoModerationRule, AutoModerationRuleUpdate, Channel, ChannelCreate, ChannelUpdate, - Composite, Guild, GuildRoleCreate, GuildRoleUpdate, JsonField, RoleObject, Snowflake, - UpdateMessage, WebSocketEvent, + self, AutoModerationRule, AutoModerationRuleUpdate, Channel, ChannelCreate, ChannelDelete, + ChannelUpdate, Composite, Guild, GuildRoleCreate, GuildRoleUpdate, JsonField, RoleObject, + Snowflake, ThreadUpdate, UpdateMessage, WebSocketEvent, }; use async_trait::async_trait; use std::any::Any; @@ -578,16 +578,16 @@ impl Gateway { "AUTO_MODERATION_RULE_UPDATE" =>auto_moderation.rule_update AutoModerationRuleUpdate: AutoModerationRule, "AUTO_MODERATION_RULE_DELETE" => auto_moderation.rule_delete, "AUTO_MODERATION_ACTION_EXECUTION" => auto_moderation.action_execution, - "CHANNEL_CREATE" => channel.create, // Could be processed if handle_message returned a Result<(), SomeError>, as channel.guild_id is Option + "CHANNEL_CREATE" => channel.create ChannelCreate: Guild, "CHANNEL_UPDATE" => channel.update ChannelUpdate: Channel, "CHANNEL_UNREAD_UPDATE" => channel.unread_update, - "CHANNEL_DELETE" => channel.delete, // Same as CHANNEL_CREATE + "CHANNEL_DELETE" => channel.delete ChannelDelete: Guild, "CHANNEL_PINS_UPDATE" => channel.pins_update, "CALL_CREATE" => call.create, "CALL_UPDATE" => call.update, "CALL_DELETE" => call.delete, "THREAD_CREATE" => thread.create, // TODO - "THREAD_UPDATE" => thread.update, // TODO + "THREAD_UPDATE" => thread.update ThreadUpdate: Channel, "THREAD_DELETE" => thread.delete, // TODO "THREAD_LIST_SYNC" => thread.list_sync, // TODO "THREAD_MEMBER_UPDATE" => thread.member_update, // TODO @@ -596,8 +596,8 @@ impl Gateway { "GUILD_UPDATE" => guild.update, // TODO "GUILD_DELETE" => guild.delete, // TODO "GUILD_AUDIT_LOG_ENTRY_CREATE" => guild.audit_log_entry_create, - "GUILD_BAN_ADD" => guild.ban_add, - "GUILD_BAN_REMOVE" => guild.ban_remove, + "GUILD_BAN_ADD" => guild.ban_add, // TODO + "GUILD_BAN_REMOVE" => guild.ban_remove, // TODO "GUILD_EMOJIS_UPDATE" => guild.emojis_update, // TODO "GUILD_STICKERS_UPDATE" => guild.stickers_update, // TODO "GUILD_INTEGRATIONS_UPDATE" => guild.integrations_update, diff --git a/src/types/events/channel.rs b/src/types/events/channel.rs index d49cf6e..ae84b79 100644 --- a/src/types/events/channel.rs +++ b/src/types/events/channel.rs @@ -1,6 +1,7 @@ use std::sync::{Arc, RwLock}; use crate::types::events::WebSocketEvent; +use crate::types::Guild; use crate::types::{entities::Channel, JsonField, Snowflake}; use chorus_macros::JsonField; use chrono::{DateTime, Utc}; @@ -18,15 +19,33 @@ pub struct ChannelPinsUpdate { impl WebSocketEvent for ChannelPinsUpdate {} -#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] /// See pub struct ChannelCreate { #[serde(flatten)] pub channel: Channel, + #[serde(skip)] + pub json: String, } impl WebSocketEvent for ChannelCreate {} +impl UpdateMessage for ChannelCreate { + fn id(&self) -> Option { + self.channel.guild_id + } + + fn update(&mut self, object_to_update: Arc>) { + let mut write = object_to_update.write().unwrap(); + let update = Arc::new(RwLock::new(self.channel.clone())); + if write.channels.is_some() { + write.channels.as_mut().unwrap().push(update); + } else { + write.channels = Some(Vec::from([update])); + } + } +} + #[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] /// See pub struct ChannelUpdate { @@ -68,11 +87,39 @@ pub struct ChannelUnreadUpdateObject { impl WebSocketEvent for ChannelUnreadUpdate {} -#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] /// See pub struct ChannelDelete { #[serde(flatten)] pub channel: Channel, + #[serde(skip)] + pub json: String, +} + +impl UpdateMessage for ChannelDelete { + fn id(&self) -> Option { + self.channel.guild_id + } + + fn update(&mut self, object_to_update: Arc>) { + if self.id().is_none() { + return; + } + let mut write = object_to_update.write().unwrap(); + if write.channels.is_none() { + return; + } + for (iteration, item) in (0_u32..).zip(write.channels.as_mut().unwrap().iter()) { + if item.read().unwrap().id == self.id().unwrap() { + write + .channels + .as_mut() + .unwrap() + .swap_remove(iteration as usize); + return; + } + } + } } impl WebSocketEvent for ChannelDelete {} diff --git a/src/types/events/thread.rs b/src/types/events/thread.rs index 2faecf7..19f1cde 100644 --- a/src/types/events/thread.rs +++ b/src/types/events/thread.rs @@ -1,8 +1,11 @@ +use chorus_macros::JsonField; use serde::{Deserialize, Serialize}; use crate::types::entities::{Channel, ThreadMember}; use crate::types::events::WebSocketEvent; -use crate::types::Snowflake; +use crate::types::{JsonField, Snowflake}; + +use super::UpdateMessage; #[derive(Debug, Default, Deserialize, Serialize, Clone)] /// See @@ -13,15 +16,23 @@ pub struct ThreadCreate { impl WebSocketEvent for ThreadCreate {} -#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] /// See pub struct ThreadUpdate { #[serde(flatten)] pub thread: Channel, + #[serde(skip)] + pub json: String, } impl WebSocketEvent for ThreadUpdate {} +impl UpdateMessage for ThreadUpdate { + fn id(&self) -> Option { + Some(self.thread.id) + } +} + #[derive(Debug, Default, Deserialize, Serialize, Clone)] /// See pub struct ThreadDelete {