mirror of
https://git.ethanthesleepy.one/ethanaobrien/ew.git
synced 2025-05-13 11:37:33 -05:00
I forgot to push the ranking file
This commit is contained in:
parent
591c0a5ac7
commit
d4a43d9ef2
1 changed files with 133 additions and 0 deletions
133
src/router/event_ranking.rs
Normal file
133
src/router/event_ranking.rs
Normal file
|
@ -0,0 +1,133 @@
|
|||
use json::{object, array, JsonValue};
|
||||
use rusqlite::params;
|
||||
use std::sync::Mutex;
|
||||
use std::thread;
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
use crate::sql::SQLite;
|
||||
use crate::router::global;
|
||||
|
||||
lazy_static! {
|
||||
static ref DATABASE: SQLite = SQLite::new("event_ranking.db", setup_tables);
|
||||
static ref CACHED_DATA: Mutex<Option<JsonValue>> = Mutex::new(None);
|
||||
}
|
||||
|
||||
fn setup_tables(conn: &SQLite) {
|
||||
conn.lock_and_exec("CREATE TABLE IF NOT EXISTS scores (
|
||||
event_id INT NOT NULL PRIMARY KEY,
|
||||
score_data TEXT NOT NULL
|
||||
)", params!());
|
||||
}
|
||||
|
||||
pub fn live_completed(event_id: u32, uid: i64, score: i64, star_level: i64) {
|
||||
if uid == 0 || score == 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
let info = DATABASE.lock_and_select("SELECT score_data FROM scores WHERE event_id=?1", params!(event_id)).unwrap_or(String::from("[]"));
|
||||
let scores = json::parse(&info).unwrap();
|
||||
|
||||
let mut result = array![];
|
||||
let mut current = 0;
|
||||
let mut added = false;
|
||||
for i in 0..10000 {
|
||||
if current >= 10000 {
|
||||
break;
|
||||
}
|
||||
if scores[i].is_empty() && !added {
|
||||
added = true;
|
||||
result.push(object!{user: uid, score: score, star_level: star_level}).unwrap();
|
||||
}
|
||||
if scores[i].is_empty() {
|
||||
break;
|
||||
}
|
||||
if scores[i]["score"].as_i64().unwrap() < score && !added {
|
||||
added = true;
|
||||
result.push(object!{user: uid, score: score, star_level: star_level}).unwrap();
|
||||
current += 1;
|
||||
if current >= 10000 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if scores[i]["user"].as_i64().unwrap() == uid && !added {
|
||||
return;
|
||||
}
|
||||
if scores[i]["user"].as_i64().unwrap() == uid {
|
||||
continue;
|
||||
}
|
||||
result.push(scores[i].clone()).unwrap();
|
||||
current += 1;
|
||||
}
|
||||
|
||||
if added {
|
||||
if DATABASE.lock_and_select("SELECT score_data FROM scores WHERE event_id=?1", params!(event_id)).is_ok() {
|
||||
DATABASE.lock_and_exec("UPDATE scores SET score_data=?1 WHERE event_id=?2", params!(json::stringify(result), event_id));
|
||||
} else {
|
||||
DATABASE.lock_and_exec("INSERT INTO scores (score_data, event_id) VALUES (?1, ?2)", params!(json::stringify(result), event_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_raw_info(event: u32) -> JsonValue {
|
||||
let info = DATABASE.lock_and_select("SELECT score_data FROM scores WHERE event_id=?1", params!(event)).unwrap_or(String::from("[]"));
|
||||
json::parse(&info).unwrap()
|
||||
}
|
||||
|
||||
fn get_json() -> JsonValue {
|
||||
let events = DATABASE.lock_and_select_all("SELECT event_id FROM scores", params!()).unwrap();
|
||||
let mut rv = object!{};
|
||||
for event in events.members() {
|
||||
rv[event.to_string()] = array![];
|
||||
let scores = json::parse(&DATABASE.lock_and_select("SELECT score_data FROM scores WHERE event_id=?1", params!(event.as_i64().unwrap())).unwrap()).unwrap();
|
||||
|
||||
let mut i = 1;
|
||||
for score in scores.members() {
|
||||
let user = global::get_user(score["user"].as_i64().unwrap(), &object![], false);
|
||||
rv[event.to_string()].push(object!{
|
||||
"rank": i,
|
||||
"user_detail": user,
|
||||
"score": score["score"].as_i64().unwrap(),
|
||||
"star_level": score["star_level"].as_i64().unwrap()
|
||||
}).unwrap();
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
object!{
|
||||
"cache": rv,
|
||||
"last_updated": global::timestamp()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_scores_json() -> JsonValue {
|
||||
loop {
|
||||
match CACHED_DATA.lock() {
|
||||
Ok(mut result) => {
|
||||
if result.is_none() {
|
||||
result.replace(get_json());
|
||||
}
|
||||
let cache = result.as_ref().unwrap();
|
||||
let rv = cache["cache"].clone();
|
||||
if cache["last_updated"].as_u64().unwrap() + (60 * 60) < global::timestamp() {
|
||||
thread::spawn(|| {
|
||||
loop {
|
||||
match CACHED_DATA.lock() {
|
||||
Ok(mut result) => {
|
||||
let new = get_json();
|
||||
result.replace(new.clone());
|
||||
break;
|
||||
}
|
||||
Err(_) => {
|
||||
std::thread::sleep(std::time::Duration::from_millis(15));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
Err(_) => {
|
||||
std::thread::sleep(std::time::Duration::from_millis(15));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue