Add more events, fix deserialization errors

This commit is contained in:
kozabrada123 2023-05-14 08:20:25 +02:00
parent f4192840ee
commit 262cd0e780
3 changed files with 92 additions and 17 deletions

View File

@ -8,6 +8,7 @@ edition = "2021"
tokio = {version = "1.27.0", features = ["rt", "macros", "rt-multi-thread"]} tokio = {version = "1.27.0", features = ["rt", "macros", "rt-multi-thread"]}
serde = {version = "1.0.159", features = ["derive"]} serde = {version = "1.0.159", features = ["derive"]}
serde_json = "1.0.95" serde_json = "1.0.95"
serde-aux = "4.2.0"
reqwest = {version = "0.11.16", features = ["multipart"]} reqwest = {version = "0.11.16", features = ["multipart"]}
url = "2.3.1" url = "2.3.1"
chrono = {version = "0.4.24", features = ["serde"]} chrono = {version = "0.4.24", features = ["serde"]}

View File

@ -7,6 +7,7 @@ I do not feel like re-documenting all of this, as everything is already perfectl
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::from_value; use serde_json::from_value;
use serde_aux::field_attributes::{deserialize_number_from_string};
use crate::{api::limits::Limits, instance::Instance}; use crate::{api::limits::Limits, instance::Instance};
@ -293,14 +294,17 @@ pub struct UserObject {
username: String, username: String,
discriminator: String, discriminator: String,
avatar: Option<String>, avatar: Option<String>,
bot: bool, bot: Option<bool>,
system: Option<bool>, system: Option<bool>,
mfa_enabled: Option<bool>, mfa_enabled: Option<bool>,
accent_color: Option<String>, accent_color: Option<String>,
locale: Option<String>, locale: Option<String>,
verified: Option<bool>, verified: Option<bool>,
email: Option<String>, email: Option<String>,
flags: String, /// This field comes as either a string or a number as a string
/// So we need to account for that
#[serde(deserialize_with = "deserialize_number_from_string")]
flags: i32,
premium_since: Option<String>, premium_since: Option<String>,
premium_type: i8, premium_type: i8,
pronouns: Option<String>, pronouns: Option<String>,
@ -311,8 +315,8 @@ pub struct UserObject {
phone: Option<String>, phone: Option<String>,
nsfw_allowed: bool, nsfw_allowed: bool,
premium: bool, premium: bool,
purchased_flags: i32, purchased_flags: Option<i32>,
premium_usage_flags: i32, premium_usage_flags: Option<i32>,
disabled: Option<bool>, disabled: Option<bool>,
} }
@ -910,9 +914,13 @@ impl WebSocketEvent for TypingStartEvent {}
pub struct GatewayIdentifyPayload { pub struct GatewayIdentifyPayload {
pub token: String, pub token: String,
pub properties: GatewayIdentifyConnectionProps, pub properties: GatewayIdentifyConnectionProps,
#[serde(skip_serializing_if = "Option::is_none")]
pub compress: Option<bool>, pub compress: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub large_threshold: Option<i16>, //default: 50 pub large_threshold: Option<i16>, //default: 50
#[serde(skip_serializing_if = "Option::is_none")]
pub shard: Option<Vec<(i32, i32)>>, pub shard: Option<Vec<(i32, i32)>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presence: Option<PresenceUpdate>, pub presence: Option<PresenceUpdate>,
pub intents: i32, pub intents: i32,
} }
@ -1232,6 +1240,48 @@ impl Default for GuildCreateDataOption {
} }
impl WebSocketEvent for GuildCreate {} impl WebSocketEvent for GuildCreate {}
#[derive(Debug, Default, Deserialize, Serialize)]
/// See https://discord.com/developers/docs/topics/gateway-events#guild-update
/// Not directly serialized, as the inner payload is a guild object
pub struct GuildUpdate {
pub guild: Guild
}
impl WebSocketEvent for GuildUpdate {}
#[derive(Debug, Default, Deserialize, Serialize)]
/// See https://discord.com/developers/docs/topics/gateway-events#guild-delete
/// Not directly serialized, as the inner payload is an unavailable guild object
pub struct GuildDelete {
pub guild: UnavailableGuild
}
impl WebSocketEvent for GuildDelete {}
#[derive(Debug, Default, Deserialize, Serialize)]
/// See https://discord.com/developers/docs/topics/gateway-events#guild-emojis-update
pub struct GuildEmojisUpdate {
pub guild_id: String,
pub emojis: Vec<Emoji>
}
impl WebSocketEvent for GuildEmojisUpdate {}
#[derive(Debug, Deserialize, Serialize, Default)]
/// Undocumented
/// {"t":"CALL_CREATE","s":2,"op":0,"d":{"voice_states":[],"ringing":[],"region":"milan","message_id":"1107187514906775613","embedded_activities":[],"channel_id":"837609115475771392"}}
pub struct CallCreate {
pub voice_states: Vec<VoiceStateObject>,
/// What is this?
pub ringing: Vec<serde_json::Value>,
pub region: String, // milan
pub message_id: String,
/// What is this?
pub embedded_activities: Vec<serde_json::Value>,
pub channel_id: String,
}
impl WebSocketEvent for CallCreate {}
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
pub struct GatewayPayload { pub struct GatewayPayload {
pub op: u8, pub op: u8,

View File

@ -169,6 +169,8 @@ impl Gateway {
let msg_string = msg.to_string(); let msg_string = msg.to_string();
println!("{}", &msg_string);
let gateway_payload: GatewayPayload = serde_json::from_str(&msg_string).unwrap(); let gateway_payload: GatewayPayload = serde_json::from_str(&msg_string).unwrap();
// See https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes // See https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes
@ -183,7 +185,8 @@ impl Gateway {
// See https://discord.com/developers/docs/topics/gateway-events#receive-events // See https://discord.com/developers/docs/topics/gateway-events#receive-events
match gateway_payload_t.as_str() { match gateway_payload_t.as_str() {
"READY" => { "READY" => {
let _data: GatewayReady = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); let data: GatewayReady = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
println!("{:?}", data);
} }
"RESUMED" => {} "RESUMED" => {}
"APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {} "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {}
@ -210,6 +213,10 @@ impl Gateway {
let new_data: ChannelPinsUpdate = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); let new_data: ChannelPinsUpdate = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.channel.pins_update.update_data(new_data).await; self.events.lock().await.channel.pins_update.update_data(new_data).await;
} }
"CALL_CREATE" => {
let new_data: CallCreate = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.call.create.update_data(new_data).await;
}
"THREAD_CREATE" => { "THREAD_CREATE" => {
let thread: Channel = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); let thread: Channel = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
let new_data = ThreadCreate {thread}; let new_data = ThreadCreate {thread};
@ -241,18 +248,29 @@ impl Gateway {
let new_data: GuildCreate = serde_json::from_str(&msg_string).unwrap(); let new_data: GuildCreate = serde_json::from_str(&msg_string).unwrap();
self.events.lock().await.guild.create.update_data(new_data).await; self.events.lock().await.guild.create.update_data(new_data).await;
} }
"GUILD_UPDATE" => {} "GUILD_UPDATE" => {
let guild: Guild = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
let new_data = GuildUpdate {guild};
self.events.lock().await.guild.update.update_data(new_data).await;
}
"GUILD_DELETE" => { "GUILD_DELETE" => {
let _new_data: UnavailableGuild = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); let guild: UnavailableGuild = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
let new_data = GuildDelete {guild};
self.events.lock().await.guild.delete.update_data(new_data).await;
} }
"GUILD_AUDIT_LOG_ENTRY_CREATE" => {} "GUILD_AUDIT_LOG_ENTRY_CREATE" => {}
"GUILD_BAN_ADD" => { "GUILD_BAN_ADD" => {
let _new_data: GuildBanAdd = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); let new_data: GuildBanAdd = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.guild.ban_add.update_data(new_data).await;
} }
"GUILD_BAN_REMOVE" => { "GUILD_BAN_REMOVE" => {
let _new_data: GuildBanRemove = serde_json::from_value(gateway_payload.d.unwrap()).unwrap(); let new_data: GuildBanRemove = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.guild.ban_remove.update_data(new_data).await;
}
"GUILD_EMOJIS_UPDATE" => {
let new_data: GuildEmojisUpdate = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.guild.emojis_update.update_data(new_data).await;
} }
"GUILD_EMOJIS_UPDATE" => {}
"GUILD_STICKERS_UPDATE" => {} "GUILD_STICKERS_UPDATE" => {}
"GUILD_INTEGRATIONS_UPDATE" => {} "GUILD_INTEGRATIONS_UPDATE" => {}
"GUILD_MEMBER_ADD" => {} "GUILD_MEMBER_ADD" => {}
@ -517,6 +535,7 @@ mod events {
pub channel: Channel, pub channel: Channel,
pub thread: Thread, pub thread: Thread,
pub guild: Guild, pub guild: Guild,
pub call: Call,
pub gateway_identify_payload: GatewayEvent<GatewayIdentifyPayload>, pub gateway_identify_payload: GatewayEvent<GatewayIdentifyPayload>,
pub gateway_resume: GatewayEvent<GatewayResume>, pub gateway_resume: GatewayEvent<GatewayResume>,
} }
@ -561,13 +580,13 @@ mod events {
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Guild { pub struct Guild {
pub create: GatewayEvent<GuildCreate>, pub create: GatewayEvent<GuildCreate>,
/*pub update: GatewayEvent<ThreadCreate>, pub update: GatewayEvent<GuildUpdate>,
pub delete: GatewayEvent<ThreadCreate>, pub delete: GatewayEvent<GuildDelete>,
pub audit_log_entry_create: GatewayEvent<ThreadCreate>, //pub audit_log_entry_create: GatewayEvent<ThreadCreate>,
pub ban_add: GatewayEvent<ThreadCreate>, pub ban_add: GatewayEvent<GuildBanAdd>,
pub ban_remove: GatewayEvent<ThreadCreate>, pub ban_remove: GatewayEvent<GuildBanRemove>,
pub emojis_update: GatewayEvent<ThreadCreate>, pub emojis_update: GatewayEvent<GuildEmojisUpdate>,
pub stickers_update: GatewayEvent<ThreadCreate>, /*pub stickers_update: GatewayEvent<ThreadCreate>,
pub integrations_update: GatewayEvent<ThreadCreate>, pub integrations_update: GatewayEvent<ThreadCreate>,
pub member_add: GatewayEvent<ThreadCreate>, pub member_add: GatewayEvent<ThreadCreate>,
pub member_remove: GatewayEvent<ThreadCreate>, pub member_remove: GatewayEvent<ThreadCreate>,
@ -582,6 +601,11 @@ mod events {
pub role_scheduled_event_user_add: GatewayEvent<ThreadCreate>, pub role_scheduled_event_user_add: GatewayEvent<ThreadCreate>,
pub role_scheduled_event_user_remove: GatewayEvent<ThreadCreate>,*/ pub role_scheduled_event_user_remove: GatewayEvent<ThreadCreate>,*/
} }
#[derive(Default, Debug)]
pub struct Call {
pub create: GatewayEvent<CallCreate>
}
} }
#[cfg(test)] #[cfg(test)]