Reformat entire project, optimize imports

This commit is contained in:
Flori Weber 2023-06-11 13:52:31 +02:00
parent 4e5165d9ff
commit f641dbb14f
68 changed files with 411 additions and 369 deletions

View File

@ -1,72 +1,70 @@
pub mod login { use std::cell::RefCell;
use std::cell::RefCell; use std::rc::Rc;
use std::rc::Rc;
use reqwest::Client; use reqwest::Client;
use serde_json::{from_str, json}; use serde_json::{from_str, json};
use crate::api::limits::LimitType; use crate::api::limits::LimitType;
use crate::errors::ChorusLibError; use crate::errors::ChorusLibError;
use crate::instance::{Instance, UserMeta}; use crate::instance::{Instance, UserMeta};
use crate::limit::LimitedRequester; use crate::limit::LimitedRequester;
use crate::types::{ErrorResponse, LoginResult, LoginSchema}; use crate::types::{ErrorResponse, LoginResult, LoginSchema};
impl Instance { impl Instance {
pub async fn login_account( pub async fn login_account(
&mut self, &mut self,
login_schema: &LoginSchema, login_schema: &LoginSchema,
) -> Result<UserMeta, ChorusLibError> { ) -> Result<UserMeta, ChorusLibError> {
let mut requester = LimitedRequester::new().await; let mut requester = LimitedRequester::new().await;
let json_schema = json!(login_schema); let json_schema = json!(login_schema);
let client = Client::new(); let client = Client::new();
let endpoint_url = self.urls.get_api().to_string() + "/auth/login"; let endpoint_url = self.urls.get_api().to_string() + "/auth/login";
let request_builder = client.post(endpoint_url).body(json_schema.to_string()); let request_builder = client.post(endpoint_url).body(json_schema.to_string());
// We do not have a user yet, and the UserRateLimits will not be affected by a login // We do not have a user yet, and the UserRateLimits will not be affected by a login
// request (since login is an instance wide limit), which is why we are just cloning the // request (since login is an instance wide limit), which is why we are just cloning the
// instances' limits to pass them on as user_rate_limits later. // instances' limits to pass them on as user_rate_limits later.
let mut cloned_limits = self.limits.clone(); let mut cloned_limits = self.limits.clone();
let response = requester let response = requester
.send_request( .send_request(
request_builder, request_builder,
LimitType::AuthRegister, LimitType::AuthRegister,
&mut self.limits, &mut self.limits,
&mut cloned_limits, &mut cloned_limits,
) )
.await; .await;
if response.is_err() { if response.is_err() {
return Err(ChorusLibError::NoResponse); return Err(ChorusLibError::NoResponse);
}
let response_unwrap = response.unwrap();
let status = response_unwrap.status();
let response_text_string = response_unwrap.text().await.unwrap();
if status.is_client_error() {
let json: ErrorResponse = serde_json::from_str(&response_text_string).unwrap();
let error_type = json.errors.errors.iter().next().unwrap().0.to_owned();
let mut error = "".to_string();
for (_, value) in json.errors.errors.iter() {
for error_item in value._errors.iter() {
error += &(error_item.message.to_string() + " (" + &error_item.code + ")");
}
}
return Err(ChorusLibError::InvalidFormBodyError { error_type, error });
}
let cloned_limits = self.limits.clone();
let login_result: LoginResult = from_str(&response_text_string).unwrap();
let object = self
.get_user(login_result.token.clone(), None)
.await
.unwrap();
let user = UserMeta::new(
Rc::new(RefCell::new(self.clone())),
login_result.token,
cloned_limits,
login_result.settings,
object,
);
Ok(user)
} }
let response_unwrap = response.unwrap();
let status = response_unwrap.status();
let response_text_string = response_unwrap.text().await.unwrap();
if status.is_client_error() {
let json: ErrorResponse = serde_json::from_str(&response_text_string).unwrap();
let error_type = json.errors.errors.iter().next().unwrap().0.to_owned();
let mut error = "".to_string();
for (_, value) in json.errors.errors.iter() {
for error_item in value._errors.iter() {
error += &(error_item.message.to_string() + " (" + &error_item.code + ")");
}
}
return Err(ChorusLibError::InvalidFormBodyError { error_type, error });
}
let cloned_limits = self.limits.clone();
let login_result: LoginResult = from_str(&response_text_string).unwrap();
let object = self
.get_user(login_result.token.clone(), None)
.await
.unwrap();
let user = UserMeta::new(
Rc::new(RefCell::new(self.clone())),
login_result.token,
cloned_limits,
login_result.settings,
object,
);
Ok(user)
} }
} }

View File

@ -1,5 +1,6 @@
pub use login::*;
pub use register::*;
pub mod login; pub mod login;
pub mod register; pub mod register;
pub use login::*;
pub use register::*;

View File

