This commit is contained in:
kozabrada123 2023-05-28 14:52:48 +02:00
parent dfa047a9c5
commit a1a0c94e2d
4 changed files with 196 additions and 103 deletions

View File

@ -5,7 +5,6 @@ use futures_util::stream::SplitSink;
use futures_util::SinkExt; use futures_util::SinkExt;
use futures_util::StreamExt; use futures_util::StreamExt;
use native_tls::TlsConnector; use native_tls::TlsConnector;
use tokio::task::JoinHandle;
use std::sync::Arc; use std::sync::Arc;
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tokio::sync::mpsc; use tokio::sync::mpsc;
@ -13,6 +12,7 @@ use tokio::sync::mpsc::error::TryRecvError;
use tokio::sync::mpsc::Sender; use tokio::sync::mpsc::Sender;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use tokio::task; use tokio::task;
use tokio::task::JoinHandle;
use tokio::time; use tokio::time;
use tokio::time::Instant; use tokio::time::Instant;
use tokio_tungstenite::MaybeTlsStream; use tokio_tungstenite::MaybeTlsStream;
@ -24,45 +24,45 @@ const GATEWAY_DISPATCH: u8 = 0;
/// Opcode sent when sending a heartbeat /// Opcode sent when sending a heartbeat
const GATEWAY_HEARTBEAT: u8 = 1; const GATEWAY_HEARTBEAT: u8 = 1;
/// Opcode sent to initiate a session /// Opcode sent to initiate a session
/// ///
/// See [types::GatewayIdentifyPayload] /// See [types::GatewayIdentifyPayload]
const GATEWAY_IDENTIFY: u8 = 2; const GATEWAY_IDENTIFY: u8 = 2;
/// Opcode sent to update our presence /// Opcode sent to update our presence
/// ///
/// See [types::GatewayUpdatePresence] /// See [types::GatewayUpdatePresence]
const GATEWAY_UPDATE_PRESENCE: u8 = 3; const GATEWAY_UPDATE_PRESENCE: u8 = 3;
/// Opcode sent to update our state in vc /// Opcode sent to update our state in vc
/// ///
/// Like muting, deafening, leaving, joining.. /// Like muting, deafening, leaving, joining..
/// ///
/// See [types::UpdateVoiceState] /// See [types::UpdateVoiceState]
const GATEWAY_UPDATE_VOICE_STATE: u8 = 4; const GATEWAY_UPDATE_VOICE_STATE: u8 = 4;
/// Opcode sent to resume a session /// Opcode sent to resume a session
/// ///
/// See [types::GatewayResume] /// See [types::GatewayResume]
const GATEWAY_RESUME: u8 = 6; const GATEWAY_RESUME: u8 = 6;
/// Opcode received to tell the client to reconnect /// Opcode received to tell the client to reconnect
const GATEWAY_RECONNECT: u8 = 7; const GATEWAY_RECONNECT: u8 = 7;
/// Opcode sent to request guild member data /// Opcode sent to request guild member data
/// ///
/// See [types::GatewayRequestGuildMembers] /// See [types::GatewayRequestGuildMembers]
const GATEWAY_REQUEST_GUILD_MEMBERS: u8 = 8; const GATEWAY_REQUEST_GUILD_MEMBERS: u8 = 8;
/// Opcode received to tell the client their token / session is invalid /// Opcode received to tell the client their token / session is invalid
const GATEWAY_INVALID_SESSION: u8 = 9; const GATEWAY_INVALID_SESSION: u8 = 9;
/// Opcode received when initially connecting to the gateway, starts our heartbeat /// Opcode received when initially connecting to the gateway, starts our heartbeat
/// ///
/// See [types::HelloData] /// See [types::HelloData]
const GATEWAY_HELLO: u8 = 10; const GATEWAY_HELLO: u8 = 10;
/// Opcode received to acknowledge a heartbeat /// Opcode received to acknowledge a heartbeat
const GATEWAY_HEARTBEAT_ACK: u8 = 11; const GATEWAY_HEARTBEAT_ACK: u8 = 11;
/// Opcode sent to get the voice state of users in a given DM/group channel /// Opcode sent to get the voice state of users in a given DM/group channel
/// ///
/// See [types::CallSync] /// See [types::CallSync]
const GATEWAY_CALL_SYNC: u8 = 13; const GATEWAY_CALL_SYNC: u8 = 13;
/// Opcode sent to get data for a server (Lazy Loading request) /// Opcode sent to get data for a server (Lazy Loading request)
/// ///
/// Sent by the official client when switching to a server /// Sent by the official client when switching to a server
/// ///
/// See [types::LazyRequest] /// See [types::LazyRequest]
const GATEWAY_LAZY_REQUEST: u8 = 14; const GATEWAY_LAZY_REQUEST: u8 = 14;
@ -84,7 +84,7 @@ pub struct GatewayHandle {
>, >,
>, >,
>, >,
pub handle: JoinHandle<()> pub handle: JoinHandle<()>,
} }
impl GatewayHandle { impl GatewayHandle {
@ -100,7 +100,12 @@ impl GatewayHandle {
let message = tokio_tungstenite::tungstenite::Message::text(payload_json); let message = tokio_tungstenite::tungstenite::Message::text(payload_json);
self.websocket_send.lock().await.send(message).await.unwrap(); self.websocket_send
.lock()
.await
.send(message)
.await
.unwrap();
} }
/// Sends an identify event to the gateway /// Sends an identify event to the gateway
@ -127,7 +132,8 @@ impl GatewayHandle {
println!("GW: Sending Presence Update.."); println!("GW: Sending Presence Update..");
self.send_json_event(GATEWAY_UPDATE_PRESENCE, to_send_value).await; self.send_json_event(GATEWAY_UPDATE_PRESENCE, to_send_value)
.await;
} }
/// Sends a request guild members to the server /// Sends a request guild members to the server
@ -136,7 +142,8 @@ impl GatewayHandle {
println!("GW: Sending Request Guild Members.."); println!("GW: Sending Request Guild Members..");
self.send_json_event(GATEWAY_REQUEST_GUILD_MEMBERS, to_send_value).await; self.send_json_event(GATEWAY_REQUEST_GUILD_MEMBERS, to_send_value)
.await;
} }
/// Sends an update voice state to the server /// Sends an update voice state to the server
@ -145,7 +152,8 @@ impl GatewayHandle {
println!("GW: Sending Update Voice State.."); println!("GW: Sending Update Voice State..");
self.send_json_event(GATEWAY_UPDATE_VOICE_STATE, to_send_value).await; self.send_json_event(GATEWAY_UPDATE_VOICE_STATE, to_send_value)
.await;
} }
/// Sends a call sync to the server /// Sends a call sync to the server
@ -163,7 +171,8 @@ impl GatewayHandle {
println!("GW: Sending Lazy Request.."); println!("GW: Sending Lazy Request..");
self.send_json_event(GATEWAY_LAZY_REQUEST, to_send_value).await; self.send_json_event(GATEWAY_LAZY_REQUEST, to_send_value)
.await;
} }
} }
@ -277,7 +286,8 @@ impl Gateway {
match gateway_payload_t.as_str() { match gateway_payload_t.as_str() {
"READY" => { "READY" => {
let new_data: types::GatewayReady = let new_data: types::GatewayReady =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -288,7 +298,8 @@ impl Gateway {
} }
"READY_SUPPLEMENTAL" => { "READY_SUPPLEMENTAL" => {
let new_data: types::GatewayReadySupplemental = let new_data: types::GatewayReadySupplemental =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -300,7 +311,8 @@ impl Gateway {
"RESUMED" => {} "RESUMED" => {}
"APPLICATION_COMMAND_PERMISSIONS_UPDATE" => { "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {
let new_data: types::ApplicationCommandPermissionsUpdate = let new_data: types::ApplicationCommandPermissionsUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -311,7 +323,8 @@ impl Gateway {
} }
"AUTO_MODERATION_RULE_CREATE" => { "AUTO_MODERATION_RULE_CREATE" => {
let new_data: types::AutoModerationRuleCreate = let new_data: types::AutoModerationRuleCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -322,7 +335,8 @@ impl Gateway {
} }
"AUTO_MODERATION_RULE_UPDATE" => { "AUTO_MODERATION_RULE_UPDATE" => {
let new_data: types::AutoModerationRuleUpdate = let new_data: types::AutoModerationRuleUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -333,7 +347,8 @@ impl Gateway {
} }
"AUTO_MODERATION_RULE_DELETE" => { "AUTO_MODERATION_RULE_DELETE" => {
let new_data: types::AutoModerationRuleDelete = let new_data: types::AutoModerationRuleDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -344,7 +359,8 @@ impl Gateway {
} }
"AUTO_MODERATION_ACTION_EXECUTION" => { "AUTO_MODERATION_ACTION_EXECUTION" => {
let new_data: types::AutoModerationActionExecution = let new_data: types::AutoModerationActionExecution =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -355,7 +371,8 @@ impl Gateway {
} }
"CHANNEL_CREATE" => { "CHANNEL_CREATE" => {
let new_data: types::ChannelCreate = let new_data: types::ChannelCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -366,7 +383,8 @@ impl Gateway {
} }
"CHANNEL_UPDATE" => { "CHANNEL_UPDATE" => {
let new_data: types::ChannelUpdate = let new_data: types::ChannelUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -377,7 +395,8 @@ impl Gateway {
} }
"CHANNEL_UNREAD_UPDATE" => { "CHANNEL_UNREAD_UPDATE" => {
let new_data: types::ChannelUnreadUpdate = let new_data: types::ChannelUnreadUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -388,7 +407,8 @@ impl Gateway {
} }
"CHANNEL_DELETE" => { "CHANNEL_DELETE" => {
let new_data: types::ChannelDelete = let new_data: types::ChannelDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -399,7 +419,8 @@ impl Gateway {
} }
"CHANNEL_PINS_UPDATE" => { "CHANNEL_PINS_UPDATE" => {
let new_data: types::ChannelPinsUpdate = let new_data: types::ChannelPinsUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -410,7 +431,8 @@ impl Gateway {
} }
"CALL_CREATE" => { "CALL_CREATE" => {
let new_data: types::CallCreate = let new_data: types::CallCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -421,7 +443,8 @@ impl Gateway {
} }
"CALL_UPDATE" => { "CALL_UPDATE" => {
let new_data: types::CallUpdate = let new_data: types::CallUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -432,7 +455,8 @@ impl Gateway {
} }
"CALL_DELETE" => { "CALL_DELETE" => {
let new_data: types::CallDelete = let new_data: types::CallDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -443,7 +467,8 @@ impl Gateway {
} }
"THREAD_CREATE" => { "THREAD_CREATE" => {
let new_data: types::ThreadCreate = let new_data: types::ThreadCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -454,7 +479,8 @@ impl Gateway {
} }
"THREAD_UPDATE" => { "THREAD_UPDATE" => {
let new_data: types::ThreadUpdate = let new_data: types::ThreadUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -465,7 +491,8 @@ impl Gateway {
} }
"THREAD_DELETE" => { "THREAD_DELETE" => {
let new_data: types::ThreadDelete = let new_data: types::ThreadDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -476,7 +503,8 @@ impl Gateway {
} }
"THREAD_LIST_SYNC" => { "THREAD_LIST_SYNC" => {
let new_data: types::ThreadListSync = let new_data: types::ThreadListSync =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -487,7 +515,8 @@ impl Gateway {
} }
"THREAD_MEMBER_UPDATE" => { "THREAD_MEMBER_UPDATE" => {
let new_data: types::ThreadMemberUpdate = let new_data: types::ThreadMemberUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -498,7 +527,8 @@ impl Gateway {
} }
"THREAD_MEMBERS_UPDATE" => { "THREAD_MEMBERS_UPDATE" => {
let new_data: types::ThreadMembersUpdate = let new_data: types::ThreadMembersUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -509,7 +539,8 @@ impl Gateway {
} }
"GUILD_CREATE" => { "GUILD_CREATE" => {
let new_data: types::GuildCreate = let new_data: types::GuildCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -520,7 +551,8 @@ impl Gateway {
} }
"GUILD_UPDATE" => { "GUILD_UPDATE" => {
let new_data: types::GuildUpdate = let new_data: types::GuildUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -531,7 +563,8 @@ impl Gateway {
} }
"GUILD_DELETE" => { "GUILD_DELETE" => {
let new_data: types::GuildDelete = let new_data: types::GuildDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -542,7 +575,8 @@ impl Gateway {
} }
"GUILD_AUDIT_LOG_ENTRY_CREATE" => { "GUILD_AUDIT_LOG_ENTRY_CREATE" => {
let new_data: types::GuildAuditLogEntryCreate = let new_data: types::GuildAuditLogEntryCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -553,7 +587,8 @@ impl Gateway {
} }
"GUILD_BAN_ADD" => { "GUILD_BAN_ADD" => {
let new_data: types::GuildBanAdd = let new_data: types::GuildBanAdd =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -564,7 +599,8 @@ impl Gateway {
} }
"GUILD_BAN_REMOVE" => { "GUILD_BAN_REMOVE" => {
let new_data: types::GuildBanRemove = let new_data: types::GuildBanRemove =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -575,7 +611,8 @@ impl Gateway {
} }
"GUILD_EMOJIS_UPDATE" => { "GUILD_EMOJIS_UPDATE" => {
let new_data: types::GuildEmojisUpdate = let new_data: types::GuildEmojisUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -586,7 +623,8 @@ impl Gateway {
} }
"GUILD_STICKERS_UPDATE" => { "GUILD_STICKERS_UPDATE" => {
let new_data: types::GuildStickersUpdate = let new_data: types::GuildStickersUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -597,7 +635,8 @@ impl Gateway {
} }
"GUILD_INTEGRATIONS_UPDATE" => { "GUILD_INTEGRATIONS_UPDATE" => {
let new_data: types::GuildIntegrationsUpdate = let new_data: types::GuildIntegrationsUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -608,7 +647,8 @@ impl Gateway {
} }
"GUILD_MEMBER_ADD" => { "GUILD_MEMBER_ADD" => {
let new_data: types::GuildMemberAdd = let new_data: types::GuildMemberAdd =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -619,7 +659,8 @@ impl Gateway {
} }
"GUILD_MEMBER_REMOVE" => { "GUILD_MEMBER_REMOVE" => {
let new_data: types::GuildMemberRemove = let new_data: types::GuildMemberRemove =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -630,7 +671,8 @@ impl Gateway {
} }
"GUILD_MEMBER_UPDATE" => { "GUILD_MEMBER_UPDATE" => {
let new_data: types::GuildMemberUpdate = let new_data: types::GuildMemberUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -641,7 +683,8 @@ impl Gateway {
} }
"GUILD_MEMBERS_CHUNK" => { "GUILD_MEMBERS_CHUNK" => {
let new_data: types::GuildMembersChunk = let new_data: types::GuildMembersChunk =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -652,7 +695,8 @@ impl Gateway {
} }
"GUILD_ROLE_CREATE" => { "GUILD_ROLE_CREATE" => {
let new_data: types::GuildRoleCreate = let new_data: types::GuildRoleCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -663,7 +707,8 @@ impl Gateway {
} }
"GUILD_ROLE_UPDATE" => { "GUILD_ROLE_UPDATE" => {
let new_data: types::GuildRoleUpdate = let new_data: types::GuildRoleUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -674,7 +719,8 @@ impl Gateway {
} }
"GUILD_ROLE_DELETE" => { "GUILD_ROLE_DELETE" => {
let new_data: types::GuildRoleDelete = let new_data: types::GuildRoleDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -685,7 +731,8 @@ impl Gateway {
} }
"GUILD_SCHEDULED_EVENT_CREATE" => { "GUILD_SCHEDULED_EVENT_CREATE" => {
let new_data: types::GuildScheduledEventCreate = let new_data: types::GuildScheduledEventCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -696,7 +743,8 @@ impl Gateway {
} }
"GUILD_SCHEDULED_EVENT_UPDATE" => { "GUILD_SCHEDULED_EVENT_UPDATE" => {
let new_data: types::GuildScheduledEventUpdate = let new_data: types::GuildScheduledEventUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -707,7 +755,8 @@ impl Gateway {
} }
"GUILD_SCHEDULED_EVENT_DELETE" => { "GUILD_SCHEDULED_EVENT_DELETE" => {
let new_data: types::GuildScheduledEventDelete = let new_data: types::GuildScheduledEventDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -718,7 +767,8 @@ impl Gateway {
} }
"GUILD_SCHEDULED_EVENT_USER_ADD" => { "GUILD_SCHEDULED_EVENT_USER_ADD" => {
let new_data: types::GuildScheduledEventUserAdd = let new_data: types::GuildScheduledEventUserAdd =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -729,7 +779,8 @@ impl Gateway {
} }
"GUILD_SCHEDULED_EVENT_USER_REMOVE" => { "GUILD_SCHEDULED_EVENT_USER_REMOVE" => {
let new_data: types::GuildScheduledEventUserRemove = let new_data: types::GuildScheduledEventUserRemove =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -740,7 +791,8 @@ impl Gateway {
} }
"PASSIVE_UPDATE_V1" => { "PASSIVE_UPDATE_V1" => {
let new_data: types::PassiveUpdateV1 = let new_data: types::PassiveUpdateV1 =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -751,7 +803,8 @@ impl Gateway {
} }
"INTEGRATION_CREATE" => { "INTEGRATION_CREATE" => {
let new_data: types::IntegrationCreate = let new_data: types::IntegrationCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -762,7 +815,8 @@ impl Gateway {
} }
"INTEGRATION_UPDATE" => { "INTEGRATION_UPDATE" => {
let new_data: types::IntegrationUpdate = let new_data: types::IntegrationUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -773,7 +827,8 @@ impl Gateway {
} }
"INTEGRATION_DELETE" => { "INTEGRATION_DELETE" => {
let new_data: types::IntegrationDelete = let new_data: types::IntegrationDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -784,7 +839,8 @@ impl Gateway {
} }
"INTERACTION_CREATE" => { "INTERACTION_CREATE" => {
let new_data: types::InteractionCreate = let new_data: types::InteractionCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -795,7 +851,8 @@ impl Gateway {
} }
"INVITE_CREATE" => { "INVITE_CREATE" => {
let new_data: types::InviteCreate = let new_data: types::InviteCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -806,7 +863,8 @@ impl Gateway {
} }
"INVITE_DELETE" => { "INVITE_DELETE" => {
let new_data: types::InviteDelete = let new_data: types::InviteDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -817,7 +875,8 @@ impl Gateway {
} }
"MESSAGE_CREATE" => { "MESSAGE_CREATE" => {
let new_data: types::MessageCreate = let new_data: types::MessageCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -828,7 +887,8 @@ impl Gateway {
} }
"MESSAGE_UPDATE" => { "MESSAGE_UPDATE" => {
let new_data: types::MessageUpdate = let new_data: types::MessageUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -839,7 +899,8 @@ impl Gateway {
} }
"MESSAGE_DELETE" => { "MESSAGE_DELETE" => {
let new_data: types::MessageDelete = let new_data: types::MessageDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -850,7 +911,8 @@ impl Gateway {
} }
"MESSAGE_DELETE_BULK" => { "MESSAGE_DELETE_BULK" => {
let new_data: types::MessageDeleteBulk = let new_data: types::MessageDeleteBulk =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -861,7 +923,8 @@ impl Gateway {
} }
"MESSAGE_REACTION_ADD" => { "MESSAGE_REACTION_ADD" => {
let new_data: types::MessageReactionAdd = let new_data: types::MessageReactionAdd =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -872,7 +935,8 @@ impl Gateway {
} }
"MESSAGE_REACTION_REMOVE" => { "MESSAGE_REACTION_REMOVE" => {
let new_data: types::MessageReactionRemove = let new_data: types::MessageReactionRemove =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -883,7 +947,8 @@ impl Gateway {
} }
"MESSAGE_REACTION_REMOVE_ALL" => { "MESSAGE_REACTION_REMOVE_ALL" => {
let new_data: types::MessageReactionRemoveAll = let new_data: types::MessageReactionRemoveAll =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -894,7 +959,8 @@ impl Gateway {
} }
"MESSAGE_REACTION_REMOVE_EMOJI" => { "MESSAGE_REACTION_REMOVE_EMOJI" => {
let new_data: types::MessageReactionRemoveEmoji = let new_data: types::MessageReactionRemoveEmoji =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -905,7 +971,8 @@ impl Gateway {
} }
"MESSAGE_ACK" => { "MESSAGE_ACK" => {
let new_data: types::MessageACK = let new_data: types::MessageACK =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -916,7 +983,8 @@ impl Gateway {
} }
"PRESENCE_UPDATE" => { "PRESENCE_UPDATE" => {
let new_data: types::PresenceUpdate = let new_data: types::PresenceUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -927,7 +995,8 @@ impl Gateway {
} }
"RELATIONSHIP_ADD" => { "RELATIONSHIP_ADD" => {
let new_data: types::RelationshipAdd = let new_data: types::RelationshipAdd =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -938,7 +1007,8 @@ impl Gateway {
} }
"RELATIONSHIP_REMOVE" => { "RELATIONSHIP_REMOVE" => {
let new_data: types::RelationshipRemove = let new_data: types::RelationshipRemove =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -949,7 +1019,8 @@ impl Gateway {
} }
"STAGE_INSTANCE_CREATE" => { "STAGE_INSTANCE_CREATE" => {
let new_data: types::StageInstanceCreate = let new_data: types::StageInstanceCreate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -960,7 +1031,8 @@ impl Gateway {
} }
"STAGE_INSTANCE_UPDATE" => { "STAGE_INSTANCE_UPDATE" => {
let new_data: types::StageInstanceUpdate = let new_data: types::StageInstanceUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -971,7 +1043,8 @@ impl Gateway {
} }
"STAGE_INSTANCE_DELETE" => { "STAGE_INSTANCE_DELETE" => {
let new_data: types::StageInstanceDelete = let new_data: types::StageInstanceDelete =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -982,7 +1055,8 @@ impl Gateway {
} }
"SESSIONS_REPLACE" => { "SESSIONS_REPLACE" => {
let sessions: Vec<types::Session> = let sessions: Vec<types::Session> =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
let new_data = types::SessionsReplace { sessions }; let new_data = types::SessionsReplace { sessions };
self.events self.events
.lock() .lock()
@ -994,7 +1068,8 @@ impl Gateway {
} }
"TYPING_START" => { "TYPING_START" => {
let new_data: types::TypingStartEvent = let new_data: types::TypingStartEvent =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -1005,7 +1080,8 @@ impl Gateway {
} }
"USER_UPDATE" => { "USER_UPDATE" => {
let new_data: types::UserUpdate = let new_data: types::UserUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -1013,14 +1089,23 @@ impl Gateway {
.update .update
.update_data(new_data) .update_data(new_data)
.await; .await;
}, }
"USER_GUILD_SETTINGS_UPDATE" => { "USER_GUILD_SETTINGS_UPDATE" => {
let new_data: types::UserGuildSettingsUpdate = serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); let new_data: types::UserGuildSettingsUpdate =
self.events.lock().await.user.guild_settings_update.update_data(new_data).await; serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events
.lock()
.await
.user
.guild_settings_update
.update_data(new_data)
.await;
} }
"VOICE_STATE_UPDATE" => { "VOICE_STATE_UPDATE" => {
let new_data: types::VoiceStateUpdate = let new_data: types::VoiceStateUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -1031,7 +1116,8 @@ impl Gateway {
} }
"VOICE_SERVER_UPDATE" => { "VOICE_SERVER_UPDATE" => {
let new_data: types::VoiceServerUpdate = let new_data: types::VoiceServerUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -1042,7 +1128,8 @@ impl Gateway {
} }
"WEBHOOKS_UPDATE" => { "WEBHOOKS_UPDATE" => {
let new_data: types::WebhooksUpdate = let new_data: types::WebhooksUpdate =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); serde_json::from_str(gateway_payload.event_data.unwrap().get())
.unwrap();
self.events self.events
.lock() .lock()
.await .await
@ -1072,7 +1159,13 @@ impl Gateway {
GATEWAY_HEARTBEAT_ACK => { GATEWAY_HEARTBEAT_ACK => {
println!("GW: Received Heartbeat ACK"); println!("GW: Received Heartbeat ACK");
} }
GATEWAY_IDENTIFY | GATEWAY_UPDATE_PRESENCE | GATEWAY_UPDATE_VOICE_STATE | GATEWAY_RESUME | GATEWAY_REQUEST_GUILD_MEMBERS | GATEWAY_CALL_SYNC | GATEWAY_LAZY_REQUEST => { GATEWAY_IDENTIFY
| GATEWAY_UPDATE_PRESENCE
| GATEWAY_UPDATE_VOICE_STATE
| GATEWAY_RESUME
| GATEWAY_REQUEST_GUILD_MEMBERS
| GATEWAY_CALL_SYNC
| GATEWAY_LAZY_REQUEST => {
panic!( panic!(
"Received gateway op code that's meant to be sent, not received ({})", "Received gateway op code that's meant to be sent, not received ({})",
gateway_payload.op_code gateway_payload.op_code
@ -1112,7 +1205,7 @@ struct HeartbeatHandler {
/// The send channel for the heartbeat thread /// The send channel for the heartbeat thread
pub send: Sender<HeartbeatThreadCommunication>, pub send: Sender<HeartbeatThreadCommunication>,
/// The handle of the thread /// The handle of the thread
handle: JoinHandle<()> handle: JoinHandle<()>,
} }
impl HeartbeatHandler { impl HeartbeatHandler {
@ -1130,7 +1223,6 @@ impl HeartbeatHandler {
let (send, mut receive) = mpsc::channel(32); let (send, mut receive) = mpsc::channel(32);
let handle: JoinHandle<()> = task::spawn(async move { let handle: JoinHandle<()> = task::spawn(async move {
let mut last_heartbeat_timestamp: Instant = time::Instant::now(); let mut last_heartbeat_timestamp: Instant = time::Instant::now();
let mut last_seq_number: Option<u64> = None; let mut last_seq_number: Option<u64> = None;
@ -1142,7 +1234,8 @@ impl HeartbeatHandler {
last_seq_number = Some(received_communication.unwrap().sequence_number); last_seq_number = Some(received_communication.unwrap().sequence_number);
} }
let should_send = last_heartbeat_timestamp.elapsed().as_millis() >= heartbeat_interval; let should_send =
last_heartbeat_timestamp.elapsed().as_millis() >= heartbeat_interval;
if should_send { if should_send {
println!("GW: Sending Heartbeat.."); println!("GW: Sending Heartbeat..");

View File

@ -2,8 +2,8 @@ use serde::{Deserialize, Serialize};
use crate::types::{ use crate::types::{
entities::{ entities::{
Application, Attachment, Channel, Emoji, GuildMember, RoleSubscriptionData, Sticker, Application, Attachment, Channel, Emoji, GuildMember, PublicUser, RoleSubscriptionData,
StickerItem, User, PublicUser Sticker, StickerItem, User,
}, },
utils::Snowflake, utils::Snowflake,
}; };

View File

@ -1,4 +1,4 @@
use crate::types::entities::{Guild, UnavailableGuild, PublicUser}; use crate::types::entities::{Guild, PublicUser, UnavailableGuild};
use crate::types::events::WebSocketEvent; use crate::types::events::WebSocketEvent;
use crate::types::{AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, RoleObject, Sticker}; use crate::types::{AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, RoleObject, Sticker};
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};

View File

@ -14,9 +14,9 @@ impl WebSocketEvent for UserUpdate {}
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
/// Undocumented /// Undocumented
/// ///
/// Possibly an update for muted guild / channel settings for the current user /// 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"}]} /// {"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 struct UserGuildSettingsUpdate {
pub version: u8, pub version: u8,
@ -32,16 +32,16 @@ pub struct UserGuildSettingsUpdate {
pub hide_muted_channels: bool, pub hide_muted_channels: bool,
pub guild_id: Snowflake, pub guild_id: Snowflake,
pub flags: i32, pub flags: i32,
pub channel_overrides: Vec<UserGuildSettingsChannelOverride> pub channel_overrides: Vec<UserGuildSettingsChannelOverride>,
} }
impl WebSocketEvent for UserGuildSettingsUpdate {} impl WebSocketEvent for UserGuildSettingsUpdate {}
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
/// Undocumented /// Undocumented
/// ///
/// Received in [UserGuildSettingsUpdate] /// Received in [UserGuildSettingsUpdate]
/// ///
/// {"muted":false,"mute_config":null,"message_notifications":3,"flags":4096,"collapsed":false,"channel_id":"1042689182893604885"} /// {"muted":false,"mute_config":null,"message_notifications":3,"flags":4096,"collapsed":false,"channel_id":"1042689182893604885"}
pub struct UserGuildSettingsChannelOverride { pub struct UserGuildSettingsChannelOverride {
pub muted: bool, pub muted: bool,
@ -51,4 +51,4 @@ pub struct UserGuildSettingsChannelOverride {
pub flags: i32, pub flags: i32,
pub collapsed: bool, pub collapsed: bool,
pub channel_id: Snowflake, pub channel_id: Snowflake,
} }