Compare commits

..

No commits in common. "3daa17cccfeab0f6e7bb8972fcfbbfc28a42ec9d" and "2d15914d1ad77eb918f4fde2d106a6892b103fc4" have entirely different histories.

3 changed files with 44 additions and 67 deletions

View file

@ -6,9 +6,7 @@ CREATE TABLE users (
account_id INTEGER references accounts(id), account_id INTEGER references accounts(id),
registered INTEGER NOT NULL, registered INTEGER NOT NULL,
-- idk why but we get weird errors if we use `COLLATE case_insensitive` username TEXT NOT NULL COLLATE case_insensitive,
-- maybe troubleshoot later, this works fine for now.
username TEXT NOT NULL, -- COLLATE case_insensitive,
stars INTEGER NOT NULL DEFAULT 0, stars INTEGER NOT NULL DEFAULT 0,
demons INTEGER NOT NULL DEFAULT 0, demons INTEGER NOT NULL DEFAULT 0,

View file

@ -34,6 +34,6 @@ _these features are implemented_
## todo ## todo
- get users multiple pages - ___fix the fucking get users for usernames!!!!___
- move authorization logic to (./src/helpers/accounts.rs)[./src/helpers/accounts.rs] - move authorization logic to (./src/helpers/accounts.rs)[./src/helpers/accounts.rs]
- make gjp2 authentication faster (bcrypt?) - make gjp2 authentication faster (bcrypt?)

View file

@ -3,6 +3,7 @@ use rocket::http::Status;
use rocket::response::status; use rocket::response::status;
use diesel::prelude::*; use diesel::prelude::*;
use diesel::result::Error;
use crate::helpers; use crate::helpers;
use crate::db; use crate::db;
@ -13,7 +14,7 @@ pub struct FormGetUsers {
str: String str: String
} }
#[post("/getGJUsers20.php", data = "<input>")] #[post("/accounts/getGJUsers20.php", data = "<input>")]
pub fn get_users(input: Form<FormGetUsers>) -> status::Custom<&'static str> { pub fn get_users(input: Form<FormGetUsers>) -> status::Custom<&'static str> {
let connection = &mut db::establish_connection_pg(); let connection = &mut db::establish_connection_pg();
@ -21,48 +22,45 @@ pub fn get_users(input: Form<FormGetUsers>) -> status::Custom<&'static str> {
use crate::schema::users::dsl::*; use crate::schema::users::dsl::*;
use crate::models::User; use crate::models::User;
let mut query_users = users.into_boxed(); let mut query = users.into_boxed();
match input.str.parse::<i32>() { match input.str.parse::<i32>() {
Ok(id_value) => query_users = query_users.filter(id.eq(id_value)), Ok(id_value) => query = query.filter(id.eq(id_value)),
Err(_) => query_users = query_users.filter(username.ilike(input.str.to_owned() + "%")) Err(_) => query = query.filter(username.like(input.str.to_owned() + "%"))
}; };
let mut results: Vec<String> = vec![]; let results = query
for result in {
query_users
.order(stars.desc()) .order(stars.desc())
.offset(input.page * 10)
.limit(10) .limit(10)
.get_results::<User, >(connection) .offset(input.page * 10)
.expect("Fatal error loading users") .get_result::<User, >(connection)
} { .expect("Fatal error loading users");
let formatted_result = helpers::format::format(hashmap! {
1 => result.username, let response = helpers::format::format(hashmap! {
2 => result.id.to_string(), 1 => results.username,
3 => result.stars.to_string(), 2 => results.id.to_string(),
4 => result.demons.to_string(), 3 => results.stars.to_string(),
8 => result.creator_points.to_string(), 4 => results.demons.to_string(),
8 => results.creator_points.to_string(),
9 => { 9 => {
vec![ vec![
result.cube, results.cube,
result.ship, results.ship,
result.ball, results.ball,
result.ufo, results.ufo,
result.wave, results.wave,
result.robot results.robot
][result.icon_type as usize].to_string() ][results.icon_type as usize].to_string()
}, },
10 => result.color1.to_string(), 10 => results.color1.to_string(),
11 => result.color2.to_string(), 11 => results.color2.to_string(),
13 => result.coins.to_string(), 13 => results.coins.to_string(),
14 => result.icon_type.to_string(), 14 => results.icon_type.to_string(),
15 => result.special.to_string(), 15 => results.special.to_string(),
16 => { 16 => {
match result.account_id { match results.account_id {
Some(account_id_value) => account_id_value.to_string(), Some(account_id_value) => account_id_value.to_string(),
None => match result.udid { None => match results.udid {
Some(udid_value) => udid_value.to_string(), Some(udid_value) => udid_value.to_string(),
None => panic!("user has no account_id or udid?!?!?") None => panic!("user has no account_id or udid?!?!?")
} }
@ -70,26 +68,7 @@ pub fn get_users(input: Form<FormGetUsers>) -> status::Custom<&'static str> {
} }
}); });
results.push(formatted_result) println!("{}", response);
};
let mut query_users_count = users.into_boxed(); return status::Custom(Status::Ok, "1")
match input.str.parse::<i32>() {
Ok(id_value) => query_users_count = query_users_count.filter(id.eq(id_value)),
Err(_) => query_users_count = query_users_count.filter(username.ilike(input.str.to_owned() + "%"))
};
let amount = query_users_count
.count()
.get_result::<i64>(connection)
.expect("Error querying user count");
let response = if amount < 1 {
String::from("-1")
} else {
vec![results.join("|"), format!("{}:#{}:10", amount, input.page * 10)].join("#")
};
return status::Custom(Status::Ok, Box::leak(response.into_boxed_str()))
} }