diff --git a/src/api/guilds/mod.rs b/src/api/guilds/mod.rs index 242a03e..7108ef7 100644 --- a/src/api/guilds/mod.rs +++ b/src/api/guilds/mod.rs @@ -1,3 +1 @@ pub mod guilds; - -use guilds::*; diff --git a/src/gateway.rs b/src/gateway.rs index 90bcff5..009cac5 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -40,11 +40,10 @@ pub struct GatewayHandle { impl GatewayHandle { /// Sends json to the gateway with an opcode async fn send_json_event(&self, op: u8, to_send: serde_json::Value) { - let gateway_payload = types::GatewaySendPayload { op, - d: Some(to_send), - s: None + d: Some(to_send), + s: None, }; let payload_json = serde_json::to_string(&gateway_payload).unwrap(); @@ -92,7 +91,6 @@ impl GatewayHandle { /// Sends an update voice state to the server pub async fn send_update_voice_state(&self, to_send: types::UpdateVoiceState) { - let to_send_value = serde_json::to_value(&to_send).unwrap(); println!("GW: Sending Update Voice State.."); @@ -102,7 +100,6 @@ impl GatewayHandle { /// Sends a call sync to the server pub async fn send_call_sync(&self, to_send: types::CallSync) { - let to_send_value = serde_json::to_value(&to_send).unwrap(); println!("GW: Sending Call Sync.."); @@ -112,7 +109,6 @@ impl GatewayHandle { /// Sends a Lazy Request pub async fn send_lazy_request(&self, to_send: types::LazyRequest) { - let to_send_value = serde_json::to_value(&to_send).unwrap(); println!("GW: Sending Lazy Request.."); @@ -167,7 +163,8 @@ impl Gateway { // Wait for the first hello and then spawn both tasks so we avoid nested tasks // This automatically spawns the heartbeat task, but from the main thread let msg = ws_rx.next().await.unwrap().unwrap(); - let gateway_payload: types::GatewayReceivePayload = serde_json::from_str(msg.to_text().unwrap()).unwrap(); + let gateway_payload: types::GatewayReceivePayload = + serde_json::from_str(msg.to_text().unwrap()).unwrap(); if gateway_payload.op != 10 { println!("Recieved non hello on gateway init, what is happening?"); @@ -180,8 +177,12 @@ impl Gateway { println!("GW: Received Hello"); - let gateway_hello: types::HelloData = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - gateway.heartbeat_handler = Some(HeartbeatHandler::new(gateway_hello.heartbeat_interval, shared_tx.clone())); + let gateway_hello: types::HelloData = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + gateway.heartbeat_handler = Some(HeartbeatHandler::new( + gateway_hello.heartbeat_interval, + shared_tx.clone(), + )); // Now we can continously check for messages in a different task, since we aren't going to receive another hello task::spawn(async move { @@ -207,7 +208,8 @@ impl Gateway { return; } - let gateway_payload: types::GatewayReceivePayload = serde_json::from_str(msg.to_text().unwrap()).unwrap(); + let gateway_payload: types::GatewayReceivePayload = + 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 { @@ -219,291 +221,781 @@ impl Gateway { println!("GW: Received {}..", gateway_payload_t); //println!("Event data dump: {}", gateway_payload.d.clone().unwrap().get()); - + // See https://discord.com/developers/docs/topics/gateway-events#receive-events // "Some" of these are uncodumented match gateway_payload_t.as_str() { "READY" => { - let new_data: types::GatewayReady = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.session.ready.update_data(new_data).await; - }, + let new_data: types::GatewayReady = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .session + .ready + .update_data(new_data) + .await; + } "READY_SUPPLEMENTAL" => { - let new_data: types::GatewayReadySupplemental = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.session.ready_supplimental.update_data(new_data).await; + let new_data: types::GatewayReadySupplemental = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .session + .ready_supplimental + .update_data(new_data) + .await; } "RESUMED" => {} "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => { - let new_data: types::ApplicationCommandPermissionsUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.application.command_permissions_update.update_data(new_data).await; + let new_data: types::ApplicationCommandPermissionsUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .application + .command_permissions_update + .update_data(new_data) + .await; } "AUTO_MODERATION_RULE_CREATE" => { - let new_data: types::AutoModerationRuleCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.auto_moderation.rule_create.update_data(new_data).await; + let new_data: types::AutoModerationRuleCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .auto_moderation + .rule_create + .update_data(new_data) + .await; } "AUTO_MODERATION_RULE_UPDATE" => { - let new_data: types::AutoModerationRuleUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.auto_moderation.rule_update.update_data(new_data).await; + let new_data: types::AutoModerationRuleUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .auto_moderation + .rule_update + .update_data(new_data) + .await; } "AUTO_MODERATION_RULE_DELETE" => { - let new_data: types::AutoModerationRuleDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.auto_moderation.rule_delete.update_data(new_data).await; + let new_data: types::AutoModerationRuleDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .auto_moderation + .rule_delete + .update_data(new_data) + .await; } "AUTO_MODERATION_ACTION_EXECUTION" => { - let new_data: types::AutoModerationActionExecution = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.auto_moderation.action_execution.update_data(new_data).await; + let new_data: types::AutoModerationActionExecution = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .auto_moderation + .action_execution + .update_data(new_data) + .await; } "CHANNEL_CREATE" => { - let new_data: types::ChannelCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.channel.create.update_data(new_data).await; + let new_data: types::ChannelCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .channel + .create + .update_data(new_data) + .await; } "CHANNEL_UPDATE" => { - let new_data: types::ChannelUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.channel.update.update_data(new_data).await; + let new_data: types::ChannelUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .channel + .update + .update_data(new_data) + .await; } "CHANNEL_UNREAD_UPDATE" => { - let new_data: types::ChannelUnreadUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.channel.unread_update.update_data(new_data).await; + let new_data: types::ChannelUnreadUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .channel + .unread_update + .update_data(new_data) + .await; } "CHANNEL_DELETE" => { - let new_data: types::ChannelDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.channel.delete.update_data(new_data).await; + let new_data: types::ChannelDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .channel + .delete + .update_data(new_data) + .await; } "CHANNEL_PINS_UPDATE" => { - let new_data: types::ChannelPinsUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.channel.pins_update.update_data(new_data).await; + let new_data: types::ChannelPinsUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .channel + .pins_update + .update_data(new_data) + .await; } "CALL_CREATE" => { - let new_data: types::CallCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.call.create.update_data(new_data).await; - }, + let new_data: types::CallCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .call + .create + .update_data(new_data) + .await; + } "CALL_UPDATE" => { - let new_data: types::CallUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.call.update.update_data(new_data).await; + let new_data: types::CallUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .call + .update + .update_data(new_data) + .await; } "CALL_DELETE" => { - let new_data: types::CallDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.call.delete.update_data(new_data).await; + let new_data: types::CallDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .call + .delete + .update_data(new_data) + .await; } "THREAD_CREATE" => { - let new_data: types::ThreadCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.thread.create.update_data(new_data).await; + let new_data: types::ThreadCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .thread + .create + .update_data(new_data) + .await; } "THREAD_UPDATE" => { - let new_data: types::ThreadUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.thread.update.update_data(new_data).await; + let new_data: types::ThreadUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .thread + .update + .update_data(new_data) + .await; } "THREAD_DELETE" => { - let new_data: types::ThreadDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.thread.delete.update_data(new_data).await; + let new_data: types::ThreadDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .thread + .delete + .update_data(new_data) + .await; } "THREAD_LIST_SYNC" => { - let new_data: types::ThreadListSync = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.thread.list_sync.update_data(new_data).await; + let new_data: types::ThreadListSync = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .thread + .list_sync + .update_data(new_data) + .await; } "THREAD_MEMBER_UPDATE" => { - let new_data: types::ThreadMemberUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.thread.member_update.update_data(new_data).await; + let new_data: types::ThreadMemberUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .thread + .member_update + .update_data(new_data) + .await; } "THREAD_MEMBERS_UPDATE" => { - let new_data: types::ThreadMembersUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.thread.members_update.update_data(new_data).await; + let new_data: types::ThreadMembersUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .thread + .members_update + .update_data(new_data) + .await; } "GUILD_CREATE" => { - let new_data: types::GuildCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.create.update_data(new_data).await; + let new_data: types::GuildCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .create + .update_data(new_data) + .await; } "GUILD_UPDATE" => { - let new_data: types::GuildUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.update.update_data(new_data).await; + let new_data: types::GuildUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .update + .update_data(new_data) + .await; } "GUILD_DELETE" => { - let new_data: types::GuildDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.delete.update_data(new_data).await; + let new_data: types::GuildDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .delete + .update_data(new_data) + .await; } "GUILD_AUDIT_LOG_ENTRY_CREATE" => { - let new_data: types::GuildAuditLogEntryCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.audit_log_entry_create.update_data(new_data).await; + let new_data: types::GuildAuditLogEntryCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .audit_log_entry_create + .update_data(new_data) + .await; } "GUILD_BAN_ADD" => { - let new_data: types::GuildBanAdd = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.ban_add.update_data(new_data).await; + let new_data: types::GuildBanAdd = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .ban_add + .update_data(new_data) + .await; } "GUILD_BAN_REMOVE" => { - let new_data: types::GuildBanRemove = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.ban_remove.update_data(new_data).await; + let new_data: types::GuildBanRemove = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .ban_remove + .update_data(new_data) + .await; } "GUILD_EMOJIS_UPDATE" => { - let new_data: types::GuildEmojisUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.emojis_update.update_data(new_data).await; + let new_data: types::GuildEmojisUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .emojis_update + .update_data(new_data) + .await; } "GUILD_STICKERS_UPDATE" => { - let new_data: types::GuildStickersUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.stickers_update.update_data(new_data).await; + let new_data: types::GuildStickersUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .stickers_update + .update_data(new_data) + .await; } "GUILD_INTEGRATIONS_UPDATE" => { - let new_data: types::GuildIntegrationsUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.integrations_update.update_data(new_data).await; + let new_data: types::GuildIntegrationsUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .integrations_update + .update_data(new_data) + .await; } "GUILD_MEMBER_ADD" => { - let new_data: types::GuildMemberAdd = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.member_add.update_data(new_data).await; + let new_data: types::GuildMemberAdd = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .member_add + .update_data(new_data) + .await; } "GUILD_MEMBER_REMOVE" => { - let new_data: types::GuildMemberRemove = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.member_remove.update_data(new_data).await; + let new_data: types::GuildMemberRemove = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .member_remove + .update_data(new_data) + .await; } "GUILD_MEMBER_UPDATE" => { - let new_data: types::GuildMemberUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.member_update.update_data(new_data).await; + let new_data: types::GuildMemberUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .member_update + .update_data(new_data) + .await; } "GUILD_MEMBERS_CHUNK" => { - let new_data: types::GuildMembersChunk = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.members_chunk.update_data(new_data).await; + let new_data: types::GuildMembersChunk = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .members_chunk + .update_data(new_data) + .await; } "GUILD_ROLE_CREATE" => { - let new_data: types::GuildRoleCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_create.update_data(new_data).await; + let new_data: types::GuildRoleCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_create + .update_data(new_data) + .await; } "GUILD_ROLE_UPDATE" => { - let new_data: types::GuildRoleUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_update.update_data(new_data).await; + let new_data: types::GuildRoleUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_update + .update_data(new_data) + .await; } "GUILD_ROLE_DELETE" => { - let new_data: types::GuildRoleDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_delete.update_data(new_data).await; + let new_data: types::GuildRoleDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_delete + .update_data(new_data) + .await; } "GUILD_SCHEDULED_EVENT_CREATE" => { - let new_data: types::GuildScheduledEventCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_scheduled_event_create.update_data(new_data).await; + let new_data: types::GuildScheduledEventCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_scheduled_event_create + .update_data(new_data) + .await; } "GUILD_SCHEDULED_EVENT_UPDATE" => { - let new_data: types::GuildScheduledEventUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_scheduled_event_update.update_data(new_data).await; + let new_data: types::GuildScheduledEventUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_scheduled_event_update + .update_data(new_data) + .await; } "GUILD_SCHEDULED_EVENT_DELETE" => { - let new_data: types::GuildScheduledEventDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_scheduled_event_delete.update_data(new_data).await; + let new_data: types::GuildScheduledEventDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_scheduled_event_delete + .update_data(new_data) + .await; } "GUILD_SCHEDULED_EVENT_USER_ADD" => { - let new_data: types::GuildScheduledEventUserAdd = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_scheduled_event_user_add.update_data(new_data).await; + let new_data: types::GuildScheduledEventUserAdd = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_scheduled_event_user_add + .update_data(new_data) + .await; } "GUILD_SCHEDULED_EVENT_USER_REMOVE" => { - let new_data: types::GuildScheduledEventUserRemove = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.role_scheduled_event_user_remove.update_data(new_data).await; + let new_data: types::GuildScheduledEventUserRemove = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .role_scheduled_event_user_remove + .update_data(new_data) + .await; } "PASSIVE_UPDATE_V1" => { - let new_data: types::PassiveUpdateV1 = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.guild.passive_update_v1.update_data(new_data).await; + let new_data: types::PassiveUpdateV1 = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .guild + .passive_update_v1 + .update_data(new_data) + .await; } "INTEGRATION_CREATE" => { - let new_data: types::IntegrationCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.integration.create.update_data(new_data).await; + let new_data: types::IntegrationCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .integration + .create + .update_data(new_data) + .await; } "INTEGRATION_UPDATE" => { - let new_data: types::IntegrationUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.integration.update.update_data(new_data).await; + let new_data: types::IntegrationUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .integration + .update + .update_data(new_data) + .await; } "INTEGRATION_DELETE" => { - let new_data: types::IntegrationDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.integration.delete.update_data(new_data).await; + let new_data: types::IntegrationDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .integration + .delete + .update_data(new_data) + .await; } "INTERACTION_CREATE" => { - let new_data: types::InteractionCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.interaction.create.update_data(new_data).await; + let new_data: types::InteractionCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .interaction + .create + .update_data(new_data) + .await; } "INVITE_CREATE" => { - let new_data: types::InviteCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.invite.create.update_data(new_data).await; + let new_data: types::InviteCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .invite + .create + .update_data(new_data) + .await; } "INVITE_DELETE" => { - let new_data: types::InviteDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.invite.delete.update_data(new_data).await; + let new_data: types::InviteDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .invite + .delete + .update_data(new_data) + .await; } "MESSAGE_CREATE" => { - let new_data: types::MessageCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.create.update_data(new_data).await; + let new_data: types::MessageCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .create + .update_data(new_data) + .await; } "MESSAGE_UPDATE" => { - let new_data: types::MessageUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.update.update_data(new_data).await; + let new_data: types::MessageUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .update + .update_data(new_data) + .await; } "MESSAGE_DELETE" => { - let new_data: types::MessageDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.delete.update_data(new_data).await; + let new_data: types::MessageDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .delete + .update_data(new_data) + .await; } "MESSAGE_DELETE_BULK" => { - let new_data: types::MessageDeleteBulk = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.delete_bulk.update_data(new_data).await; + let new_data: types::MessageDeleteBulk = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .delete_bulk + .update_data(new_data) + .await; } "MESSAGE_REACTION_ADD" => { - let new_data: types::MessageReactionAdd = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.reaction_add.update_data(new_data).await; + let new_data: types::MessageReactionAdd = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .reaction_add + .update_data(new_data) + .await; } "MESSAGE_REACTION_REMOVE" => { - let new_data: types::MessageReactionRemove = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.reaction_remove.update_data(new_data).await; + let new_data: types::MessageReactionRemove = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .reaction_remove + .update_data(new_data) + .await; } "MESSAGE_REACTION_REMOVE_ALL" => { - let new_data: types::MessageReactionRemoveAll = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.reaction_remove_all.update_data(new_data).await; + let new_data: types::MessageReactionRemoveAll = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .reaction_remove_all + .update_data(new_data) + .await; } "MESSAGE_REACTION_REMOVE_EMOJI" => { - let new_data: types::MessageReactionRemoveEmoji= serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.reaction_remove_emoji.update_data(new_data).await; - }, + let new_data: types::MessageReactionRemoveEmoji = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .reaction_remove_emoji + .update_data(new_data) + .await; + } "MESSAGE_ACK" => { - let new_data: types::MessageACK = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.message.ack.update_data(new_data).await; + let new_data: types::MessageACK = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .message + .ack + .update_data(new_data) + .await; } "PRESENCE_UPDATE" => { - let new_data: types::PresenceUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.user.presence_update.update_data(new_data).await; + let new_data: types::PresenceUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .user + .presence_update + .update_data(new_data) + .await; } "RELATIONSHIP_ADD" => { - let new_data: types::RelationshipAdd = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.relationship.add.update_data(new_data).await; + let new_data: types::RelationshipAdd = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .relationship + .add + .update_data(new_data) + .await; } "RELATIONSHIP_REMOVE" => { - let new_data: types::RelationshipRemove = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.relationship.remove.update_data(new_data).await; + let new_data: types::RelationshipRemove = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .relationship + .remove + .update_data(new_data) + .await; } "STAGE_INSTANCE_CREATE" => { - let new_data: types::StageInstanceCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.stage_instance.create.update_data(new_data).await; + let new_data: types::StageInstanceCreate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .stage_instance + .create + .update_data(new_data) + .await; } "STAGE_INSTANCE_UPDATE" => { - let new_data: types::StageInstanceUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.stage_instance.update.update_data(new_data).await; + let new_data: types::StageInstanceUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .stage_instance + .update + .update_data(new_data) + .await; } "STAGE_INSTANCE_DELETE" => { - let new_data: types::StageInstanceDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.stage_instance.delete.update_data(new_data).await; + let new_data: types::StageInstanceDelete = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .stage_instance + .delete + .update_data(new_data) + .await; } "SESSIONS_REPLACE" => { - let sessions: Vec = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - let new_data = types::SessionsReplace {sessions}; - self.events.lock().await.session.replace.update_data(new_data).await; + let sessions: Vec = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + let new_data = types::SessionsReplace { sessions }; + self.events + .lock() + .await + .session + .replace + .update_data(new_data) + .await; } "TYPING_START" => { - let new_data: types::TypingStartEvent = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.user.typing_start_event.update_data(new_data).await; + let new_data: types::TypingStartEvent = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .user + .typing_start_event + .update_data(new_data) + .await; } "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; + 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; } "VOICE_STATE_UPDATE" => { - let new_data: types::VoiceStateUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.voice.state_update.update_data(new_data).await; + let new_data: types::VoiceStateUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .voice + .state_update + .update_data(new_data) + .await; } "VOICE_SERVER_UPDATE" => { - let new_data: types::VoiceServerUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.voice.server_update.update_data(new_data).await; + let new_data: types::VoiceServerUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .voice + .server_update + .update_data(new_data) + .await; } "WEBHOOKS_UPDATE" => { - let new_data: types::WebhooksUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); - self.events.lock().await.webhooks.update.update_data(new_data).await; + let new_data: types::WebhooksUpdate = + serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events + .lock() + .await + .webhooks + .update + .update_data(new_data) + .await; } _ => { println!("Received unrecognised gateway event ({})! Please open an issue on the chorus github so we can implement it", &gateway_payload_t); @@ -531,8 +1023,15 @@ impl Gateway { 11 => { println!("GW: Received Heartbeat ACK"); } - 2 | 3 | 4 | 6 | 8 => {panic!("Received gateway op code that's meant to be sent, not received ({})", gateway_payload.op)} - _ => {println!("Received unrecognised gateway op code ({})! Please open an issue on the chorus github so we can implement it", gateway_payload.op);} + 2 | 3 | 4 | 6 | 8 => { + panic!( + "Received gateway op code that's meant to be sent, not received ({})", + gateway_payload.op + ) + } + _ => { + println!("Received unrecognised gateway op code ({})! Please open an issue on the chorus github so we can implement it", gateway_payload.op); + } } // If we have an active heartbeat thread and we received a seq number we should let it know @@ -755,7 +1254,7 @@ mod events { pub struct Session { pub ready: GatewayEvent, pub ready_supplimental: GatewayEvent, - pub replace: GatewayEvent + pub replace: GatewayEvent, } #[derive(Default, Debug)] @@ -775,7 +1274,7 @@ mod events { pub reaction_remove: GatewayEvent, pub reaction_remove_all: GatewayEvent, pub reaction_remove_emoji: GatewayEvent, - pub ack: GatewayEvent + pub ack: GatewayEvent, } #[derive(Default, Debug)] @@ -839,14 +1338,14 @@ mod events { #[derive(Default, Debug)] pub struct Invite { pub create: GatewayEvent, - pub delete: GatewayEvent + pub delete: GatewayEvent, } #[derive(Default, Debug)] pub struct Integration { pub create: GatewayEvent, pub update: GatewayEvent, - pub delete: GatewayEvent + pub delete: GatewayEvent, } #[derive(Default, Debug)] @@ -858,13 +1357,13 @@ mod events { pub struct Call { pub create: GatewayEvent, pub update: GatewayEvent, - pub delete: GatewayEvent + pub delete: GatewayEvent, } #[derive(Default, Debug)] pub struct Voice { pub state_update: GatewayEvent, - pub server_update: GatewayEvent + pub server_update: GatewayEvent, } #[derive(Default, Debug)] diff --git a/src/types/config/types/subconfigs/region/mod.rs b/src/types/config/types/subconfigs/region/mod.rs index e0b1800..08c3b73 100644 --- a/src/types/config/types/subconfigs/region/mod.rs +++ b/src/types/config/types/subconfigs/region/mod.rs @@ -1,7 +1,5 @@ use serde::{Deserialize, Serialize}; - - #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct LatLong { pub latitude: f64, diff --git a/src/types/entities/attachment.rs b/src/types/entities/attachment.rs index 210f738..5bdfede 100644 --- a/src/types/entities/attachment.rs +++ b/src/types/entities/attachment.rs @@ -1,4 +1,3 @@ -use crate::types::Message; use serde::{Deserialize, Serialize}; use crate::types::utils::Snowflake; diff --git a/src/types/entities/audit_log.rs b/src/types/entities/audit_log.rs index 4e5dba6..21682ae 100644 --- a/src/types/entities/audit_log.rs +++ b/src/types/entities/audit_log.rs @@ -13,7 +13,7 @@ pub struct AuditLogEntry { pub action_type: u8, // to:do add better options type pub options: Option, - pub reason: Option + pub reason: Option, } #[derive(Serialize, Deserialize, Debug, Default, Clone)] @@ -21,5 +21,5 @@ pub struct AuditLogEntry { pub struct AuditLogChange { pub new_value: Option, pub old_value: Option, - pub key: String + pub key: String, } diff --git a/src/types/entities/auto_moderation.rs b/src/types/entities/auto_moderation.rs index 0b723c1..144aa4b 100644 --- a/src/types/entities/auto_moderation.rs +++ b/src/types/entities/auto_moderation.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use serde_repr::{Serialize_repr, Deserialize_repr}; +use serde_repr::{Deserialize_repr, Serialize_repr}; use crate::types::utils::Snowflake; @@ -21,23 +21,23 @@ pub struct AutoModerationRule { #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] #[repr(u8)] -#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-event-types pub enum AutoModerationRuleEventType { #[default] - MessageSend = 1 + MessageSend = 1, } #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] #[repr(u8)] -#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-types pub enum AutoModerationRuleTriggerType { #[default] Keyword = 1, Spam = 3, KeywordPreset = 4, - MentionSpam = 5 + MentionSpam = 5, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] @@ -48,7 +48,7 @@ pub enum AutoModerationRuleTriggerMetadata { ForKeywordPreset(AutoModerationRuleTriggerMetadataForKeywordPreset), ForMentionSpam(AutoModerationRuleTriggerMetadataForMentionSpam), #[default] - None + None, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] @@ -71,37 +71,37 @@ pub struct AutoModerationRuleTriggerMetadataForKeywordPreset { pub struct AutoModerationRuleTriggerMetadataForMentionSpam { /// Max 50 pub mention_total_limit: u8, - pub mention_raid_protection_enabled: bool + pub mention_raid_protection_enabled: bool, } #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] #[repr(u8)] -#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-keyword-preset-types pub enum AutoModerationRuleKeywordPresetType { #[default] Profanity = 1, SexualContent = 2, - Slurs = 3 + Slurs = 3, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object pub struct AutoModerationAction { - #[serde(rename = "type")] + #[serde(rename = "type")] pub action_type: AutoModerationActionType, - pub metadata: Option + pub metadata: Option, } #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] #[repr(u8)] -#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-types pub enum AutoModerationActionType { #[default] BlockMessage = 1, SendAlertMessage = 2, - Timeout = 3 + Timeout = 3, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] @@ -112,19 +112,19 @@ pub enum AutoModerationActionMetadata { ForSendAlertMessage(AutoModerationActionMetadataForSendAlertMessage), ForTimeout(AutoModerationActionMetadataForTimeout), #[default] - None + None, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata pub struct AutoModerationActionMetadataForBlockMessage { - pub custom_message: Option + pub custom_message: Option, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] /// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata pub struct AutoModerationActionMetadataForSendAlertMessage { - pub channel_id: Snowflake + pub channel_id: Snowflake, } #[derive(Serialize, Deserialize, Debug, Clone, Default)] @@ -132,4 +132,4 @@ pub struct AutoModerationActionMetadataForSendAlertMessage { pub struct AutoModerationActionMetadataForTimeout { /// Max 2419200 pub duration_seconds: u32, -} \ No newline at end of file +} diff --git a/src/types/entities/channel.rs b/src/types/entities/channel.rs index a0c2bcb..4ce0e4b 100644 --- a/src/types/entities/channel.rs +++ b/src/types/entities/channel.rs @@ -1,6 +1,9 @@ use chrono::Utc; use serde::{Deserialize, Serialize}; -use serde_aux::prelude::{deserialize_number_from_string, deserialize_option_number_from_string, deserialize_string_from_number}; +use serde_aux::prelude::{ + deserialize_number_from_string, deserialize_option_number_from_string, + deserialize_string_from_number, +}; use serde_repr::{Deserialize_repr, Serialize_repr}; use crate::types::{ diff --git a/src/types/entities/emoji.rs b/src/types/entities/emoji.rs index c9811af..dbe998b 100644 --- a/src/types/entities/emoji.rs +++ b/src/types/entities/emoji.rs @@ -1,8 +1,7 @@ use serde::{Deserialize, Serialize}; -use serde_aux::prelude::deserialize_option_number_from_string; use crate::types::entities::User; -use crate::types::{Guild, Snowflake}; +use crate::types::Snowflake; #[derive(Debug, PartialEq, Clone, Deserialize, Serialize, Default)] #[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))] diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index c79ee1d..3a6b11a 100644 --- a/src/types/entities/guild.rs +++ b/src/types/entities/guild.rs @@ -1,9 +1,9 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use serde_repr::{Serialize_repr, Deserialize_repr}; +use serde_repr::{Deserialize_repr, Serialize_repr}; use crate::types::{ - entities::{Channel, Emoji, GuildTemplate, RoleObject, Sticker, User, VoiceState, Webhook}, + entities::{Channel, Emoji, RoleObject, Sticker, User, VoiceState, Webhook}, interfaces::WelcomeScreenObject, utils::Snowflake, }; @@ -140,7 +140,7 @@ pub struct GuildScheduledEvent { pub entity_metadata: Option, pub creator: Option, pub user_count: Option, - pub image: Option + pub image: Option, } #[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone)] @@ -159,7 +159,7 @@ pub enum GuildScheduledEventStatus { Scheduled = 1, Active = 2, Completed = 3, - Canceled = 4 + Canceled = 4, } #[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone)] @@ -175,5 +175,5 @@ pub enum GuildScheduledEventEntityType { #[derive(Serialize, Deserialize, Debug, Default, Clone)] /// See https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-metadata pub struct GuildScheduledEventEntityMetadata { - pub location: Option -} \ No newline at end of file + pub location: Option, +} diff --git a/src/types/entities/mod.rs b/src/types/entities/mod.rs index 5c8306b..d27c76e 100644 --- a/src/types/entities/mod.rs +++ b/src/types/entities/mod.rs @@ -1,5 +1,7 @@ mod application; mod attachment; +mod audit_log; +mod auto_moderation; mod channel; mod config; mod emoji; @@ -7,8 +9,10 @@ mod guild; mod guild_member; mod integration; mod message; +mod relationship; mod role; mod security_key; +mod stage_instance; mod sticker; mod team; mod template; @@ -16,13 +20,11 @@ mod user; mod user_settings; mod voice_state; mod webhook; -mod audit_log; -mod relationship; -mod auto_moderation; -mod stage_instance; pub use application::*; pub use attachment::*; +pub use audit_log::*; +pub use auto_moderation::*; pub use channel::*; pub use config::*; pub use emoji::*; @@ -30,8 +32,10 @@ pub use guild::*; pub use guild_member::*; pub use integration::*; pub use message::*; +pub use relationship::*; pub use role::*; pub use security_key::*; +pub use stage_instance::*; pub use sticker::*; pub use team::*; pub use template::*; @@ -39,7 +43,3 @@ pub use user::*; pub use user_settings::*; pub use voice_state::*; pub use webhook::*; -pub use audit_log::*; -pub use relationship::*; -pub use auto_moderation::*; -pub use stage_instance::*; \ No newline at end of file diff --git a/src/types/entities/relationship.rs b/src/types/entities/relationship.rs index fc6d78d..f4e735c 100644 --- a/src/types/entities/relationship.rs +++ b/src/types/entities/relationship.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use serde_repr::{Serialize_repr, Deserialize_repr}; +use serde_repr::{Deserialize_repr, Serialize_repr}; use crate::types::Snowflake; @@ -9,10 +9,10 @@ use super::PublicUser; /// See https://docs.spacebar.chat/routes/#get-/users/@me/relationships/ pub struct Relationship { pub id: Snowflake, - #[serde(rename = "type")] + #[serde(rename = "type")] pub relationship_type: RelationshipType, pub nickname: Option, - pub user: PublicUser + pub user: PublicUser, } #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] @@ -24,4 +24,4 @@ pub enum RelationshipType { Blocked = 2, #[default] Friends = 1, -} \ No newline at end of file +} diff --git a/src/types/entities/role.rs b/src/types/entities/role.rs index a9e479b..87135ba 100644 --- a/src/types/entities/role.rs +++ b/src/types/entities/role.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use serde_aux::prelude::{deserialize_string_from_number, deserialize_option_number_from_string}; +use serde_aux::prelude::{deserialize_option_number_from_string, deserialize_string_from_number}; use crate::types::utils::Snowflake; @@ -19,7 +19,7 @@ pub struct RoleObject { pub permissions: String, pub managed: bool, pub mentionable: bool, - pub tags: Option + pub tags: Option, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] diff --git a/src/types/entities/stage_instance.rs b/src/types/entities/stage_instance.rs index 66376ef..b2d19c3 100644 --- a/src/types/entities/stage_instance.rs +++ b/src/types/entities/stage_instance.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use serde_repr::{Serialize_repr, Deserialize_repr}; +use serde_repr::{Deserialize_repr, Serialize_repr}; use crate::types::Snowflake; @@ -19,11 +19,11 @@ pub struct StageInstance { #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] #[repr(u8)] -#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] /// See https://discord.com/developers/docs/resources/stage-instance#stage-instance-object-privacy-level pub enum StageInstancePrivacyLevel { /// deprecated, apparently Public = 1, #[default] - GuildOnly = 2 -} \ No newline at end of file + GuildOnly = 2, +} diff --git a/src/types/entities/sticker.rs b/src/types/entities/sticker.rs index a3a79de..098394d 100644 --- a/src/types/entities/sticker.rs +++ b/src/types/entities/sticker.rs @@ -1,5 +1,4 @@ use serde::{Deserialize, Serialize}; -use serde_aux::prelude::{deserialize_option_number_from_string}; use crate::types::{entities::User, utils::Snowflake}; diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index f6bf5c0..7b1943e 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -1,12 +1,8 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_aux::prelude::deserialize_option_number_from_string; -use serde_json::{Map, Value}; -use crate::types::{ - errors::Error, - utils::Snowflake, //util::{email::adjust_email, entities::user_setting::UserSettings}, -}; +use crate::types::utils::Snowflake; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] #[cfg_attr(feature = "sqlx", derive(sqlx::Type))] diff --git a/src/types/entities/user_settings.rs b/src/types/entities/user_settings.rs index f34a159..7b9541f 100644 --- a/src/types/entities/user_settings.rs +++ b/src/types/entities/user_settings.rs @@ -1,8 +1,6 @@ use chrono::{serde::ts_milliseconds_option, Utc}; use serde::{Deserialize, Serialize}; -use crate::types::utils::Snowflake; - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] #[cfg_attr(feature = "sqlx", derive(sqlx::Type))] #[serde(rename_all = "lowercase")] diff --git a/src/types/entities/voice_state.rs b/src/types/entities/voice_state.rs index dd0ab15..cdd27a5 100644 --- a/src/types/entities/voice_state.rs +++ b/src/types/entities/voice_state.rs @@ -2,7 +2,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use crate::types::{ - entities::{Channel, Guild, GuildMember, User}, + entities::{Guild, GuildMember}, utils::Snowflake, }; diff --git a/src/types/entities/webhook.rs b/src/types/entities/webhook.rs index 0097d81..521b93f 100644 --- a/src/types/entities/webhook.rs +++ b/src/types/entities/webhook.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use crate::types::{ - entities::{Application, Channel, Guild, User}, + entities::{Guild, User}, utils::Snowflake, }; diff --git a/src/types/events/application.rs b/src/types/events/application.rs index b2bd042..aca2b29 100644 --- a/src/types/events/application.rs +++ b/src/types/events/application.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::types::{WebSocketEvent, GuildApplicationCommandPermissions}; +use crate::types::{GuildApplicationCommandPermissions, WebSocketEvent}; #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#application-command-permissions-update @@ -9,4 +9,4 @@ pub struct ApplicationCommandPermissionsUpdate { pub permissions: GuildApplicationCommandPermissions, } -impl WebSocketEvent for ApplicationCommandPermissionsUpdate {} \ No newline at end of file +impl WebSocketEvent for ApplicationCommandPermissionsUpdate {} diff --git a/src/types/events/auto_moderation.rs b/src/types/events/auto_moderation.rs index 3c6696d..2fa8fc5 100644 --- a/src/types/events/auto_moderation.rs +++ b/src/types/events/auto_moderation.rs @@ -1,6 +1,9 @@ use serde::{Deserialize, Serialize}; -use crate::types::{WebSocketEvent, AutoModerationRule, Snowflake, AutoModerationAction, AutoModerationRuleTriggerType}; +use crate::types::{ + AutoModerationAction, AutoModerationRule, AutoModerationRuleTriggerType, Snowflake, + WebSocketEvent, +}; #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create @@ -9,7 +12,7 @@ pub struct AutoModerationRuleCreate { pub rule: AutoModerationRule, } -impl WebSocketEvent for AutoModerationRuleCreate {} +impl WebSocketEvent for AutoModerationRuleCreate {} #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update @@ -18,7 +21,7 @@ pub struct AutoModerationRuleUpdate { pub rule: AutoModerationRule, } -impl WebSocketEvent for AutoModerationRuleUpdate {} +impl WebSocketEvent for AutoModerationRuleUpdate {} #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete @@ -27,7 +30,7 @@ pub struct AutoModerationRuleDelete { pub rule: AutoModerationRule, } -impl WebSocketEvent for AutoModerationRuleDelete {} +impl WebSocketEvent for AutoModerationRuleDelete {} #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution @@ -42,7 +45,7 @@ pub struct AutoModerationActionExecution { pub alert_system_message_id: Option, pub content: Option, pub matched_keyword: Option, - pub matched_content: Option + pub matched_content: Option, } -impl WebSocketEvent for AutoModerationActionExecution {} \ No newline at end of file +impl WebSocketEvent for AutoModerationActionExecution {} diff --git a/src/types/events/call.rs b/src/types/events/call.rs index dfea045..3c58635 100644 --- a/src/types/events/call.rs +++ b/src/types/events/call.rs @@ -48,4 +48,4 @@ impl WebSocketEvent for CallDelete {} pub struct CallSync { pub channel_id: String, } -impl WebSocketEvent for CallSync {} \ No newline at end of file +impl WebSocketEvent for CallSync {} diff --git a/src/types/events/channel.rs b/src/types/events/channel.rs index d1ea864..adafa9f 100644 --- a/src/types/events/channel.rs +++ b/src/types/events/channel.rs @@ -46,7 +46,7 @@ pub struct ChannelUnreadUpdate { pub struct ChannelUnreadUpdateObject { pub id: String, pub last_message_id: String, - pub last_pin_timestamp: Option + pub last_pin_timestamp: Option, } impl WebSocketEvent for ChannelUnreadUpdate {} diff --git a/src/types/events/integration.rs b/src/types/events/integration.rs index b7b49cc..6569a72 100644 --- a/src/types/events/integration.rs +++ b/src/types/events/integration.rs @@ -30,4 +30,4 @@ pub struct IntegrationDelete { pub application_id: Option, } -impl WebSocketEvent for IntegrationDelete {} \ No newline at end of file +impl WebSocketEvent for IntegrationDelete {} diff --git a/src/types/events/interaction.rs b/src/types/events/interaction.rs index 560ef55..51513a3 100644 --- a/src/types/events/interaction.rs +++ b/src/types/events/interaction.rs @@ -9,4 +9,4 @@ pub struct InteractionCreate { pub interaction: Interaction, } -impl WebSocketEvent for InteractionCreate {} \ No newline at end of file +impl WebSocketEvent for InteractionCreate {} diff --git a/src/types/events/invite.rs b/src/types/events/invite.rs index e4693c8..4eb31a7 100644 --- a/src/types/events/invite.rs +++ b/src/types/events/invite.rs @@ -6,7 +6,7 @@ use crate::types::{GuildInvite, WebSocketEvent}; /// See https://discord.com/developers/docs/topics/gateway-events#invite-create pub struct InviteCreate { #[serde(flatten)] - pub invite: GuildInvite + pub invite: GuildInvite, } impl WebSocketEvent for InviteCreate {} @@ -19,4 +19,4 @@ pub struct InviteDelete { pub code: String, } -impl WebSocketEvent for InviteDelete {} \ No newline at end of file +impl WebSocketEvent for InviteDelete {} diff --git a/src/types/events/lazy_request.rs b/src/types/events/lazy_request.rs index d20fcf3..2bf3038 100644 --- a/src/types/events/lazy_request.rs +++ b/src/types/events/lazy_request.rs @@ -6,13 +6,13 @@ use super::WebSocketEvent; #[derive(Debug, Deserialize, Serialize, Default)] /// Officially Undocumented -/// +/// /// Sent to the server to signify lazy loading of a guild; /// Sent by the official client when switching to a guild or channel; /// After this, you should recieve message updates -/// +/// /// See https://luna.gitlab.io/discord-unofficial-docs/lazy_guilds.html#op-14-lazy-request -/// +/// /// {"op":14,"d":{"guild_id":"848582562217590824","typing":true,"activities":true,"threads":true}} pub struct LazyRequest { pub guild_id: String, @@ -22,6 +22,6 @@ pub struct LazyRequest { #[serde(skip_serializing_if = "Option::is_none")] pub members: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub channels: Option>>> + pub channels: Option>>>, } -impl WebSocketEvent for LazyRequest {} \ No newline at end of file +impl WebSocketEvent for LazyRequest {} diff --git a/src/types/events/message.rs b/src/types/events/message.rs index 758deff..cea0d75 100644 --- a/src/types/events/message.rs +++ b/src/types/events/message.rs @@ -1,10 +1,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use crate::types::{ - entities::{Emoji, GuildMember, Message, User}, - utils::Snowflake, -}; +use crate::types::entities::{Emoji, GuildMember, Message, User}; use super::WebSocketEvent; @@ -56,7 +53,7 @@ pub struct MessageCreateUser { purchased_flags: Option, premium_usage_flags: Option, disabled: Option, - member: GuildMember + member: GuildMember, } impl WebSocketEvent for MessageCreate {} @@ -134,12 +131,12 @@ impl WebSocketEvent for MessageReactionRemoveEmoji {} #[derive(Debug, Deserialize, Serialize, Default)] /// Officially Undocumented -/// +/// /// Not documented anywhere unofficially -/// +/// /// Apparently "Message ACK refers to marking a message as read for Discord's API." (https://github.com/Rapptz/discord.py/issues/1851) /// I suspect this is sent and recieved from the gateway to let clients on other devices know the user has read a message -/// +/// /// {"t":"MESSAGE_ACK","s":3,"op":0,"d":{"version":52,"message_id":"1107236673638633472","last_viewed":null,"flags":null,"channel_id":"967363950217936897"}} pub struct MessageACK { /// ? @@ -150,4 +147,4 @@ pub struct MessageACK { pub flags: Option, pub channel_id: String, } -impl WebSocketEvent for MessageACK {} \ No newline at end of file +impl WebSocketEvent for MessageACK {} diff --git a/src/types/events/mod.rs b/src/types/events/mod.rs index 3dbf5a6..3fd54c9 100644 --- a/src/types/events/mod.rs +++ b/src/types/events/mod.rs @@ -1,62 +1,62 @@ use serde::{Deserialize, Serialize}; +mod application; +mod auto_moderation; +mod call; mod channel; mod guild; mod heartbeat; mod hello; mod identify; +mod integration; +mod interaction; +mod invite; +mod lazy_request; mod message; +mod passive_update; mod presence; mod ready; +mod relationship; mod request_members; mod resume; +mod session; +mod stage_instance; mod thread; mod user; mod voice; -mod session; mod webhooks; -mod passive_update; -mod integration; -mod invite; -mod call; -mod lazy_request; -mod relationship; -mod auto_moderation; -mod stage_instance; -mod interaction; -mod application; +pub use application::*; +pub use auto_moderation::*; +pub use call::*; pub use channel::*; pub use guild::*; pub use heartbeat::*; pub use hello::*; pub use identify::*; +pub use integration::*; +pub use interaction::*; +pub use invite::*; +pub use lazy_request::*; pub use message::*; +pub use passive_update::*; pub use presence::*; pub use ready::*; +pub use relationship::*; pub use request_members::*; pub use resume::*; +pub use session::*; +pub use stage_instance::*; pub use thread::*; pub use user::*; pub use voice::*; -pub use session::*; pub use webhooks::*; -pub use passive_update::*; -pub use integration::*; -pub use invite::*; -pub use call::*; -pub use lazy_request::*; -pub use relationship::*; -pub use auto_moderation::*; -pub use stage_instance::*; -pub use interaction::*; -pub use application::*; pub trait WebSocketEvent {} #[derive(Debug, Default, Serialize, Clone)] /// The payload used for sending events to the gateway -/// +/// /// Similar to [GatewayReceivePayload], except we send a [Value] for d whilst we receive a [serde_json::value::RawValue] /// Also, we never need to send the event name pub struct GatewaySendPayload { @@ -71,7 +71,7 @@ impl WebSocketEvent for GatewaySendPayload {} #[derive(Debug, Default, Deserialize, Clone)] /// The payload used for receiving events from the gateway -/// +/// /// Similar to [GatewaySendPayload], except we send a [Value] for d whilst we receive a [serde_json::value::RawValue] /// Also, we never need to sent the event name diff --git a/src/types/events/passive_update.rs b/src/types/events/passive_update.rs index 43bed2a..65a7272 100644 --- a/src/types/events/passive_update.rs +++ b/src/types/events/passive_update.rs @@ -1,11 +1,11 @@ use serde::{Deserialize, Serialize}; -use crate::types::{VoiceState, GuildMember}; use super::{ChannelUnreadUpdateObject, WebSocketEvent}; +use crate::types::{GuildMember, VoiceState}; #[derive(Debug, Deserialize, Serialize, Default)] /// Officially Undocumented -/// +/// /// Seems to be passively set to update the client on guild details (though, why not just send the update events?) pub struct PassiveUpdateV1 { pub voice_states: Vec, @@ -14,4 +14,4 @@ pub struct PassiveUpdateV1 { pub channels: Vec, } -impl WebSocketEvent for PassiveUpdateV1 {} \ No newline at end of file +impl WebSocketEvent for PassiveUpdateV1 {} diff --git a/src/types/events/presence.rs b/src/types/events/presence.rs index 65c86e5..dd49fde 100644 --- a/src/types/events/presence.rs +++ b/src/types/events/presence.rs @@ -1,6 +1,6 @@ -use crate::types::PublicUser; use crate::types::events::WebSocketEvent; use crate::types::interfaces::Activity; +use crate::types::PublicUser; use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize, Default, Clone)] diff --git a/src/types/events/ready.rs b/src/types/events/ready.rs index b82839e..78d2010 100644 --- a/src/types/events/ready.rs +++ b/src/types/events/ready.rs @@ -1,7 +1,7 @@ -use crate::types::entities::{UnavailableGuild, User, Guild}; -use crate::types::events::{WebSocketEvent, Session}; +use crate::types::entities::{Guild, User}; +use crate::types::events::{Session, WebSocketEvent}; use crate::types::interfaces::ClientStatusObject; -use crate::types::{PresenceUpdate, GuildMember, Activity, VoiceState}; +use crate::types::{Activity, GuildMember, PresenceUpdate, VoiceState}; use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize, Default)] @@ -46,7 +46,7 @@ impl WebSocketEvent for GatewayReadySupplemental {} #[derive(Debug, Deserialize, Serialize, Default)] pub struct MergedPresences { pub guilds: Vec>, - pub friends: Vec + pub friends: Vec, } #[derive(Debug, Deserialize, Serialize, Default)] @@ -56,7 +56,7 @@ pub struct MergedPresenceFriend { /// Looks like ms?? pub last_modified: u128, pub client_status: ClientStatusObject, - pub activities: Vec + pub activities: Vec, } #[derive(Debug, Deserialize, Serialize, Default)] @@ -66,12 +66,12 @@ pub struct MergedPresenceGuild { // ? pub game: Option, pub client_status: ClientStatusObject, - pub activities: Vec + pub activities: Vec, } #[derive(Debug, Deserialize, Serialize, Default)] pub struct SupplimentalGuild { pub voice_states: Option>, pub id: String, - pub embedded_activities: Vec + pub embedded_activities: Vec, } diff --git a/src/types/events/relationship.rs b/src/types/events/relationship.rs index f8c0dff..c9b79c0 100644 --- a/src/types/events/relationship.rs +++ b/src/types/events/relationship.rs @@ -1,4 +1,4 @@ -use crate::types::{events::WebSocketEvent, Relationship, Snowflake, RelationshipType}; +use crate::types::{events::WebSocketEvent, Relationship, RelationshipType, Snowflake}; use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize, Default)] @@ -15,8 +15,8 @@ impl WebSocketEvent for RelationshipAdd {} /// See https://github.com/spacebarchat/server/issues/203 pub struct RelationshipRemove { pub id: Snowflake, - #[serde(rename = "type")] + #[serde(rename = "type")] pub relationship_type: RelationshipType, } -impl WebSocketEvent for RelationshipRemove {} \ No newline at end of file +impl WebSocketEvent for RelationshipRemove {} diff --git a/src/types/events/session.rs b/src/types/events/session.rs index e0206f5..26364d9 100644 --- a/src/types/events/session.rs +++ b/src/types/events/session.rs @@ -7,7 +7,7 @@ use crate::types::{Activity, WebSocketEvent}; /// Seems like it sends active session info to users on connect /// [{"activities":[],"client_info":{"client":"web","os":"other","version":0},"session_id":"ab5941b50d818b1f8d93b4b1b581b192","status":"online"}] pub struct SessionsReplace { - pub sessions: Vec + pub sessions: Vec, } #[derive(Debug, Deserialize, Serialize, Default)] @@ -22,11 +22,11 @@ pub struct Session { #[derive(Debug, Deserialize, Serialize, Default)] /// Another Client info object /// {"client":"web","os":"other","version":0} -// Note: I don't think this one exists yet? Though I might've made a mistake and this might be a duplicate +// Note: I don't think this one exists yet? Though I might've made a mistake and this might be a duplicate pub struct ClientInfo { pub client: String, pub os: String, - pub version: u8 + pub version: u8, } impl WebSocketEvent for SessionsReplace {} diff --git a/src/types/events/stage_instance.rs b/src/types/events/stage_instance.rs index b308576..ea215f9 100644 --- a/src/types/events/stage_instance.rs +++ b/src/types/events/stage_instance.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::types::{WebSocketEvent, StageInstance}; +use crate::types::{StageInstance, WebSocketEvent}; #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#stage-instance-create @@ -9,7 +9,7 @@ pub struct StageInstanceCreate { pub stage_instance: StageInstance, } -impl WebSocketEvent for StageInstanceCreate {} +impl WebSocketEvent for StageInstanceCreate {} #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#stage-instance-update @@ -18,7 +18,7 @@ pub struct StageInstanceUpdate { pub stage_instance: StageInstance, } -impl WebSocketEvent for StageInstanceUpdate {} +impl WebSocketEvent for StageInstanceUpdate {} #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#stage-instance-delete @@ -27,4 +27,4 @@ pub struct StageInstanceDelete { pub stage_instance: StageInstance, } -impl WebSocketEvent for StageInstanceDelete {} \ No newline at end of file +impl WebSocketEvent for StageInstanceDelete {} diff --git a/src/types/events/thread.rs b/src/types/events/thread.rs index a02a148..62186b7 100644 --- a/src/types/events/thread.rs +++ b/src/types/events/thread.rs @@ -1,4 +1,4 @@ -use crate::types::entities::{Channel, GuildMember, ThreadMember}; +use crate::types::entities::{Channel, ThreadMember}; use crate::types::events::WebSocketEvent; use serde::{Deserialize, Serialize}; diff --git a/src/types/events/voice.rs b/src/types/events/voice.rs index 2a102b5..8af9c66 100644 --- a/src/types/events/voice.rs +++ b/src/types/events/voice.rs @@ -3,9 +3,9 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#update-voice-state -/// +/// /// Sent to the server -/// +/// /// Not to be confused with [VoiceStateUpdate] pub struct UpdateVoiceState { pub guild_id: Option, @@ -18,13 +18,13 @@ impl WebSocketEvent for UpdateVoiceState {} #[derive(Debug, Deserialize, Serialize, Default)] /// See https://discord.com/developers/docs/topics/gateway-events#voice-state-update -/// +/// /// Received from the server -/// +/// /// Not to be confused with [UpdateVoiceState] pub struct VoiceStateUpdate { #[serde(flatten)] - pub state: VoiceState + pub state: VoiceState, } impl WebSocketEvent for VoiceStateUpdate {} @@ -34,7 +34,7 @@ impl WebSocketEvent for VoiceStateUpdate {} pub struct VoiceServerUpdate { pub token: String, pub guild_id: String, - pub endpoint: Option + pub endpoint: Option, } -impl WebSocketEvent for VoiceServerUpdate {} \ No newline at end of file +impl WebSocketEvent for VoiceServerUpdate {} diff --git a/src/types/events/webhooks.rs b/src/types/events/webhooks.rs index e7711a7..b88e1ee 100644 --- a/src/types/events/webhooks.rs +++ b/src/types/events/webhooks.rs @@ -9,4 +9,4 @@ pub struct WebhooksUpdate { pub channel_id: String, } -impl WebSocketEvent for WebhooksUpdate {} \ No newline at end of file +impl WebSocketEvent for WebhooksUpdate {} diff --git a/src/types/interfaces/connected_account.rs b/src/types/interfaces/connected_account.rs index e69de29..8b13789 100644 --- a/src/types/interfaces/connected_account.rs +++ b/src/types/interfaces/connected_account.rs @@ -0,0 +1 @@ + diff --git a/src/types/interfaces/mod.rs b/src/types/interfaces/mod.rs index 6e0a7df..0f99ae2 100644 --- a/src/types/interfaces/mod.rs +++ b/src/types/interfaces/mod.rs @@ -8,4 +8,4 @@ pub use activity::*; pub use connected_account::*; pub use guild_welcome_screen::*; pub use interaction::*; -pub use status::*; \ No newline at end of file +pub use status::*; diff --git a/src/types/interfaces/status.rs b/src/types/interfaces/status.rs index 105dd87..c82e665 100644 --- a/src/types/interfaces/status.rs +++ b/src/types/interfaces/status.rs @@ -6,4 +6,4 @@ pub struct ClientStatusObject { pub desktop: Option, pub mobile: Option, pub web: Option, -} \ No newline at end of file +} diff --git a/src/types/schema/user.rs b/src/types/schema/user.rs index 00f4962..ab85a16 100644 --- a/src/types/schema/user.rs +++ b/src/types/schema/user.rs @@ -13,4 +13,4 @@ pub struct UserModifySchema { pub code: Option, pub email: Option, pub discriminator: Option, -} \ No newline at end of file +}