Start implementing some UpdateMessages
This commit is contained in:
parent
d7bd96d039
commit
1ad8055406
|
@ -1,9 +1,9 @@
|
||||||
use crate::errors::GatewayError;
|
use crate::errors::GatewayError;
|
||||||
use crate::gateway::events::Events;
|
use crate::gateway::events::Events;
|
||||||
use crate::types::{
|
use crate::types::{
|
||||||
self, AutoModerationRule, AutoModerationRuleUpdate, Channel, ChannelCreate, ChannelUpdate,
|
self, AutoModerationRule, AutoModerationRuleUpdate, Channel, ChannelCreate, ChannelDelete,
|
||||||
Composite, Guild, GuildRoleCreate, GuildRoleUpdate, JsonField, RoleObject, Snowflake,
|
ChannelUpdate, Composite, Guild, GuildRoleCreate, GuildRoleUpdate, JsonField, RoleObject,
|
||||||
UpdateMessage, WebSocketEvent,
|
Snowflake, ThreadUpdate, UpdateMessage, WebSocketEvent,
|
||||||
};
|
};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
|
@ -578,16 +578,16 @@ impl Gateway {
|
||||||
"AUTO_MODERATION_RULE_UPDATE" =>auto_moderation.rule_update AutoModerationRuleUpdate: AutoModerationRule,
|
"AUTO_MODERATION_RULE_UPDATE" =>auto_moderation.rule_update AutoModerationRuleUpdate: AutoModerationRule,
|
||||||
"AUTO_MODERATION_RULE_DELETE" => auto_moderation.rule_delete,
|
"AUTO_MODERATION_RULE_DELETE" => auto_moderation.rule_delete,
|
||||||
"AUTO_MODERATION_ACTION_EXECUTION" => auto_moderation.action_execution,
|
"AUTO_MODERATION_ACTION_EXECUTION" => auto_moderation.action_execution,
|
||||||
"CHANNEL_CREATE" => channel.create, // Could be processed if handle_message returned a Result<(), SomeError>, as channel.guild_id is Option
|
"CHANNEL_CREATE" => channel.create ChannelCreate: Guild,
|
||||||
"CHANNEL_UPDATE" => channel.update ChannelUpdate: Channel,
|
"CHANNEL_UPDATE" => channel.update ChannelUpdate: Channel,
|
||||||
"CHANNEL_UNREAD_UPDATE" => channel.unread_update,
|
"CHANNEL_UNREAD_UPDATE" => channel.unread_update,
|
||||||
"CHANNEL_DELETE" => channel.delete, // Same as CHANNEL_CREATE
|
"CHANNEL_DELETE" => channel.delete ChannelDelete: Guild,
|
||||||
"CHANNEL_PINS_UPDATE" => channel.pins_update,
|
"CHANNEL_PINS_UPDATE" => channel.pins_update,
|
||||||
"CALL_CREATE" => call.create,
|
"CALL_CREATE" => call.create,
|
||||||
"CALL_UPDATE" => call.update,
|
"CALL_UPDATE" => call.update,
|
||||||
"CALL_DELETE" => call.delete,
|
"CALL_DELETE" => call.delete,
|
||||||
"THREAD_CREATE" => thread.create, // TODO
|
"THREAD_CREATE" => thread.create, // TODO
|
||||||
"THREAD_UPDATE" => thread.update, // TODO
|
"THREAD_UPDATE" => thread.update ThreadUpdate: Channel,
|
||||||
"THREAD_DELETE" => thread.delete, // TODO
|
"THREAD_DELETE" => thread.delete, // TODO
|
||||||
"THREAD_LIST_SYNC" => thread.list_sync, // TODO
|
"THREAD_LIST_SYNC" => thread.list_sync, // TODO
|
||||||
"THREAD_MEMBER_UPDATE" => thread.member_update, // TODO
|
"THREAD_MEMBER_UPDATE" => thread.member_update, // TODO
|
||||||
|
@ -596,8 +596,8 @@ impl Gateway {
|
||||||
"GUILD_UPDATE" => guild.update, // TODO
|
"GUILD_UPDATE" => guild.update, // TODO
|
||||||
"GUILD_DELETE" => guild.delete, // TODO
|
"GUILD_DELETE" => guild.delete, // TODO
|
||||||
"GUILD_AUDIT_LOG_ENTRY_CREATE" => guild.audit_log_entry_create,
|
"GUILD_AUDIT_LOG_ENTRY_CREATE" => guild.audit_log_entry_create,
|
||||||
"GUILD_BAN_ADD" => guild.ban_add,
|
"GUILD_BAN_ADD" => guild.ban_add, // TODO
|
||||||
"GUILD_BAN_REMOVE" => guild.ban_remove,
|
"GUILD_BAN_REMOVE" => guild.ban_remove, // TODO
|
||||||
"GUILD_EMOJIS_UPDATE" => guild.emojis_update, // TODO
|
"GUILD_EMOJIS_UPDATE" => guild.emojis_update, // TODO
|
||||||
"GUILD_STICKERS_UPDATE" => guild.stickers_update, // TODO
|
"GUILD_STICKERS_UPDATE" => guild.stickers_update, // TODO
|
||||||
"GUILD_INTEGRATIONS_UPDATE" => guild.integrations_update,
|
"GUILD_INTEGRATIONS_UPDATE" => guild.integrations_update,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
use crate::types::events::WebSocketEvent;
|
use crate::types::events::WebSocketEvent;
|
||||||
|
use crate::types::Guild;
|
||||||
use crate::types::{entities::Channel, JsonField, Snowflake};
|
use crate::types::{entities::Channel, JsonField, Snowflake};
|
||||||
use chorus_macros::JsonField;
|
use chorus_macros::JsonField;
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
@ -18,15 +19,33 @@ pub struct ChannelPinsUpdate {
|
||||||
|
|
||||||
impl WebSocketEvent for ChannelPinsUpdate {}
|
impl WebSocketEvent for ChannelPinsUpdate {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)]
|
||||||
/// See <https://discord.com/developers/docs/topics/gateway-events#channel-create>
|
/// See <https://discord.com/developers/docs/topics/gateway-events#channel-create>
|
||||||
pub struct ChannelCreate {
|
pub struct ChannelCreate {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub channel: Channel,
|
pub channel: Channel,
|
||||||
|
#[serde(skip)]
|
||||||
|
pub json: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebSocketEvent for ChannelCreate {}
|
impl WebSocketEvent for ChannelCreate {}
|
||||||
|
|
||||||
|
impl UpdateMessage<Guild> for ChannelCreate {
|
||||||
|
fn id(&self) -> Option<Snowflake> {
|
||||||
|
self.channel.guild_id
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, object_to_update: Arc<RwLock<Guild>>) {
|
||||||
|
let mut write = object_to_update.write().unwrap();
|
||||||
|
let update = Arc::new(RwLock::new(self.channel.clone()));
|
||||||
|
if write.channels.is_some() {
|
||||||
|
write.channels.as_mut().unwrap().push(update);
|
||||||
|
} else {
|
||||||
|
write.channels = Some(Vec::from([update]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)]
|
#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)]
|
||||||
/// See <https://discord.com/developers/docs/topics/gateway-events#channel-update>
|
/// See <https://discord.com/developers/docs/topics/gateway-events#channel-update>
|
||||||
pub struct ChannelUpdate {
|
pub struct ChannelUpdate {
|
||||||
|
@ -68,11 +87,39 @@ pub struct ChannelUnreadUpdateObject {
|
||||||
|
|
||||||
impl WebSocketEvent for ChannelUnreadUpdate {}
|
impl WebSocketEvent for ChannelUnreadUpdate {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)]
|
||||||
/// See <https://discord.com/developers/docs/topics/gateway-events#channel-delete>
|
/// See <https://discord.com/developers/docs/topics/gateway-events#channel-delete>
|
||||||
pub struct ChannelDelete {
|
pub struct ChannelDelete {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub channel: Channel,
|
pub channel: Channel,
|
||||||
|
#[serde(skip)]
|
||||||
|
pub json: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl UpdateMessage<Guild> for ChannelDelete {
|
||||||
|
fn id(&self) -> Option<Snowflake> {
|
||||||
|
self.channel.guild_id
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, object_to_update: Arc<RwLock<Guild>>) {
|
||||||
|
if self.id().is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let mut write = object_to_update.write().unwrap();
|
||||||
|
if write.channels.is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (iteration, item) in (0_u32..).zip(write.channels.as_mut().unwrap().iter()) {
|
||||||
|
if item.read().unwrap().id == self.id().unwrap() {
|
||||||
|
write
|
||||||
|
.channels
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.swap_remove(iteration as usize);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebSocketEvent for ChannelDelete {}
|
impl WebSocketEvent for ChannelDelete {}
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
|
use chorus_macros::JsonField;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::types::entities::{Channel, ThreadMember};
|
use crate::types::entities::{Channel, ThreadMember};
|
||||||
use crate::types::events::WebSocketEvent;
|
use crate::types::events::WebSocketEvent;
|
||||||
use crate::types::Snowflake;
|
use crate::types::{JsonField, Snowflake};
|
||||||
|
|
||||||
|
use super::UpdateMessage;
|
||||||
|
|
||||||
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
||||||
/// See <https://discord.com/developers/docs/topics/gateway-events#thread-create>
|
/// See <https://discord.com/developers/docs/topics/gateway-events#thread-create>
|
||||||
|
@ -13,15 +16,23 @@ pub struct ThreadCreate {
|
||||||
|
|
||||||
impl WebSocketEvent for ThreadCreate {}
|
impl WebSocketEvent for ThreadCreate {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)]
|
||||||
/// See <https://discord.com/developers/docs/topics/gateway-events#thread-update>
|
/// See <https://discord.com/developers/docs/topics/gateway-events#thread-update>
|
||||||
pub struct ThreadUpdate {
|
pub struct ThreadUpdate {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub thread: Channel,
|
pub thread: Channel,
|
||||||
|
#[serde(skip)]
|
||||||
|
pub json: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebSocketEvent for ThreadUpdate {}
|
impl WebSocketEvent for ThreadUpdate {}
|
||||||
|
|
||||||
|
impl UpdateMessage<Channel> for ThreadUpdate {
|
||||||
|
fn id(&self) -> Option<Snowflake> {
|
||||||
|
Some(self.thread.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
|
||||||
/// See <https://discord.com/developers/docs/topics/gateway-events#thread-delete>
|
/// See <https://discord.com/developers/docs/topics/gateway-events#thread-delete>
|
||||||
pub struct ThreadDelete {
|
pub struct ThreadDelete {
|
||||||
|
|
Loading…
Reference in New Issue