Make `ChorusUser` `Send` (#423)
Replace `belongs_to: Rc<RefCell<Instance>>` with `Arc<RwLock<Instance>>` to make `ChorusUser` `Send`
This commit is contained in:
commit
be8ddf5888
|
@ -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"
|
||||
|
|
|
@ -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::<LoginResult>(&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,
|
||||
|
|
|
@ -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::<Token>(&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)),
|
||||
|
|
|
@ -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<String>,
|
||||
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<Vec<Message>, 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
|
||||
);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ impl Message {
|
|||
channel_id: Snowflake,
|
||||
mut message: MessageSendSchema,
|
||||
) -> ChorusResult<Message> {
|
||||
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<Message> {
|
||||
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(),
|
||||
|
|
|
@ -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
|
||||
);
|
||||
|
|
|
@ -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<Vec<PublicUser>> {
|
||||
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,
|
||||
|
|
|
@ -23,7 +23,7 @@ impl Guild {
|
|||
user: &mut ChorusUser,
|
||||
guild_create_schema: GuildCreateSchema,
|
||||
) -> ChorusResult<Guild> {
|
||||
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<Vec<GuildBan>> {
|
||||
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<GuildBan> {
|
||||
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())
|
||||
|
|
|
@ -20,7 +20,7 @@ impl types::GuildMember {
|
|||
) -> ChorusResult<GuildMember> {
|
||||
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
|
||||
|
|
|
@ -20,7 +20,7 @@ impl types::RoleObject {
|
|||
) -> ChorusResult<Vec<RoleObject>> {
|
||||
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<RoleObject> {
|
||||
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<RoleObject> {
|
||||
let url = format!(
|
||||
"{}/guilds/{}/roles",
|
||||
user.belongs_to.borrow().urls.api,
|
||||
user.belongs_to.read().unwrap().urls.api,
|
||||
guild_id
|
||||
);
|
||||
let body = to_string::<RoleCreateModifySchema>(&role_create_schema).map_err(|e| {
|
||||
|
@ -105,7 +105,7 @@ impl types::RoleObject {
|
|||
) -> ChorusResult<RoleObject> {
|
||||
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<RoleObject> {
|
||||
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
|
||||
);
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -21,7 +21,10 @@ impl ChorusUser {
|
|||
&mut self,
|
||||
create_private_channel_schema: PrivateChannelCreateSchema,
|
||||
) -> ChorusResult<Channel> {
|
||||
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)
|
||||
|
|
|
@ -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<GetUserGuildSchema>,
|
||||
) -> ChorusResult<Vec<Guild>> {
|
||||
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)
|
||||
|
|
|
@ -22,7 +22,7 @@ impl ChorusUser {
|
|||
) -> ChorusResult<Vec<types::PublicUser>> {
|
||||
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<Vec<types::Relationship>> {
|
||||
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 {
|
||||
|
|
|
@ -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 <https://discord-userdoccers.vercel.app/resources/user#get-user> and
|
||||
/// <https://discord-userdoccers.vercel.app/resources/user#get-current-user>
|
||||
pub async fn get(user: &mut ChorusUser, id: Option<&String>) -> ChorusResult<User> {
|
||||
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 <https://discord-userdoccers.vercel.app/resources/user#get-user> and
|
||||
/// <https://discord-userdoccers.vercel.app/resources/user#get-current-user>
|
||||
pub async fn get_user(&mut self, token: String, id: Option<&String>) -> ChorusResult<User> {
|
||||
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
|
||||
}
|
||||
|
|
|
@ -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<RefCell<Instance>>,
|
||||
pub belongs_to: Arc<RwLock<Instance>>,
|
||||
pub token: String,
|
||||
pub limits: Option<HashMap<LimitType, Limit>>,
|
||||
pub settings: Arc<RwLock<UserSettings>>,
|
||||
|
@ -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<RefCell<Instance>>,
|
||||
belongs_to: Arc<RwLock<Instance>>,
|
||||
token: String,
|
||||
limits: Option<HashMap<LimitType, Limit>>,
|
||||
settings: Arc<RwLock<UserSettings>>,
|
||||
|
@ -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<RefCell<Instance>>, token: String) -> ChorusUser {
|
||||
pub(crate) async fn shell(instance: Arc<RwLock<Instance>>, 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()),
|
||||
|
|
|
@ -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!(
|
||||
|
|
Loading…
Reference in New Issue