diesel -> sqlx, patch cve (again lul)
This commit is contained in:
parent
a5cac129dd
commit
c3bb6d0d67
39 changed files with 1581 additions and 1207 deletions
|
@ -2,19 +2,53 @@ use rocket::form::Form;
|
|||
use rocket::http::Status;
|
||||
use rocket::response::status;
|
||||
|
||||
use diesel::prelude::*;
|
||||
|
||||
use base64::{Engine as _, engine::general_purpose};
|
||||
|
||||
use sqlx::Type;
|
||||
use sqlx::{Encode, Sqlite, query_builder::QueryBuilder, Execute};
|
||||
|
||||
use crate::helpers;
|
||||
use crate::db;
|
||||
|
||||
#[derive(Debug, sqlx::FromRow)]
|
||||
struct DynQuery {
|
||||
id: i64,
|
||||
name: String,
|
||||
user_id: i64,
|
||||
description: String,
|
||||
original: Option<i32>,
|
||||
game_version: i32,
|
||||
requested_stars: Option<i32>,
|
||||
version: i32,
|
||||
song_id: i32,
|
||||
length: i32,
|
||||
objects: i32,
|
||||
coins: i32,
|
||||
has_ldm: i32,
|
||||
two_player: i32,
|
||||
downloads: i32,
|
||||
likes: i32,
|
||||
difficulty: Option<i64>,
|
||||
community_difficulty: Option<i64>,
|
||||
demon_difficulty: Option<i64>,
|
||||
stars: Option<i32>,
|
||||
featured: i32,
|
||||
epic: i32,
|
||||
rated_coins: i32,
|
||||
user_username: String,
|
||||
user_udid: Option<String>,
|
||||
user_account_id: Option<i64>,
|
||||
user_registered: i32,
|
||||
editor_time: i32,
|
||||
editor_time_copies: i32
|
||||
}
|
||||
|
||||
#[derive(FromForm)]
|
||||
pub struct FormGetLevels {
|
||||
page: i64,
|
||||
str: String,
|
||||
page: Option<i64>,
|
||||
str: Option<String>,
|
||||
|
||||
accountID: Option<i32>,
|
||||
accountID: Option<i64>,
|
||||
gjp: Option<String>,
|
||||
gjp2: Option<String>,
|
||||
password: Option<String>,
|
||||
|
@ -41,55 +75,57 @@ pub struct FormGetLevels {
|
|||
}
|
||||
|
||||
#[post("/getGJLevels20.php", data = "<input>")]
|
||||
pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
||||
let connection = &mut db::establish_connection_pg();
|
||||
|
||||
use db::schema::{levels, users};
|
||||
use db::models::{Level, User};
|
||||
pub async fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
||||
let mut connection = db::establish_sqlite_conn().await;
|
||||
|
||||
let mut can_see_unlisted = false;
|
||||
|
||||
let mut query = levels::table.into_boxed();
|
||||
let mut count_query = levels::table.into_boxed();
|
||||
|
||||
if input.str != "" && input.r#type != Some(5) && input.r#type != Some(10) && input.r#type != Some(19) {
|
||||
match input.str.parse::<i32>() {
|
||||
Ok(matched_id) => {
|
||||
// WHERE [...]
|
||||
let mut query_params: Vec<&str> = vec![];
|
||||
// Use this for binding on `query_params`
|
||||
let mut query_params_bind: Vec<Box<dyn ToString + Send>> = vec![];
|
||||
// ORDER BY [...]
|
||||
let mut order = "levels.created_at DESC";
|
||||
|
||||
let page_offset = input.page.unwrap_or(0) * 10;
|
||||
|
||||
let search_query = input.str.clone().unwrap_or("".to_string());
|
||||
|
||||
if !search_query.is_empty() && input.r#type != Some(5) && input.r#type != Some(10) && input.r#type != Some(19) {
|
||||
match search_query.parse::<i64>() {
|
||||
Ok(id) => {
|
||||
can_see_unlisted = true;
|
||||
query = query.filter(levels::id.eq(matched_id));
|
||||
count_query = count_query.filter(levels::id.eq(matched_id))
|
||||
query_params.push("levels.id = ?");
|
||||
query_params_bind.push(Box::new(id))
|
||||
},
|
||||
Err(_) => {
|
||||
query = query.filter(levels::name.ilike(input.str.to_owned() + "%"));
|
||||
count_query = count_query.filter(levels::name.ilike(input.str.to_owned() + "%"))
|
||||
query_params.push("levels.name LIKE ?");
|
||||
query_params_bind.push(Box::new(search_query.clone() + "%"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(1) = input.featured {
|
||||
query = query.filter(levels::featured.eq(1));
|
||||
count_query = count_query.filter(levels::featured.eq(1))
|
||||
query_params.push("featured = 1");
|
||||
}
|
||||
if let Some(1) = input.original {
|
||||
query = query.filter(levels::original.is_null());
|
||||
count_query = count_query.filter(levels::original.is_null())
|
||||
query_params.push("original IS NULL");
|
||||
}
|
||||
if let Some(1) = input.coins {
|
||||
query = query.filter(levels::rated_coins.eq(1).and(levels::coins.ne(0)));
|
||||
count_query = count_query.filter(levels::rated_coins.eq(1).and(levels::coins.ne(0)))
|
||||
query_params.push("rated_coins = 1 AND levels.coins != 0");
|
||||
}
|
||||
if let Some(1) = input.epic {
|
||||
query = query.filter(levels::epic.eq(1));
|
||||
count_query = count_query.filter(levels::epic.eq(1))
|
||||
query_params.push("epic = 1");
|
||||
}
|
||||
if let Some(1) = input.uncompleted {
|
||||
match input.completedLevels.clone() {
|
||||
Some(completed_levels) => {
|
||||
let clean_levels: Vec<i32> = completed_levels[1..completed_levels.len() - 1].split(',')
|
||||
.map(|s| s.parse::<i32>().expect("failed to parse i32"))
|
||||
let clean_levels: Vec<i64> = completed_levels[1..completed_levels.len() - 1].split(',')
|
||||
.map(|s| s.parse::<i64>().expect("failed to parse i64"))
|
||||
.collect();
|
||||
query = query.filter(levels::id.ne_all(clean_levels.clone()));
|
||||
count_query = count_query.filter(levels::id.ne_all(clean_levels))
|
||||
let levels_str = clean_levels.iter().map(|n| n.to_string()).collect::<Vec<String>>().join(", ");
|
||||
query_params.push("levels.id NOT IN (?)");
|
||||
query_params_bind.push(Box::new(levels_str));
|
||||
},
|
||||
None => return status::Custom(Status::Ok, "-1")
|
||||
}
|
||||
|
@ -97,91 +133,92 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
if let Some(1) = input.onlyCompleted {
|
||||
match input.completedLevels.clone() {
|
||||
Some(completed_levels) => {
|
||||
let clean_levels: Vec<i32> = completed_levels[1..completed_levels.len() - 1].split(',')
|
||||
.map(|s| s.parse::<i32>().expect("failed to parse i32"))
|
||||
let clean_levels: Vec<i64> = completed_levels[1..completed_levels.len() - 1].split(',')
|
||||
.map(|s| s.parse::<i64>().expect("failed to parse i64"))
|
||||
.collect();
|
||||
query = query.filter(levels::id.eq_any(clean_levels.clone()));
|
||||
count_query = count_query.filter(levels::id.eq_any(clean_levels))
|
||||
let levels_str = clean_levels.iter().map(|n| n.to_string()).collect::<Vec<String>>().join(", ");
|
||||
query_params.push("levels.id IN (?)");
|
||||
query_params_bind.push(Box::new(levels_str));
|
||||
},
|
||||
None => return status::Custom(Status::Ok, "-1")
|
||||
}
|
||||
}
|
||||
if let Some(song_id) = input.song {
|
||||
if let Some(custom_song) = input.customSong {
|
||||
query = query.filter(levels::song_id.eq(custom_song));
|
||||
count_query = count_query.filter(levels::song_id.eq(custom_song))
|
||||
query_params.push("song_id = ?");
|
||||
query_params_bind.push(Box::new(custom_song));
|
||||
} else {
|
||||
query = query.filter(levels::song_id.eq(song_id));
|
||||
count_query = count_query.filter(levels::song_id.eq(song_id));
|
||||
query_params.push("song_id = ?");
|
||||
query_params_bind.push(Box::new(song_id));
|
||||
}
|
||||
}
|
||||
if let Some(1) = input.twoPlayer {
|
||||
query = query.filter(levels::two_player.eq(1));
|
||||
count_query = count_query.filter(levels::two_player.eq(1))
|
||||
query_params.push("two_player = 1");
|
||||
}
|
||||
if let Some(1) = input.star {
|
||||
query = query.filter(levels::stars.is_not_null());
|
||||
count_query = count_query.filter(levels::stars.is_not_null())
|
||||
query_params.push("levels.stars IS NOT NULL");
|
||||
}
|
||||
if let Some(1) = input.noStar {
|
||||
query = query.filter(levels::stars.is_null());
|
||||
count_query = count_query.filter(levels::stars.is_null())
|
||||
query_params.push("levels.stars IS NULL");
|
||||
}
|
||||
if let Some(_gauntlet_id) = input.gauntlet {
|
||||
unimplemented!("no gauntlet support")
|
||||
}
|
||||
if let Some(len) = input.len {
|
||||
query = query.filter(levels::length.eq(len));
|
||||
count_query = count_query.filter(levels::length.eq(len))
|
||||
query_params.push("levels.length = ?");
|
||||
query_params_bind.push(Box::new(len));
|
||||
}
|
||||
if let Some(diff) = input.diff.clone() {
|
||||
if diff != "-" {
|
||||
match diff.as_str() {
|
||||
"-1" => {
|
||||
query = query.filter(levels::difficulty.is_null().and(levels::community_difficulty.is_null()));
|
||||
count_query = count_query.filter(levels::difficulty.is_null().and(levels::community_difficulty.is_null()))
|
||||
query_params.push("difficulty IS NULL AND community_difficulty IS NULL"); // NA
|
||||
},
|
||||
"-2" => match input.demonFilter {
|
||||
Some(demon_filter) => {
|
||||
match demon_filter {
|
||||
1 => {
|
||||
query = query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Easy.to_demon_difficulty()));
|
||||
count_query = count_query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Easy.to_demon_difficulty()))
|
||||
query_params.push("demon_difficulty = ?");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::DemonDifficulty::Easy.to_demon_difficulty()));
|
||||
},
|
||||
2 => {
|
||||
query = query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Medium.to_demon_difficulty()));
|
||||
count_query = count_query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Medium.to_demon_difficulty()))
|
||||
query_params.push("demon_difficulty = ?");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::DemonDifficulty::Medium.to_demon_difficulty()));
|
||||
},
|
||||
3 => {
|
||||
query = query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Hard.to_demon_difficulty()));
|
||||
count_query = count_query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Hard.to_demon_difficulty()))
|
||||
query_params.push("demon_difficulty = ?");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::DemonDifficulty::Hard.to_demon_difficulty()));
|
||||
},
|
||||
4 => {
|
||||
query = query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Insane.to_demon_difficulty()));
|
||||
count_query = count_query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Insane.to_demon_difficulty()))
|
||||
query_params.push("demon_difficulty = ?");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::DemonDifficulty::Insane.to_demon_difficulty()));
|
||||
},
|
||||
5 => {
|
||||
query = query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Extreme.to_demon_difficulty()));
|
||||
count_query = count_query.filter(levels::demon_difficulty.eq::<i32>(helpers::difficulty::DemonDifficulty::Extreme.to_demon_difficulty()))
|
||||
query_params.push("demon_difficulty = ?");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::DemonDifficulty::Extreme.to_demon_difficulty()));
|
||||
},
|
||||
_ => panic!("invalid demon filter!")
|
||||
}
|
||||
query = query.filter(diesel::BoolExpressionMethods::or(levels::difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Demon.to_star_difficulty()), levels::difficulty.is_null().and(levels::community_difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Demon.to_star_difficulty()))));
|
||||
count_query = count_query.filter(diesel::BoolExpressionMethods::or(levels::difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Demon.to_star_difficulty()), levels::difficulty.is_null().and(levels::community_difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Demon.to_star_difficulty()))))
|
||||
query_params.push("difficulty = ? OR (difficulty IS NULL AND community_difficulty = ?)");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::LevelDifficulty::Demon.to_star_difficulty()));
|
||||
query_params_bind.push(Box::new(helpers::difficulty::LevelDifficulty::Demon.to_star_difficulty()));
|
||||
},
|
||||
None => panic!("demon filter option with no demon filter argument")
|
||||
},
|
||||
"-3" => {
|
||||
query = query.filter(diesel::BoolExpressionMethods::or(levels::difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Auto.to_star_difficulty()), levels::difficulty.is_null().and(levels::community_difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Auto.to_star_difficulty()))));
|
||||
count_query = count_query.filter(diesel::BoolExpressionMethods::or(levels::difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Auto.to_star_difficulty()), levels::difficulty.is_null().and(levels::community_difficulty.eq::<i32>(helpers::difficulty::LevelDifficulty::Auto.to_star_difficulty()))))
|
||||
query_params.push("difficulty = ? OR (difficulty IS NULL AND community_difficulty = ?)");
|
||||
query_params_bind.push(Box::new(helpers::difficulty::LevelDifficulty::Auto.to_star_difficulty()));
|
||||
query_params_bind.push(Box::new(helpers::difficulty::LevelDifficulty::Auto.to_star_difficulty()));
|
||||
},
|
||||
// easy, normal, hard, harder, insane
|
||||
_ => {
|
||||
let diffs: Vec<i32> = diff.split(',')
|
||||
let clean_diffs: Vec<i32> = diff.split(',')
|
||||
.map(|v| v.parse::<i32>().expect("couldnt parse i32"))
|
||||
.collect();
|
||||
query = query.filter(levels::difficulty.eq_any(diffs.clone()).or(levels::difficulty.is_null().and(levels::community_difficulty.eq_any(diffs.clone()))));
|
||||
count_query = count_query.filter(levels::difficulty.eq_any(diffs.clone()).or(levels::difficulty.is_null().and(levels::community_difficulty.eq_any(diffs))))
|
||||
let diffs_str = clean_diffs.iter().map(|n| n.to_string()).collect::<Vec<String>>().join(", ");
|
||||
query_params.push("difficulty IN (?) OR (difficulty IS NULL AND community_difficulty IN (?))");
|
||||
query_params_bind.push(Box::new(diffs_str.clone()));
|
||||
query_params_bind.push(Box::new(diffs_str));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -191,13 +228,11 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
match search_type {
|
||||
// downloads
|
||||
1 => {
|
||||
query = query.order(levels::downloads.desc());
|
||||
// count query order doesnt matter
|
||||
order = "levels.downloads DESC";
|
||||
},
|
||||
// likes
|
||||
2 => {
|
||||
query = query.order(levels::likes.desc());
|
||||
// count query order doesnt matter
|
||||
order = "levels.likes DESC";
|
||||
},
|
||||
// trending
|
||||
3 => {
|
||||
|
@ -212,9 +247,9 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
5 => {
|
||||
if let Some(1) = input.local {
|
||||
if let Some(input_account_id) = input.accountID {
|
||||
let (user_id_val, _account_id_val): (i32, i32);
|
||||
let (user_id_val, _account_id_val): (i64, i64);
|
||||
|
||||
match helpers::accounts::auth(input_account_id, input.password.clone(), input.gjp.clone(), input.gjp2.clone()) {
|
||||
match helpers::accounts::auth(input_account_id, input.password.clone(), input.gjp.clone(), input.gjp2.clone()).await {
|
||||
Ok((user_id_val_auth, account_id_val_auth)) => {
|
||||
user_id_val = user_id_val_auth;
|
||||
_account_id_val = account_id_val_auth;
|
||||
|
@ -222,37 +257,34 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
Err(_) => return status::Custom(Status::Ok, "-1")
|
||||
};
|
||||
|
||||
if user_id_val == input.str.parse::<i32>().expect("couldnt convert query input to i32") {
|
||||
if user_id_val == search_query.parse::<i64>().expect("couldnt convert query input to i64") {
|
||||
can_see_unlisted = true;
|
||||
query = query.filter(levels::user_id.eq(user_id_val));
|
||||
count_query = count_query.filter(levels::user_id.eq(user_id_val))
|
||||
query_params.push("levels.user_id = ?");
|
||||
query_params_bind.push(Box::new(user_id_val));
|
||||
} else {
|
||||
return status::Custom(Status::Ok, "-1")
|
||||
}
|
||||
}
|
||||
}
|
||||
if let None = input.local {
|
||||
let user_id_val = input.str.parse::<i32>().expect("couldnt convert query input to i32");
|
||||
let user_id_val = search_query.parse::<i64>().expect("couldnt convert query input to i64");
|
||||
|
||||
query = query.filter(levels::user_id.eq(user_id_val));
|
||||
count_query = count_query.filter(levels::user_id.eq(user_id_val))
|
||||
query_params.push("levels.user_id = ?");
|
||||
query_params_bind.push(Box::new(user_id_val));
|
||||
}
|
||||
}
|
||||
// featured
|
||||
// 17 is gdworld
|
||||
6 | 17 => {
|
||||
query = query.filter(levels::featured.eq(1));
|
||||
count_query = count_query.filter(levels::featured.eq(1))
|
||||
query_params.push("featured = 1");
|
||||
},
|
||||
// epic / HoF
|
||||
16 => {
|
||||
query = query.filter(levels::epic.eq(1));
|
||||
count_query = count_query.filter(levels::epic.eq(1))
|
||||
query_params.push("epic = 1");
|
||||
},
|
||||
// magic
|
||||
7 => {
|
||||
query = query.filter(levels::objects.gt(4000));
|
||||
count_query = count_query.filter(levels::objects.gt(4000))
|
||||
query_params.push("objects > 4000");
|
||||
},
|
||||
// map packs 🙄😶
|
||||
10 | 19 => {
|
||||
|
@ -260,8 +292,7 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
},
|
||||
// rated
|
||||
11 => {
|
||||
query = query.filter(levels::stars.is_not_null());
|
||||
count_query = count_query.filter(levels::stars.is_not_null())
|
||||
query_params.push("levels.stars IS NOT NULL");
|
||||
},
|
||||
// followed
|
||||
12 => {
|
||||
|
@ -286,72 +317,63 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
// default sort
|
||||
// 15 is gdworld
|
||||
0 | 15 | _ => {
|
||||
query = query.order(levels::likes.desc());
|
||||
// count query order doesnt matter
|
||||
order = "likes DESC";
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
if !can_see_unlisted {
|
||||
query = query.filter(levels::unlisted.eq(0));
|
||||
count_query = count_query.filter(levels::unlisted.eq(0))
|
||||
query_params.push("unlisted = 0");
|
||||
}
|
||||
|
||||
let mut results: Vec<String> = [].to_vec();
|
||||
let mut users: Vec<String> = [].to_vec();
|
||||
let mut songs: Vec<String> = [].to_vec();
|
||||
let where_str = format!("WHERE ({})", query_params.join(" AND "));
|
||||
let query_base = format!("FROM levels JOIN users ON levels.user_id = users.id {} ORDER BY {}", where_str, order);
|
||||
|
||||
let mut hash_data: Vec<(i32, i32, bool)> = [].to_vec();
|
||||
let mut query_builder: QueryBuilder<Sqlite> = QueryBuilder::new(&format!("SELECT levels.id, levels.name, users.id as user_id, levels.description, levels.original, levels.game_version, levels.requested_stars, levels.version, levels.song_id, levels.length, levels.objects, levels.coins, levels.has_ldm, levels.two_player, levels.downloads, levels.likes, levels.difficulty, levels.community_difficulty, levels.demon_difficulty, levels.stars, levels.featured, levels.epic, levels.rated_coins, users.username as user_username, users.udid as user_udid, users.account_id as user_account_id, users.registered as user_registered, editor_time, editor_time_copies {}", query_base));
|
||||
let mut query = query_builder.build_query_as::<DynQuery>();
|
||||
|
||||
for param in query_params_bind {
|
||||
query = query.bind(param.to_string());
|
||||
}
|
||||
|
||||
let mut results: Vec<String> = vec![];
|
||||
let mut users: Vec<String> = vec![];
|
||||
let mut songs: Vec<String> = vec![];
|
||||
|
||||
let mut hash_data: Vec<(i64, i32, bool)> = vec![];
|
||||
|
||||
let count: i64 = sqlx::query_scalar(&format!("SELECT COUNT(*) {}", query_base))
|
||||
.fetch_one(&mut connection)
|
||||
.await
|
||||
.expect("error getting level count");
|
||||
|
||||
// for goop in {
|
||||
// query
|
||||
// .fetch_all(&mut connection)
|
||||
// .await
|
||||
// .expect("error loading levels")
|
||||
// } {
|
||||
// println!("lvl id: {:?}", goop.id);
|
||||
// println!("user id: {:?}", goop.user_id);
|
||||
// }
|
||||
|
||||
for result in {
|
||||
query
|
||||
.order(levels::created_at.desc())
|
||||
.offset(input.page * 10)
|
||||
.limit(10)
|
||||
.get_results::<Level, >(connection)
|
||||
.expect("fatal error loading levels")
|
||||
.fetch_all(&mut connection)
|
||||
.await
|
||||
.expect("error loading levels")
|
||||
} {
|
||||
let user: User = users::table.find(result.user_id).get_result::<User, >(connection).expect("couldnt get user from lvl");
|
||||
let level: Level = result;
|
||||
|
||||
let set_difficulty = match level.difficulty {
|
||||
Some(diff) => {
|
||||
Some(helpers::difficulty::LevelDifficulty::new(diff))
|
||||
},
|
||||
None => None
|
||||
};
|
||||
let community_difficulty = match level.community_difficulty {
|
||||
Some(diff) => {
|
||||
Some(helpers::difficulty::LevelDifficulty::new(diff))
|
||||
},
|
||||
None => None
|
||||
};
|
||||
let difficulty = match set_difficulty {
|
||||
Some(diff) => {
|
||||
Some(diff)
|
||||
},
|
||||
None => {
|
||||
match community_difficulty {
|
||||
Some(diff) => {
|
||||
Some(diff)
|
||||
},
|
||||
None => None
|
||||
}
|
||||
}
|
||||
};
|
||||
let demon_difficulty = match level.demon_difficulty {
|
||||
Some(diff) => {
|
||||
Some(helpers::difficulty::DemonDifficulty::new(diff))
|
||||
},
|
||||
None => None
|
||||
};
|
||||
|
||||
let set_difficulty = result.difficulty.map(helpers::difficulty::LevelDifficulty::new);
|
||||
let community_difficulty = result.community_difficulty.map(helpers::difficulty::LevelDifficulty::new);
|
||||
let difficulty = set_difficulty.or(community_difficulty);
|
||||
let demon_difficulty = result.demon_difficulty.map(helpers::difficulty::DemonDifficulty::new);
|
||||
|
||||
results.push(helpers::format::format(hashmap! {
|
||||
1 => level.id.to_string(),
|
||||
2 => level.name,
|
||||
3 => general_purpose::URL_SAFE.encode(level.description),
|
||||
5 => level.version.to_string(),
|
||||
6 => user.id.to_string(),
|
||||
1 => result.id.to_string(),
|
||||
2 => result.name,
|
||||
3 => general_purpose::URL_SAFE.encode(result.description),
|
||||
5 => result.version.to_string(),
|
||||
6 => result.user_id.to_string(),
|
||||
// this argument is weird. its the "difficulty divisor"
|
||||
// used to be vote count but yeah
|
||||
8 => 10.to_string(),
|
||||
|
@ -359,12 +381,12 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
Some(diff) => diff.to_star_difficulty(),
|
||||
None => 0
|
||||
} * 10).to_string(),
|
||||
10 => level.downloads.to_string(),
|
||||
12 => (if level.song_id < 50 { level.song_id } else { 0 }).to_string(),
|
||||
13 => level.game_version.to_string(),
|
||||
14 => level.likes.to_string(),
|
||||
16 => (-level.likes).to_string(),
|
||||
15 => level.length.to_string(),
|
||||
10 => result.downloads.to_string(),
|
||||
12 => (if result.song_id < 50 { result.song_id } else { 0 }).to_string(),
|
||||
13 => result.game_version.to_string(),
|
||||
14 => result.likes.to_string(),
|
||||
16 => (-result.likes).to_string(),
|
||||
15 => result.length.to_string(),
|
||||
17 => match difficulty {
|
||||
Some(diff) => {
|
||||
if diff == helpers::difficulty::LevelDifficulty::Demon {
|
||||
|
@ -375,8 +397,8 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
},
|
||||
None => 0
|
||||
}.to_string(),
|
||||
18 => (if let Some(stars) = level.stars { stars } else { 0 }).to_string(),
|
||||
19 => level.featured.to_string(),
|
||||
18 => (if let Some(stars) = result.stars { stars } else { 0 }).to_string(),
|
||||
19 => result.featured.to_string(),
|
||||
25 => match difficulty {
|
||||
Some(diff) => {
|
||||
if diff == helpers::difficulty::LevelDifficulty::Auto {
|
||||
|
@ -387,54 +409,49 @@ pub fn get_levels(input: Form<FormGetLevels>) -> status::Custom<&'static str> {
|
|||
},
|
||||
None => 0
|
||||
}.to_string(),
|
||||
30 => (if let Some(original) = level.original { original } else { 0 }).to_string(),
|
||||
31 => level.two_player.to_string(),
|
||||
35 => (if level.song_id >= 50 { level.song_id } else { 0 }).to_string(),
|
||||
37 => level.coins.to_string(),
|
||||
38 => level.rated_coins.to_string(),
|
||||
39 => (if let Some(requested_stars) = level.requested_stars { requested_stars } else { 0 }).to_string(),
|
||||
40 => level.has_ldm.to_string(),
|
||||
42 => level.epic.to_string(),
|
||||
30 => (if let Some(original) = result.original { original } else { 0 }).to_string(),
|
||||
31 => result.two_player.to_string(),
|
||||
35 => (if result.song_id >= 50 { result.song_id } else { 0 }).to_string(),
|
||||
37 => result.coins.to_string(),
|
||||
38 => result.rated_coins.to_string(),
|
||||
39 => (if let Some(requested_stars) = result.requested_stars { requested_stars } else { 0 }).to_string(),
|
||||
40 => result.has_ldm.to_string(),
|
||||
42 => result.epic.to_string(),
|
||||
43 => match demon_difficulty {
|
||||
Some(diff) => {
|
||||
diff
|
||||
},
|
||||
None => helpers::difficulty::DemonDifficulty::Hard
|
||||
}.to_demon_difficulty().to_string(),
|
||||
45 => level.objects.to_string(),
|
||||
46 => level.editor_time.to_string(),
|
||||
47 => level.editor_time_copies.to_string()
|
||||
45 => result.objects.to_string(),
|
||||
46 => result.editor_time.to_string(),
|
||||
47 => result.editor_time_copies.to_string()
|
||||
}));
|
||||
|
||||
users.push(format!("{}:{}:{}", user.id, user.username, {
|
||||
if user.registered == 1 {
|
||||
user.account_id.expect("wtf? registered user with no account id.").to_string()
|
||||
users.push(format!("{}:{}:{}", result.user_id, result.user_username, {
|
||||
if result.user_registered == 1 {
|
||||
result.user_account_id.expect("wtf? registered user with no account id.").to_string()
|
||||
} else {
|
||||
user.udid.expect("wtf? unregistered user with no udid.")
|
||||
result.user_udid.expect("wtf? unregistered user with no udid.")
|
||||
}
|
||||
}));
|
||||
|
||||
hash_data.push((
|
||||
level.id,
|
||||
{ if let Some(stars) = level.stars {
|
||||
result.id,
|
||||
{ if let Some(stars) = result.stars {
|
||||
stars
|
||||
} else {
|
||||
0
|
||||
}},
|
||||
{ if let 1 = level.rated_coins {
|
||||
{ if let 1 = result.rated_coins {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}}
|
||||
));
|
||||
};
|
||||
}
|
||||
|
||||
let level_count = count_query
|
||||
.count()
|
||||
.get_result::<i64, >(connection)
|
||||
.expect("failed to get count of levels");
|
||||
|
||||
let search_meta = format!("{}:{}:{}", level_count, input.page * 10, 10);
|
||||
let search_meta = format!("{}:{}:{}", count, page_offset, 10);
|
||||
|
||||
let response = vec![results.join("|"), users.join("|"), songs.join("|"), search_meta, helpers::encryption::gen_multi(hash_data)].join("#");
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue