diff --git a/Cargo.toml b/Cargo.toml index 40c67f5..40a7024 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "chorus" description = "A library for interacting with multiple Spacebar-compatible Instances at once." -version = "0.2.0" +version = "0.3.0" license = "AGPL-3.0" edition = "2021" repository = "https://github.com/polyphony-chat/chorus" diff --git a/src/api/auth/login.rs b/src/api/auth/login.rs index d5d96e6..a95c3ca 100644 --- a/src/api/auth/login.rs +++ b/src/api/auth/login.rs @@ -1,5 +1,3 @@ -use std::cell::RefCell; -use std::rc::Rc; use std::sync::{Arc, RwLock}; use reqwest::Client; @@ -30,7 +28,7 @@ impl Instance { // 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. let mut shell = - ChorusUser::shell(Rc::new(RefCell::new(self.clone())), "None".to_string()).await; + ChorusUser::shell(Arc::new(RwLock::new(self.clone())), "None".to_string()).await; let login_result = chorus_request .deserialize_response::(&mut shell) .await?; @@ -43,7 +41,7 @@ impl Instance { identify.token = login_result.token.clone(); gateway.send_identify(identify).await; let user = ChorusUser::new( - Rc::new(RefCell::new(self.clone())), + Arc::new(RwLock::new(self.clone())), login_result.token, self.clone_limits_if_some(), login_result.settings, diff --git a/src/api/auth/register.rs b/src/api/auth/register.rs index 43292d9..1a95d3d 100644 --- a/src/api/auth/register.rs +++ b/src/api/auth/register.rs @@ -1,5 +1,4 @@ use std::sync::{Arc, RwLock}; -use std::{cell::RefCell, rc::Rc}; use reqwest::Client; use serde_json::to_string; @@ -35,7 +34,7 @@ impl Instance { // 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. let mut shell = - ChorusUser::shell(Rc::new(RefCell::new(self.clone())), "None".to_string()).await; + ChorusUser::shell(Arc::new(RwLock::new(self.clone())), "None".to_string()).await; let token = chorus_request .deserialize_response::(&mut shell) .await? @@ -50,7 +49,7 @@ impl Instance { identify.token = token.clone(); gateway.send_identify(identify).await; let user = ChorusUser::new( - Rc::new(RefCell::new(self.clone())), + Arc::new(RwLock::new(self.clone())), token.clone(), self.clone_limits_if_some(), Arc::new(RwLock::new(settings)), diff --git a/src/api/channels/channels.rs b/src/api/channels/channels.rs index 9565877..7250b0e 100644 --- a/src/api/channels/channels.rs +++ b/src/api/channels/channels.rs @@ -20,7 +20,7 @@ impl Channel { http::Method::GET, &format!( "{}/channels/{}", - user.belongs_to.borrow().urls.api.clone(), + user.belongs_to.read().unwrap().urls.api.clone(), channel_id ), None, @@ -45,7 +45,11 @@ impl Channel { audit_log_reason: Option, user: &mut ChorusUser, ) -> ChorusResult<()> { - let url = format!("{}/channels/{}", user.belongs_to.borrow().urls.api, self.id,); + let url = format!( + "{}/channels/{}", + user.belongs_to.read().unwrap().urls.api, + self.id, + ); let request = ChorusRequest::new( http::Method::DELETE, @@ -83,7 +87,7 @@ impl Channel { let channel_id = self.id; let url = format!( "{}/channels/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id ); @@ -116,7 +120,7 @@ impl Channel { ) -> Result, ChorusError> { let url = format!( "{}/channels/{}/messages", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id ); @@ -149,7 +153,7 @@ impl Channel { let mut request = Client::new() .put(format!( "{}/channels/{}/recipients/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.id, recipient_id )) @@ -177,7 +181,7 @@ impl Channel { ) -> ChorusResult<()> { let url = format!( "{}/channels/{}/recipients/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.id, recipient_id ); @@ -207,7 +211,7 @@ impl Channel { ) -> ChorusResult<()> { let url = format!( "{}/guilds/{}/channels", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id ); diff --git a/src/api/channels/messages.rs b/src/api/channels/messages.rs index dc79f82..960e492 100644 --- a/src/api/channels/messages.rs +++ b/src/api/channels/messages.rs @@ -23,7 +23,7 @@ impl Message { channel_id: Snowflake, mut message: MessageSendSchema, ) -> ChorusResult { - let url_api = user.belongs_to.borrow().urls.api.clone(); + let url_api = user.belongs_to.read().unwrap().urls.api.clone(); if message.attachments.is_none() { let chorus_request = ChorusRequest { @@ -98,7 +98,7 @@ impl Message { request: Client::new() .get(format!( "{}/{}/messages/search", - &user.belongs_to.borrow().urls.api, + &user.belongs_to.read().unwrap().urls.api, endpoint )) .header("Authorization", user.token()) @@ -142,7 +142,7 @@ impl Message { http::Method::GET, format!( "{}/channels/{}/pins", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id ) .as_str(), @@ -172,7 +172,7 @@ impl Message { http::Method::PUT, format!( "{}/channels/{}/pins/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ) @@ -199,7 +199,7 @@ impl Message { http::Method::DELETE, format!( "{}/channels/{}/pins/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ) @@ -226,7 +226,7 @@ impl Message { request: Client::new() .get(format!( "{}/channels/{}/messages/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id )) @@ -249,7 +249,7 @@ impl Message { http::Method::POST, format!( "{}/channels/{}/messages/greet", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, ) .as_str(), @@ -282,7 +282,7 @@ impl Message { http::Method::POST, format!( "{}/channels/{}/messages/{}/ack", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ) @@ -311,7 +311,7 @@ impl Message { http::Method::POST, format!( "{}/channels/{}/messages/{}/crosspost", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ) @@ -336,7 +336,7 @@ impl Message { ) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}/hide-guild-feed", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ); @@ -370,7 +370,7 @@ impl Message { ) -> ChorusResult { let url = format!( "{}/channels/{}/messages/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ); @@ -396,7 +396,7 @@ impl Message { ) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, message_id ); @@ -438,7 +438,7 @@ impl Message { http::Method::POST, format!( "{}/channels/{}/messages/bulk-delete", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, ) .as_str(), @@ -463,7 +463,7 @@ impl Message { http::Method::POST, format!( "{}/channels/{}/pins/ack", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, ) .as_str(), diff --git a/src/api/channels/permissions.rs b/src/api/channels/permissions.rs index b932e11..7fa8edd 100644 --- a/src/api/channels/permissions.rs +++ b/src/api/channels/permissions.rs @@ -28,7 +28,7 @@ impl types::Channel { ) -> ChorusResult<()> { let url = format!( "{}/channels/{}/permissions/{}", - user.belongs_to.borrow_mut().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, overwrite.id ); @@ -70,7 +70,7 @@ impl types::Channel { ) -> ChorusResult<()> { let url = format!( "{}/channels/{}/permissions/{}", - user.belongs_to.borrow_mut().urls.api, + user.belongs_to.read().unwrap().urls.api, channel_id, overwrite_id ); diff --git a/src/api/channels/reactions.rs b/src/api/channels/reactions.rs index 4685993..81c0366 100644 --- a/src/api/channels/reactions.rs +++ b/src/api/channels/reactions.rs @@ -23,7 +23,7 @@ impl ReactionMeta { pub async fn delete_all(&self, user: &mut ChorusUser) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}/reactions", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.channel_id, self.message_id ); @@ -51,7 +51,7 @@ impl ReactionMeta { pub async fn get(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult> { let url = format!( "{}/channels/{}/messages/{}/reactions/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.channel_id, self.message_id, emoji @@ -82,7 +82,7 @@ impl ReactionMeta { pub async fn delete_emoji(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}/reactions/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.channel_id, self.message_id, emoji @@ -116,7 +116,7 @@ impl ReactionMeta { pub async fn create(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}/reactions/{}/@me", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.channel_id, self.message_id, emoji @@ -145,7 +145,7 @@ impl ReactionMeta { pub async fn remove(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}/reactions/{}/@me", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.channel_id, self.message_id, emoji @@ -181,7 +181,7 @@ impl ReactionMeta { ) -> ChorusResult<()> { let url = format!( "{}/channels/{}/messages/{}/reactions/{}/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.channel_id, self.message_id, emoji, diff --git a/src/api/guilds/guilds.rs b/src/api/guilds/guilds.rs index e420d6a..8d5f0d6 100644 --- a/src/api/guilds/guilds.rs +++ b/src/api/guilds/guilds.rs @@ -23,7 +23,7 @@ impl Guild { user: &mut ChorusUser, guild_create_schema: GuildCreateSchema, ) -> ChorusResult { - let url = format!("{}/guilds", user.belongs_to.borrow().urls.api); + let url = format!("{}/guilds", user.belongs_to.read().unwrap().urls.api); let chorus_request = ChorusRequest { request: Client::new() .post(url.clone()) @@ -57,7 +57,7 @@ impl Guild { pub async fn delete(user: &mut ChorusUser, guild_id: Snowflake) -> ChorusResult<()> { let url = format!( "{}/guilds/{}/delete", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id ); let chorus_request = ChorusRequest { @@ -99,7 +99,7 @@ impl Guild { request: Client::new() .get(format!( "{}/guilds/{}/channels", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, self.id )) .header("Authorization", user.token()), @@ -133,7 +133,7 @@ impl Guild { request: Client::new() .get(format!( "{}/guilds/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id )) .header("Authorization", user.token()), @@ -155,7 +155,7 @@ impl Guild { http::Method::PUT, format!( "{}/guilds/{}/bans/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, user_id ) @@ -180,7 +180,7 @@ impl Guild { request: Client::new() .patch(format!( "{}/guilds/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, )) .header("Authorization", user.token()) @@ -204,7 +204,7 @@ impl Guild { request: Client::new() .patch(format!( "{}/guilds/{}/preview", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, )) .header("Authorization", user.token()) @@ -229,7 +229,7 @@ impl Guild { http::Method::GET, format!( "{}/guilds/{}/members", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, ) .as_str(), @@ -255,7 +255,7 @@ impl Guild { http::Method::GET, format!( "{}/guilds/{}/members/search", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, ) .as_str(), @@ -285,7 +285,7 @@ impl Guild { http::Method::DELETE, format!( "{}/guilds/{}/members/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, member_id, ) @@ -315,7 +315,7 @@ impl Guild { http::Method::PATCH, format!( "{}/guilds/{}/members/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, member_id, ) @@ -343,7 +343,7 @@ impl Guild { http::Method::PATCH, format!( "{}/guilds/{}/members/@me", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, ) .as_str(), @@ -369,7 +369,7 @@ impl Guild { http::Method::PATCH, format!( "{}/guilds/{}/profile/@me", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, ) .as_str(), @@ -395,7 +395,7 @@ impl Guild { ) -> ChorusResult> { let url = format!( "{}/guilds/{}/bans", - user.belongs_to.borrow_mut().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, ); @@ -425,7 +425,7 @@ impl Guild { ) -> ChorusResult { let url = format!( "{}/guilds/{}/bans/{}", - user.belongs_to.borrow_mut().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, user_id ); @@ -454,7 +454,7 @@ impl Guild { ) -> ChorusResult<()> { let url = format!( "{}/guilds/{}/bans/{}", - user.belongs_to.borrow_mut().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, user_id ); @@ -488,7 +488,7 @@ impl Channel { let mut request = Client::new() .post(format!( "{}/guilds/{}/channels", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id )) .header("Authorization", user.token()) diff --git a/src/api/guilds/member.rs b/src/api/guilds/member.rs index ca81ea1..01294bd 100644 --- a/src/api/guilds/member.rs +++ b/src/api/guilds/member.rs @@ -20,7 +20,7 @@ impl types::GuildMember { ) -> ChorusResult { let url = format!( "{}/guilds/{}/members/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, member_id ); @@ -47,7 +47,7 @@ impl types::GuildMember { ) -> ChorusResult<()> { let url = format!( "{}/guilds/{}/members/{}/roles/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, member_id, role_id @@ -76,7 +76,7 @@ impl types::GuildMember { ) -> Result<(), crate::errors::ChorusError> { let url = format!( "{}/guilds/{}/members/{}/roles/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, member_id, role_id diff --git a/src/api/guilds/roles.rs b/src/api/guilds/roles.rs index 02994f9..17d6f7b 100644 --- a/src/api/guilds/roles.rs +++ b/src/api/guilds/roles.rs @@ -20,7 +20,7 @@ impl types::RoleObject { ) -> ChorusResult> { let url = format!( "{}/guilds/{}/roles", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id ); let chorus_request = ChorusRequest { @@ -45,7 +45,7 @@ impl types::RoleObject { ) -> ChorusResult { let url = format!( "{}/guilds/{}/roles/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, role_id ); @@ -71,7 +71,7 @@ impl types::RoleObject { ) -> ChorusResult { let url = format!( "{}/guilds/{}/roles", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id ); let body = to_string::(&role_create_schema).map_err(|e| { @@ -105,7 +105,7 @@ impl types::RoleObject { ) -> ChorusResult { let url = format!( "{}/guilds/{}/roles", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id ); let body = @@ -139,7 +139,7 @@ impl types::RoleObject { ) -> ChorusResult { let url = format!( "{}/guilds/{}/roles/{}", - user.belongs_to.borrow().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, role_id ); @@ -173,7 +173,7 @@ impl types::RoleObject { ) -> ChorusResult<()> { let url = format!( "{}/guilds/{}/roles/{}", - user.belongs_to.borrow_mut().urls.api, + user.belongs_to.read().unwrap().urls.api, guild_id, role_id ); diff --git a/src/api/invites/mod.rs b/src/api/invites/mod.rs index 88a5705..658fb22 100644 --- a/src/api/invites/mod.rs +++ b/src/api/invites/mod.rs @@ -22,7 +22,7 @@ impl ChorusUser { request: Client::new() .post(format!( "{}/invites/{}", - self.belongs_to.borrow().urls.api, + self.belongs_to.read().unwrap().urls.api, invite_code )) .header("Authorization", self.token()), @@ -48,7 +48,7 @@ impl ChorusUser { request: Client::new() .post(format!( "{}/users/@me/invites", - self.belongs_to.borrow().urls.api + self.belongs_to.read().unwrap().urls.api )) .body(to_string(&code).unwrap()) .header("Authorization", self.token()) @@ -75,7 +75,7 @@ impl ChorusUser { request: Client::new() .post(format!( "{}/channels/{}/invites", - self.belongs_to.borrow().urls.api, + self.belongs_to.read().unwrap().urls.api, channel_id )) .header("Authorization", self.token()) diff --git a/src/api/users/channels.rs b/src/api/users/channels.rs index 993894f..8d5f063 100644 --- a/src/api/users/channels.rs +++ b/src/api/users/channels.rs @@ -21,7 +21,10 @@ impl ChorusUser { &mut self, create_private_channel_schema: PrivateChannelCreateSchema, ) -> ChorusResult { - let url = format!("{}/users/@me/channels", self.belongs_to.borrow().urls.api); + let url = format!( + "{}/users/@me/channels", + self.belongs_to.read().unwrap().urls.api + ); ChorusRequest { request: Client::new() .post(url) diff --git a/src/api/users/guilds.rs b/src/api/users/guilds.rs index 5e9b921..d2d5b9e 100644 --- a/src/api/users/guilds.rs +++ b/src/api/users/guilds.rs @@ -20,7 +20,7 @@ impl ChorusUser { request: Client::new() .delete(format!( "{}/users/@me/guilds/{}", - self.belongs_to.borrow().urls.api, + self.belongs_to.read().unwrap().urls.api, guild_id )) .header("Authorization", self.token()) @@ -41,7 +41,10 @@ impl ChorusUser { &mut self, query: Option, ) -> ChorusResult> { - let url = format!("{}/users/@me/guilds", self.belongs_to.borrow().urls.api,); + let url = format!( + "{}/users/@me/guilds", + self.belongs_to.read().unwrap().urls.api, + ); let chorus_request = ChorusRequest { request: Client::new() .get(url) diff --git a/src/api/users/relationships.rs b/src/api/users/relationships.rs index ae4ee27..8988871 100644 --- a/src/api/users/relationships.rs +++ b/src/api/users/relationships.rs @@ -22,7 +22,7 @@ impl ChorusUser { ) -> ChorusResult> { let url = format!( "{}/users/{}/relationships", - self.belongs_to.borrow().urls.api, + self.belongs_to.read().unwrap().urls.api, user_id ); let chorus_request = ChorusRequest { @@ -41,7 +41,7 @@ impl ChorusUser { pub async fn get_relationships(&mut self) -> ChorusResult> { let url = format!( "{}/users/@me/relationships", - self.belongs_to.borrow().urls.api + self.belongs_to.read().unwrap().urls.api ); let chorus_request = ChorusRequest { request: Client::new().get(url).header("Authorization", self.token()), @@ -62,7 +62,7 @@ impl ChorusUser { ) -> ChorusResult<()> { let url = format!( "{}/users/@me/relationships", - self.belongs_to.borrow().urls.api + self.belongs_to.read().unwrap().urls.api ); let body = to_string(&schema).unwrap(); let chorus_request = ChorusRequest { @@ -84,7 +84,7 @@ impl ChorusUser { user_id: Snowflake, relationship_type: RelationshipType, ) -> ChorusResult<()> { - let api_url = self.belongs_to.borrow().urls.api.clone(); + let api_url = self.belongs_to.read().unwrap().urls.api.clone(); match relationship_type { RelationshipType::None => { let chorus_request = ChorusRequest { @@ -136,7 +136,7 @@ impl ChorusUser { pub async fn remove_relationship(&mut self, user_id: Snowflake) -> ChorusResult<()> { let url = format!( "{}/users/@me/relationships/{}", - self.belongs_to.borrow().urls.api, + self.belongs_to.read().unwrap().urls.api, user_id ); let chorus_request = ChorusRequest { diff --git a/src/api/users/users.rs b/src/api/users/users.rs index d80700e..25ac6cd 100644 --- a/src/api/users/users.rs +++ b/src/api/users/users.rs @@ -1,4 +1,4 @@ -use std::{cell::RefCell, rc::Rc}; +use std::sync::{Arc, RwLock}; use reqwest::Client; use serde_json::to_string; @@ -48,7 +48,10 @@ impl ChorusUser { return Err(ChorusError::PasswordRequired); } let request = Client::new() - .patch(format!("{}/users/@me", self.belongs_to.borrow().urls.api)) + .patch(format!( + "{}/users/@me", + self.belongs_to.read().unwrap().urls.api + )) .body(to_string(&modify_schema).unwrap()) .header("Authorization", self.token()) .header("Content-Type", "application/json"); @@ -67,7 +70,7 @@ impl ChorusUser { let request = Client::new() .post(format!( "{}/users/@me/delete", - self.belongs_to.borrow().urls.api + self.belongs_to.read().unwrap().urls.api )) .header("Authorization", self.token()) .header("Content-Type", "application/json"); @@ -86,7 +89,7 @@ impl User { /// See and /// pub async fn get(user: &mut ChorusUser, id: Option<&String>) -> ChorusResult { - let url_api = user.belongs_to.borrow().urls.api.clone(); + let url_api = user.belongs_to.read().unwrap().urls.api.clone(); let url = if id.is_none() { format!("{}/users/@me", url_api) } else { @@ -121,7 +124,7 @@ impl User { .get(format!("{}/users/@me/settings", url_api)) .header("Authorization", token); let mut user = - ChorusUser::shell(Rc::new(RefCell::new(instance.clone())), token.clone()).await; + ChorusUser::shell(Arc::new(RwLock::new(instance.clone())), token.clone()).await; let chorus_request = ChorusRequest { request, limit_type: LimitType::Global, @@ -131,8 +134,12 @@ impl User { Err(e) => Err(e), }; if instance.limits_information.is_some() { - instance.limits_information.as_mut().unwrap().ratelimits = - user.belongs_to.borrow().clone_limits_if_some().unwrap(); + instance.limits_information.as_mut().unwrap().ratelimits = user + .belongs_to + .read() + .unwrap() + .clone_limits_if_some() + .unwrap(); } result } @@ -148,11 +155,15 @@ impl Instance { /// See and /// pub async fn get_user(&mut self, token: String, id: Option<&String>) -> ChorusResult { - let mut user = ChorusUser::shell(Rc::new(RefCell::new(self.clone())), token).await; + let mut user = ChorusUser::shell(Arc::new(RwLock::new(self.clone())), token).await; let result = User::get(&mut user, id).await; if self.limits_information.is_some() { - self.limits_information.as_mut().unwrap().ratelimits = - user.belongs_to.borrow().clone_limits_if_some().unwrap(); + self.limits_information.as_mut().unwrap().ratelimits = user + .belongs_to + .read() + .unwrap() + .clone_limits_if_some() + .unwrap(); } result } diff --git a/src/instance.rs b/src/instance.rs index 0e39a24..08a7f82 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -1,9 +1,8 @@ //! Instance and ChorusUser objects. -use std::cell::RefCell; use std::collections::HashMap; use std::fmt; -use std::rc::Rc; + use std::sync::{Arc, RwLock}; use reqwest::Client; @@ -90,7 +89,7 @@ impl fmt::Display for Token { /// It is used for most authenticated actions on a Spacebar server. /// It also has its own [Gateway] connection. pub struct ChorusUser { - pub belongs_to: Rc>, + pub belongs_to: Arc>, pub token: String, pub limits: Option>, pub settings: Arc>, @@ -113,7 +112,7 @@ impl ChorusUser { /// This isn't the prefered way to create a ChorusUser. /// See [Instance::login_account] and [Instance::register_account] instead. pub fn new( - belongs_to: Rc>, + belongs_to: Arc>, token: String, limits: Option>, settings: Arc>, @@ -135,17 +134,18 @@ impl ChorusUser { /// registering or logging in to the Instance, where you do not yet have a User object, but still /// need to make a RateLimited request. To use the [`GatewayHandle`], you will have to identify /// first. - pub(crate) async fn shell(instance: Rc>, token: String) -> ChorusUser { + pub(crate) async fn shell(instance: Arc>, token: String) -> ChorusUser { let settings = Arc::new(RwLock::new(UserSettings::default())); let object = Arc::new(RwLock::new(User::default())); - let wss_url = instance.borrow().urls.wss.clone(); + let wss_url = instance.read().unwrap().urls.wss.clone(); // Dummy gateway object let gateway = Gateway::new(wss_url).await.unwrap(); ChorusUser { token, belongs_to: instance.clone(), limits: instance - .borrow() + .read() + .unwrap() .limits_information .as_ref() .map(|info| info.ratelimits.clone()), diff --git a/src/ratelimiter.rs b/src/ratelimiter.rs index ac7642c..84bd641 100644 --- a/src/ratelimiter.rs +++ b/src/ratelimiter.rs @@ -82,12 +82,8 @@ impl ChorusRequest { bucket: format!("{:?}", self.limit_type), }); } - let belongs_to = user.belongs_to.borrow(); - let result = match belongs_to - .client - .execute(self.request.build().unwrap()) - .await - { + let client = user.belongs_to.read().unwrap().client.clone(); + let result = match client.execute(self.request.build().unwrap()).await { Ok(result) => { debug!("Request successful: {:?}", result); result @@ -100,12 +96,13 @@ impl ChorusRequest { }); } }; - drop(belongs_to); + drop(client); if !result.status().is_success() { if result.status().as_u16() == 429 { log::warn!("Rate limit hit unexpectedly. Bucket: {:?}. Setting the instances' remaining global limit to 0 to have cooldown.", self.limit_type); user.belongs_to - .borrow_mut() + .write() + .unwrap() .limits_information .as_mut() .unwrap() @@ -126,7 +123,7 @@ impl ChorusRequest { fn can_send_request(user: &mut ChorusUser, limit_type: &LimitType) -> bool { log::trace!("Checking if user or instance is rate-limited..."); - let mut belongs_to = user.belongs_to.borrow_mut(); + let mut belongs_to = user.belongs_to.write().unwrap(); if belongs_to.limits_information.is_none() { log::trace!("Instance indicates no rate limits are configured. Continuing."); return true; @@ -288,7 +285,7 @@ impl ChorusRequest { /// reset to the rate limit limit. /// 2. The remaining rate limit is decreased by 1. fn update_rate_limits(user: &mut ChorusUser, limit_type: &LimitType, response_was_err: bool) { - if user.belongs_to.borrow().limits_information.is_none() { + if user.belongs_to.read().unwrap().limits_information.is_none() { return; } let instance_dictated_limits = [ @@ -311,7 +308,7 @@ impl ChorusRequest { } let time: u64 = chrono::Utc::now().timestamp() as u64; for relevant_limit in relevant_limits.iter() { - let mut belongs_to = user.belongs_to.borrow_mut(); + let mut belongs_to = user.belongs_to.write().unwrap(); let limit = match relevant_limit.0 { LimitOrigin::Instance => { log::trace!(