Prettify imports, remove outdated types/schemas
This commit is contained in:
parent
ba93db0be8
commit
3353a2f461
|
@ -6,11 +6,7 @@ use crate::api::limits::Limits;
|
||||||
use crate::errors::InstanceServerError;
|
use crate::errors::InstanceServerError;
|
||||||
use crate::instance::UserMeta;
|
use crate::instance::UserMeta;
|
||||||
use crate::limit::LimitedRequester;
|
use crate::limit::LimitedRequester;
|
||||||
use crate::types::Channel;
|
use crate::types::{Channel, ChannelCreateSchema, Guild, GuildCreateResponse, GuildCreateSchema};
|
||||||
use crate::types::ChannelCreateSchema;
|
|
||||||
use crate::types::Guild;
|
|
||||||
use crate::types::GuildCreateResponse;
|
|
||||||
use crate::types::GuildCreateSchema;
|
|
||||||
|
|
||||||
impl Guild {
|
impl Guild {
|
||||||
/// Creates a new guild with the given parameters.
|
/// Creates a new guild with the given parameters.
|
||||||
|
|
|
@ -1,432 +0,0 @@
|
||||||
use regex::Regex;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::errors::FieldFormatError;
|
|
||||||
|
|
||||||
use super::{Channel, Embed};
|
|
||||||
|
|
||||||
/**
|
|
||||||
A struct that represents a well-formed email address.
|
|
||||||
*/
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
|
||||||
pub struct AuthEmail {
|
|
||||||
pub email: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthEmail {
|
|
||||||
/**
|
|
||||||
Returns a new [`Result<AuthEmail, FieldFormatError>`].
|
|
||||||
## Arguments
|
|
||||||
The email address you want to validate.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The email address is not in a valid format.
|
|
||||||
|
|
||||||
*/
|
|
||||||
pub fn new(email: String) -> Result<AuthEmail, FieldFormatError> {
|
|
||||||
let regex = Regex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$").unwrap();
|
|
||||||
if !regex.is_match(email.as_str()) {
|
|
||||||
return Err(FieldFormatError::EmailError);
|
|
||||||
}
|
|
||||||
Ok(AuthEmail { email })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
A struct that represents a well-formed username.
|
|
||||||
## Arguments
|
|
||||||
Please use new() to create a new instance of this struct.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The username is not between 2 and 32 characters.
|
|
||||||
*/
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
|
||||||
pub struct AuthUsername {
|
|
||||||
pub username: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthUsername {
|
|
||||||
/**
|
|
||||||
Returns a new [`Result<AuthUsername, FieldFormatError>`].
|
|
||||||
## Arguments
|
|
||||||
The username you want to validate.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The username is not between 2 and 32 characters.
|
|
||||||
*/
|
|
||||||
pub fn new(username: String) -> Result<AuthUsername, FieldFormatError> {
|
|
||||||
if username.len() < 2 || username.len() > 32 {
|
|
||||||
Err(FieldFormatError::UsernameError)
|
|
||||||
} else {
|
|
||||||
Ok(AuthUsername { username })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
A struct that represents a well-formed password.
|
|
||||||
## Arguments
|
|
||||||
Please use new() to create a new instance of this struct.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The password is not between 1 and 72 characters.
|
|
||||||
*/
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
|
||||||
pub struct AuthPassword {
|
|
||||||
pub password: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AuthPassword {
|
|
||||||
/**
|
|
||||||
Returns a new [`Result<AuthPassword, FieldFormatError>`].
|
|
||||||
## Arguments
|
|
||||||
The password you want to validate.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The password is not between 1 and 72 characters.
|
|
||||||
*/
|
|
||||||
pub fn new(password: String) -> Result<AuthPassword, FieldFormatError> {
|
|
||||||
if password.is_empty() || password.len() > 72 {
|
|
||||||
Err(FieldFormatError::PasswordError)
|
|
||||||
} else {
|
|
||||||
Ok(AuthPassword { password })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
A struct that represents a well-formed register request.
|
|
||||||
## Arguments
|
|
||||||
Please use new() to create a new instance of this struct.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The username is not between 2 and 32 characters.
|
|
||||||
- The password is not between 1 and 72 characters.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
pub struct RegisterSchema {
|
|
||||||
username: String,
|
|
||||||
password: Option<String>,
|
|
||||||
consent: bool,
|
|
||||||
email: Option<String>,
|
|
||||||
fingerprint: Option<String>,
|
|
||||||
invite: Option<String>,
|
|
||||||
date_of_birth: Option<String>,
|
|
||||||
gift_code_sku_id: Option<String>,
|
|
||||||
captcha_key: Option<String>,
|
|
||||||
promotional_email_opt_in: Option<bool>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl RegisterSchema {
|
|
||||||
/**
|
|
||||||
Returns a new [`Result<RegisterSchema, FieldFormatError>`].
|
|
||||||
## Arguments
|
|
||||||
All but "String::username" and "bool::consent" are optional.
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The username is less than 2 or more than 32 characters in length
|
|
||||||
- You supply a `password` which is less than 1 or more than 72 characters in length.
|
|
||||||
|
|
||||||
These constraints have been defined [in the Spacebar-API](https://docs.spacebar.chat/routes/)
|
|
||||||
*/
|
|
||||||
pub fn new(
|
|
||||||
username: AuthUsername,
|
|
||||||
password: Option<AuthPassword>,
|
|
||||||
consent: bool,
|
|
||||||
email: Option<AuthEmail>,
|
|
||||||
fingerprint: Option<String>,
|
|
||||||
invite: Option<String>,
|
|
||||||
date_of_birth: Option<String>,
|
|
||||||
gift_code_sku_id: Option<String>,
|
|
||||||
captcha_key: Option<String>,
|
|
||||||
promotional_email_opt_in: Option<bool>,
|
|
||||||
) -> Result<RegisterSchema, FieldFormatError> {
|
|
||||||
let username = username.username;
|
|
||||||
|
|
||||||
let email_addr;
|
|
||||||
if email.is_some() {
|
|
||||||
email_addr = Some(email.unwrap().email);
|
|
||||||
} else {
|
|
||||||
email_addr = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let has_password;
|
|
||||||
if password.is_some() {
|
|
||||||
has_password = Some(password.unwrap().password);
|
|
||||||
} else {
|
|
||||||
has_password = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
if !consent {
|
|
||||||
return Err(FieldFormatError::ConsentError);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(RegisterSchema {
|
|
||||||
username,
|
|
||||||
password: has_password,
|
|
||||||
consent,
|
|
||||||
email: email_addr,
|
|
||||||
fingerprint,
|
|
||||||
invite,
|
|
||||||
date_of_birth,
|
|
||||||
gift_code_sku_id,
|
|
||||||
captcha_key,
|
|
||||||
promotional_email_opt_in,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
A struct that represents a well-formed login request.
|
|
||||||
## Arguments
|
|
||||||
Please use new() to create a new instance of this struct.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The username is not between 2 and 32 characters.
|
|
||||||
- The password is not between 1 and 72 characters.
|
|
||||||
*/
|
|
||||||
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
pub struct LoginSchema {
|
|
||||||
login: String,
|
|
||||||
password: String,
|
|
||||||
undelete: Option<bool>,
|
|
||||||
captcha_key: Option<String>,
|
|
||||||
login_source: Option<String>,
|
|
||||||
gift_code_sku_id: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl LoginSchema {
|
|
||||||
/**
|
|
||||||
Returns a new [`Result<LoginSchema, FieldFormatError>`].
|
|
||||||
## Arguments
|
|
||||||
login: The username you want to login with.
|
|
||||||
password: The password you want to login with.
|
|
||||||
undelete: Honestly no idea what this is for.
|
|
||||||
captcha_key: The captcha key you want to login with.
|
|
||||||
login_source: The login source.
|
|
||||||
gift_code_sku_id: The gift code sku id.
|
|
||||||
## Errors
|
|
||||||
You will receive a [`FieldFormatError`], if:
|
|
||||||
- The username is less than 2 or more than 32 characters in length
|
|
||||||
*/
|
|
||||||
pub fn new(
|
|
||||||
login: AuthUsername,
|
|
||||||
password: String,
|
|
||||||
undelete: Option<bool>,
|
|
||||||
captcha_key: Option<String>,
|
|
||||||
login_source: Option<String>,
|
|
||||||
gift_code_sku_id: Option<String>,
|
|
||||||
) -> Result<LoginSchema, FieldFormatError> {
|
|
||||||
let login = login.username;
|
|
||||||
Ok(LoginSchema {
|
|
||||||
login,
|
|
||||||
password,
|
|
||||||
undelete,
|
|
||||||
captcha_key,
|
|
||||||
login_source,
|
|
||||||
gift_code_sku_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
pub struct TotpSchema {
|
|
||||||
code: String,
|
|
||||||
ticket: String,
|
|
||||||
gift_code_sku_id: Option<String>,
|
|
||||||
login_source: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
pub struct MessageSendSchema {
|
|
||||||
#[serde(rename = "type")]
|
|
||||||
message_type: Option<i32>,
|
|
||||||
content: Option<String>,
|
|
||||||
nonce: Option<String>,
|
|
||||||
tts: Option<bool>,
|
|
||||||
embeds: Option<Vec<super::Embed>>,
|
|
||||||
allowed_mentions: Option<super::AllowedMention>,
|
|
||||||
message_reference: Option<super::MessageReference>,
|
|
||||||
components: Option<Vec<super::Component>>,
|
|
||||||
sticker_ids: Option<Vec<String>>,
|
|
||||||
pub attachments: Option<Vec<super::PartialDiscordFileAttachment>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
// make a new() method for MessageSendSchema
|
|
||||||
impl MessageSendSchema {
|
|
||||||
pub fn new(
|
|
||||||
message_type: Option<i32>,
|
|
||||||
content: Option<String>,
|
|
||||||
nonce: Option<String>,
|
|
||||||
tts: Option<bool>,
|
|
||||||
embeds: Option<Vec<Embed>>,
|
|
||||||
allowed_mentions: Option<super::AllowedMention>,
|
|
||||||
message_reference: Option<super::MessageReference>,
|
|
||||||
components: Option<Vec<super::Component>>,
|
|
||||||
sticker_ids: Option<Vec<String>>,
|
|
||||||
attachments: Option<Vec<super::PartialDiscordFileAttachment>>,
|
|
||||||
) -> MessageSendSchema {
|
|
||||||
MessageSendSchema {
|
|
||||||
message_type,
|
|
||||||
content,
|
|
||||||
nonce,
|
|
||||||
tts,
|
|
||||||
embeds,
|
|
||||||
allowed_mentions,
|
|
||||||
message_reference,
|
|
||||||
components,
|
|
||||||
sticker_ids,
|
|
||||||
attachments,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
pub struct GuildCreateSchema {
|
|
||||||
pub name: Option<String>,
|
|
||||||
pub region: Option<String>,
|
|
||||||
pub icon: Option<String>,
|
|
||||||
pub channels: Option<Vec<Channel>>,
|
|
||||||
pub guild_template_code: Option<String>,
|
|
||||||
pub system_channel_id: Option<String>,
|
|
||||||
pub rules_channel_id: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
pub struct UserModifySchema {
|
|
||||||
pub username: Option<String>,
|
|
||||||
pub avatar: Option<String>,
|
|
||||||
pub bio: Option<String>,
|
|
||||||
pub accent_color: Option<u64>,
|
|
||||||
pub banner: Option<String>,
|
|
||||||
pub current_password: Option<String>,
|
|
||||||
pub new_password: Option<String>,
|
|
||||||
pub code: Option<String>,
|
|
||||||
pub email: Option<String>,
|
|
||||||
pub discriminator: Option<i16>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
// TODO: Implement in polyphony/types
|
|
||||||
pub struct ChannelCreateSchema {
|
|
||||||
pub name: String,
|
|
||||||
#[serde(rename = "type")]
|
|
||||||
pub channel_type: Option<u8>,
|
|
||||||
pub topic: Option<String>,
|
|
||||||
pub icon: Option<String>,
|
|
||||||
pub bitrate: Option<i32>,
|
|
||||||
pub user_limit: Option<i32>,
|
|
||||||
pub rate_limit_per_user: Option<i32>,
|
|
||||||
pub position: Option<i32>,
|
|
||||||
pub permission_overwrites: Option<Vec<crate::api::types::PermissionOverwrite>>,
|
|
||||||
pub parent_id: Option<String>,
|
|
||||||
pub id: Option<String>,
|
|
||||||
pub nsfw: Option<bool>,
|
|
||||||
pub rtc_region: Option<String>,
|
|
||||||
pub default_auto_archive_duration: Option<i32>,
|
|
||||||
pub default_reaction_emoji: Option<String>,
|
|
||||||
pub flags: Option<i32>,
|
|
||||||
pub default_thread_rate_limit_per_user: Option<i32>,
|
|
||||||
pub video_quality_mode: Option<i32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
// I know that some of these tests are... really really basic and unneccessary, but sometimes, I
|
|
||||||
// just feel like writing tests, so there you go :) -@bitfl0wer
|
|
||||||
#[cfg(test)]
|
|
||||||
mod schemas_tests {
|
|
||||||
use super::*;
|
|
||||||
use crate::errors::FieldFormatError;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn password_too_short() {
|
|
||||||
assert_eq!(
|
|
||||||
AuthPassword::new("".to_string()),
|
|
||||||
Err(FieldFormatError::PasswordError)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn password_too_long() {
|
|
||||||
let mut long_pw = String::new();
|
|
||||||
for _ in 0..73 {
|
|
||||||
long_pw += "a";
|
|
||||||
}
|
|
||||||
assert_eq!(
|
|
||||||
AuthPassword::new(long_pw),
|
|
||||||
Err(FieldFormatError::PasswordError)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn username_too_short() {
|
|
||||||
assert_eq!(
|
|
||||||
AuthUsername::new("T".to_string()),
|
|
||||||
Err(FieldFormatError::UsernameError)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn username_too_long() {
|
|
||||||
let mut long_un = String::new();
|
|
||||||
for _ in 0..33 {
|
|
||||||
long_un += "a";
|
|
||||||
}
|
|
||||||
assert_eq!(
|
|
||||||
AuthUsername::new(long_un),
|
|
||||||
Err(FieldFormatError::UsernameError)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn consent_false() {
|
|
||||||
assert_eq!(
|
|
||||||
RegisterSchema::new(
|
|
||||||
AuthUsername::new("Test".to_string()).unwrap(),
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
),
|
|
||||||
Err(FieldFormatError::ConsentError)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn invalid_email() {
|
|
||||||
assert_eq!(
|
|
||||||
AuthEmail::new("p@p.p".to_string()),
|
|
||||||
Err(FieldFormatError::EmailError)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn valid_email() {
|
|
||||||
let reg = RegisterSchema::new(
|
|
||||||
AuthUsername::new("Testy".to_string()).unwrap(),
|
|
||||||
None,
|
|
||||||
true,
|
|
||||||
Some(AuthEmail::new("me@mail.de".to_string()).unwrap()),
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
);
|
|
||||||
assert_ne!(reg, Err(FieldFormatError::EmailError));
|
|
||||||
}
|
|
||||||
}
|
|
1482
src/api/types.rs
1482
src/api/types.rs
File diff suppressed because it is too large
Load Diff
188
src/gateway.rs
188
src/gateway.rs
|
@ -1,41 +1,6 @@
|
||||||
use crate::errors::ObserverError;
|
use crate::errors::ObserverError;
|
||||||
use crate::gateway::events::Events;
|
use crate::gateway::events::Events;
|
||||||
use crate::types::Channel;
|
use crate::types;
|
||||||
use crate::types::ChannelCreate;
|
|
||||||
use crate::types::ChannelDelete;
|
|
||||||
use crate::types::ChannelPinsUpdate;
|
|
||||||
use crate::types::ChannelUpdate;
|
|
||||||
use crate::types::GatewayHeartbeat;
|
|
||||||
use crate::types::GatewayIdentifyPayload;
|
|
||||||
use crate::types::GatewayPayload;
|
|
||||||
use crate::types::GatewayReady;
|
|
||||||
use crate::types::GatewayRequestGuildMembers;
|
|
||||||
use crate::types::GatewayResume;
|
|
||||||
use crate::types::GatewayVoiceStateUpdate;
|
|
||||||
use crate::types::GuildBanAdd;
|
|
||||||
use crate::types::GuildBanRemove;
|
|
||||||
use crate::types::GuildCreate;
|
|
||||||
use crate::types::HelloData;
|
|
||||||
use crate::types::MessageCreate;
|
|
||||||
use crate::types::MessageDelete;
|
|
||||||
use crate::types::MessageDeleteBulk;
|
|
||||||
use crate::types::MessageReactionAdd;
|
|
||||||
use crate::types::MessageReactionRemove;
|
|
||||||
use crate::types::MessageReactionRemoveAll;
|
|
||||||
use crate::types::MessageReactionRemoveEmoji;
|
|
||||||
use crate::types::MessageUpdate;
|
|
||||||
use crate::types::PresenceUpdate;
|
|
||||||
use crate::types::ThreadCreate;
|
|
||||||
use crate::types::ThreadDelete;
|
|
||||||
use crate::types::ThreadListSync;
|
|
||||||
use crate::types::ThreadMemberUpdate;
|
|
||||||
use crate::types::ThreadMembersUpdate;
|
|
||||||
use crate::types::ThreadUpdate;
|
|
||||||
use crate::types::TypingStartEvent;
|
|
||||||
use crate::types::UnavailableGuild;
|
|
||||||
use crate::types::User;
|
|
||||||
use crate::types::UserUpdate;
|
|
||||||
use crate::types::WebSocketEvent;
|
|
||||||
use futures_util::stream::SplitSink;
|
use futures_util::stream::SplitSink;
|
||||||
use futures_util::SinkExt;
|
use futures_util::SinkExt;
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
|
@ -75,7 +40,7 @@ pub struct GatewayHandle {
|
||||||
impl GatewayHandle {
|
impl GatewayHandle {
|
||||||
/// Sends json to the gateway with an opcode
|
/// Sends json to the gateway with an opcode
|
||||||
async fn send_json_event(&self, op: u8, to_send: serde_json::Value) {
|
async fn send_json_event(&self, op: u8, to_send: serde_json::Value) {
|
||||||
let gateway_payload = GatewayPayload {
|
let gateway_payload = types::GatewayPayload {
|
||||||
op,
|
op,
|
||||||
d: Some(to_send),
|
d: Some(to_send),
|
||||||
s: None,
|
s: None,
|
||||||
|
@ -90,7 +55,7 @@ impl GatewayHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends an identify event to the gateway
|
/// Sends an identify event to the gateway
|
||||||
pub async fn send_identify(&self, to_send: GatewayIdentifyPayload) {
|
pub async fn send_identify(&self, to_send: types::GatewayIdentifyPayload) {
|
||||||
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
||||||
|
|
||||||
println!("GW: Sending Identify..");
|
println!("GW: Sending Identify..");
|
||||||
|
@ -99,7 +64,7 @@ impl GatewayHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends a resume event to the gateway
|
/// Sends a resume event to the gateway
|
||||||
pub async fn send_resume(&self, to_send: GatewayResume) {
|
pub async fn send_resume(&self, to_send: types::GatewayResume) {
|
||||||
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
||||||
|
|
||||||
println!("GW: Sending Resume..");
|
println!("GW: Sending Resume..");
|
||||||
|
@ -108,7 +73,7 @@ impl GatewayHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends an update presence event to the gateway
|
/// Sends an update presence event to the gateway
|
||||||
pub async fn send_update_presence(&self, to_send: PresenceUpdate) {
|
pub async fn send_update_presence(&self, to_send: types::PresenceUpdate) {
|
||||||
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
||||||
|
|
||||||
println!("GW: Sending Presence Update..");
|
println!("GW: Sending Presence Update..");
|
||||||
|
@ -117,7 +82,7 @@ impl GatewayHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends a Request Guild Members to the server
|
/// Sends a Request Guild Members to the server
|
||||||
pub async fn send_request_guild_members(&self, to_send: GatewayRequestGuildMembers) {
|
pub async fn send_request_guild_members(&self, to_send: types::GatewayRequestGuildMembers) {
|
||||||
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
||||||
|
|
||||||
println!("GW: Sending Request Guild Members..");
|
println!("GW: Sending Request Guild Members..");
|
||||||
|
@ -126,7 +91,7 @@ impl GatewayHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sends a Request Guild Members to the server
|
/// Sends a Request Guild Members to the server
|
||||||
pub async fn send_update_voice_state(&self, to_send: GatewayVoiceStateUpdate) {
|
pub async fn send_update_voice_state(&self, to_send: types::GatewayVoiceStateUpdate) {
|
||||||
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
let to_send_value = serde_json::to_value(&to_send).unwrap();
|
||||||
|
|
||||||
println!("GW: Sending Voice State Update..");
|
println!("GW: Sending Voice State Update..");
|
||||||
|
@ -180,7 +145,8 @@ impl Gateway {
|
||||||
// Wait for the first hello and then spawn both tasks so we avoid nested tasks
|
// 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
|
// This automatically spawns the heartbeat task, but from the main thread
|
||||||
let msg = ws_rx.next().await.unwrap().unwrap();
|
let msg = ws_rx.next().await.unwrap().unwrap();
|
||||||
let gateway_payload: GatewayPayload = serde_json::from_str(msg.to_text().unwrap()).unwrap();
|
let gateway_payload: types::GatewayPayload =
|
||||||
|
serde_json::from_str(msg.to_text().unwrap()).unwrap();
|
||||||
|
|
||||||
if gateway_payload.op != 10 {
|
if gateway_payload.op != 10 {
|
||||||
println!("Recieved non hello on gateway init, what is happening?");
|
println!("Recieved non hello on gateway init, what is happening?");
|
||||||
|
@ -193,7 +159,8 @@ impl Gateway {
|
||||||
|
|
||||||
println!("GW: Received Hello");
|
println!("GW: Received Hello");
|
||||||
|
|
||||||
let gateway_hello: HelloData = serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
let gateway_hello: types::HelloData =
|
||||||
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
gateway.heartbeat_handler = Some(HeartbeatHandler::new(
|
gateway.heartbeat_handler = Some(HeartbeatHandler::new(
|
||||||
gateway_hello.heartbeat_interval,
|
gateway_hello.heartbeat_interval,
|
||||||
shared_tx.clone(),
|
shared_tx.clone(),
|
||||||
|
@ -225,7 +192,7 @@ impl Gateway {
|
||||||
|
|
||||||
let msg_string = msg.to_string();
|
let msg_string = msg.to_string();
|
||||||
|
|
||||||
let gateway_payload: GatewayPayload = serde_json::from_str(&msg_string).unwrap();
|
let gateway_payload: types::GatewayPayload = serde_json::from_str(&msg_string).unwrap();
|
||||||
|
|
||||||
// See https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes
|
// See https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes
|
||||||
match gateway_payload.op {
|
match gateway_payload.op {
|
||||||
|
@ -239,7 +206,7 @@ impl Gateway {
|
||||||
// See https://discord.com/developers/docs/topics/gateway-events#receive-events
|
// See https://discord.com/developers/docs/topics/gateway-events#receive-events
|
||||||
match gateway_payload_t.as_str() {
|
match gateway_payload_t.as_str() {
|
||||||
"READY" => {
|
"READY" => {
|
||||||
let _data: GatewayReady =
|
let _data: types::GatewayReady =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
}
|
}
|
||||||
"RESUMED" => {}
|
"RESUMED" => {}
|
||||||
|
@ -249,9 +216,9 @@ impl Gateway {
|
||||||
"AUTO_MODERATION_RULE_DELETE" => {}
|
"AUTO_MODERATION_RULE_DELETE" => {}
|
||||||
"AUTO_MODERATION_ACTION_EXECUTION" => {}
|
"AUTO_MODERATION_ACTION_EXECUTION" => {}
|
||||||
"CHANNEL_CREATE" => {
|
"CHANNEL_CREATE" => {
|
||||||
let channel: Channel =
|
let channel: types::Channel =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = ChannelCreate { channel };
|
let new_data = types::ChannelCreate { channel };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -261,9 +228,9 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"CHANNEL_UPDATE" => {
|
"CHANNEL_UPDATE" => {
|
||||||
let channel: Channel =
|
let channel: types::Channel =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = ChannelUpdate { channel };
|
let new_data = types::ChannelUpdate { channel };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -273,9 +240,9 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"CHANNEL_DELETE" => {
|
"CHANNEL_DELETE" => {
|
||||||
let channel: Channel =
|
let channel: types::Channel =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = ChannelDelete { channel };
|
let new_data = types::ChannelDelete { channel };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -285,7 +252,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"CHANNEL_PINS_UPDATE" => {
|
"CHANNEL_PINS_UPDATE" => {
|
||||||
let new_data: ChannelPinsUpdate =
|
let new_data: types::ChannelPinsUpdate =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -296,9 +263,9 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"THREAD_CREATE" => {
|
"THREAD_CREATE" => {
|
||||||
let thread: Channel =
|
let thread: types::Channel =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = ThreadCreate { thread };
|
let new_data = types::ThreadCreate { thread };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -308,9 +275,9 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"THREAD_UPDATE" => {
|
"THREAD_UPDATE" => {
|
||||||
let thread: Channel =
|
let thread: types::Channel =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = ThreadUpdate { thread };
|
let new_data = types::ThreadUpdate { thread };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -320,9 +287,9 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"THREAD_DELETE" => {
|
"THREAD_DELETE" => {
|
||||||
let thread: Channel =
|
let thread: types::Channel =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = ThreadDelete { thread };
|
let new_data = types::ThreadDelete { thread };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -332,7 +299,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"THREAD_LIST_SYNC" => {
|
"THREAD_LIST_SYNC" => {
|
||||||
let new_data: ThreadListSync =
|
let new_data: types::ThreadListSync =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -343,7 +310,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"THREAD_MEMBER_UPDATE" => {
|
"THREAD_MEMBER_UPDATE" => {
|
||||||
let new_data: ThreadMemberUpdate =
|
let new_data: types::ThreadMemberUpdate =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -354,7 +321,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"THREAD_MEMBERS_UPDATE" => {
|
"THREAD_MEMBERS_UPDATE" => {
|
||||||
let new_data: ThreadMembersUpdate =
|
let new_data: types::ThreadMembersUpdate =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -365,7 +332,8 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"GUILD_CREATE" => {
|
"GUILD_CREATE" => {
|
||||||
let new_data: GuildCreate = serde_json::from_str(&msg_string).unwrap();
|
let new_data: types::GuildCreate =
|
||||||
|
serde_json::from_str(&msg_string).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -376,16 +344,16 @@ impl Gateway {
|
||||||
}
|
}
|
||||||
"GUILD_UPDATE" => {}
|
"GUILD_UPDATE" => {}
|
||||||
"GUILD_DELETE" => {
|
"GUILD_DELETE" => {
|
||||||
let _new_data: UnavailableGuild =
|
let _new_data: types::UnavailableGuild =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
}
|
}
|
||||||
"GUILD_AUDIT_LOG_ENTRY_CREATE" => {}
|
"GUILD_AUDIT_LOG_ENTRY_CREATE" => {}
|
||||||
"GUILD_BAN_ADD" => {
|
"GUILD_BAN_ADD" => {
|
||||||
let _new_data: GuildBanAdd =
|
let _new_data: types::GuildBanAdd =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
}
|
}
|
||||||
"GUILD_BAN_REMOVE" => {
|
"GUILD_BAN_REMOVE" => {
|
||||||
let _new_data: GuildBanRemove =
|
let _new_data: types::GuildBanRemove =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
}
|
}
|
||||||
"GUILD_EMOJIS_UPDATE" => {}
|
"GUILD_EMOJIS_UPDATE" => {}
|
||||||
|
@ -410,7 +378,7 @@ impl Gateway {
|
||||||
"INVITE_CREATE" => {}
|
"INVITE_CREATE" => {}
|
||||||
"INVITE_DELETE" => {}
|
"INVITE_DELETE" => {}
|
||||||
"MESSAGE_CREATE" => {
|
"MESSAGE_CREATE" => {
|
||||||
let new_data: MessageCreate =
|
let new_data: types::MessageCreate =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -421,7 +389,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_UPDATE" => {
|
"MESSAGE_UPDATE" => {
|
||||||
let new_data: MessageUpdate =
|
let new_data: types::MessageUpdate =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -432,7 +400,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_DELETE" => {
|
"MESSAGE_DELETE" => {
|
||||||
let new_data: MessageDelete =
|
let new_data: types::MessageDelete =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -443,7 +411,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_DELETE_BULK" => {
|
"MESSAGE_DELETE_BULK" => {
|
||||||
let new_data: MessageDeleteBulk =
|
let new_data: types::MessageDeleteBulk =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -454,7 +422,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_REACTION_ADD" => {
|
"MESSAGE_REACTION_ADD" => {
|
||||||
let new_data: MessageReactionAdd =
|
let new_data: types::MessageReactionAdd =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -465,7 +433,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_REACTION_REMOVE" => {
|
"MESSAGE_REACTION_REMOVE" => {
|
||||||
let new_data: MessageReactionRemove =
|
let new_data: types::MessageReactionRemove =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -476,7 +444,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_REACTION_REMOVE_ALL" => {
|
"MESSAGE_REACTION_REMOVE_ALL" => {
|
||||||
let new_data: MessageReactionRemoveAll =
|
let new_data: types::MessageReactionRemoveAll =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -487,7 +455,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"MESSAGE_REACTION_REMOVE_EMOJI" => {
|
"MESSAGE_REACTION_REMOVE_EMOJI" => {
|
||||||
let new_data: MessageReactionRemoveEmoji =
|
let new_data: types::MessageReactionRemoveEmoji =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -498,7 +466,7 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"PRESENCE_UPDATE" => {
|
"PRESENCE_UPDATE" => {
|
||||||
let new_data: PresenceUpdate =
|
let new_data: types::PresenceUpdate =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -514,7 +482,7 @@ impl Gateway {
|
||||||
// Not documented in discord docs, I assume this isnt for bots / apps but is for users?
|
// Not documented in discord docs, I assume this isnt for bots / apps but is for users?
|
||||||
"SESSIONS_REPLACE" => {}
|
"SESSIONS_REPLACE" => {}
|
||||||
"TYPING_START" => {
|
"TYPING_START" => {
|
||||||
let new_data: TypingStartEvent =
|
let new_data: types::TypingStartEvent =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -525,9 +493,9 @@ impl Gateway {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
"USER_UPDATE" => {
|
"USER_UPDATE" => {
|
||||||
let user: User =
|
let user: types::User =
|
||||||
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
serde_json::from_value(gateway_payload.d.unwrap()).unwrap();
|
||||||
let new_data = UserUpdate { user };
|
let new_data = types::UserUpdate { user };
|
||||||
self.events
|
self.events
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
|
@ -634,7 +602,7 @@ impl HeartbeatHandler {
|
||||||
if last_heartbeat.elapsed().as_millis() > heartbeat_interval {
|
if last_heartbeat.elapsed().as_millis() > heartbeat_interval {
|
||||||
println!("GW: Sending Heartbeat..");
|
println!("GW: Sending Heartbeat..");
|
||||||
|
|
||||||
let heartbeat = GatewayHeartbeat {
|
let heartbeat = types::GatewayHeartbeat {
|
||||||
op: 1,
|
op: 1,
|
||||||
d: last_seq_number,
|
d: last_seq_number,
|
||||||
};
|
};
|
||||||
|
@ -674,7 +642,7 @@ Trait which defines the behaviour of an Observer. An Observer is an object which
|
||||||
an Observable. The Observer is notified when the Observable's data changes.
|
an Observable. The Observer is notified when the Observable's data changes.
|
||||||
In this case, the Observable is a [`GatewayEvent`], which is a wrapper around a WebSocketEvent.
|
In this case, the Observable is a [`GatewayEvent`], which is a wrapper around a WebSocketEvent.
|
||||||
*/
|
*/
|
||||||
pub trait Observer<T: WebSocketEvent>: std::fmt::Debug {
|
pub trait Observer<T: types::WebSocketEvent>: std::fmt::Debug {
|
||||||
fn update(&self, data: &T);
|
fn update(&self, data: &T);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -683,13 +651,13 @@ change in the WebSocketEvent. GatewayEvents are observable.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct GatewayEvent<T: WebSocketEvent> {
|
pub struct GatewayEvent<T: types::WebSocketEvent> {
|
||||||
observers: Vec<Arc<Mutex<dyn Observer<T> + Sync + Send>>>,
|
observers: Vec<Arc<Mutex<dyn Observer<T> + Sync + Send>>>,
|
||||||
pub event_data: T,
|
pub event_data: T,
|
||||||
pub is_observed: bool,
|
pub is_observed: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: WebSocketEvent> GatewayEvent<T> {
|
impl<T: types::WebSocketEvent> GatewayEvent<T> {
|
||||||
fn new(event_data: T) -> Self {
|
fn new(event_data: T) -> Self {
|
||||||
Self {
|
Self {
|
||||||
is_observed: false,
|
is_observed: false,
|
||||||
|
@ -764,50 +732,50 @@ mod events {
|
||||||
pub channel: Channel,
|
pub channel: Channel,
|
||||||
pub thread: Thread,
|
pub thread: Thread,
|
||||||
pub guild: Guild,
|
pub guild: Guild,
|
||||||
pub gateway_identify_payload: GatewayEvent<GatewayIdentifyPayload>,
|
pub gateway_identify_payload: GatewayEvent<types::GatewayIdentifyPayload>,
|
||||||
pub gateway_resume: GatewayEvent<GatewayResume>,
|
pub gateway_resume: GatewayEvent<types::GatewayResume>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct Message {
|
pub struct Message {
|
||||||
pub create: GatewayEvent<MessageCreate>,
|
pub create: GatewayEvent<types::MessageCreate>,
|
||||||
pub update: GatewayEvent<MessageUpdate>,
|
pub update: GatewayEvent<types::MessageUpdate>,
|
||||||
pub delete: GatewayEvent<MessageDelete>,
|
pub delete: GatewayEvent<types::MessageDelete>,
|
||||||
pub delete_bulk: GatewayEvent<MessageDeleteBulk>,
|
pub delete_bulk: GatewayEvent<types::MessageDeleteBulk>,
|
||||||
pub reaction_add: GatewayEvent<MessageReactionAdd>,
|
pub reaction_add: GatewayEvent<types::MessageReactionAdd>,
|
||||||
pub reaction_remove: GatewayEvent<MessageReactionRemove>,
|
pub reaction_remove: GatewayEvent<types::MessageReactionRemove>,
|
||||||
pub reaction_remove_all: GatewayEvent<MessageReactionRemoveAll>,
|
pub reaction_remove_all: GatewayEvent<types::MessageReactionRemoveAll>,
|
||||||
pub reaction_remove_emoji: GatewayEvent<MessageReactionRemoveEmoji>,
|
pub reaction_remove_emoji: GatewayEvent<types::MessageReactionRemoveEmoji>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
pub update: GatewayEvent<UserUpdate>,
|
pub update: GatewayEvent<types::UserUpdate>,
|
||||||
pub presence_update: GatewayEvent<PresenceUpdate>,
|
pub presence_update: GatewayEvent<types::PresenceUpdate>,
|
||||||
pub typing_start_event: GatewayEvent<TypingStartEvent>,
|
pub typing_start_event: GatewayEvent<types::TypingStartEvent>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct Channel {
|
pub struct Channel {
|
||||||
pub create: GatewayEvent<ChannelCreate>,
|
pub create: GatewayEvent<types::ChannelCreate>,
|
||||||
pub update: GatewayEvent<ChannelUpdate>,
|
pub update: GatewayEvent<types::ChannelUpdate>,
|
||||||
pub delete: GatewayEvent<ChannelDelete>,
|
pub delete: GatewayEvent<types::ChannelDelete>,
|
||||||
pub pins_update: GatewayEvent<ChannelPinsUpdate>,
|
pub pins_update: GatewayEvent<types::ChannelPinsUpdate>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct Thread {
|
pub struct Thread {
|
||||||
pub create: GatewayEvent<ThreadCreate>,
|
pub create: GatewayEvent<types::ThreadCreate>,
|
||||||
pub update: GatewayEvent<ThreadUpdate>,
|
pub update: GatewayEvent<types::ThreadUpdate>,
|
||||||
pub delete: GatewayEvent<ThreadDelete>,
|
pub delete: GatewayEvent<types::ThreadDelete>,
|
||||||
pub list_sync: GatewayEvent<ThreadListSync>,
|
pub list_sync: GatewayEvent<types::ThreadListSync>,
|
||||||
pub member_update: GatewayEvent<ThreadMemberUpdate>,
|
pub member_update: GatewayEvent<types::ThreadMemberUpdate>,
|
||||||
pub members_update: GatewayEvent<ThreadMembersUpdate>,
|
pub members_update: GatewayEvent<types::ThreadMembersUpdate>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct Guild {
|
pub struct Guild {
|
||||||
pub create: GatewayEvent<GuildCreate>,
|
pub create: GatewayEvent<types::GuildCreate>,
|
||||||
/*pub update: GatewayEvent<ThreadCreate>,
|
/*pub update: GatewayEvent<ThreadCreate>,
|
||||||
pub delete: GatewayEvent<ThreadCreate>,
|
pub delete: GatewayEvent<ThreadCreate>,
|
||||||
pub audit_log_entry_create: GatewayEvent<ThreadCreate>,
|
pub audit_log_entry_create: GatewayEvent<ThreadCreate>,
|
||||||
|
@ -837,21 +805,21 @@ mod example {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Consumer;
|
struct Consumer;
|
||||||
impl Observer<GatewayResume> for Consumer {
|
impl Observer<types::GatewayResume> for Consumer {
|
||||||
fn update(&self, data: &GatewayResume) {
|
fn update(&self, data: &types::GatewayResume) {
|
||||||
println!("{}", data.token)
|
println!("{}", data.token)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_observer_behaviour() {
|
async fn test_observer_behaviour() {
|
||||||
let mut event = GatewayEvent::new(GatewayResume {
|
let mut event = GatewayEvent::new(types::GatewayResume {
|
||||||
token: "start".to_string(),
|
token: "start".to_string(),
|
||||||
session_id: "start".to_string(),
|
session_id: "start".to_string(),
|
||||||
seq: "start".to_string(),
|
seq: "start".to_string(),
|
||||||
});
|
});
|
||||||
|
|
||||||
let new_data = GatewayResume {
|
let new_data = types::GatewayResume {
|
||||||
token: "token_3276ha37am3".to_string(),
|
token: "token_3276ha37am3".to_string(),
|
||||||
session_id: "89346671230".to_string(),
|
session_id: "89346671230".to_string(),
|
||||||
seq: "3".to_string(),
|
seq: "3".to_string(),
|
||||||
|
|
Loading…
Reference in New Issue