From a8496548d9fd41434cae8a0a130062517202e2f6 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 3 Sep 2023 21:00:48 +0200 Subject: [PATCH] Add source url field trait --- Cargo.lock | 72 +++++++++++++++-------------- Cargo.toml | 2 +- chorus-macros/Cargo.toml | 2 +- chorus-macros/src/lib.rs | 19 ++++++++ src/gateway.rs | 5 +- src/types/events/auto_moderation.rs | 8 ++-- src/types/events/channel.rs | 16 +++++-- src/types/events/guild.rs | 24 ++++++++-- src/types/events/mod.rs | 7 ++- src/types/events/thread.rs | 8 ++-- 10 files changed, 108 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a78751..df89f42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,7 +67,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -211,11 +211,13 @@ dependencies = [ [[package]] name = "chorus-macros" -version = "0.1.0" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a81545a60b926f815517dadbbd40cd502294ae2baea25fa8194d854d607512b0" dependencies = [ "async-trait", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -345,7 +347,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -356,7 +358,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -581,7 +583,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1032,9 +1034,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.2" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "mime" @@ -1183,9 +1185,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -1219,7 +1221,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1310,7 +1312,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1354,9 +1356,9 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "poem" -version = "1.3.57" +version = "1.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d92c532a37a9e98c0e9a0411e6852b8acccf9ec07d5e6e450b01cbf947d90b" +checksum = "ebc7ae19f3e791ae8108b08801abb3708d64d3a16490c720e0b81040cae87b5d" dependencies = [ "async-trait", "bytes", @@ -1383,14 +1385,14 @@ dependencies = [ [[package]] name = "poem-derive" -version = "1.3.57" +version = "1.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5dd58846a1f582215370384c3090c62c9ef188e9d798ffc67ea90d0a1a8a3b8" +checksum = "2550a0bce7273b278894ef3ccc5a6869e7031b6870042f3cc6826ed9faa980a6" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1468,9 +1470,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", @@ -1480,9 +1482,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", @@ -1682,7 +1684,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1704,7 +1706,7 @@ checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1745,7 +1747,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2109,9 +2111,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -2133,22 +2135,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2232,7 +2234,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2337,7 +2339,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2515,7 +2517,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", "wasm-bindgen-shared", ] @@ -2549,7 +2551,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index b8de308..42a5130 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,7 +50,7 @@ thiserror = "1.0.47" jsonwebtoken = "8.3.0" log = "0.4.20" async-trait = "0.1.73" -chorus-macros = { path = "chorus-macros", version = "0.1.0" } +chorus-macros = "0.2.0" [dev-dependencies] tokio = { version = "1.32.0", features = ["full"] } diff --git a/chorus-macros/Cargo.toml b/chorus-macros/Cargo.toml index 098159f..272d99f 100644 --- a/chorus-macros/Cargo.toml +++ b/chorus-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chorus-macros" -version = "0.1.0" +version = "0.2.0" edition = "2021" license = "AGPL-3.0" description = "Macros for the chorus crate." diff --git a/chorus-macros/src/lib.rs b/chorus-macros/src/lib.rs index f825568..fd68df0 100644 --- a/chorus-macros/src/lib.rs +++ b/chorus-macros/src/lib.rs @@ -37,6 +37,25 @@ pub fn jsonfield_macro_derive(input: TokenStream) -> TokenStream { .into() } +#[proc_macro_derive(SourceUrlField)] +pub fn source_url_macro_derive(input: TokenStream) -> TokenStream { + let ast: syn::DeriveInput = syn::parse(input).unwrap(); + + let name = &ast.ident; + // No need for macro hygiene, we're only using this in chorus + quote! { + impl SourceUrlField for #name { + fn get_source_url(&self) -> String { + self.source_url.clone() + } + fn set_source_url(&mut self, url: String) { + self.source_url = url; + } + } + } + .into() +} + #[proc_macro_attribute] pub fn observe_option(_args: TokenStream, input: TokenStream) -> TokenStream { input diff --git a/src/gateway.rs b/src/gateway.rs index 1eac899..25072e4 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -5,7 +5,7 @@ use crate::gateway::events::Events; use crate::types::{ self, AutoModerationRule, AutoModerationRuleUpdate, Channel, ChannelCreate, ChannelDelete, ChannelUpdate, Composite, Guild, GuildRoleCreate, GuildRoleUpdate, JsonField, RoleObject, - Snowflake, ThreadUpdate, UpdateMessage, WebSocketEvent, + Snowflake, SourceUrlField, ThreadUpdate, UpdateMessage, WebSocketEvent, }; use async_trait::async_trait; use std::any::Any; @@ -343,6 +343,7 @@ pub struct Gateway { websocket_receive: SplitStream>>, kill_send: tokio::sync::broadcast::Sender<()>, store: Arc>>>>, + url: String, } impl Gateway { @@ -406,6 +407,7 @@ impl Gateway { websocket_receive, kill_send: kill_send.clone(), store: store.clone(), + url: websocket_url.clone(), }; // Now we can continuously check for messages in a different task, since we aren't going to receive another hello @@ -534,6 +536,7 @@ impl Gateway { let downcasted = unsafe { Arc::from_raw(ptr as *const RwLock<$update_type>).clone() }; drop(inner_object); message.set_json(json.to_string()); + message.set_source_url(self.url.clone()); message.update(downcasted.clone()); } else { warn!("Received {} for {}, but it has been observed to be a different type!", $name, id) diff --git a/src/types/events/auto_moderation.rs b/src/types/events/auto_moderation.rs index 2764ebf..2a2eb6b 100644 --- a/src/types/events/auto_moderation.rs +++ b/src/types/events/auto_moderation.rs @@ -1,5 +1,5 @@ -use crate::types::JsonField; -use chorus_macros::JsonField; +use crate::types::{JsonField, SourceUrlField}; +use chorus_macros::{JsonField, SourceUrlField}; use serde::{Deserialize, Serialize}; use crate::types::{ @@ -19,13 +19,15 @@ pub struct AutoModerationRuleCreate { impl WebSocketEvent for AutoModerationRuleCreate {} -#[derive(Debug, Deserialize, Serialize, Default, Clone, JsonField)] +#[derive(Debug, Deserialize, Serialize, Default, Clone, JsonField, SourceUrlField)] /// See pub struct AutoModerationRuleUpdate { #[serde(flatten)] pub rule: AutoModerationRule, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } #[cfg(feature = "client")] diff --git a/src/types/events/channel.rs b/src/types/events/channel.rs index 6156c33..001be0e 100644 --- a/src/types/events/channel.rs +++ b/src/types/events/channel.rs @@ -1,6 +1,6 @@ use crate::types::events::WebSocketEvent; -use crate::types::{entities::Channel, JsonField, Snowflake}; -use chorus_macros::JsonField; +use crate::types::{entities::Channel, JsonField, Snowflake, SourceUrlField}; +use chorus_macros::{JsonField, SourceUrlField}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; @@ -23,13 +23,15 @@ pub struct ChannelPinsUpdate { impl WebSocketEvent for ChannelPinsUpdate {} -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField, SourceUrlField)] /// See pub struct ChannelCreate { #[serde(flatten)] pub channel: Channel, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } impl WebSocketEvent for ChannelCreate {} @@ -51,13 +53,15 @@ impl UpdateMessage for ChannelCreate { } } -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField, SourceUrlField)] /// See pub struct ChannelUpdate { #[serde(flatten)] pub channel: Channel, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } impl WebSocketEvent for ChannelUpdate {} @@ -93,13 +97,15 @@ pub struct ChannelUnreadUpdateObject { impl WebSocketEvent for ChannelUnreadUpdate {} -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField, SourceUrlField)] /// See pub struct ChannelDelete { #[serde(flatten)] pub channel: Channel, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } #[cfg(feature = "client")] diff --git a/src/types/events/guild.rs b/src/types/events/guild.rs index 8225961..b0126c6 100644 --- a/src/types/events/guild.rs +++ b/src/types/events/guild.rs @@ -1,4 +1,4 @@ -use chorus_macros::JsonField; +use chorus_macros::{JsonField, SourceUrlField}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; @@ -6,7 +6,7 @@ use crate::types::entities::{Guild, PublicUser, UnavailableGuild}; use crate::types::events::WebSocketEvent; use crate::types::{ AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, JsonField, RoleObject, Snowflake, - Sticker, + SourceUrlField, Sticker, }; use super::PresenceUpdate; @@ -60,16 +60,26 @@ pub struct GuildBanRemove { impl WebSocketEvent for GuildBanRemove {} -#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, SourceUrlField, JsonField)] /// See ; /// Received to give info about a guild being updated; pub struct GuildUpdate { #[serde(flatten)] pub guild: Guild, + #[serde(skip)] + pub source_url: String, + #[serde(skip)] + pub json: String, } impl WebSocketEvent for GuildUpdate {} +impl UpdateMessage for GuildUpdate { + fn id(&self) -> Option { + Some(self.guild.id) + } +} + #[derive(Debug, Default, Deserialize, Serialize, Clone)] /// See ; /// Received to tell the client about a guild being deleted; @@ -171,13 +181,15 @@ pub struct GuildMembersChunk { impl WebSocketEvent for GuildMembersChunk {} -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField, SourceUrlField)] /// See pub struct GuildRoleCreate { pub guild_id: Snowflake, pub role: RoleObject, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } impl WebSocketEvent for GuildRoleCreate {} @@ -202,13 +214,15 @@ impl UpdateMessage for GuildRoleCreate { } } -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField, SourceUrlField)] /// See pub struct GuildRoleUpdate { pub guild_id: Snowflake, pub role: RoleObject, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } impl WebSocketEvent for GuildRoleUpdate {} diff --git a/src/types/events/mod.rs b/src/types/events/mod.rs index 4e213a1..2bca363 100644 --- a/src/types/events/mod.rs +++ b/src/types/events/mod.rs @@ -127,7 +127,7 @@ impl<'a> WebSocketEvent for GatewayReceivePayload<'a> {} /// This would imply, that the [`WebSocketEvent`] "[`ChannelUpdate`]" contains new/updated information /// about a [`Channel`]. The update method describes how this new information will be turned into /// a [`Channel`] object. -pub(crate) trait UpdateMessage: Clone + JsonField +pub(crate) trait UpdateMessage: Clone + JsonField + SourceUrlField where T: Updateable + Serialize + DeserializeOwned + Clone, { @@ -142,6 +142,11 @@ pub(crate) trait JsonField: Clone { fn get_json(&self) -> String; } +pub trait SourceUrlField: Clone { + fn set_source_url(&mut self, url: String); + fn get_source_url(&self) -> String; +} + #[cfg(feature = "client")] /// Only applicable for events where the Update struct is the same as the Entity struct pub(crate) fn update_object( diff --git a/src/types/events/thread.rs b/src/types/events/thread.rs index 5995c19..cff5f6f 100644 --- a/src/types/events/thread.rs +++ b/src/types/events/thread.rs @@ -1,9 +1,9 @@ -use chorus_macros::JsonField; +use chorus_macros::{JsonField, SourceUrlField}; use serde::{Deserialize, Serialize}; use crate::types::entities::{Channel, ThreadMember}; use crate::types::events::WebSocketEvent; -use crate::types::{JsonField, Snowflake}; +use crate::types::{JsonField, Snowflake, SourceUrlField}; #[cfg(feature = "client")] use super::UpdateMessage; @@ -17,13 +17,15 @@ pub struct ThreadCreate { impl WebSocketEvent for ThreadCreate {} -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField, SourceUrlField)] /// See pub struct ThreadUpdate { #[serde(flatten)] pub thread: Channel, #[serde(skip)] pub json: String, + #[serde(skip)] + pub source_url: String, } impl WebSocketEvent for ThreadUpdate {}