Compare commits

...

6 commits
v1.0.0 ... main

Author SHA1 Message Date
038a651202 I forgot to define user_id.....
Some checks failed
Build docker images / build (push) Has been cancelled
2025-05-04 01:14:55 -05:00
4aa00fd3d8 Fix for fried list
Man I am hungry and I have no food....
2025-05-03 23:16:02 -05:00
222021382f
Add flags to use max time or not
Some checks failed
Build docker images / build (push) Has been cancelled
2025-05-01 21:11:00 -05:00
1a736155e3
Update dependencies 2025-05-01 12:14:17 -05:00
e27a020cfb
Fix timestamp in friend pages 2025-05-01 12:05:18 -05:00
b082def65c Check for consume type 2 (paid gems) 2025-01-20 12:38:45 -06:00
10 changed files with 632 additions and 396 deletions

930
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,30 +1,30 @@
[package] [package]
name = "ew" name = "ew"
version = "1.0.0" version = "1.0.0"
edition = "2021" edition = "2024"
[dependencies] [dependencies]
actix-web = { version = "4.9.0" } actix-web = { version = "4.10.2" }
rusqlite = { version = "0.32.1", features = ["bundled"] } rusqlite = { version = "0.35.0", features = ["bundled"] }
openssl = { version = "0.10", features = ["vendored"] } openssl = { version = "0.10", features = ["vendored"] }
reqwest = { version = "0.12", features = ["blocking"] } reqwest = { version = "0.12", features = ["blocking"] }
clap = { version = "4.5.21", features = ["derive"]} clap = { version = "4.5.37", features = ["derive"]}
base64 = "0.22.1" base64 = "0.22.1"
json = "0.12.4" json = "0.12.4"
rand = "0.8.5" rand = "0.9.1"
lazy_static = "1.5.0" lazy_static = "1.5.0"
chrono = "0.4.38" chrono = "0.4.41"
hex = "0.4.3" hex = "0.4.3"
hmac = "0.12.1" hmac = "0.12.1"
md5 = "0.7.0" md5 = "0.7.0"
urlencoding = "2.1.3" urlencoding = "2.1.3"
sha1 = "0.10.6" sha1 = "0.10.6"
substring = "1.4.5" substring = "1.4.5"
uuid = { version = "1.11.0", features = ["v7"] } uuid = { version = "1.16.0", features = ["v7"] }
rsa = "0.9.6" rsa = "0.9.8"
mime = "0.3.17" mime = "0.3.17"
sha2 = "0.10.8" sha2 = "0.10.9"
include-flate-codegen = "0.3.0" include-flate-codegen = "0.3.0"
libflate = "2.1.0" libflate = "2.1.0"
serde_json = "1.0.133" serde_json = "1.0.140"
serde = { version = "1.0.215", features = ["derive"] } serde = { version = "1.0.219", features = ["derive"] }

View file

