From 99f6183f48ccd39e05abc4b075aaeb6d221cdac3 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:15:25 -0500 Subject: [PATCH] More user interaction stuff --- src/router/friend.rs | 22 +++++++++- src/router/global.rs | 2 +- src/router/live.rs | 86 +++++++++++++++++++++++++++++++++++--- src/router/userdata/mod.rs | 35 ++++++++++++---- 4 files changed, 129 insertions(+), 16 deletions(-) diff --git a/src/router/friend.rs b/src/router/friend.rs index 1619774..51c8ca6 100644 --- a/src/router/friend.rs +++ b/src/router/friend.rs @@ -47,13 +47,31 @@ pub fn ids(req: HttpRequest) -> HttpResponse { global::send(resp) } -pub fn recommend(_req: HttpRequest, _body: String) -> HttpResponse { +pub fn recommend(req: HttpRequest, body: String) -> HttpResponse { + let key = global::get_login(req.headers(), &body); + let user_id = userdata::get_acc(&key)["user"]["id"].as_i64().unwrap(); + let friends = userdata::get_acc_friends(&key); + + let mut random = userdata::get_random_uids(20); + let index = random.members().into_iter().position(|r| *r.to_string() == user_id.to_string()); + if !index.is_none() { + random.array_remove(index.unwrap()); + } + + let mut rv = array![]; + for (_i, uid) in random.members().enumerate() { + let user = global::get_user(uid.as_i64().unwrap(), &friends); + if user["user"]["friend_request_disabled"].to_string() == "1" || user.is_empty() { + continue; + } + rv.push(user).unwrap(); + } let resp = object!{ "code": 0, "server_time": global::timestamp(), "data": { - friend_list: [] + friend_list: rv } }; global::send(resp) diff --git a/src/router/global.rs b/src/router/global.rs index aff2e3e..543f05f 100644 --- a/src/router/global.rs +++ b/src/router/global.rs @@ -235,7 +235,7 @@ pub fn get_user(id: i64, friends: &JsonValue) -> JsonValue { guest_smile_card: get_card(user["user"]["guest_smile_master_card_id"].as_i64().unwrap_or(0), &user), guest_cool_card: get_card(user["user"]["guest_cool_master_card_id"].as_i64().unwrap_or(0), &user), guest_pure_card: get_card(user["user"]["guest_pure_master_card_id"].as_i64().unwrap_or(0), &user), - master_title_ids: user["master_title_ids"].clone() + master_title_ids: user["user"]["master_title_ids"].clone() }; rv["user"].remove("sif_user_id"); rv["user"].remove("ss_user_id"); diff --git a/src/router/live.rs b/src/router/live.rs index 1a881d9..d41b094 100644 --- a/src/router/live.rs +++ b/src/router/live.rs @@ -4,6 +4,7 @@ use crate::router::global; use crate::encryption; use actix_web::{HttpResponse, HttpRequest}; use crate::router::userdata; +use rand::Rng; pub fn retire(_req: HttpRequest, _body: String) -> HttpResponse { let resp = object!{ @@ -18,15 +19,27 @@ pub fn retire(_req: HttpRequest, _body: String) -> HttpResponse { global::send(resp) } +fn random_number(lowest: usize, highest: usize) -> usize { + if lowest == highest { + return lowest; + } + assert!(lowest < highest); + + rand::thread_rng().gen_range(lowest..highest + 1) +} + pub fn guest(req: HttpRequest, body: String) -> HttpResponse { let key = global::get_login(req.headers(), &body); + let user_id = userdata::get_acc(&key)["user"]["id"].as_i64().unwrap(); let friends = userdata::get_acc_friends(&key); + let user = userdata::get_acc(&key); let mut guest_list = array![]; - if friends["friend_user_id_list"].len() == 0 { + if user["tutorial_step"].as_i32().unwrap() != 130 { guest_list.push(object!{ "user": { - "name": "A Nice Guest","comment":"Enjoy your live show!", + "name": "A VERY Nice Guest", + "comment": "Enjoy your first live show!", "exp": 900, "main_deck_slot": 1, "favorite_master_card_id": 10010013, @@ -70,11 +83,72 @@ pub fn guest(req: HttpRequest, body: String) -> HttpResponse { "status":0 }).unwrap(); } else { - for (i, uid) in friends["friend_user_id_list"].members().enumerate() { - if i > 10 { - break; + if friends["friend_user_id_list"].len() != 0 { + guest_list.push(global::get_user(friends["friend_user_id_list"][random_number(0, friends["friend_user_id_list"].len() - 1)].as_i64().unwrap(), &friends)).unwrap(); + } + let expected: usize = 5; + if guest_list.len() < expected { + let mut random = userdata::get_random_uids((expected-guest_list.len()) as i32); + let index = random.members().into_iter().position(|r| *r.to_string() == user_id.to_string()); + if !index.is_none() { + random.array_remove(index.unwrap()); } - guest_list.push(global::get_user(uid.as_i64().unwrap(), &friends)).unwrap(); + + for (_i, uid) in random.members().enumerate() { + let guest = global::get_user(uid.as_i64().unwrap(), &friends); + if guest["user"]["friend_request_disabled"].to_string() == "1" || guest.is_empty() { + continue; + } + guest_list.push(guest).unwrap(); + } + } + if guest_list.len() == 0 { + guest_list.push(object!{ + "user": { + "name": "A sad Guest", + "comment": "Cant believe you're the only person on this server!", + "exp": 900, + "main_deck_slot": 1, + "favorite_master_card_id": 10010013, + "favorite_card_evolve": 0, + "guest_smile_master_card_id": 10010013, + "guest_cool_master_card_id": 10010013, + "guest_pure_master_card_id": 10010013, + "friend_request_disabled": 1, + "master_title_ids": [3000001,0], + "profile_settings": [1,2,3,4,5,6,7], + "last_login_time": 1708699449 + }, + "favorite_card": { + "id": 0, + "master_card_id": 10010013, + "exp": 1025, + "skill_exp": 0, + "evolve": [] + }, + "guest_smile_card": { + "id": 0, + "master_card_id": 10010013, + "exp": 1025, + "skill_exp": 0, + "evolve": [] + }, + "guest_cool_card": { + "id": 0, + "master_card_id": 10010013, + "exp": 1025, + "skill_exp": 0, + "evolve": [] + }, + "guest_pure_card": { + "id": 0, + "master_card_id": 10010013, + "exp": 1025, + "skill_exp": 0, + "evolve": [] + }, + "status":0 + }).unwrap(); } } diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index a626ec6..72d09a5 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -1,7 +1,7 @@ use rusqlite::{Connection, params, ToSql}; use std::sync::{Mutex, MutexGuard}; use lazy_static::lazy_static; -use json::{JsonValue, object}; +use json::{JsonValue, array, object}; use crate::router::global; use rand::Rng; @@ -55,7 +55,7 @@ fn lock_and_select(command: &str, args: &[&dyn ToSql]) -> Result Result { loop { match ENGINE.lock() { Ok(mut result) => { @@ -63,11 +63,22 @@ fn create_store_v2(table: &str) { init(&mut result); } let conn = result.as_ref().unwrap(); - conn.execute( - table, - (), - ).unwrap(); - return; + let mut stmt = conn.prepare(command)?; + let map = stmt.query_map(args, |row| { + match row.get::(0) { + Ok(val) => Ok(val.to_string()), + Err(_) => row.get(0) + } + })?; + let mut rv = array![]; + for val in map { + let res = val?; + match res.clone().parse::() { + Ok(v) => rv.push(v).unwrap(), + Err(_) => rv.push(res).unwrap() + }; + } + return Ok(rv); } Err(_) => { std::thread::sleep(std::time::Duration::from_millis(15)); @@ -75,6 +86,9 @@ fn create_store_v2(table: &str) { } } } +fn create_store_v2(table: &str) { + lock_and_exec(table, params!()); +} fn create_token_store() { create_store_v2("CREATE TABLE IF NOT EXISTS tokens ( @@ -377,3 +391,10 @@ pub fn friend_remove(uid: i64, requestor: i64) { } lock_and_exec("UPDATE users SET friends=?1 WHERE user_id=?2", params!(json::stringify(friends), uid)); } + +pub fn get_random_uids(count: i32) -> JsonValue { + if count <= 0 { + return array![]; + } + lock_and_select_all(&format!("SELECT user_id FROM uids ORDER BY RANDOM() LIMIT {}", count), params!()).unwrap() +}