Add Readies to Events, try to fix msg_create error

This commit is contained in:
kozabrada123 2023-05-14 14:03:18 +02:00
parent 2209d967cd
commit 2ff5e4fd9d
2 changed files with 118 additions and 24 deletions

View File

@ -9,7 +9,7 @@ use std::collections::HashMap;
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 serde_aux::field_attributes::deserialize_option_number_from_string;
use crate::{api::limits::Limits, instance::Instance}; use crate::{api::limits::Limits, instance::Instance};
@ -290,7 +290,7 @@ pub struct RoleObject {
//pub tags: Option<RoleTags> //pub tags: Option<RoleTags>
} }
#[derive(Serialize, Deserialize, Debug, Default, Clone)] #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, Hash)]
pub struct UserObject { pub struct UserObject {
pub id: String, pub id: String,
username: String, username: String,
@ -305,18 +305,18 @@ pub struct UserObject {
email: Option<String>, email: Option<String>,
/// This field comes as either a string or a number as a string /// This field comes as either a string or a number as a string
/// So we need to account for that /// So we need to account for that
#[serde(deserialize_with = "deserialize_number_from_string")] #[serde(deserialize_with = "deserialize_option_number_from_string")]
flags: i32, flags: Option<i32>,
premium_since: Option<String>, premium_since: Option<String>,
premium_type: i8, premium_type: Option<i8>,
pronouns: Option<String>, pronouns: Option<String>,
public_flags: Option<i8>, public_flags: Option<i32>,
banner: Option<String>, banner: Option<String>,
bio: String, bio: Option<String>,
theme_colors: Option<Vec<i32>>, theme_colors: Option<Vec<i32>>,
phone: Option<String>, phone: Option<String>,
nsfw_allowed: bool, nsfw_allowed: Option<bool>,
premium: bool, premium: Option<bool>,
purchased_flags: Option<i32>, purchased_flags: Option<i32>,
premium_usage_flags: Option<i32>, premium_usage_flags: Option<i32>,
disabled: Option<bool>, disabled: Option<bool>,
@ -398,12 +398,43 @@ pub struct Message {
} }
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default)]
/// See https://discord.com/developers/docs/topics/gateway-events#message-create
pub struct MessageCreate { pub struct MessageCreate {
#[serde(flatten)] #[serde(flatten)]
message: Message, message: Message,
guild_id: Option<String>, guild_id: Option<String>,
member: Option<GuildMember>, member: Option<GuildMember>,
mentions: Vec<(UserObject, GuildMember)>, // Not sure if this is correct: https://discord.com/developers/docs/topics/gateway-events#message-create mentions: Vec<MessageCreateUser>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
/// See https://discord.com/developers/docs/topics/gateway-events#message-create-message-create-extra-fields
pub struct MessageCreateUser {
pub id: String,
username: String,
discriminator: String,
avatar: Option<String>,
bot: Option<bool>,
system: Option<bool>,
mfa_enabled: Option<bool>,
accent_color: Option<String>,
locale: Option<String>,
verified: Option<bool>,
email: Option<String>,
premium_since: Option<String>,
premium_type: Option<i8>,
pronouns: Option<String>,
public_flags: Option<i32>,
banner: Option<String>,
bio: Option<String>,
theme_colors: Option<Vec<i32>>,
phone: Option<String>,
nsfw_allowed: Option<bool>,
premium: Option<bool>,
purchased_flags: Option<i32>,
premium_usage_flags: Option<i32>,
disabled: Option<bool>,
member: GuildMember
} }
impl WebSocketEvent for MessageCreate {} impl WebSocketEvent for MessageCreate {}
@ -700,17 +731,17 @@ pub struct MessageInteraction {
pub member: Option<GuildMember>, pub member: Option<GuildMember>,
} }
#[derive(Debug, Deserialize, Serialize, Clone)] #[derive(Debug, Deserialize, Serialize, Clone, Default)]
pub struct GuildMember { pub struct GuildMember {
pub user: Option<UserObject>, pub user: Option<UserObject>,
pub nick: Option<String>, pub nick: Option<String>,
pub avatar: Option<String>, pub avatar: Option<String>,
pub roles: Vec<String>, pub roles: Vec<RoleObject>,
pub joined_at: String, pub joined_at: String,
pub premium_since: Option<String>, pub premium_since: Option<String>,
pub deaf: bool, pub deaf: bool,
pub mute: bool, pub mute: bool,
pub flags: i32, pub flags: Option<i32>,
pub pending: Option<bool>, pub pending: Option<bool>,
pub permissions: Option<String>, pub permissions: Option<String>,
pub communication_disabled_until: Option<String>, pub communication_disabled_until: Option<String>,
@ -924,7 +955,15 @@ pub struct GatewayIdentifyPayload {
pub shard: Option<Vec<(i32, i32)>>, pub shard: Option<Vec<(i32, i32)>>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub presence: Option<PresenceUpdate>, pub presence: Option<PresenceUpdate>,
pub intents: i32, pub capabilities: i32,
}
impl GatewayIdentifyPayload {
pub fn default_w_client_capabilities() -> Self {
let mut def = Self::default();
def.capabilities = 8189; // Default capabilities for a client
def
}
} }
impl WebSocketEvent for GatewayIdentifyPayload {} impl WebSocketEvent for GatewayIdentifyPayload {}
@ -1031,6 +1070,55 @@ pub struct GatewayReady {
impl WebSocketEvent for GatewayReady {} impl WebSocketEvent for GatewayReady {}
#[derive(Debug, Deserialize, Serialize, Default)]
/// Officially Undocumented
/// Sent after the READY event when a client has capabilities
/// {"t":"READY_SUPPLEMENTAL","s":2,"op":0,"d":{"merged_presences":{"guilds":[[{"user_id":"463640391196082177","status":"online","game":null,"client_status":{"web":"online"},"activities":[]}]],"friends":[{"user_id":"463640391196082177","status":"online","last_modified":1684053508443,"client_status":{"web":"online"},"activities":[]}]},"merged_members":[[{"user_id":"463640391196082177","roles":[],"premium_since":null,"pending":false,"nick":"pog","mute":false,"joined_at":"2021-05-30T15:24:08.763000+00:00","flags":0,"deaf":false,"communication_disabled_until":null,"avatar":null}]],"lazy_private_channels":[],"guilds":[{"voice_states":[],"id":"848582562217590824","embedded_activities":[]}],"disclose":["pomelo"]}}
pub struct GatewayReadySupplemental {
pub merged_presences: MergedPresences,
pub merged_members: Vec<Vec<GuildMember>>,
// ?
pub lazy_private_channels: Vec<serde_json::Value>,
pub guilds: Vec<SupplimentalGuild>,
// ? pomelo
pub disclose: Vec<String>,
}
impl WebSocketEvent for GatewayReadySupplemental {}
#[derive(Debug, Deserialize, Serialize, Default)]
pub struct MergedPresences {
pub guilds: Vec<Vec<MergedPresenceGuild>>,
pub friends: Vec<MergedPresenceFriend>
}
#[derive(Debug, Deserialize, Serialize, Default)]
pub struct MergedPresenceFriend {
pub user_id: String,
pub status: String,
/// Looks like ms??
pub last_modified: u128,
pub client_status: ClientStatusObject,
pub activities: Vec<Activity>
}
#[derive(Debug, Deserialize, Serialize, Default)]
pub struct MergedPresenceGuild {
pub user_id: String,
pub status: String,
// ?
pub game: Option<serde_json::Value>,
pub client_status: ClientStatusObject,
pub activities: Vec<Activity>
}
#[derive(Debug, Deserialize, Serialize, Default)]
pub struct SupplimentalGuild {
pub voice_states: Vec<VoiceStateObject>,
pub id: String,
pub embedded_activities: Vec<serde_json::Value>
}
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
/// See https://discord.com/developers/docs/topics/gateway-events#request-guild-members-request-guild-members-structure /// See https://discord.com/developers/docs/topics/gateway-events#request-guild-members-request-guild-members-structure
pub struct GatewayRequestGuildMembers { pub struct GatewayRequestGuildMembers {

View File

@ -187,11 +187,7 @@ impl Gateway {
return; return;
} }
let msg_string = msg.to_string(); let gateway_payload: GatewayPayload = serde_json::from_str(msg.to_text().unwrap()).unwrap();
println!("{}", &msg_string);
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
match gateway_payload.op { match gateway_payload.op {
@ -205,8 +201,12 @@ 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 new_data: GatewayReady = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
println!("{:?}", data); self.events.lock().await.ready.ready.update_data(new_data).await;
},
"READY_SUPPLEMENTAL" => {
let new_data: GatewayReadySupplemental = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.ready.ready_supplimental.update_data(new_data).await;
} }
"RESUMED" => {} "RESUMED" => {}
"APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {} "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {}
@ -267,7 +267,7 @@ impl Gateway {
self.events.lock().await.thread.members_update.update_data(new_data).await; self.events.lock().await.thread.members_update.update_data(new_data).await;
} }
"GUILD_CREATE" => { "GUILD_CREATE" => {
let new_data: GuildCreate = serde_json::from_str(&msg_string).unwrap(); let new_data: GuildCreate = serde_json::from_value(gateway_payload.d.unwrap()).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" => {
@ -361,8 +361,7 @@ impl Gateway {
self.events.lock().await.user.typing_start_event.update_data(new_data).await; 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 = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
let new_data = UserUpdate {user};
self.events.lock().await.user.update.update_data(new_data).await; self.events.lock().await.user.update.update_data(new_data).await;
} }
"VOICE_STATE_UPDATE" => {} "VOICE_STATE_UPDATE" => {}
@ -554,6 +553,7 @@ mod events {
use super::*; use super::*;
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Events { pub struct Events {
pub ready: Ready,
pub message: Message, pub message: Message,
pub user: User, pub user: User,
pub channel: Channel, pub channel: Channel,
@ -564,6 +564,12 @@ mod events {
pub gateway_resume: GatewayEvent<GatewayResume>, pub gateway_resume: GatewayEvent<GatewayResume>,
} }
#[derive(Default, Debug)]
pub struct Ready {
pub ready: GatewayEvent<GatewayReady>,
pub ready_supplimental: GatewayEvent<GatewayReadySupplemental>
}
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Message { pub struct Message {
pub create: GatewayEvent<MessageCreate>, pub create: GatewayEvent<MessageCreate>,