@ -47,7 +47,7 @@ pub fn encrypt_packet(input: &str) -> Result<String, ErrorStack> {
} }
fn generate_random_iv() -> Vec<u8> { fn generate_random_iv() -> Vec<u8> {
let mut rng = rand::thread_rng(); let mut rng = rand::rng();
let mut bytes = vec![0u8; IV_LENGTH]; let mut bytes = vec![0u8; IV_LENGTH];
rng.fill(&mut bytes[..]); rng.fill(&mut bytes[..]);
bytes bytes

View file

@ -51,8 +51,8 @@ fn save_event_data(key: &str, event_id: u32, data: JsonValue) {
} }
fn get_random_song() -> JsonValue { fn get_random_song() -> JsonValue {
let mut rng = rand::thread_rng(); let mut rng = rand::rng();
let random_number = rng.gen_range(0..=databases::LIVES.len()); let random_number = rng.random_range(0..=databases::LIVES.len());
object!{ object!{
song: databases::LIVES[random_number]["masterMusicId"].clone(), song: databases::LIVES[random_number]["masterMusicId"].clone(),
score: (databases::LIVES[random_number]["scoreC"].as_f64().unwrap() * 1.75).round() as i64 score: (databases::LIVES[random_number]["scoreC"].as_f64().unwrap() * 1.75).round() as i64

View file

@ -9,6 +9,7 @@ pub const FRIEND_LIMIT: usize = 40;
pub fn friend(req: HttpRequest, body: String) -> Option<JsonValue> { pub fn friend(req: HttpRequest, body: String) -> Option<JsonValue> {
let key = global::get_login(req.headers(), &body); let key = global::get_login(req.headers(), &body);
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap(); let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
let user_id = userdata::get_acc(&key)["user"]["id"].as_i64().unwrap();
let friends = userdata::get_acc_friends(&key); let friends = userdata::get_acc_friends(&key);
let mut rv = array![]; let mut rv = array![];
@ -24,7 +25,9 @@ pub fn friend(req: HttpRequest, body: String) -> Option<JsonValue> {
}; };
for uid in rv_data.members() { for uid in rv_data.members() {
rv.push(global::get_user(uid.as_i64().unwrap(), &friends, false)).unwrap(); let mut user = global::get_user(uid.as_i64().unwrap(), &friends, false);
user["user"]["last_login_time"] = global::set_time(user["user"]["last_login_time"].as_u64().unwrap_or(0), user_id, false).into();
rv.push(user).unwrap();
} }
Some(object!{ Some(object!{
@ -52,10 +55,11 @@ pub fn recommend(req: HttpRequest, body: String) -> Option<JsonValue> {
let mut rv = array![]; let mut rv = array![];
for uid in random.members() { for uid in random.members() {
let user = global::get_user(uid.as_i64().unwrap(), &friends, false); let mut user = global::get_user(uid.as_i64().unwrap(), &friends, false);
if user["user"]["friend_request_disabled"] == 1 || user.is_empty() { if user["user"]["friend_request_disabled"] == 1 || user.is_empty() {
continue; continue;
} }
user["user"]["last_login_time"] = global::set_time(user["user"]["last_login_time"].as_u64().unwrap_or(0), user_id, false).into();
rv.push(user).unwrap(); rv.push(user).unwrap();
} }

View file

@ -106,11 +106,11 @@ pub fn timestamp_since_midnight() -> u64 {
unix_timestamp.as_secs() - midnight unix_timestamp.as_secs() - midnight
} }
fn init_time(data: &JsonValue, server_data: &mut JsonValue, token: &str, max_time: u64) { fn init_time(current_time: u64, server_data: &mut JsonValue, token: &str, max_time: u64, max: bool) {
let mut edited = false; let mut edited = false;
let default_time = 1709272800; let default_time = 1709272800;
if max_time > 10 && max_time < data["server_time"].as_u64().unwrap_or(0) && server_data["server_time"].as_u64().unwrap_or(0) < max_time { if max_time > 10 && max_time < current_time && server_data["server_time"].as_u64().unwrap_or(0) < max_time && max {
server_data["server_time_set"] = timestamp().into(); server_data["server_time_set"] = timestamp().into();
edited = true; edited = true;
} }
@ -123,36 +123,37 @@ fn init_time(data: &JsonValue, server_data: &mut JsonValue, token: &str, max_tim
server_data["server_time"] = default_time.into(); server_data["server_time"] = default_time.into();
edited = true; edited = true;
} }
if edited { if edited && max {
userdata::save_server_data(token, server_data.clone()); userdata::save_server_data(token, server_data.clone());
} }
} }
fn set_time(data: &mut JsonValue, uid: i64) { pub fn set_time(current_time: u64, uid: i64, max: bool) -> u64 {
let max_time = crate::get_args().max_time; let max_time = crate::get_args().max_time;
if uid == 0 { if uid == 0 {
if max_time > 10 && max_time < data["server_time"].as_u64().unwrap_or(0) { if max_time > 10 && max_time < current_time {
data["server_time"] = max_time.into(); return max_time;
} else {
return timestamp();
} }
return;
} }
let token = userdata::get_login_token(uid); let token = userdata::get_login_token(uid);
let mut server_data = userdata::get_server_data(&token); let mut server_data = userdata::get_server_data(&token);
init_time(data, &mut server_data, &token, max_time); init_time(current_time, &mut server_data, &token, max_time, max);
let time_set = server_data["server_time_set"].as_u64().unwrap_or(timestamp()); let time_set = server_data["server_time_set"].as_u64().unwrap_or(timestamp());
let server_time = server_data["server_time"].as_u64().unwrap_or(0);//1711741114 let server_time = server_data["server_time"].as_u64().unwrap_or(0);//1711741114
if server_time == 0 { if server_time == 0 {
return; return current_time;
} }
let time_since_set = timestamp() - time_set; let time_since_set = current_time - time_set;
data["server_time"] = (server_time + time_since_set).into(); return server_time + time_since_set;
} }
pub fn send(mut data: JsonValue, uid: i64, headers: &HeaderMap) -> HttpResponse { pub fn send(mut data: JsonValue, uid: i64, headers: &HeaderMap) -> HttpResponse {
//println!("{}", json::stringify(data.clone())); //println!("{}", json::stringify(data.clone()));
set_time(&mut data, uid); data["server_time"] = set_time(data["server_time"].as_u64().unwrap_or(0), uid, true).into();
if !data["data"]["item_list"].is_empty() || !data["data"]["updated_value_list"]["item_list"].is_empty() { if !data["data"]["item_list"].is_empty() || !data["data"]["updated_value_list"]["item_list"].is_empty() {
items::check_for_region(&mut data, headers); items::check_for_region(&mut data, headers);

View file

@ -24,6 +24,18 @@ pub fn remove_gems(user: &mut JsonValue, amount: i64) {
user["gem"]["total"] = (free + paid).into(); user["gem"]["total"] = (free + paid).into();
} }
pub fn remove_paid_gems(user: &mut JsonValue, amount: i64) {
let free = user["gem"]["free"].as_i64().unwrap();
let mut paid = user["gem"]["charge"].as_i64().unwrap();
paid -= amount;
if paid < 0 {
paid = 0;
}
user["gem"]["charge"] = paid.into();
user["gem"]["total"] = (free + paid).into();
}
pub fn get_region(headers: &HeaderMap) -> bool { pub fn get_region(headers: &HeaderMap) -> bool {
let blank_header = HeaderValue::from_static(""); let blank_header = HeaderValue::from_static("");
let asset_version = headers.get("aoharu-asset-version").unwrap_or(&blank_header).to_str().unwrap_or(""); let asset_version = headers.get("aoharu-asset-version").unwrap_or(&blank_header).to_str().unwrap_or("");
@ -110,6 +122,8 @@ pub fn use_item(item: &JsonValue, multiplier: i64, user: &mut JsonValue) {
// Is anything really ever free...? // Is anything really ever free...?
} else if item["consumeType"] == 1 { } else if item["consumeType"] == 1 {
remove_gems(user, item["amount"].as_i64().unwrap()); remove_gems(user, item["amount"].as_i64().unwrap());
} else if item["consumeType"] == 2 {
remove_paid_gems(user, item["amount"].as_i64().unwrap());
} else if item["consumeType"] == 4 { } else if item["consumeType"] == 4 {
use_itemm(item["value"].as_i64().unwrap(), item["amount"].as_i64().unwrap() * multiplier, user); use_itemm(item["value"].as_i64().unwrap(), item["amount"].as_i64().unwrap() * multiplier, user);
} else { } else {
@ -230,7 +244,7 @@ fn random_number(lowest: usize, highest: usize) -> usize {
} }
assert!(lowest < highest); assert!(lowest < highest);
rand::thread_rng().gen_range(lowest..highest + 1) rand::rng().random_range(lowest..highest + 1)
} }
pub fn gift_item_basic(id: i32, value: i64, ty_pe: i32, reason: &str, user: &mut JsonValue) -> JsonValue { pub fn gift_item_basic(id: i32, value: i64, ty_pe: i32, reason: &str, user: &mut JsonValue) -> JsonValue {

View file

@ -34,7 +34,7 @@ fn random_number(lowest: usize, highest: usize) -> usize {
} }
assert!(lowest < highest); assert!(lowest < highest);
rand::thread_rng().gen_range(lowest..highest + 1) rand::rng().random_range(lowest..highest + 1)
} }
pub fn guest(req: HttpRequest, body: String) -> Option<JsonValue> { pub fn guest(req: HttpRequest, body: String) -> Option<JsonValue> {

View file

@ -46,7 +46,7 @@ fn get_random_card(item: &JsonValue, rv: &mut JsonValue, rng: &mut rand::rngs::T
let mut random_id = 0; let mut random_id = 0;
while random_id == 0 { while random_id == 0 {
let card = rng.gen_range(1..databases::POOL[lottery_id.to_string()][databases::POOL[lottery_id.to_string()].len() - 1].as_i64().unwrap() + 1); let card = rng.random_range(1..databases::POOL[lottery_id.to_string()][databases::POOL[lottery_id.to_string()].len() - 1].as_i64().unwrap() + 1);
if get_card_master_id(lottery_id.to_string(), card.to_string()).is_some() { if get_card_master_id(lottery_id.to_string(), card.to_string()).is_some() {
random_id = card; random_id = card;
break; break;
@ -63,7 +63,7 @@ fn get_random_card(item: &JsonValue, rv: &mut JsonValue, rng: &mut rand::rngs::T
fn get_random_cards(id: i64, mut count: usize) -> JsonValue { fn get_random_cards(id: i64, mut count: usize) -> JsonValue {
let total_ratio: i64 = databases::RARITY[id.to_string()].members().map(|item| if item["ensured"].as_i32().unwrap() == 1 { 0 } else { item["ratio"].as_i64().unwrap() }).sum(); let total_ratio: i64 = databases::RARITY[id.to_string()].members().map(|item| if item["ensured"].as_i32().unwrap() == 1 { 0 } else { item["ratio"].as_i64().unwrap() }).sum();
let mut rng = rand::thread_rng(); let mut rng = rand::rng();
let mut rv = array![]; let mut rv = array![];
let mut promised = false; let mut promised = false;
@ -80,7 +80,7 @@ fn get_random_cards(id: i64, mut count: usize) -> JsonValue {
count -= 1; count -= 1;
} }
for _i in 0..count { for _i in 0..count {
let random_number: i64 = rng.gen_range(1..total_ratio + 1); let random_number: i64 = rng.random_range(1..total_ratio + 1);
let mut cumulative_ratio = 0; let mut cumulative_ratio = 0;
for item in databases::RARITY[id.to_string()].members() { for item in databases::RARITY[id.to_string()].members() {
cumulative_ratio += item["ratio"].as_i64().unwrap(); cumulative_ratio += item["ratio"].as_i64().unwrap();
@ -118,12 +118,7 @@ pub fn lottery_post(req: HttpRequest, body: String) -> Option<JsonValue> {
consumeType: price["consumeType"].clone() consumeType: price["consumeType"].clone()
}, 1, &mut user); }, 1, &mut user);
let mut count = price["count"].as_usize().unwrap(); let count = price["count"].as_usize().unwrap();
// This is a temporary easter egg, not meant to stay
if lottery_id == 4110044 {
count = 30;
}
let cardstogive = get_random_cards(lottery_id, count); let cardstogive = get_random_cards(lottery_id, count);

View file

@ -94,8 +94,8 @@ fn get_key(auth_key: &str) -> i64 {
} }
fn generate_uid() -> i64 { fn generate_uid() -> i64 {
let mut rng = rand::thread_rng(); let mut rng = rand::rng();
let random_number = rng.gen_range(100_000_000_000_000..=999_999_999_999_999); let random_number = rng.random_range(100_000_000_000_000..=999_999_999_999_999);
//the chances of this...? //the chances of this...?
if acc_exists(random_number) { if acc_exists(random_number) {
return generate_uid(); return generate_uid();
@ -301,7 +301,7 @@ pub fn save_acc_sif(auth_key: &str, data: JsonValue) {
} }
fn generate_salt() -> Vec<u8> { fn generate_salt() -> Vec<u8> {
let mut rng = rand::thread_rng(); let mut rng = rand::rng();
let mut bytes = vec![0u8; 16]; let mut bytes = vec![0u8; 16];
rng.fill(&mut bytes[..]); rng.fill(&mut bytes[..]);
bytes bytes