More user interaction stuff

This commit is contained in:
Ethan O'Brien 2024-04-16 14:15:25 -05:00
parent c09823c17c
commit 99f6183f48
4 changed files with 129 additions and 16 deletions

View file

@ -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)

View file

@ -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");

View file

@ -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();
}
}

View file

@ -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<String, rusqlit
}
}
}
fn create_store_v2(table: &str) {
fn lock_and_select_all(command: &str, args: &[&dyn ToSql]) -> Result<JsonValue, rusqlite::Error> {
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::<usize, i64>(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::<i64>() {
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()
}