@ -1,79 +1,77 @@
pub mod register { use std::{cell::RefCell, rc::Rc};
use std::{cell::RefCell, rc::Rc};
use reqwest::Client; use reqwest::Client;
use serde_json::{from_str, json}; use serde_json::{from_str, json};
use crate::{ use crate::{
api::limits::LimitType, api::limits::LimitType,
errors::ChorusLibError, errors::ChorusLibError,
instance::{Instance, Token, UserMeta}, instance::{Instance, Token, UserMeta},
limit::LimitedRequester, limit::LimitedRequester,
types::{ErrorResponse, RegisterSchema}, types::{ErrorResponse, RegisterSchema},
}; };
impl Instance { impl Instance {
/** /**
Registers a new user on the Spacebar server. Registers a new user on the Spacebar server.
# Arguments # Arguments
* `register_schema` - The [`RegisterSchema`] that contains all the information that is needed to register a new user. * `register_schema` - The [`RegisterSchema`] that contains all the information that is needed to register a new user.
# Errors # Errors
* [`ChorusLibError`] - If the server does not respond. * [`ChorusLibError`] - If the server does not respond.
*/ */
pub async fn register_account( pub async fn register_account(
&mut self, &mut self,
register_schema: &RegisterSchema, register_schema: &RegisterSchema,
) -> Result<UserMeta, ChorusLibError> { ) -> Result<UserMeta, ChorusLibError> {
let json_schema = json!(register_schema); let json_schema = json!(register_schema);
let mut limited_requester = LimitedRequester::new().await; let mut limited_requester = LimitedRequester::new().await;
let client = Client::new(); let client = Client::new();
let endpoint_url = self.urls.get_api().to_string() + "/auth/register"; let endpoint_url = self.urls.get_api().to_string() + "/auth/register";
let request_builder = client.post(endpoint_url).body(json_schema.to_string()); let request_builder = client.post(endpoint_url).body(json_schema.to_string());
// We do not have a user yet, and the UserRateLimits will not be affected by a login // We do not have a user yet, and the UserRateLimits will not be affected by a login
// request (since register is an instance wide limit), which is why we are just cloning // request (since register is an instance wide limit), which is why we are just cloning
// the instances' limits to pass them on as user_rate_limits later. // the instances' limits to pass them on as user_rate_limits later.
let mut cloned_limits = self.limits.clone(); let mut cloned_limits = self.limits.clone();
let response = limited_requester let response = limited_requester
.send_request( .send_request(
request_builder, request_builder,
LimitType::AuthRegister, LimitType::AuthRegister,
&mut self.limits, &mut self.limits,
&mut cloned_limits, &mut cloned_limits,
) )
.await; .await;
if response.is_err() { if response.is_err() {
return Err(ChorusLibError::NoResponse); return Err(ChorusLibError::NoResponse);
}
let response_unwrap = response.unwrap();
let status = response_unwrap.status();
let response_unwrap_text = response_unwrap.text().await.unwrap();
let token = from_str::<Token>(&response_unwrap_text).unwrap();
let token = token.token;
if status.is_client_error() {
let json: ErrorResponse = serde_json::from_str(&token).unwrap();
let error_type = json.errors.errors.iter().next().unwrap().0.to_owned();
let mut error = "".to_string();
for (_, value) in json.errors.errors.iter() {
for error_item in value._errors.iter() {
error += &(error_item.message.to_string() + " (" + &error_item.code + ")");
}
}
return Err(ChorusLibError::InvalidFormBodyError { error_type, error });
}
let user_object = self.get_user(token.clone(), None).await.unwrap();
let settings =
UserMeta::get_settings(&token, &self.urls.get_api().to_string(), &mut self.limits)
.await
.unwrap();
let user: UserMeta = UserMeta::new(
Rc::new(RefCell::new(self.clone())),
token.clone(),
cloned_limits,
settings,
user_object,
);
Ok(user)
} }
let response_unwrap = response.unwrap();
let status = response_unwrap.status();
let response_unwrap_text = response_unwrap.text().await.unwrap();
let token = from_str::<Token>(&response_unwrap_text).unwrap();
let token = token.token;
if status.is_client_error() {
let json: ErrorResponse = serde_json::from_str(&token).unwrap();
let error_type = json.errors.errors.iter().next().unwrap().0.to_owned();
let mut error = "".to_string();
for (_, value) in json.errors.errors.iter() {
for error_item in value._errors.iter() {
error += &(error_item.message.to_string() + " (" + &error_item.code + ")");
}
}
return Err(ChorusLibError::InvalidFormBodyError { error_type, error });
}
let user_object = self.get_user(token.clone(), None).await.unwrap();
let settings =
UserMeta::get_settings(&token, &self.urls.get_api().to_string(), &mut self.limits)
.await
.unwrap();
let user: UserMeta = UserMeta::new(
Rc::new(RefCell::new(self.clone())),
token.clone(),
cloned_limits,
settings,
user_object,
);
Ok(user)
} }
} }

View File

@ -1,6 +1,6 @@
use http::header::CONTENT_DISPOSITION; use http::header::CONTENT_DISPOSITION;
use http::HeaderMap; use http::HeaderMap;
use reqwest::{multipart, Client}; use reqwest::{Client, multipart};
use serde_json::to_string; use serde_json::to_string;
use crate::instance::UserMeta; use crate::instance::UserMeta;

View File

@ -1,9 +1,10 @@
pub use channels::*;
pub use messages::*;
pub use permissions::*;
pub use reactions::*;
pub mod channels; pub mod channels;
pub mod messages; pub mod messages;
pub mod permissions; pub mod permissions;
pub mod reactions; pub mod reactions;
pub use channels::*;
pub use messages::*;
pub use permissions::*;
pub use reactions::*;

View File

