Skip to content

Commit

Permalink
Permanent bans
Browse files Browse the repository at this point in the history
  • Loading branch information
Seefaaa committed Nov 30, 2024
1 parent f81d9f4 commit 49d1ca5
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 12 deletions.
34 changes: 25 additions & 9 deletions src/database/player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,10 @@ pub async fn get_ckeys(ckey: &str, pool: &MySqlPool) -> Result<Vec<String>, Erro

#[derive(Debug, Serialize)]
pub struct Ban {
pub id: u32,
#[serde(with = "crate::serde::datetime")]
pub bantime: NaiveDateTime,
pub round_id: Option<u32>,
pub role: Option<String>,
pub roles: Option<String>,
#[serde(with = "crate::serde::opt_datetime")]
pub expiration_time: Option<NaiveDateTime>,
pub reason: String,
Expand All @@ -194,13 +193,31 @@ pub struct Ban {
pub unbanned_ckey: Option<String>,
}

pub async fn get_ban(ckey: &str, pool: &MySqlPool) -> Result<Vec<Ban>, Error> {
pub async fn get_ban(
ckey: &str,
permanent: bool,
since: Option<&str>,
pool: &MySqlPool,
) -> Result<Vec<Ban>, Error> {
let mut connection = pool.acquire().await?;

let query = sqlx::query(
"SELECT id, bantime, round_id, role, expiration_time, reason, ckey, a_ckey, edits, unbanned_datetime, unbanned_ckey FROM ban WHERE LOWER(ckey) = ?"
)
.bind(ckey.to_lowercase());
let mut sql = "SELECT id, bantime, round_id, GROUP_CONCAT(role ORDER BY role SEPARATOR ', ') AS roles, expiration_time, reason, ckey, a_ckey, edits, unbanned_datetime, unbanned_ckey FROM ban WHERE LOWER(ckey) = ?".to_string();

if permanent {
sql.push_str(" AND expiration_time IS NULL");
}

if since.is_some() {
sql.push_str(" AND bantime > ?");
}

sql.push_str(" GROUP BY bantime");

let mut query = sqlx::query(&sql).bind(ckey.to_lowercase());

if let Some(since) = since {
query = query.bind(since);
}

let mut bans = Vec::new();

Expand All @@ -211,10 +228,9 @@ pub async fn get_ban(ckey: &str, pool: &MySqlPool) -> Result<Vec<Ban>, Error> {
let ban = row?;

let ban = Ban {
id: ban.try_get("id")?,
bantime: ban.try_get("bantime")?,
round_id: ban.try_get("round_id")?,
role: ban.try_get("role")?,
roles: ban.try_get("roles")?,
expiration_time: ban.try_get("expiration_time")?,
reason: ban.try_get("reason")?,
ckey: ban.try_get("ckey")?,
Expand Down
2 changes: 1 addition & 1 deletion src/database/test_merges.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub async fn get_recent_test_merges(pool: &MySqlPool) -> Result<Vec<TestMerge>,
let mut connection = pool.acquire().await?;

let query = sqlx::query(
"SELECT round_id, datetime, JSON_EXTRACT(json, '$.data.*.number') AS test_merges FROM tg.feedback WHERE key_name = 'testmerged_prs' ORDER BY round_id DESC LIMIT 200"
"SELECT round_id, datetime, JSON_EXTRACT(json, '$.data.*.number') AS test_merges FROM feedback WHERE key_name = 'testmerged_prs' ORDER BY round_id DESC LIMIT 200"
);

let mut recent_test_merges = Vec::new();
Expand Down
6 changes: 4 additions & 2 deletions src/routes/v2/player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,15 @@ pub async fn index(
}
}

#[get("/player/ban?<ckey>")]
#[get("/player/ban?<ckey>&<permanent>&<since>")]
pub async fn ban(
ckey: &str,
permanent: Option<bool>,
since: Option<&str>,
database: &State<Database>,
_api_key: ApiKey,
) -> Result<Json<Vec<Ban>>, Status> {
match get_ban(ckey, &database.pool).await {
match get_ban(ckey, permanent.unwrap_or(false), since, &database.pool).await {
Ok(bans) => Ok(Json::Ok(bans)),
Err(Error::PlayerNotFound) => Err(Status::NotFound),
Err(_) => Err(Status::InternalServerError),
Expand Down

0 comments on commit 49d1ca5

Please sign in to comment.