feat: add basic server limit via env var
This commit is contained in:
@@ -16,6 +16,7 @@ use crate::database::*;
|
|||||||
use crate::notifications::websocket::is_online;
|
use crate::notifications::websocket::is_online;
|
||||||
use crate::util::result::{Error, Result};
|
use crate::util::result::{Error, Result};
|
||||||
use crate::util::variables::EARLY_ADOPTER_BADGE;
|
use crate::util::variables::EARLY_ADOPTER_BADGE;
|
||||||
|
use crate::util::variables::MAX_SERVER_COUNT;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
||||||
pub enum RelationshipStatus {
|
pub enum RelationshipStatus {
|
||||||
@@ -323,4 +324,10 @@ impl User {
|
|||||||
.collect::<Vec<Document>>()
|
.collect::<Vec<Document>>()
|
||||||
.await)
|
.await)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if this user can acquire another server.
|
||||||
|
pub async fn can_acquire_server(id: &str) -> Result<bool> {
|
||||||
|
let server_ids = User::fetch_server_ids(&id).await?;
|
||||||
|
Ok(server_ids.len() < *MAX_SERVER_COUNT)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use crate::database::*;
|
use crate::database::*;
|
||||||
use crate::util::result::{Error, Result};
|
use crate::util::result::{Error, Result};
|
||||||
|
use crate::util::variables::MAX_SERVER_COUNT;
|
||||||
|
|
||||||
use rocket::serde::json::Value;
|
use rocket::serde::json::Value;
|
||||||
|
|
||||||
@@ -8,6 +9,12 @@ pub async fn req(user: User, target: Ref) -> Result<Value> {
|
|||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
return Err(Error::IsBot)
|
return Err(Error::IsBot)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !User::can_acquire_server(&user.id).await? {
|
||||||
|
Err(Error::TooManyServers {
|
||||||
|
max: *MAX_SERVER_COUNT,
|
||||||
|
})?
|
||||||
|
}
|
||||||
|
|
||||||
let target = target.fetch_invite().await?;
|
let target = target.fetch_invite().await?;
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::database::*;
|
use crate::database::*;
|
||||||
use crate::util::result::{Error, Result};
|
use crate::util::result::{Error, Result};
|
||||||
|
use crate::util::variables::MAX_SERVER_COUNT;
|
||||||
|
|
||||||
use mongodb::bson::doc;
|
use mongodb::bson::doc;
|
||||||
use rocket::serde::json::{Json, Value};
|
use rocket::serde::json::{Json, Value};
|
||||||
@@ -27,6 +28,12 @@ pub async fn req(user: User, info: Json<Data>) -> Result<Value> {
|
|||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
return Err(Error::IsBot)
|
return Err(Error::IsBot)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !User::can_acquire_server(&user.id).await? {
|
||||||
|
Err(Error::TooManyServers {
|
||||||
|
max: *MAX_SERVER_COUNT,
|
||||||
|
})?
|
||||||
|
}
|
||||||
|
|
||||||
let info = info.into_inner();
|
let info = info.into_inner();
|
||||||
info.validate()
|
info.validate()
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ pub enum Error {
|
|||||||
UnknownServer,
|
UnknownServer,
|
||||||
InvalidRole,
|
InvalidRole,
|
||||||
Banned,
|
Banned,
|
||||||
|
TooManyServers{
|
||||||
|
max: usize,
|
||||||
|
},
|
||||||
|
|
||||||
// ? Bot related errors.
|
// ? Bot related errors.
|
||||||
ReachedMaximumBots,
|
ReachedMaximumBots,
|
||||||
@@ -111,6 +114,7 @@ impl<'r> Responder<'r, 'static> for Error {
|
|||||||
Error::UnknownServer => Status::NotFound,
|
Error::UnknownServer => Status::NotFound,
|
||||||
Error::InvalidRole => Status::NotFound,
|
Error::InvalidRole => Status::NotFound,
|
||||||
Error::Banned => Status::Forbidden,
|
Error::Banned => Status::Forbidden,
|
||||||
|
Error::TooManyServers { .. } => Status::Forbidden,
|
||||||
|
|
||||||
Error::ReachedMaximumBots => Status::BadRequest,
|
Error::ReachedMaximumBots => Status::BadRequest,
|
||||||
Error::IsBot => Status::BadRequest,
|
Error::IsBot => Status::BadRequest,
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ lazy_static! {
|
|||||||
env::var("REVOLT_MAX_GROUP_SIZE").unwrap_or_else(|_| "50".to_string()).parse().unwrap();
|
env::var("REVOLT_MAX_GROUP_SIZE").unwrap_or_else(|_| "50".to_string()).parse().unwrap();
|
||||||
pub static ref MAX_BOT_COUNT: usize =
|
pub static ref MAX_BOT_COUNT: usize =
|
||||||
env::var("REVOLT_MAX_BOT_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap();
|
env::var("REVOLT_MAX_BOT_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap();
|
||||||
|
pub static ref MAX_SERVER_COUNT: usize =
|
||||||
|
env::var("REVOLT_MAX_SERVER_COUNT").unwrap_or_else(|_| "100".to_string()).parse().unwrap();
|
||||||
pub static ref EARLY_ADOPTER_BADGE: i64 =
|
pub static ref EARLY_ADOPTER_BADGE: i64 =
|
||||||
env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap();
|
env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user