@ -28,7 +28,7 @@ impl ReactionMeta {
# Reference # Reference
See [https://discord.com/developers/docs/resources/channel#delete-all-reactions](https://discord.com/developers/docs/resources/channel#delete-all-reactions) See [https://discord.com/developers/docs/resources/channel#delete-all-reactions](https://discord.com/developers/docs/resources/channel#delete-all-reactions)
*/ */
pub async fn delete_all( pub async fn delete_all(
&self, &self,
user: &mut UserMeta, user: &mut UserMeta,
@ -66,7 +66,7 @@ impl ReactionMeta {
# Reference # Reference
See [https://discord.com/developers/docs/resources/channel#get-reactions](https://discord.com/developers/docs/resources/channel#get-reactions) See [https://discord.com/developers/docs/resources/channel#get-reactions](https://discord.com/developers/docs/resources/channel#get-reactions)
*/ */
pub async fn get( pub async fn get(
&self, &self,
emoji: &str, emoji: &str,
@ -108,7 +108,7 @@ impl ReactionMeta {
# Reference # Reference
See [https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji](https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji) See [https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji](https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji)
*/ */
pub async fn delete_emoji( pub async fn delete_emoji(
&self, &self,
emoji: &str, emoji: &str,
@ -154,7 +154,7 @@ impl ReactionMeta {
# Reference # Reference
See [https://discord.com/developers/docs/resources/channel#create-reaction](https://discord.com/developers/docs/resources/channel#create-reaction) See [https://discord.com/developers/docs/resources/channel#create-reaction](https://discord.com/developers/docs/resources/channel#create-reaction)
*/ */
pub async fn create( pub async fn create(
&self, &self,
emoji: &str, emoji: &str,
@ -241,7 +241,7 @@ impl ReactionMeta {
# Reference # Reference
See [https://discord.com/developers/docs/resources/channel#delete-own-reaction](https://discord.com/developers/docs/resources/channel#delete-own-reaction) See [https://discord.com/developers/docs/resources/channel#delete-own-reaction](https://discord.com/developers/docs/resources/channel#delete-own-reaction)
*/ */
pub async fn delete_user( pub async fn delete_user(
&self, &self,
user_id: &str, user_id: &str,

View File

@ -56,8 +56,8 @@ impl Guild {
&mut user.limits, &mut user.limits,
&mut belongs_to.limits, &mut belongs_to.limits,
) )
.await .await
.unwrap(); .unwrap();
Ok(guild) Ok(guild)
} }
@ -134,7 +134,7 @@ impl Guild {
&mut user.limits, &mut user.limits,
&mut belongs_to.limits, &mut belongs_to.limits,
) )
.await .await
} }
/// Returns a `Result` containing a vector of `Channel` structs if the request was successful, or an `ChorusLibError` if there was an error. /// Returns a `Result` containing a vector of `Channel` structs if the request was successful, or an `ChorusLibError` if there was an error.
@ -173,7 +173,7 @@ impl Guild {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
let _: Vec<Channel> = match from_str(&stringed_response) { let _: Vec<Channel> = match from_str(&stringed_response) {
@ -181,7 +181,7 @@ impl Guild {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
} }
@ -205,7 +205,7 @@ impl Guild {
&mut user.limits, &mut user.limits,
&mut belongs_to.limits, &mut belongs_to.limits,
) )
.await .await
} }
/// For internal use. Does the same as the public get method, but does not require a second, mutable /// For internal use. Does the same as the public get method, but does not require a second, mutable
@ -267,7 +267,7 @@ impl Channel {
&mut user.limits, &mut user.limits,
&mut belongs_to.limits, &mut belongs_to.limits,
) )
.await .await
} }
async fn _create( async fn _create(

View File

@ -43,7 +43,7 @@ impl types::GuildMember {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
let member = from_str::<types::GuildMember>(&response_text); let member = from_str::<types::GuildMember>(&response_text);

View File

@ -1,7 +1,7 @@
pub mod guilds;
pub mod member;
pub mod roles;
pub use guilds::*; pub use guilds::*;
pub use roles::*; pub use roles::*;
pub use roles::*; pub use roles::*;
pub mod guilds;
pub mod member;
pub mod roles;

View File

@ -48,7 +48,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
@ -105,7 +105,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
@ -139,7 +139,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::FormCreationError { return Err(ChorusLibError::FormCreationError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
let request = Client::new().post(url).bearer_auth(user.token()).body(body); let request = Client::new().post(url).bearer_auth(user.token()).body(body);
@ -161,7 +161,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
Ok(role) Ok(role)
@ -194,7 +194,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::FormCreationError { return Err(ChorusLibError::FormCreationError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
let request = Client::new() let request = Client::new()
@ -216,7 +216,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
Ok(role) Ok(role)
@ -256,7 +256,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::FormCreationError { return Err(ChorusLibError::FormCreationError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
let request = Client::new() let request = Client::new()
@ -281,7 +281,7 @@ impl types::RoleObject {
Err(e) => { Err(e) => {
return Err(ChorusLibError::InvalidResponseError { return Err(ChorusLibError::InvalidResponseError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
Ok(role) Ok(role)

View File

@ -1,10 +1,11 @@
pub use channels::messages::*;
pub use guilds::*;
pub use policies::instance::instance::*;
pub use policies::instance::limits::*;
pub mod auth; pub mod auth;
pub mod channels; pub mod channels;
pub mod guilds; pub mod guilds;
pub mod policies; pub mod policies;
pub mod users; pub mod users;
pub use channels::messages::*;
pub use guilds::*;
pub use policies::instance::instance::*;
pub use policies::instance::limits::*;

View File

@ -10,7 +10,7 @@ impl Instance {
Gets the instance policies schema. Gets the instance policies schema.
# Errors # Errors
[`ChorusLibError`] - If the request fails. [`ChorusLibError`] - If the request fails.
*/ */
pub async fn general_configuration_schema( pub async fn general_configuration_schema(
&self, &self,
) -> Result<GeneralConfiguration, ChorusLibError> { ) -> Result<GeneralConfiguration, ChorusLibError> {

View File

@ -47,7 +47,6 @@ pub mod limits {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct Guild { pub struct Guild {
pub maxRoles: u64, pub maxRoles: u64,
pub maxEmojis: u64, pub maxEmojis: u64,
@ -58,7 +57,6 @@ pub mod limits {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct Message { pub struct Message {
pub maxCharacters: u64, pub maxCharacters: u64,
pub maxTTSCharacters: u64, pub maxTTSCharacters: u64,
@ -70,7 +68,6 @@ pub mod limits {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct Channel { pub struct Channel {
pub maxPins: u64, pub maxPins: u64,
pub maxTopic: u64, pub maxTopic: u64,
@ -102,7 +99,6 @@ pub mod limits {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct AuthRoutes { pub struct AuthRoutes {
pub login: Window, pub login: Window,
pub register: Window, pub register: Window,
@ -110,7 +106,6 @@ pub mod limits {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct AbsoluteRate { pub struct AbsoluteRate {
pub register: AbsoluteWindow, pub register: AbsoluteWindow,
pub sendMessage: AbsoluteWindow, pub sendMessage: AbsoluteWindow,
@ -125,7 +120,6 @@ pub mod limits {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct Config { pub struct Config {
pub user: User, pub user: User,
pub guild: Guild, pub guild: Guild,

View File

@ -1,5 +1,6 @@
pub use instance::*;
pub use limits::*;
pub mod instance; pub mod instance;
pub mod limits; pub mod limits;
pub use instance::*;
pub use limits::*;

View File

@ -1,3 +1,4 @@
pub use instance::limits::*;
pub mod instance; pub mod instance;
pub use instance::limits::*;

View File

@ -1,3 +1,4 @@
pub use users::*;
pub mod users; pub mod users;
pub use users::*;

View File

@ -115,7 +115,7 @@ impl User {
&mut belongs_to.limits, &mut belongs_to.limits,
id, id,
) )
.await .await
} }
async fn _get( async fn _get(
@ -197,6 +197,6 @@ impl Instance {
&mut self.limits, &mut self.limits,
id, id,
) )
.await .await
} }
} }

View File

@ -1,11 +1,9 @@
use crate::errors::ObserverError; use std::sync::Arc;
use crate::gateway::events::Events;
use crate::types;
use futures_util::stream::SplitSink;
use futures_util::SinkExt; use futures_util::SinkExt;
use futures_util::stream::SplitSink;
use futures_util::StreamExt; use futures_util::StreamExt;
use native_tls::TlsConnector; use native_tls::TlsConnector;
use std::sync::Arc;
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use tokio::sync::mpsc::error::TryRecvError; use tokio::sync::mpsc::error::TryRecvError;
@ -15,8 +13,12 @@ use tokio::task;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tokio::time; use tokio::time;
use tokio::time::Instant; use tokio::time::Instant;
use tokio_tungstenite::MaybeTlsStream;
use tokio_tungstenite::{connect_async_tls_with_config, Connector, WebSocketStream}; use tokio_tungstenite::{connect_async_tls_with_config, Connector, WebSocketStream};
use tokio_tungstenite::MaybeTlsStream;
use crate::errors::ObserverError;
use crate::gateway::events::Events;
use crate::types;
// Gateway opcodes // Gateway opcodes
/// Opcode received when the server dispatches a [crate::types::WebSocketEvent] /// Opcode received when the server dispatches a [crate::types::WebSocketEvent]
@ -72,7 +74,7 @@ Represents a handle to a Gateway connection. A Gateway connection will create ob
[`GatewayEvents`](GatewayEvent), which you can subscribe to. Gateway events include all currently [`GatewayEvents`](GatewayEvent), which you can subscribe to. Gateway events include all currently
implemented [Types] with the trait [`WebSocketEvent`] implemented [Types] with the trait [`WebSocketEvent`]
Using this handle you can also send Gateway Events directly. Using this handle you can also send Gateway Events directly.
*/ */
pub struct GatewayHandle { pub struct GatewayHandle {
pub url: String, pub url: String,
pub events: Arc<Mutex<Events>>, pub events: Arc<Mutex<Events>>,
@ -201,7 +203,7 @@ impl Gateway {
TlsConnector::builder().build().unwrap(), TlsConnector::builder().build().unwrap(),
)), )),
) )
.await .await
{ {
Ok(websocket_stream) => websocket_stream, Ok(websocket_stream) => websocket_stream,
Err(e) => return Err(e), Err(e) => return Err(e),
@ -1198,7 +1200,7 @@ impl Gateway {
/** /**
Handles sending heartbeats to the gateway in another thread Handles sending heartbeats to the gateway in another thread
*/ */
struct HeartbeatHandler { struct HeartbeatHandler {
/// The heartbeat interval in milliseconds /// The heartbeat interval in milliseconds
pub heartbeat_interval: u128, pub heartbeat_interval: u128,
@ -1267,7 +1269,7 @@ impl HeartbeatHandler {
/** /**
Used to communicate with the main thread. Used to communicate with the main thread.
Either signifies a sequence number update or a received heartbeat ack Either signifies a sequence number update or a received heartbeat ack
*/ */
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
struct HeartbeatThreadCommunication { struct HeartbeatThreadCommunication {
/// The opcode for the communication we received /// The opcode for the communication we received
@ -1287,8 +1289,7 @@ pub trait Observer<T: types::WebSocketEvent>: std::fmt::Debug {
/** GatewayEvent is a wrapper around a WebSocketEvent. It is used to notify the observers of a /** GatewayEvent is a wrapper around a WebSocketEvent. It is used to notify the observers of a
change in the WebSocketEvent. GatewayEvents are observable. change in the WebSocketEvent. GatewayEvents are observable.
*/ */
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct GatewayEvent<T: types::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>>>,
@ -1307,7 +1308,7 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
/** /**
Returns true if the GatewayEvent is observed by at least one Observer. Returns true if the GatewayEvent is observed by at least one Observer.
*/ */
pub fn is_observed(&self) -> bool { pub fn is_observed(&self) -> bool {
self.is_observed self.is_observed
} }
@ -1318,7 +1319,7 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
# Errors # Errors
Returns an error if the GatewayEvent is already observed. Returns an error if the GatewayEvent is already observed.
Error type: [`ObserverError::AlreadySubscribedError`] Error type: [`ObserverError::AlreadySubscribedError`]
*/ */
pub fn subscribe( pub fn subscribe(
&mut self, &mut self,
observable: Arc<Mutex<dyn Observer<T> + Sync + Send>>, observable: Arc<Mutex<dyn Observer<T> + Sync + Send>>,
@ -1333,7 +1334,7 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
/** /**
Unsubscribes an Observer from the GatewayEvent. Unsubscribes an Observer from the GatewayEvent.
*/ */
pub fn unsubscribe(&mut self, observable: Arc<Mutex<dyn Observer<T> + Sync + Send>>) { pub fn unsubscribe(&mut self, observable: Arc<Mutex<dyn Observer<T> + Sync + Send>>) {
// .retain()'s closure retains only those elements of the vector, which have a different // .retain()'s closure retains only those elements of the vector, which have a different
// pointer value than observable. // pointer value than observable.
@ -1346,7 +1347,7 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
/** /**
Updates the GatewayEvent's data and notifies the observers. Updates the GatewayEvent's data and notifies the observers.
*/ */
async fn update_data(&mut self, new_event_data: T) { async fn update_data(&mut self, new_event_data: T) {
self.event_data = new_event_data; self.event_data = new_event_data;
self.notify().await; self.notify().await;
@ -1354,7 +1355,7 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
/** /**
Notifies the observers of the GatewayEvent. Notifies the observers of the GatewayEvent.
*/ */
async fn notify(&self) { async fn notify(&self) {
for observer in &self.observers { for observer in &self.observers {
observer.lock().await.update(&self.event_data); observer.lock().await.update(&self.event_data);
@ -1364,6 +1365,7 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
mod events { mod events {
use super::*; use super::*;
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Events { pub struct Events {
pub application: Application, pub application: Application,
@ -1528,6 +1530,7 @@ mod example {
#[derive(Debug)] #[derive(Debug)]
struct Consumer; struct Consumer;
impl Observer<types::GatewayResume> for Consumer { impl Observer<types::GatewayResume> for Consumer {
fn update(&self, data: &types::GatewayResume) { fn update(&self, data: &types::GatewayResume) {
println!("{}", data.token) println!("{}", data.token)

View File

@ -1,3 +1,7 @@
use std::cell::RefCell;
use std::fmt;
use std::rc::Rc;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::api::limits::Limits; use crate::api::limits::Limits;
@ -5,10 +9,6 @@ use crate::errors::{ChorusLibError, FieldFormatError};
use crate::types::{GeneralConfiguration, User, UserSettings}; use crate::types::{GeneralConfiguration, User, UserSettings};
use crate::URLBundle; use crate::URLBundle;
use std::cell::RefCell;
use std::fmt;
use std::rc::Rc;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
/** /**
The [`Instance`] what you will be using to perform all sorts of actions on the Spacebar server. The [`Instance`] what you will be using to perform all sorts of actions on the Spacebar server.
@ -47,7 +47,7 @@ impl Instance {
Err(e) => { Err(e) => {
return Err(ChorusLibError::CantGetInfoError { return Err(ChorusLibError::CantGetInfoError {
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
Ok(instance) Ok(instance)

View File

@ -1,3 +1,5 @@
use url::{ParseError, Url};
#[cfg(feature = "client")] #[cfg(feature = "client")]
pub mod api; pub mod api;
pub mod errors; pub mod errors;
@ -11,9 +13,7 @@ pub mod types;
#[cfg(feature = "client")] #[cfg(feature = "client")]
pub mod voice; pub mod voice;
use url::{ParseError, Url};
#[derive(Clone, Default, Debug, PartialEq, Eq)] #[derive(Clone, Default, Debug, PartialEq, Eq)]
/// A URLBundle is a struct which bundles together the API-, Gateway- and CDN-URLs of a Spacebar /// A URLBundle is a struct which bundles together the API-, Gateway- and CDN-URLs of a Spacebar
/// instance. /// instance.
pub struct URLBundle { pub struct URLBundle {

View File

@ -1,10 +1,11 @@
use crate::{ use std::collections::VecDeque;
api::limits::{Limit, LimitType, Limits, LimitsMutRef},
errors::ChorusLibError,
};
use reqwest::{Client, RequestBuilder, Response}; use reqwest::{Client, RequestBuilder, Response};
use std::collections::VecDeque;
use crate::{
api::limits::{Limit, Limits, LimitsMutRef, LimitType},
errors::ChorusLibError,
};
// Note: There seem to be some overlapping request limiters. We need to make sure that sending a // Note: There seem to be some overlapping request limiters. We need to make sure that sending a
// request checks for all the request limiters that apply, and blocks if any of the limiters are 0 // request checks for all the request limiters that apply, and blocks if any of the limiters are 0
@ -64,7 +65,7 @@ impl LimitedRequester {
- There has been an error with processing (unwrapping) the [`Response`](`reqwest::Response`) - There has been an error with processing (unwrapping) the [`Response`](`reqwest::Response`)
- The call to [`update_limits`](`crate::limits::update_limits`) yielded errors. Read the - The call to [`update_limits`](`crate::limits::update_limits`) yielded errors. Read the
methods' Errors section for more information. methods' Errors section for more information.
*/ */
pub async fn send_request( pub async fn send_request(
&mut self, &mut self,
request: RequestBuilder, request: RequestBuilder,
@ -79,7 +80,7 @@ impl LimitedRequester {
return Err(ChorusLibError::RequestErrorError { return Err(ChorusLibError::RequestErrorError {
url: "".to_string(), url: "".to_string(),
error: e.to_string(), error: e.to_string(),
}) });
} }
}; };
let result = self.http.execute(built_request).await; let result = self.http.execute(built_request).await;
@ -88,7 +89,7 @@ impl LimitedRequester {
Err(e) => { Err(e) => {
return Err(ChorusLibError::ReceivedErrorCodeError { return Err(ChorusLibError::ReceivedErrorCodeError {
error_code: e.to_string(), error_code: e.to_string(),
}) });
} }
}; };
self.update_limits( self.update_limits(
@ -104,7 +105,7 @@ impl LimitedRequester {
_ => { _ => {
return Err(ChorusLibError::ReceivedErrorCodeError { return Err(ChorusLibError::ReceivedErrorCodeError {
error_code: response.status().as_str().to_string(), error_code: response.status().as_str().to_string(),
}) });
} }
} }
} else { } else {
@ -148,7 +149,7 @@ impl LimitedRequester {
&LimitType::Ip, &LimitType::Ip,
&limit_type, &limit_type,
] ]
.to_vec(); .to_vec();
for limit in constant_limits.iter() { for limit in constant_limits.iter() {
match rate_limits.to_hash_map().get(limit) { match rate_limits.to_hash_map().get(limit) {
Some(limit) => { Some(limit) => {
@ -158,21 +159,21 @@ impl LimitedRequester {
// AbsoluteRegister and AuthRegister can cancel each other out. // AbsoluteRegister and AuthRegister can cancel each other out.
if limit.bucket == LimitType::AbsoluteRegister if limit.bucket == LimitType::AbsoluteRegister
&& rate_limits && rate_limits
.to_hash_map() .to_hash_map()
.get(&LimitType::AuthRegister) .get(&LimitType::AuthRegister)
.unwrap() .unwrap()
.remaining .remaining
== 0 == 0
{ {
return false; return false;
} }
if limit.bucket == LimitType::AuthRegister if limit.bucket == LimitType::AuthRegister
&& rate_limits && rate_limits
.to_hash_map() .to_hash_map()
.get(&LimitType::AbsoluteRegister) .get(&LimitType::AbsoluteRegister)
.unwrap() .unwrap()
.remaining .remaining
== 0 == 0
{ {
return false; return false;
} }
@ -281,10 +282,11 @@ impl LimitedRequester {
mod rate_limit { mod rate_limit {
use serde_json::from_str; use serde_json::from_str;
use super::*;
use crate::{api::limits::Config, URLBundle}; use crate::{api::limits::Config, URLBundle};
#[tokio::test]
use super::*;
#[tokio::test]
async fn create_limited_requester() { async fn create_limited_requester() {
let _urls = URLBundle::new( let _urls = URLBundle::new(
String::from("http://localhost:3001/api/"), String::from("http://localhost:3001/api/"),

View File

@ -172,7 +172,7 @@ fn insert_into(value: &mut Value, path: &[&str], new_value: Value) {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use crate::types::config::{generate_pairs, pairs_to_config, ConfigValue}; use crate::types::config::{ConfigValue, generate_pairs, pairs_to_config};
#[test] #[test]
fn test_pairs() { fn test_pairs() {

View File

@ -1,20 +1,21 @@
use serde::{Deserialize, Serialize};
#[cfg(feature = "sqlx")]
use sqlx::{
database::{HasArguments, HasValueRef},
encode::IsNull,
error::BoxDynError,
Decode, Encode, MySql,
};
use std::fmt::{Display, Formatter}; use std::fmt::{Display, Formatter};
use std::io::Write; use std::io::Write;
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use std::str::FromStr; use std::str::FromStr;
use serde::{Deserialize, Serialize};
#[cfg(feature = "sqlx")]
use sqlx::{
database::{HasArguments, HasValueRef},
Decode,
Encode,
encode::IsNull, error::BoxDynError, MySql,
};
use crate::types::{Error, GuildError};
use crate::types::config::types::subconfigs::guild::{ use crate::types::config::types::subconfigs::guild::{
autojoin::AutoJoinConfiguration, discovery::DiscoverConfiguration, autojoin::AutoJoinConfiguration, discovery::DiscoverConfiguration,
}; };
use crate::types::{Error, GuildError};
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] #[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]

View File

@ -1,7 +1,7 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::config::types::subconfigs::limits::ratelimits::{ use crate::types::config::types::subconfigs::limits::ratelimits::{
route::RouteRateLimit, RateLimitOptions, RateLimitOptions, route::RouteRateLimit,
}; };
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]

View File

@ -9,6 +9,7 @@ pub struct RegistrationEmailConfiguration {
#[serde(default)] #[serde(default)]
pub domains: Vec<String>, pub domains: Vec<String>,
} }
impl Default for RegistrationEmailConfiguration { impl Default for RegistrationEmailConfiguration {
fn default() -> Self { fn default() -> Self {
Self { Self {

View File

@ -1,7 +1,8 @@
pub use date_of_birth::DateOfBirthConfiguration;
pub use email::RegistrationEmailConfiguration;
pub use password::PasswordConfiguration;
mod date_of_birth; mod date_of_birth;
mod email; mod email;
mod password; mod password;
pub use date_of_birth::DateOfBirthConfiguration;
pub use email::RegistrationEmailConfiguration;
pub use password::PasswordConfiguration;

View File

@ -1,5 +1,6 @@
pub use captcha::{CaptchaConfiguration, CaptchaService};
pub use twofactor::TwoFactorConfiguration;
mod captcha; mod captcha;
mod twofactor; mod twofactor;
pub use captcha::{CaptchaConfiguration, CaptchaService};
pub use twofactor::TwoFactorConfiguration;

View File

@ -1,10 +1,11 @@
use crate::types::utils::Snowflake;
use crate::types::{Team, User};
use bitflags::{bitflags, Flags}; use bitflags::{bitflags, Flags};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::Value; use serde_json::Value;
use serde_repr::{Deserialize_repr, Serialize_repr}; use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::types::{Team, User};
use crate::types::utils::Snowflake;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))] #[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct Application { pub struct Application {

View File

@ -23,7 +23,6 @@ pub struct Attachment {
} }
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PartialDiscordFileAttachment { pub struct PartialDiscordFileAttachment {
pub id: Option<i16>, pub id: Option<i16>,
pub filename: String, pub filename: String,

View File

@ -2,12 +2,12 @@ use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr}; use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::types::types::guild_configuration::GuildFeaturesList;
use crate::types::{ use crate::types::{
entities::{Channel, Emoji, RoleObject, Sticker, User, VoiceState, Webhook}, entities::{Channel, Emoji, RoleObject, Sticker, User, VoiceState, Webhook},
interfaces::WelcomeScreenObject, interfaces::WelcomeScreenObject,
utils::Snowflake, utils::Snowflake,
}; };
use crate::types::types::guild_configuration::GuildFeaturesList;
/// See https://discord.com/developers/docs/resources/guild /// See https://discord.com/developers/docs/resources/guild
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]

View File

@ -170,7 +170,6 @@ pub struct EmbedAuthor {
} }
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] #[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub struct EmbedField { pub struct EmbedField {
name: String, name: String,
value: String, value: String,

View File

@ -1,3 +1,26 @@
pub use application::*;
pub use attachment::*;
pub use audit_log::*;
pub use auto_moderation::*;
pub use channel::*;
pub use config::*;
pub use emoji::*;
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::*;
pub use user::*;
pub use user_settings::*;
pub use voice_state::*;
pub use webhook::*;
mod application; mod application;
mod attachment; mod attachment;
mod audit_log; mod audit_log;
@ -21,25 +44,3 @@ mod user_settings;
mod voice_state; mod voice_state;
mod webhook; mod webhook;
pub use application::*;
pub use attachment::*;
pub use audit_log::*;
pub use auto_moderation::*;
pub use channel::*;
pub use config::*;
pub use emoji::*;
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::*;
pub use user::*;
pub use user_settings::*;
pub use voice_state::*;
pub use webhook::*;

View File

@ -21,7 +21,8 @@ pub struct GuildTemplate {
pub updated_at: DateTime<Utc>, pub updated_at: DateTime<Utc>,
pub source_guild_id: String, pub source_guild_id: String,
#[cfg_attr(feature = "sqlx", sqlx(skip))] #[cfg_attr(feature = "sqlx", sqlx(skip))]
pub source_guild: Vec<Guild>, // Unsure how a {recursive: Guild} looks like, might be a Vec? pub source_guild: Vec<Guild>,
// Unsure how a {recursive: Guild} looks like, might be a Vec?
#[cfg_attr(feature = "sqlx", sqlx(skip))] #[cfg_attr(feature = "sqlx", sqlx(skip))]
pub serialized_source_guild: Vec<Guild>, pub serialized_source_guild: Vec<Guild>,
} }

View File

@ -10,12 +10,14 @@ pub struct CallCreate {
pub voice_states: Vec<VoiceState>, pub voice_states: Vec<VoiceState>,
/// Seems like a vec of channel ids /// Seems like a vec of channel ids
pub ringing: Vec<String>, pub ringing: Vec<String>,
pub region: String, // milan pub region: String,
// milan
pub message_id: String, pub message_id: String,
/// What is this? /// What is this?
pub embedded_activities: Vec<serde_json::Value>, pub embedded_activities: Vec<serde_json::Value>,
pub channel_id: String, pub channel_id: String,
} }
impl WebSocketEvent for CallCreate {} impl WebSocketEvent for CallCreate {}
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
@ -25,11 +27,13 @@ impl WebSocketEvent for CallCreate {}
pub struct CallUpdate { pub struct CallUpdate {
/// Seems like a vec of channel ids /// Seems like a vec of channel ids
pub ringing: Vec<String>, pub ringing: Vec<String>,
pub region: String, // milan pub region: String,
// milan
pub message_id: String, pub message_id: String,
pub guild_id: Option<String>, pub guild_id: Option<String>,
pub channel_id: String, pub channel_id: String,
} }
impl WebSocketEvent for CallUpdate {} impl WebSocketEvent for CallUpdate {}
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
@ -39,6 +43,7 @@ impl WebSocketEvent for CallUpdate {}
pub struct CallDelete { pub struct CallDelete {
pub channel_id: String, pub channel_id: String,
} }
impl WebSocketEvent for CallDelete {} impl WebSocketEvent for CallDelete {}
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
@ -48,4 +53,5 @@ impl WebSocketEvent for CallDelete {}
pub struct CallSync { pub struct CallSync {
pub channel_id: String, pub channel_id: String,
} }
impl WebSocketEvent for CallSync {} impl WebSocketEvent for CallSync {}

View File

@ -1,8 +1,9 @@
use crate::types::entities::Channel;
use crate::types::events::WebSocketEvent;
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::entities::Channel;
use crate::types::events::WebSocketEvent;
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
/// See https://discord.com/developers/docs/topics/gateway-events#channel-pins-update /// See https://discord.com/developers/docs/topics/gateway-events#channel-pins-update
pub struct ChannelPinsUpdate { pub struct ChannelPinsUpdate {

View File

@ -1,9 +1,10 @@
use crate::types::entities::{Guild, PublicUser, UnavailableGuild};
use crate::types::events::WebSocketEvent;
use crate::types::{AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, RoleObject, Sticker};
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::{AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, RoleObject, Sticker};
use crate::types::entities::{Guild, PublicUser, UnavailableGuild};
use crate::types::events::WebSocketEvent;
use super::PresenceUpdate; use super::PresenceUpdate;
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
@ -26,6 +27,7 @@ impl Default for GuildCreateDataOption {
GuildCreateDataOption::UnavailableGuild(UnavailableGuild::default()) GuildCreateDataOption::UnavailableGuild(UnavailableGuild::default())
} }
} }
impl WebSocketEvent for GuildCreate {} impl WebSocketEvent for GuildCreate {}
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]

View File

@ -1,6 +1,7 @@
use crate::types::events::WebSocketEvent;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::events::WebSocketEvent;
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
pub struct GatewayHeartbeat { pub struct GatewayHeartbeat {
pub op: u8, pub op: u8,

View File

@ -1,6 +1,7 @@
use crate::types::events::WebSocketEvent;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::events::WebSocketEvent;
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
pub struct GatewayHello { pub struct GatewayHello {
pub op: i32, pub op: i32,

View File

@ -1,7 +1,8 @@
use crate::types::events::{PresenceUpdate, WebSocketEvent};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_with::serde_as; use serde_with::serde_as;
use crate::types::events::{PresenceUpdate, WebSocketEvent};
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct GatewayIdentifyPayload { pub struct GatewayIdentifyPayload {
pub token: String, pub token: String,
@ -9,7 +10,8 @@ pub struct GatewayIdentifyPayload {
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub compress: Option<bool>, pub compress: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub large_threshold: Option<i16>, //default: 50 pub large_threshold: Option<i16>,
//default: 50
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub shard: Option<Vec<(i32, i32)>>, pub shard: Option<Vec<(i32, i32)>>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]

View File

@ -24,4 +24,5 @@ pub struct LazyRequest {
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<HashMap<String, Vec<Vec<u64>>>>, pub channels: Option<HashMap<String, Vec<Vec<u64>>>>,
} }
impl WebSocketEvent for LazyRequest {} impl WebSocketEvent for LazyRequest {}

View File

@ -126,4 +126,5 @@ pub struct MessageACK {
pub flags: Option<serde_json::Value>, pub flags: Option<serde_json::Value>,
pub channel_id: String, pub channel_id: String,
} }
impl WebSocketEvent for MessageACK {} impl WebSocketEvent for MessageACK {}

View File

@ -1,31 +1,5 @@
use serde::{Deserialize, Serialize}; 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 webhooks;
pub use application::*; pub use application::*;
pub use auto_moderation::*; pub use auto_moderation::*;
pub use call::*; pub use call::*;
@ -52,6 +26,32 @@ pub use user::*;
pub use voice::*; pub use voice::*;
pub use webhooks::*; pub use webhooks::*;
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 webhooks;
pub trait WebSocketEvent {} pub trait WebSocketEvent {}
#[derive(Debug, Default, Serialize, Clone)] #[derive(Debug, Default, Serialize, Clone)]
@ -79,7 +79,6 @@ impl WebSocketEvent for GatewaySendPayload {}
/// ///
/// Similar to [GatewaySendPayload], except we send a [Value] for d whilst we receive a [serde_json::value::RawValue] /// 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 /// Also, we never need to sent the event name
pub struct GatewayReceivePayload<'a> { pub struct GatewayReceivePayload<'a> {
#[serde(rename = "op")] #[serde(rename = "op")]
pub op_code: u8, pub op_code: u8,

View File

@ -1,8 +1,9 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use super::{ChannelUnreadUpdateObject, WebSocketEvent};
use crate::types::{GuildMember, VoiceState}; use crate::types::{GuildMember, VoiceState};
use super::{ChannelUnreadUpdateObject, WebSocketEvent};
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
/// Officially Undocumented /// Officially Undocumented
/// ///

View File

@ -1,7 +1,8 @@
use serde::{Deserialize, Serialize};
use crate::types::events::WebSocketEvent; use crate::types::events::WebSocketEvent;
use crate::types::interfaces::Activity; use crate::types::interfaces::Activity;
use crate::types::PublicUser; use crate::types::PublicUser;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Default, Clone)] #[derive(Debug, Deserialize, Serialize, Default, Clone)]
/// See https://discord.com/developers/docs/topics/gateway-events#presence-update-presence-update-event-fields /// See https://discord.com/developers/docs/topics/gateway-events#presence-update-presence-update-event-fields

View File

@ -1,8 +1,9 @@
use serde::{Deserialize, Serialize};
use crate::types::{Activity, GuildMember, PresenceUpdate, VoiceState};
use crate::types::entities::{Guild, User}; use crate::types::entities::{Guild, User};
use crate::types::events::{Session, WebSocketEvent}; use crate::types::events::{Session, WebSocketEvent};
use crate::types::interfaces::ClientStatusObject; use crate::types::interfaces::ClientStatusObject;
use crate::types::{Activity, GuildMember, PresenceUpdate, VoiceState};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
/// Sort of documented, though most fields are left out /// Sort of documented, though most fields are left out

View File

@ -1,6 +1,7 @@
use crate::types::{events::WebSocketEvent, Relationship, RelationshipType, Snowflake};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::{events::WebSocketEvent, Relationship, RelationshipType, Snowflake};
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
/// See https://github.com/spacebarchat/server/issues/204 /// See https://github.com/spacebarchat/server/issues/204
pub struct RelationshipAdd { pub struct RelationshipAdd {

View File

@ -1,6 +1,7 @@
use crate::types::events::WebSocketEvent;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::events::WebSocketEvent;
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
/// See https://discord.com/developers/docs/topics/gateway-events#request-guild-members-request-guild-members-structure /// See https://discord.com/developers/docs/topics/gateway-events#request-guild-members-request-guild-members-structure
pub struct GatewayRequestGuildMembers { pub struct GatewayRequestGuildMembers {

View File

@ -1,6 +1,7 @@
use crate::types::events::WebSocketEvent;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::events::WebSocketEvent;
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
pub struct GatewayResume { pub struct GatewayResume {
pub token: String, pub token: String,

View File

@ -1,6 +1,7 @@
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 serde::{Deserialize, Serialize};
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
/// See https://discord.com/developers/docs/topics/gateway-events#thread-create /// See https://discord.com/developers/docs/topics/gateway-events#thread-create

View File

@ -1,7 +1,8 @@
use serde::{Deserialize, Serialize};
use crate::types::entities::PublicUser; use crate::types::entities::PublicUser;
use crate::types::events::WebSocketEvent; use crate::types::events::WebSocketEvent;
use crate::types::utils::Snowflake; use crate::types::utils::Snowflake;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
/// See https://discord.com/developers/docs/topics/gateway-events#user-update /// See https://discord.com/developers/docs/topics/gateway-events#user-update

View File

@ -1,6 +1,7 @@
use crate::types::{events::WebSocketEvent, VoiceState};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::{events::WebSocketEvent, VoiceState};
#[derive(Debug, Deserialize, Serialize, Default)] #[derive(Debug, Deserialize, Serialize, Default)]
/// See https://discord.com/developers/docs/topics/gateway-events#update-voice-state /// See https://discord.com/developers/docs/topics/gateway-events#update-voice-state
/// ///

View File

@ -1,6 +1,7 @@
use crate::types::entities::Emoji;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::entities::Emoji;
#[derive(Debug, Deserialize, Serialize, Clone)] #[derive(Debug, Deserialize, Serialize, Clone)]
pub struct Activity { pub struct Activity {
name: String, name: String,

View File

@ -1,6 +1,7 @@
use crate::types::utils::Snowflake;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::utils::Snowflake;
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
pub struct WelcomeScreenObject { pub struct WelcomeScreenObject {
pub enabled: bool, pub enabled: bool,

View File

@ -1,8 +1,9 @@
use crate::types::entities::{AllowedMention, Embed};
use crate::types::utils::Snowflake;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::Value; use serde_json::Value;
use crate::types::entities::{AllowedMention, Embed};
use crate::types::utils::Snowflake;
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct Interaction { pub struct Interaction {
pub id: Snowflake, pub id: Snowflake,

View File

@ -1,11 +1,12 @@
pub use activity::*;
pub use connected_account::*;
pub use guild_welcome_screen::*;
pub use interaction::*;
pub use status::*;
mod activity; mod activity;
mod connected_account; mod connected_account;
mod guild_welcome_screen; mod guild_welcome_screen;
mod interaction; mod interaction;
mod status; mod status;
pub use activity::*;
pub use connected_account::*;
pub use guild_welcome_screen::*;
pub use interaction::*;
pub use status::*;

View File

@ -61,8 +61,8 @@ impl poem::error::ResponseError for APIError {
} }
fn as_response(&self) -> Response fn as_response(&self) -> Response
where where
Self: std::error::Error + Send + Sync + 'static, Self: std::error::Error + Send + Sync + 'static,
{ {
Response::builder() Response::builder()
.status(self.status()) .status(self.status())

View File

@ -1,7 +1,8 @@
use crate::errors::FieldFormatError;
use regex::Regex; use regex::Regex;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::errors::FieldFormatError;
/** /**
A struct that represents a well-formed email address. A struct that represents a well-formed email address.
*/ */
@ -100,7 +101,6 @@ You will receive a [`FieldFormatError`], if:
- The username is not between 2 and 32 characters. - The username is not between 2 and 32 characters.
- The password is not between 1 and 72 characters. - The password is not between 1 and 72 characters.
*/ */
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
pub struct RegisterSchema { pub struct RegisterSchema {

View File

@ -1,6 +1,7 @@
use crate::types::entities::Channel;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::entities::Channel;
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
/// Represents the schema which needs to be sent to create a Guild. /// Represents the schema which needs to be sent to create a Guild.

View File

@ -1,7 +1,8 @@
use serde::{Deserialize, Serialize};
use crate::types::entities::{ use crate::types::entities::{
AllowedMention, Component, Embed, MessageReference, PartialDiscordFileAttachment, AllowedMention, Component, Embed, MessageReference, PartialDiscordFileAttachment,
}; };
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]

View File

@ -1,11 +1,3 @@
mod apierror;
mod auth;
mod channel;
mod guild;
mod message;
mod role;
mod user;
pub use apierror::*; pub use apierror::*;
pub use auth::*; pub use auth::*;
pub use channel::*; pub use channel::*;
@ -14,11 +6,20 @@ pub use message::*;
pub use role::*; pub use role::*;
pub use user::*; pub use user::*;
mod apierror;
mod auth;
mod channel;
mod guild;
mod message;
mod role;
mod user;
#[cfg(test)] #[cfg(test)]
mod schemas_tests { mod schemas_tests {
use super::*;
use crate::errors::FieldFormatError; use crate::errors::FieldFormatError;
use super::*;
#[test] #[test]
fn password_too_short() { fn password_too_short() {
assert_eq!( assert_eq!(

View File

@ -1,6 +1,7 @@
use crate::types::Snowflake;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::Snowflake;
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
/// Represents the schema which needs to be sent to create or modify a Role. /// Represents the schema which needs to be sent to create or modify a Role.

View File

@ -1,8 +1,9 @@
pub use regexes::*;
pub use rights::Rights;
pub use snowflake::{DeconstructedSnowflake, Snowflake};
pub mod jwt; pub mod jwt;
mod regexes; mod regexes;
mod rights; mod rights;
mod snowflake; mod snowflake;
pub use regexes::*;
pub use rights::Rights;
pub use snowflake::{DeconstructedSnowflake, Snowflake};

View File

@ -1,6 +1,7 @@
mod common;
use chorus::types; use chorus::types;
mod common;
#[tokio::test] #[tokio::test]
async fn test_registration() { async fn test_registration() {
let mut bundle = common::setup().await; let mut bundle = common::setup().await;
@ -16,7 +17,7 @@ async fn test_registration() {
None, None,
None, None,
) )
.unwrap(); .unwrap();
bundle.instance.register_account(&reg).await.unwrap(); bundle.instance.register_account(&reg).await.unwrap();
common::teardown(bundle).await; common::teardown(bundle).await;
} }

View File

@ -1,6 +1,7 @@
mod common;
use chorus::types::{self, Channel, PermissionFlags, PermissionOverwrite}; use chorus::types::{self, Channel, PermissionFlags, PermissionOverwrite};
mod common;
#[tokio::test] #[tokio::test]
async fn get_channel() { async fn get_channel() {
let mut bundle = common::setup().await; let mut bundle = common::setup().await;
@ -9,7 +10,7 @@ async fn get_channel() {
assert_eq!( assert_eq!(
bundle_channel, bundle_channel,
Channel::get(&mut bundle_user, &bundle_channel.id.to_string(),) Channel::get(&mut bundle_user, &bundle_channel.id.to_string())
.await .await
.unwrap() .unwrap()
); );
@ -51,8 +52,8 @@ async fn modify_channel() {
&bundle.channel.id.to_string(), &bundle.channel.id.to_string(),
&mut bundle.user, &mut bundle.user,
) )
.await .await
.unwrap(); .unwrap();
assert_eq!(result.name, Some("beepboop".to_string())); assert_eq!(result.name, Some("beepboop".to_string()));
let permission_override = PermissionFlags::from_vec(Vec::from([ let permission_override = PermissionFlags::from_vec(Vec::from([
@ -71,14 +72,14 @@ async fn modify_channel() {
bundle.channel.id.to_string().as_str(), bundle.channel.id.to_string().as_str(),
permission_override.clone(), permission_override.clone(),
) )
.await; .await;
Channel::delete_permission( Channel::delete_permission(
&mut bundle.user, &mut bundle.user,
bundle.channel.id.to_string().as_str(), bundle.channel.id.to_string().as_str(),
&permission_override.id, &permission_override.id,
) )
.await; .await;
common::teardown(bundle).await common::teardown(bundle).await
} }

View File

@ -38,7 +38,7 @@ pub async fn setup() -> TestBundle {
None, None,
None, None,
) )
.unwrap(); .unwrap();
let guild_create_schema = GuildCreateSchema { let guild_create_schema = GuildCreateSchema {
name: Some("Test-Guild!".to_string()), name: Some("Test-Guild!".to_string()),
region: None, region: None,

View File

@ -1,6 +1,7 @@
mod common;
use chorus::types::{Guild, GuildCreateSchema}; use chorus::types::{Guild, GuildCreateSchema};
mod common;
#[tokio::test] #[tokio::test]
async fn guild_creation_deletion() { async fn guild_creation_deletion() {
let mut bundle = common::setup().await; let mut bundle = common::setup().await;

View File

@ -1,9 +1,10 @@
mod common;
use chorus::types;
use std::fs::File; use std::fs::File;
use std::io::{BufReader, Read}; use std::io::{BufReader, Read};
use chorus::types;
mod common;
#[tokio::test] #[tokio::test]
async fn send_message() { async fn send_message() {
let mut bundle = common::setup().await; let mut bundle = common::setup().await;

View File

@ -1,7 +1,7 @@
mod common;
use chorus::types::{self, RoleCreateModifySchema}; use chorus::types::{self, RoleCreateModifySchema};
mod common;
#[tokio::test] #[tokio::test]
async fn create_and_get_roles() { async fn create_and_get_roles() {
let mut bundle = common::setup().await; let mut bundle = common::setup().await;