2024-04-09 00:18:24 +00:00
use rusqlite ::{ Connection , params , ToSql } ;
2024-02-23 19:28:44 +00:00
use std ::sync ::{ Mutex , MutexGuard } ;
use lazy_static ::lazy_static ;
2024-04-16 19:15:25 +00:00
use json ::{ JsonValue , array , object } ;
2024-02-28 19:12:19 +00:00
use crate ::router ::global ;
2024-04-25 00:05:20 +00:00
use uuid ::Uuid ;
2024-04-09 00:18:24 +00:00
use rand ::Rng ;
2024-02-23 19:28:44 +00:00
lazy_static! {
pub static ref ENGINE : Mutex < Option < Connection > > = Mutex ::new ( None ) ;
}
fn init ( engine : & mut MutexGuard < '_ , Option < Connection > > ) {
let conn = Connection ::open ( " userdata.db " ) . unwrap ( ) ;
conn . execute ( " PRAGMA foreign_keys = ON; " , ( ) ) . unwrap ( ) ;
engine . replace ( conn ) ;
}
2024-04-09 00:18:24 +00:00
fn lock_and_exec ( command : & str , args : & [ & dyn ToSql ] ) {
loop {
match ENGINE . lock ( ) {
Ok ( mut result ) = > {
if result . is_none ( ) {
init ( & mut result ) ;
}
let conn = result . as_ref ( ) . unwrap ( ) ;
conn . execute ( command , args ) . unwrap ( ) ;
return ;
}
Err ( _ ) = > {
std ::thread ::sleep ( std ::time ::Duration ::from_millis ( 15 ) ) ;
}
2024-02-27 02:38:08 +00:00
}
}
}
2024-04-13 23:16:09 +00:00
fn lock_and_select ( command : & str , args : & [ & dyn ToSql ] ) -> Result < String , rusqlite ::Error > {
2024-04-09 00:18:24 +00:00
loop {
match ENGINE . lock ( ) {
Ok ( mut result ) = > {
if result . is_none ( ) {
init ( & mut result ) ;
}
let conn = result . as_ref ( ) . unwrap ( ) ;
let mut stmt = conn . prepare ( command ) ? ;
2024-04-13 23:16:09 +00:00
return stmt . query_row ( args , | row | {
match row . get ::< usize , i64 > ( 0 ) {
Ok ( val ) = > Ok ( val . to_string ( ) ) ,
Err ( _ ) = > row . get ( 0 )
}
} ) ;
2024-04-09 00:18:24 +00:00
}
Err ( _ ) = > {
std ::thread ::sleep ( std ::time ::Duration ::from_millis ( 15 ) ) ;
}
2024-02-23 19:28:44 +00:00
}
}
2024-03-30 16:11:43 +00:00
}
2024-04-16 19:15:25 +00:00
fn lock_and_select_all ( command : & str , args : & [ & dyn ToSql ] ) -> Result < JsonValue , rusqlite ::Error > {
2024-04-09 00:18:24 +00:00
loop {
match ENGINE . lock ( ) {
Ok ( mut result ) = > {
if result . is_none ( ) {
init ( & mut result ) ;
}
let conn = result . as_ref ( ) . unwrap ( ) ;
2024-04-16 19:15:25 +00:00
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 ) ;
2024-04-09 00:18:24 +00:00
}
Err ( _ ) = > {
std ::thread ::sleep ( std ::time ::Duration ::from_millis ( 15 ) ) ;
}
2024-03-30 16:11:43 +00:00
}
}
2024-02-23 19:28:44 +00:00
}
2024-04-16 19:15:25 +00:00
fn create_store_v2 ( table : & str ) {
lock_and_exec ( table , params! ( ) ) ;
}
2024-04-09 00:18:24 +00:00
fn create_token_store ( ) {
2024-04-13 23:16:09 +00:00
create_store_v2 ( " CREATE TABLE IF NOT EXISTS tokens (
user_id BIGINT NOT NULL PRIMARY KEY ,
token TEXT NOT NULL
) " );
2024-02-23 19:28:44 +00:00
}
2024-04-09 00:18:24 +00:00
fn create_uid_store ( ) {
2024-04-13 23:16:09 +00:00
create_store_v2 ( " CREATE TABLE IF NOT EXISTS uids (
user_id BIGINT NOT NULL PRIMARY KEY
) " );
2024-02-23 19:28:44 +00:00
}
2024-04-09 00:18:24 +00:00
fn create_migration_store ( ) {
2024-04-13 23:16:09 +00:00
create_store_v2 ( " CREATE TABLE IF NOT EXISTS migration (
token TEXT NOT NULL PRIMARY KEY ,
password TEXT NOT NULL
) " );
}
fn create_users_store ( ) {
create_store_v2 ( " CREATE TABLE IF NOT EXISTS users (
user_id BIGINT NOT NULL PRIMARY KEY ,
userdata TEXT NOT NULL ,
userhome TEXT NOT NULL ,
missions TEXT NOT NULL ,
loginbonus TEXT NOT NULL ,
2024-04-15 21:17:44 +00:00
sifcards TEXT NOT NULL ,
friends TEXT NOT NULL
2024-04-13 23:16:09 +00:00
) " );
2024-02-23 19:28:44 +00:00
}
2024-04-13 23:16:09 +00:00
fn acc_exists ( uid : i64 ) -> bool {
create_users_store ( ) ;
lock_and_select ( " SELECT user_id FROM users WHERE user_id=?1 " , params! ( uid ) ) . is_ok ( )
2024-04-09 00:18:24 +00:00
}
fn get_key ( auth_key : & str ) -> i64 {
let uid = get_uid ( & auth_key ) ;
let key = if uid = = 0 {
generate_uid ( )
} else {
uid
} ;
if ! acc_exists ( key ) {
create_acc ( key , & auth_key ) ;
}
key
}
2024-04-13 23:16:09 +00:00
fn uid_exists ( uid : i64 ) -> bool {
let data = lock_and_select ( " SELECT user_id FROM uids WHERE user_id=?1 " , params! ( uid ) ) ;
data . is_ok ( )
2024-02-27 02:38:08 +00:00
}
2024-02-23 19:28:44 +00:00
2024-04-09 00:18:24 +00:00
fn generate_uid ( ) -> i64 {
create_uid_store ( ) ;
2024-02-23 19:28:44 +00:00
let mut rng = rand ::thread_rng ( ) ;
let random_number = rng . gen_range ( 100_000_000_000_000 ..= 999_999_999_999_999 ) ;
//the chances of this...?
2024-04-13 23:16:09 +00:00
if uid_exists ( random_number ) {
2024-04-09 00:18:24 +00:00
return generate_uid ( ) ;
2024-02-23 19:28:44 +00:00
}
2024-04-13 23:16:09 +00:00
lock_and_exec ( " INSERT INTO uids (user_id) VALUES (?1) " , params! ( random_number ) ) ;
2024-02-23 19:28:44 +00:00
random_number
}
2024-04-09 00:18:24 +00:00
fn create_acc ( uid : i64 , login : & str ) {
2024-04-13 23:16:09 +00:00
create_users_store ( ) ;
2024-02-23 19:28:44 +00:00
2024-04-09 00:18:24 +00:00
let mut new_user = json ::parse ( include_str! ( " new_user.json " ) ) . unwrap ( ) ;
new_user [ " user " ] [ " id " ] = uid . into ( ) ;
new_user [ " stamina " ] [ " last_updated_time " ] = global ::timestamp ( ) . into ( ) ;
2024-04-15 21:17:44 +00:00
lock_and_exec ( " INSERT INTO users (user_id, userdata, userhome, missions, loginbonus, sifcards, friends) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7) " , params! (
2024-04-13 23:16:09 +00:00
uid ,
json ::stringify ( new_user ) ,
include_str! ( " new_user_home.json " ) ,
include_str! ( " chat_missions.json " ) ,
format! ( r # "{{"last_rewarded": 0, "bonus_list": [], "start_time": {}}}"# , global ::timestamp ( ) ) ,
2024-04-15 21:17:44 +00:00
" [] " ,
r # "{"friend_user_id_list":[],"request_user_id_list":[],"pending_user_id_list":[]}"#
2024-04-13 23:16:09 +00:00
) ) ;
2024-04-09 00:18:24 +00:00
create_token_store ( ) ;
2024-04-13 23:16:09 +00:00
lock_and_exec ( " DELETE FROM tokens WHERE token=?1 " , params! ( login ) ) ;
lock_and_exec ( " INSERT INTO tokens (user_id, token) VALUES (?1, ?2) " , params! ( uid , login ) ) ;
2024-02-27 02:38:08 +00:00
}
2024-04-13 23:16:09 +00:00
fn get_uid ( token : & str ) -> i64 {
2024-04-09 00:18:24 +00:00
create_token_store ( ) ;
2024-04-13 23:16:09 +00:00
let data = lock_and_select ( " SELECT user_id FROM tokens WHERE token = ?1; " , params! ( token ) ) ;
if ! data . is_ok ( ) {
2024-02-27 02:38:08 +00:00
return 0 ;
}
2024-04-13 23:16:09 +00:00
let data = data . unwrap ( ) ;
data . parse ::< i64 > ( ) . unwrap_or ( 0 )
2024-03-30 16:11:43 +00:00
}
2024-04-09 00:18:24 +00:00
fn get_login_token ( uid : i64 ) -> String {
create_token_store ( ) ;
2024-04-13 23:16:09 +00:00
let data = lock_and_select ( " SELECT token FROM tokens WHERE user_id=?1 " , params! ( uid ) ) ;
if ! data . is_ok ( ) {
return String ::new ( ) ;
2024-03-30 16:11:43 +00:00
}
2024-04-13 23:16:09 +00:00
data . unwrap ( )
2024-02-23 19:28:44 +00:00
}
2024-04-09 00:18:24 +00:00
fn get_data ( auth_key : & str , row : & str ) -> JsonValue {
let key = get_key ( & auth_key ) ;
2024-04-13 23:16:09 +00:00
let result = lock_and_select ( & format! ( " SELECT {} FROM users WHERE user_id=?1 " , row ) , params! ( key ) ) ;
2024-04-09 00:18:24 +00:00
json ::parse ( & result . unwrap ( ) ) . unwrap ( )
2024-02-23 19:28:44 +00:00
}
2024-04-09 00:18:24 +00:00
pub fn get_acc ( auth_key : & str ) -> JsonValue {
let mut user = get_data ( auth_key , " userdata " ) ;
2024-04-09 21:46:49 +00:00
user [ " gem " ] [ " total " ] = ( user [ " gem " ] [ " charge " ] . as_i64 ( ) . unwrap ( ) + user [ " gem " ] [ " free " ] . as_i64 ( ) . unwrap ( ) ) . into ( ) ;
2024-04-14 00:12:06 +00:00
let max = global ::get_user_rank_data ( user [ " user " ] [ " exp " ] . as_i64 ( ) . unwrap ( ) ) [ " maxLp " ] . as_u64 ( ) . unwrap ( ) ;
2024-04-13 23:56:27 +00:00
let speed = 285 ; //4 mins, 45 sec
2024-04-02 19:36:09 +00:00
let since_last = global ::timestamp ( ) - user [ " stamina " ] [ " last_updated_time " ] . as_u64 ( ) . unwrap ( ) ;
2024-04-13 23:56:27 +00:00
let diff = since_last % speed ;
let restored = ( since_last - diff ) / speed ;
user [ " stamina " ] [ " last_updated_time " ] = ( global ::timestamp ( ) - diff ) . into ( ) ;
2024-04-14 00:12:06 +00:00
let mut stamina = user [ " stamina " ] [ " stamina " ] . as_u64 ( ) . unwrap ( ) ;
2024-04-13 23:56:27 +00:00
if stamina < max {
stamina + = restored ;
if stamina > max {
stamina = max ;
}
2024-04-02 19:36:09 +00:00
}
user [ " stamina " ] [ " stamina " ] = stamina . into ( ) ;
return user ;
2024-02-26 07:10:34 +00:00
}
2024-04-09 00:18:24 +00:00
pub fn get_acc_home ( auth_key : & str ) -> JsonValue {
2024-04-15 21:40:31 +00:00
let mut user = get_data ( auth_key , " userhome " ) ;
user [ " home " ] [ " pending_friend_count " ] = get_acc_friends ( auth_key ) [ " pending_user_id_list " ] . len ( ) . into ( ) ;
return user ;
2024-02-26 07:10:34 +00:00
}
2024-04-09 00:18:24 +00:00
pub fn get_acc_missions ( auth_key : & str ) -> JsonValue {
get_data ( auth_key , " missions " )
2024-04-08 21:14:34 +00:00
}
2024-04-09 21:46:49 +00:00
pub fn get_acc_loginbonus ( auth_key : & str ) -> JsonValue {
get_data ( auth_key , " loginbonus " )
}
2024-04-11 18:58:41 +00:00
pub fn get_acc_sif ( auth_key : & str ) -> JsonValue {
get_data ( auth_key , " sifcards " )
}
2024-04-15 21:17:44 +00:00
pub fn get_acc_friends ( auth_key : & str ) -> JsonValue {
get_data ( auth_key , " friends " )
}
2024-02-26 07:10:34 +00:00
2024-04-09 00:18:24 +00:00
pub fn save_data ( auth_key : & str , row : & str , data : JsonValue ) {
let key = get_key ( & auth_key ) ;
2024-04-13 23:16:09 +00:00
lock_and_exec ( & format! ( " UPDATE users SET {} =?1 WHERE user_id=?2 " , row ) , params! ( json ::stringify ( data ) , key ) ) ;
2024-02-23 19:28:44 +00:00
}
2024-03-30 16:11:43 +00:00
2024-04-09 00:18:24 +00:00
pub fn save_acc ( auth_key : & str , data : JsonValue ) {
save_data ( auth_key , " userdata " , data ) ;
2024-03-30 16:11:43 +00:00
}
2024-04-09 00:18:24 +00:00
pub fn save_acc_home ( auth_key : & str , data : JsonValue ) {
save_data ( auth_key , " userhome " , data ) ;
2024-04-02 15:48:15 +00:00
}
2024-04-09 00:18:24 +00:00
pub fn save_acc_missions ( auth_key : & str , data : JsonValue ) {
save_data ( auth_key , " missions " , data ) ;
2024-04-08 21:14:34 +00:00
}
2024-04-09 21:46:49 +00:00
pub fn save_acc_loginbonus ( auth_key : & str , data : JsonValue ) {
save_data ( auth_key , " loginbonus " , data ) ;
}
2024-04-15 21:17:44 +00:00
pub fn save_acc_friends ( auth_key : & str , data : JsonValue ) {
save_data ( auth_key , " friends " , data ) ;
}
2024-03-30 16:11:43 +00:00
pub fn get_acc_transfer ( uid : i64 , token : & str , password : & str ) -> JsonValue {
2024-04-09 00:18:24 +00:00
create_migration_store ( ) ;
2024-04-13 23:16:09 +00:00
let data = lock_and_select ( " SELECT password FROM migration WHERE token=?1 " , params! ( token ) ) ;
if ! data . is_ok ( ) {
2024-04-09 00:18:24 +00:00
return object! { success : false } ;
}
2024-04-13 23:16:09 +00:00
if data . unwrap ( ) . to_string ( ) = = password . to_string ( ) {
2024-04-09 00:18:24 +00:00
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return object! { success : false } ;
2024-03-30 16:11:43 +00:00
}
2024-04-09 00:18:24 +00:00
return object! { success : true , login_token : login_token } ;
2024-03-30 16:11:43 +00:00
}
2024-04-13 23:16:09 +00:00
object! { success : false }
2024-03-30 16:11:43 +00:00
}
pub fn save_acc_transfer ( token : & str , password : & str ) {
2024-04-09 00:18:24 +00:00
create_migration_store ( ) ;
2024-04-13 23:16:09 +00:00
lock_and_exec ( " DELETE FROM migration WHERE token=?1 " , params! ( token ) ) ;
lock_and_exec ( " INSERT INTO migration (token, password) VALUES (?1, ?2) " , params! ( token , password ) ) ;
2024-03-30 16:11:43 +00:00
}
pub fn get_name_and_rank ( uid : i64 ) -> JsonValue {
2024-04-09 00:18:24 +00:00
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return object! {
user_name : " " ,
user_rank : 1
2024-03-30 16:11:43 +00:00
}
}
2024-04-09 00:18:24 +00:00
let uid = get_uid ( & login_token ) ;
if uid = = 0 | | ! acc_exists ( uid ) {
return object! {
user_name : " " ,
user_rank : 1
}
}
2024-04-13 23:16:09 +00:00
let result = lock_and_select ( " SELECT userdata FROM users WHERE user_id=?1 " , params! ( uid ) ) ;
2024-04-09 00:18:24 +00:00
let data = json ::parse ( & result . unwrap ( ) ) . unwrap ( ) ;
return object! {
user_name : data [ " user " ] [ " name " ] . clone ( ) ,
2024-04-14 00:12:06 +00:00
user_rank : global ::get_user_rank_data ( data [ " user " ] [ " exp " ] . as_i64 ( ) . unwrap ( ) ) [ " rank " ] . clone ( ) //todo
2024-04-09 00:18:24 +00:00
}
2024-03-30 16:11:43 +00:00
}
2024-04-08 20:57:57 +00:00
pub fn get_acc_from_uid ( uid : i64 ) -> JsonValue {
2024-04-09 00:18:24 +00:00
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return object! {
2024-04-15 21:17:44 +00:00
error : true
2024-04-08 20:57:57 +00:00
}
}
2024-04-09 00:18:24 +00:00
let uid = get_uid ( & login_token ) ;
if uid = = 0 | | ! acc_exists ( uid ) {
return object! { " error " : true }
}
2024-04-13 23:16:09 +00:00
let result = lock_and_select ( " SELECT userdata FROM users WHERE user_id=?1 " , params! ( uid ) ) ;
2024-04-09 00:18:24 +00:00
json ::parse ( & result . unwrap ( ) ) . unwrap ( )
2024-04-08 20:57:57 +00:00
}
2024-04-15 21:17:44 +00:00
pub fn friend_request ( uid : i64 , requestor : i64 ) {
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return ;
}
let uid = get_uid ( & login_token ) ;
let friends = lock_and_select ( " SELECT friends FROM users WHERE user_id=?1 " , params! ( uid ) ) ;
let mut friends = json ::parse ( & friends . unwrap ( ) ) . unwrap ( ) ;
if ! friends [ " pending_user_id_list " ] . contains ( requestor ) {
friends [ " pending_user_id_list " ] . push ( requestor ) . unwrap ( ) ;
lock_and_exec ( " UPDATE users SET friends=?1 WHERE user_id=?2 " , params! ( json ::stringify ( friends ) , uid ) ) ;
}
}
2024-04-15 21:40:31 +00:00
pub fn friend_request_approve ( uid : i64 , requestor : i64 , accepted : bool , key : & str ) {
2024-04-15 21:17:44 +00:00
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return ;
}
let uid = get_uid ( & login_token ) ;
let friends = lock_and_select ( " SELECT friends FROM users WHERE user_id=?1 " , params! ( uid ) ) ;
let mut friends = json ::parse ( & friends . unwrap ( ) ) . unwrap ( ) ;
2024-04-15 21:40:31 +00:00
let index = friends [ key ] . members ( ) . into_iter ( ) . position ( | r | * r . to_string ( ) = = requestor . to_string ( ) ) ;
if ! index . is_none ( ) {
friends [ key ] . array_remove ( index . unwrap ( ) ) ;
}
let index = friends [ " request_user_id_list " ] . members ( ) . into_iter ( ) . position ( | r | * r . to_string ( ) = = requestor . to_string ( ) ) ;
2024-04-15 21:17:44 +00:00
if ! index . is_none ( ) {
2024-04-15 21:40:31 +00:00
friends [ " request_user_id_list " ] . array_remove ( index . unwrap ( ) ) ;
2024-04-15 21:17:44 +00:00
}
if accepted & & ! friends [ " friend_user_id_list " ] . contains ( requestor ) {
friends [ " friend_user_id_list " ] . push ( requestor ) . unwrap ( ) ;
}
lock_and_exec ( " UPDATE users SET friends=?1 WHERE user_id=?2 " , params! ( json ::stringify ( friends ) , uid ) ) ;
}
pub fn friend_request_disabled ( uid : i64 ) -> bool {
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return true ;
}
let uid = get_uid ( & login_token ) ;
let user = lock_and_select ( " SELECT userdata FROM users WHERE user_id=?1 " , params! ( uid ) ) ;
let user = json ::parse ( & user . unwrap ( ) ) . unwrap ( ) ;
user [ " user " ] [ " friend_request_disabled " ] . to_string ( ) = = " 1 "
}
2024-04-15 22:14:26 +00:00
pub fn friend_remove ( uid : i64 , requestor : i64 ) {
let login_token = get_login_token ( uid ) ;
if login_token = = String ::new ( ) {
return ;
}
let uid = get_uid ( & login_token ) ;
let friends = lock_and_select ( " SELECT friends FROM users WHERE user_id=?1 " , params! ( uid ) ) ;
let mut friends = json ::parse ( & friends . unwrap ( ) ) . unwrap ( ) ;
let index = friends [ " friend_user_id_list " ] . members ( ) . into_iter ( ) . position ( | r | * r . to_string ( ) = = requestor . to_string ( ) ) ;
if ! index . is_none ( ) {
friends [ " friend_user_id_list " ] . array_remove ( index . unwrap ( ) ) ;
}
lock_and_exec ( " UPDATE users SET friends=?1 WHERE user_id=?2 " , params! ( json ::stringify ( friends ) , uid ) ) ;
}
2024-04-16 19:15:25 +00:00
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 ( )
}
2024-04-25 00:05:20 +00:00
fn create_webui_store ( ) {
create_store_v2 ( " CREATE TABLE IF NOT EXISTS webui (
user_id BIGINT NOT NULL PRIMARY KEY ,
token TEXT NOT NULL ,
last_login BIGINT NOT NULL
) " );
}
fn create_webui_token ( ) -> String {
let token = format! ( " {} " , Uuid ::new_v4 ( ) ) ;
if lock_and_select ( " SELECT user_id FROM webui WHERE token=?1 " , params! ( token ) ) . is_ok ( ) {
return create_webui_token ( ) ;
}
token
}
pub fn webui_login ( uid : i64 , password : & str ) -> Result < String , String > {
create_webui_store ( ) ;
create_migration_store ( ) ;
let pass = lock_and_select ( " SELECT password FROM migration WHERE token=?1 " , params! ( crate ::router ::user ::uid_to_code ( uid . to_string ( ) ) ) ) . unwrap_or ( String ::new ( ) ) ;
if pass ! = password . to_string ( ) | | password = = " " {
if acc_exists ( uid ) {
return Err ( String ::from ( " Migration token not set. Set token in game settings. " ) ) ;
}
return Err ( String ::from ( " User/password don't match " ) ) ;
}
let new_token = create_webui_token ( ) ;
lock_and_exec ( " DELETE FROM webui WHERE user_id=?1 " , params! ( uid ) ) ;
lock_and_exec ( " INSERT INTO webui (user_id, token, last_login) VALUES (?1, ?2, ?3) " , params! ( uid , new_token , global ::timestamp ( ) ) ) ;
Ok ( new_token )
}
2024-04-25 17:54:20 +00:00
pub fn webui_import_user ( user : JsonValue ) -> Result < JsonValue , String > {
let mut user = user ;
create_webui_store ( ) ;
create_migration_store ( ) ;
create_token_store ( ) ;
let uid = user [ " userdata " ] [ " user " ] [ " id " ] . as_i64 ( ) . unwrap ( ) ;
if acc_exists ( uid ) {
return Err ( String ::from ( " User already exists " ) ) ;
}
if user [ " missions " ] . is_empty ( ) {
user [ " missions " ] = json ::parse ( include_str! ( " chat_missions.json " ) ) . unwrap ( ) ;
}
if user [ " sif_cards " ] . is_empty ( ) {
user [ " sif_cards " ] = array! [ ] ;
}
lock_and_exec ( " INSERT INTO users (user_id, userdata, userhome, missions, loginbonus, sifcards, friends) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7) " , params! (
uid ,
json ::stringify ( user [ " userdata " ] . clone ( ) ) ,
json ::stringify ( user [ " home " ] . clone ( ) ) ,
json ::stringify ( user [ " missions " ] . clone ( ) ) ,
format! ( r # "{{"last_rewarded": 0, "bonus_list": [], "start_time": {}}}"# , global ::timestamp ( ) ) ,
json ::stringify ( user [ " sif_cards " ] . clone ( ) ) ,
r # "{"friend_user_id_list":[],"request_user_id_list":[],"pending_user_id_list":[]}"#
) ) ;
let token ;
if ! user [ " jp " ] . is_empty ( ) {
token = crate ::router ::gree ::import_user ( uid ) ;
} else {
token = format! ( " {} " , Uuid ::new_v4 ( ) ) ;
}
lock_and_exec ( " INSERT INTO tokens (user_id, token) VALUES (?1, ?2) " , params! ( uid , token ) ) ;
let mig = crate ::router ::user ::uid_to_code ( uid . to_string ( ) ) ;
save_acc_transfer ( & mig , & user [ " password " ] . to_string ( ) ) ;
Ok ( object! {
uid : uid ,
migration_token : mig
} )
}
2024-04-25 00:05:20 +00:00
pub fn webui_get_user ( token : & str ) -> Option < JsonValue > {
let uid = lock_and_select ( " SELECT user_id FROM webui WHERE token=?1 " , params! ( token ) ) . unwrap_or ( String ::new ( ) ) ;
if uid = = String ::new ( ) | | token = = " " {
return None ;
}
let uid = uid . parse ::< i64 > ( ) . unwrap_or ( 0 ) ;
if uid = = 0 {
return None ;
}
let last_login = lock_and_select ( " SELECT last_login FROM webui WHERE user_id=?1 " , params! ( uid ) ) . unwrap_or ( String ::new ( ) ) . parse ::< i64 > ( ) . unwrap_or ( 0 ) ;
let limit = 24 * 60 * 60 ; //1 day
//Expired token
if ( global ::timestamp ( ) as i64 ) > last_login + limit {
lock_and_exec ( " DELETE FROM webui WHERE user_id=?1 " , params! ( uid ) ) ;
return None ;
}
let login_token = lock_and_select ( " SELECT token FROM tokens WHERE user_id=?1 " , params! ( uid ) ) . unwrap_or ( String ::new ( ) ) ;
if login_token = = String ::new ( ) {
return None ;
}
return Some ( object! {
userdata : get_acc ( & login_token ) ,
loginbonus : get_acc_loginbonus ( & login_token )
} ) ;
}
pub fn webui_logout ( token : & str ) {
lock_and_exec ( " DELETE FROM webui WHERE token=?1 " , params! ( token ) ) ;
}