diff --git a/src/gateway.rs b/src/gateway.rs index 90bcff5..c11b5ee 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -492,6 +492,10 @@ impl Gateway { "USER_UPDATE" => { let new_data: types::UserUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); self.events.lock().await.user.update.update_data(new_data).await; + }, + "USER_GUILD_SETTINGS_UPDATE" => { + let new_data: types::UserGuildSettingsUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events.lock().await.user.guild_settings_update.update_data(new_data).await; } "VOICE_STATE_UPDATE" => { let new_data: types::VoiceStateUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); @@ -781,6 +785,7 @@ mod events { #[derive(Default, Debug)] pub struct User { pub update: GatewayEvent, + pub guild_settings_update: GatewayEvent, pub presence_update: GatewayEvent, pub typing_start_event: GatewayEvent, } diff --git a/src/types/entities/channel.rs b/src/types/entities/channel.rs index a0c2bcb..377ef93 100644 --- a/src/types/entities/channel.rs +++ b/src/types/entities/channel.rs @@ -12,7 +12,7 @@ use crate::types::{ #[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))] pub struct Channel { pub id: Snowflake, - pub created_at: chrono::DateTime, + pub created_at: Option>, #[serde(rename = "type")] pub channel_type: ChannelType, pub guild_id: Option, diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index c79ee1d..9960fe6 100644 --- a/src/types/entities/guild.rs +++ b/src/types/entities/guild.rs @@ -19,7 +19,7 @@ pub struct Guild { pub splash: Option, pub discovery_splash: Option, #[cfg_attr(feature = "sqlx", sqlx(skip))] - pub owner: bool, // True if requesting user is owner + pub owner: Option, // True if requesting user is owner pub owner_id: Option, pub permissions: Option, pub afk_channel_id: Option, diff --git a/src/types/entities/guild_member.rs b/src/types/entities/guild_member.rs index 5e1ebfa..6123199 100644 --- a/src/types/entities/guild_member.rs +++ b/src/types/entities/guild_member.rs @@ -1,10 +1,10 @@ use serde::{Deserialize, Serialize}; -use crate::types::entities::User; +use crate::types::entities::PublicUser; #[derive(Debug, Deserialize, Default, Serialize, Clone, PartialEq, Eq)] pub struct GuildMember { - pub user: Option, + pub user: Option, pub nick: Option, pub avatar: Option, pub roles: Vec, diff --git a/src/types/entities/message.rs b/src/types/entities/message.rs index 484a575..c6ff6e5 100644 --- a/src/types/entities/message.rs +++ b/src/types/entities/message.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::types::{ entities::{ Application, Attachment, Channel, Emoji, GuildMember, RoleSubscriptionData, Sticker, - StickerItem, User, + StickerItem, User, PublicUser }, utils::Snowflake, }; @@ -14,7 +14,7 @@ pub struct Message { pub id: Snowflake, pub channel_id: Snowflake, #[cfg_attr(feature = "sqlx", sqlx(skip))] - pub author: User, + pub author: PublicUser, pub content: String, pub timestamp: String, pub edited_timestamp: Option, diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index f6bf5c0..bb3b0eb 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -42,11 +42,11 @@ pub struct User { #[serde(deserialize_with = "deserialize_option_number_from_string")] flags: Option, pub premium_since: Option>, - pub premium_type: u8, + pub premium_type: Option, pub pronouns: Option, pub public_flags: Option, pub banner: Option, - pub bio: String, + pub bio: Option, pub theme_colors: Option>, pub phone: Option, pub nsfw_allowed: bool, @@ -56,19 +56,19 @@ pub struct User { pub disabled: Option, } -#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct PublicUser { pub id: Snowflake, - pub username: String, - pub discriminator: String, + pub username: Option, + pub discriminator: Option, pub avatar: Option, pub accent_color: Option, pub banner: Option, pub theme_colors: Option>, pub pronouns: Option, pub bot: Option, - pub bio: String, - pub premium_type: u8, + pub bio: Option, + pub premium_type: Option, pub premium_since: Option>, pub public_flags: Option, } @@ -77,8 +77,8 @@ impl From for PublicUser { fn from(value: User) -> Self { Self { id: value.id, - username: value.username, - discriminator: value.discriminator, + username: Some(value.username), + discriminator: Some(value.discriminator), avatar: value.avatar, accent_color: value.accent_color, banner: value.banner, diff --git a/src/types/events/guild.rs b/src/types/events/guild.rs index 6ddd95d..3bd81fd 100644 --- a/src/types/events/guild.rs +++ b/src/types/events/guild.rs @@ -1,4 +1,4 @@ -use crate::types::entities::{Guild, UnavailableGuild, User}; +use crate::types::entities::{Guild, UnavailableGuild, PublicUser}; use crate::types::events::WebSocketEvent; use crate::types::{AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, RoleObject, Sticker}; use chrono::{DateTime, Utc}; @@ -32,7 +32,7 @@ impl WebSocketEvent for GuildCreate {} /// 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: User, + pub user: PublicUser, } impl WebSocketEvent for GuildBanAdd {} @@ -41,7 +41,7 @@ impl WebSocketEvent for GuildBanAdd {} /// See https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove pub struct GuildBanRemove { pub guild_id: String, - pub user: User, + pub user: PublicUser, } impl WebSocketEvent for GuildBanRemove {} @@ -113,7 +113,7 @@ impl WebSocketEvent for GuildMemberAdd {} /// See https://discord.com/developers/docs/topics/gateway-events#guild-member-remove pub struct GuildMemberRemove { pub guild_id: String, - pub user: User, + pub user: PublicUser, } impl WebSocketEvent for GuildMemberRemove {} @@ -123,7 +123,7 @@ impl WebSocketEvent for GuildMemberRemove {} pub struct GuildMemberUpdate { pub guild_id: String, pub roles: Vec, - pub user: User, + pub user: PublicUser, pub nick: Option, pub avatar: Option, pub joined_at: Option>, diff --git a/src/types/events/message.rs b/src/types/events/message.rs index 758deff..24eb0fa 100644 --- a/src/types/events/message.rs +++ b/src/types/events/message.rs @@ -145,7 +145,9 @@ pub struct MessageACK { /// ? pub version: u16, pub message_id: String, - pub last_viewed: Option>, + /// This is an integer??? + /// Not even unix, see '3070'??? + pub last_viewed: Option, /// What flags? pub flags: Option, pub channel_id: String, diff --git a/src/types/events/thread.rs b/src/types/events/thread.rs index a02a148..102a754 100644 --- a/src/types/events/thread.rs +++ b/src/types/events/thread.rs @@ -35,7 +35,7 @@ pub struct ThreadListSync { pub guild_id: String, pub channel_ids: Option>, pub threads: Vec, - pub members: Vec, + pub members: Option>, } impl WebSocketEvent for ThreadListSync {} diff --git a/src/types/events/user.rs b/src/types/events/user.rs index bd90771..6a0ddce 100644 --- a/src/types/events/user.rs +++ b/src/types/events/user.rs @@ -1,12 +1,54 @@ -use crate::types::entities::User; +use crate::types::entities::PublicUser; use crate::types::events::WebSocketEvent; +use crate::types::utils::Snowflake; use serde::{Deserialize, Serialize}; #[derive(Debug, Default, Deserialize, Serialize)] /// See https://discord.com/developers/docs/topics/gateway-events#user-update pub struct UserUpdate { #[serde(flatten)] - pub user: User, + pub user: PublicUser, } impl WebSocketEvent for UserUpdate {} + +#[derive(Debug, Default, Deserialize, Serialize)] +/// Undocumented +/// +/// Possibly an update for muted guild / channel settings for the current user +/// +/// {"version":2,"suppress_roles":false,"suppress_everyone":false,"notify_highlights":0,"muted":false,"mute_scheduled_events":false,"mute_config":null,"mobile_push":true,"message_notifications":1,"hide_muted_channels":false,"guild_id":"848582562217590824","flags":0,"channel_overrides":[{"muted":false,"mute_config":null,"message_notifications":3,"flags":4096,"collapsed":false,"channel_id":"1042689182893604885"}]} +pub struct UserGuildSettingsUpdate { + pub version: u8, + pub suppress_roles: bool, + pub suppress_everyone: bool, + pub notify_highlights: u8, + pub muted: bool, + pub mute_scheduled_events: bool, + /// ?? + pub mute_config: Option, + pub mobile_push: bool, + pub message_notifications: u8, + pub hide_muted_channels: bool, + pub guild_id: Snowflake, + pub flags: i32, + pub channel_overrides: Vec +} + +impl WebSocketEvent for UserGuildSettingsUpdate {} + +#[derive(Debug, Default, Deserialize, Serialize)] +/// Undocumented +/// +/// Received in [UserGuildSettingsUpdate] +/// +/// {"muted":false,"mute_config":null,"message_notifications":3,"flags":4096,"collapsed":false,"channel_id":"1042689182893604885"} +pub struct UserGuildSettingsChannelOverride { + pub muted: bool, + /// ?? + pub mute_config: Option, + pub message_notifications: u8, + pub flags: i32, + pub collapsed: bool, + pub channel_id: Snowflake, +} \ No newline at end of file