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 e641ab0bbd
commit 1930229a90
2 changed files with 118 additions and 24 deletions

View File

@ -9,7 +9,7 @@ use std::collections::HashMap;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
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};
@ -290,7 +290,7 @@ pub struct RoleObject {
//pub tags: Option<RoleTags>
}
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, Hash)]
pub struct UserObject {
pub id: String,
username: String,
@ -305,18 +305,18 @@ pub struct UserObject {
email: Option<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,
#[serde(deserialize_with = "deserialize_option_number_from_string")]
flags: Option<i32>,
premium_since: Option<String>,
premium_type: i8,
premium_type: Option<i8>,
pronouns: Option<String>,
public_flags: Option<i8>,
public_flags: Option<i32>,
banner: Option<String>,
bio: String,
bio: Option<String>,
theme_colors: Option<Vec<i32>>,
phone: Option<String>,
nsfw_allowed: bool,
premium: bool,
nsfw_allowed: Option<bool>,
premium: Option<bool>,
purchased_flags: Option<i32>,
premium_usage_flags: Option<i32>,
disabled: Option<bool>,
@ -398,12 +398,43 @@ pub struct Message {
}
#[derive(Debug, Serialize, Deserialize, Default)]
/// See https://discord.com/developers/docs/topics/gateway-events#message-create
pub struct MessageCreate {
#[serde(flatten)]
message: Message,
guild_id: Option<String>,
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 {}
@ -700,17 +731,17 @@ pub struct MessageInteraction {
pub member: Option<GuildMember>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[derive(Debug, Deserialize, Serialize, Clone, Default)]
pub struct GuildMember {
pub user: Option<UserObject>,
pub nick: Option<String>,
pub avatar: Option<String>,
pub roles: Vec<String>,
pub roles: Vec<RoleObject>,
pub joined_at: String,
pub premium_since: Option<String>,
pub deaf: bool,
pub mute: bool,
pub flags: i32,
pub flags: Option<i32>,
pub pending: Option<bool>,
pub permissions: Option<String>,
pub communication_disabled_until: Option<String>,
@ -924,7 +955,15 @@ pub struct GatewayIdentifyPayload {
pub shard: Option<Vec<(i32, i32)>>,
#[serde(skip_serializing_if = "Option::is_none")]
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 {}
@ -1031,6 +1070,55 @@ pub struct 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)]
/// See https://discord.com/developers/docs/topics/gateway-events#request-guild-members-request-guild-members-structure
pub struct GatewayRequestGuildMembers {

View File

@ -187,11 +187,7 @@ impl Gateway {
return;
}
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.to_text().unwrap()).unwrap();
// See https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes
match gateway_payload.op {
@ -205,8 +201,12 @@ impl Gateway {
// See https://discord.com/developers/docs/topics/gateway-events#receive-events
match gateway_payload_t.as_str() {
"READY" => {
let data: GatewayReady = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
println!("{:?}", data);
let new_data: GatewayReady = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
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" => {}
"APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {}
@ -267,7 +267,7 @@ impl Gateway {
self.events.lock().await.thread.members_update.update_data(new_data).await;
}
"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;
}
"GUILD_UPDATE" => {
@ -361,8 +361,7 @@ impl Gateway {
self.events.lock().await.user.typing_start_event.update_data(new_data).await;
}
"USER_UPDATE" => {
let user: UserObject = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
let new_data = UserUpdate {user};
let new_data: UserUpdate = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
self.events.lock().await.user.update.update_data(new_data).await;
}
"VOICE_STATE_UPDATE" => {}
@ -554,6 +553,7 @@ mod events {
use super::*;
#[derive(Default, Debug)]
pub struct Events {
pub ready: Ready,
pub message: Message,
pub user: User,
pub channel: Channel,
@ -564,6 +564,12 @@ mod events {
pub gateway_resume: GatewayEvent<GatewayResume>,
}
#[derive(Default, Debug)]
pub struct Ready {
pub ready: GatewayEvent<GatewayReady>,
pub ready_supplimental: GatewayEvent<GatewayReadySupplemental>
}
#[derive(Default, Debug)]
pub struct Message {
pub create: GatewayEvent<MessageCreate>,