Implement base star event handler

This commit is contained in:
Ethan O'Brien 2024-05-04 17:31:10 -05:00
parent ea84ffdc65
commit 05aecd02c6
7 changed files with 240 additions and 31 deletions

View file

@ -64,6 +64,11 @@ async fn request(req: HttpRequest, body: String) -> HttpResponse {
"/api/live/mission" => router::live::mission(req, body), "/api/live/mission" => router::live::mission(req, body),
"/api/live/ranking" => router::clear_rate::ranking(req, body), "/api/live/ranking" => router::clear_rate::ranking(req, body),
"/api/event" => router::event::event(req, body), "/api/event" => router::event::event(req, body),
"/api/event/star_event" => router::event::star_event(req, body),
"/api/event_star_live/change_target_music" => router::event::change_target_music(req, body),
"/api/event_star_live/start" => router::live::event_start(req, body),
"/api/event_star_live/end" => router::live::event_end(req, body),
// "/api/event_star_live/skip" => router::live::event_skip(req, body),
"/api/live/start" => router::live::start(req, body), "/api/live/start" => router::live::start(req, body),
"/api/live/end" => router::live::end(req, body), "/api/live/end" => router::live::end(req, body),
"/api/live/skip" => router::live::skip(req, body), "/api/live/skip" => router::live::skip(req, body),
@ -74,6 +79,7 @@ async fn request(req: HttpRequest, body: String) -> HttpResponse {
"/api/lottery/get_tutorial" => router::lottery::tutorial(req, body), "/api/lottery/get_tutorial" => router::lottery::tutorial(req, body),
"/api/lottery" => router::lottery::lottery_post(req, body), "/api/lottery" => router::lottery::lottery_post(req, body),
"/api/login_bonus" => router::login::bonus(req, body), "/api/login_bonus" => router::login::bonus(req, body),
"/api/login_bonus/event" => router::login::bonus_event(req, body),
"/api/notice/reward" => router::notice::reward_post(req, body), "/api/notice/reward" => router::notice::reward_post(req, body),
"/api/user/getmigrationcode" => router::user::get_migration_code(req, body), "/api/user/getmigrationcode" => router::user::get_migration_code(req, body),
"/api/user/registerpassword" => router::user::register_password(req, body), "/api/user/registerpassword" => router::user::register_password(req, body),

View file

@ -138,7 +138,7 @@ lazy_static! {
info info
}; };
} }
fn get_live_id(id: i64) -> i64 { pub fn get_live_id(id: i64) -> i64 {
LIVE_LIST[id.to_string()].as_i64().unwrap() LIVE_LIST[id.to_string()].as_i64().unwrap()
} }

View file

@ -1,14 +1,79 @@
use json::object; use json::{JsonValue, object};
use actix_web::{HttpResponse, HttpRequest}; use actix_web::{HttpResponse, HttpRequest};
use crate::router::global; use crate::router::{userdata, global};
pub fn event(_req: HttpRequest, _body: String) -> HttpResponse { pub fn event(req: HttpRequest, body: String) -> HttpResponse {
let key = global::get_login(req.headers(), &body);
let mut event = userdata::get_acc_event(&key);
init_star_event(&mut event);
userdata::save_acc_event(&key, event.clone());
let resp = object!{ let resp = object!{
"code": 0, "code": 0,
"server_time": global::timestamp(), "server_time": global::timestamp(),
"data":{"point_ranking":{"point":0},"score_ranking":[],"member_ranking":[],"lottery_box":[],"mission_list":[],"policy_agreement":0,"incentive_lottery":0,"star_event":{"star_level":0,"last_event_star_level":0,"star_music_list":[],"is_star_event_update":1,"music_change_count":0,"star_event_bonus_daily_count":0,"star_event_bonus_count":0,"star_event_play_times_bonus_count":0,"star_assist_bonus":1}} "data": event["event_data"].clone()
};
global::send(resp)
}
fn switch_music(event: &mut JsonValue, music_id: i32, target_score: i64, index: i32) {
if index <= 4 {
//todo
}
let to_push = object!{
master_music_id: music_id,
position: event["event_data"]["star_event"]["star_music_list"].len(),
is_cleared: 0,
goal_score: target_score
};
event["event_data"]["star_event"]["star_music_list"].push(to_push).unwrap();
}
fn init_star_event(event: &mut JsonValue) {
if event["event_data"]["star_event"]["star_level"].as_i32().unwrap() != 0 {
return;
}
event["event_data"]["star_event"]["star_level"] = 1.into();
switch_music(event, 1014, 53407, 5);
switch_music(event, 2101, 34557, 5);
switch_music(event, 2120, 38222, 5);
switch_music(event, 2151, 46076, 5);
switch_music(event, 2160, 21991, 5);
}
pub fn star_event(req: HttpRequest, body: String) -> HttpResponse {
let key = global::get_login(req.headers(), &body);
let mut event = userdata::get_acc_event(&key);
init_star_event(&mut event);
userdata::save_acc_event(&key, event.clone());
let resp = object!{
"code": 0,
"server_time": global::timestamp(),
"data": {
star_event: event["event_data"]["star_event"].clone(),
gift_list: [],
reward_list: []
}
};
global::send(resp)
}
//todo - randomize
pub fn change_target_music(req: HttpRequest, body: String) -> HttpResponse {
let key = global::get_login(req.headers(), &body);
let event = userdata::get_acc_event(&key);
//event["star_event"]["music_change_count"] += 1;
let resp = object!{
"code": 0,
"server_time": global::timestamp(),
"data": event["event_data"]["star_event"].clone()
}; };
global::send(resp) global::send(resp)
} }

View file

@ -188,6 +188,15 @@ pub fn start(_req: HttpRequest, _body: String) -> HttpResponse {
global::send(resp) global::send(resp)
} }
pub fn event_start(_req: HttpRequest, _body: String) -> HttpResponse {
let resp = object!{
"code": 0,
"server_time": global::timestamp(),
"data": []
};
global::send(resp)
}
pub fn continuee(req: HttpRequest, body: String) -> HttpResponse { pub fn continuee(req: HttpRequest, body: String) -> HttpResponse {
let key = global::get_login(req.headers(), &body); let key = global::get_login(req.headers(), &body);
let mut user = userdata::get_acc(&key); let mut user = userdata::get_acc(&key);
@ -374,9 +383,9 @@ fn give_mission_rewards(user: &mut JsonValue, missions: &JsonValue, multiplier:
rv rv
} }
pub fn end(req: HttpRequest, body: String) -> HttpResponse { fn live_end(req: &HttpRequest, body: &String) -> 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 user2 = userdata::get_acc_home(&key); let user2 = userdata::get_acc_home(&key);
let mut user = userdata::get_acc(&key); let mut user = userdata::get_acc(&key);
let live = update_live_data(&mut user, &body, true); let live = update_live_data(&mut user, &body, true);
@ -400,7 +409,7 @@ pub fn end(req: HttpRequest, body: String) -> HttpResponse {
userdata::save_acc(&key, user.clone()); userdata::save_acc(&key, user.clone());
let resp = object!{ object!{
"code": 0, "code": 0,
"server_time": global::timestamp(), "server_time": global::timestamp(),
"data": { "data": {
@ -421,7 +430,60 @@ pub fn end(req: HttpRequest, body: String) -> HttpResponse {
"event_member": [], "event_member": [],
"event_ranking_data": [] "event_ranking_data": []
} }
}
}
pub fn end(req: HttpRequest, body: String) -> HttpResponse {
let resp = live_end(&req, &body);
global::send(resp)
}
pub fn event_end(req: HttpRequest, body: String) -> HttpResponse {
let mut resp = live_end(&req, &body);
let key = global::get_login(req.headers(), &body);
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
let mut event = userdata::get_acc_event(&key);
let live_id = crate::router::clear_rate::get_live_id(body["master_live_id"].as_i64().unwrap());
let mut all_clear = 1;
for (_i, data) in event["event_data"]["star_event"]["star_music_list"].members_mut().enumerate() {
if data["master_music_id"].as_i64().unwrap() == live_id {
data["is_cleared"] = 1.into();
}
if !data["is_cleared"].as_i32().unwrap() == 0 {
all_clear = 0;
}
}
resp["event_point_list"] = array![];
resp["event_ranking_data"] = object!{
"event_point_rank": event["event_data"]["point_ranking"]["point"].clone(),
"next_reward_rank_point": 0,
"event_score_rank": 0,
"next_reward_rank_score": 0,
"next_reward_rank_level": 0
}; };
resp["star_level"] = event["event_data"]["star_event"]["star_level"].clone();
resp["music_data"] = event["event_data"]["star_event"]["star_music_list"].clone();
resp["is_star_all_clear"] = all_clear.into();
resp["star_event_bonus_list"] = object!{
"star_event_bonus": 0,
"star_event_bonus_score": 0,
"star_play_times_bonus": 0,
"star_play_times_bonus_score": 0,
"card_bonus": 0,
"card_bonus_score": 0
};
resp["total_score"] = body["live_score"]["score"].clone();
resp["star_event"] = object!{
"star_event_bonus_daily_count": event["event_data"]["point_ranking"]["star_event_bonus_daily_count"].clone(),
"star_event_bonus_count": event["event_data"]["point_ranking"]["star_event_bonus_count"].clone(),
"star_event_play_times_bonus_count": event["event_data"]["point_ranking"]["star_event_play_times_bonus_count"].clone()
};
userdata::save_acc_event(&key, event);
global::send(resp) global::send(resp)
} }

View file

@ -51,17 +51,8 @@ pub fn get_login_bonus_info(id: i64) -> JsonValue {
LOTTERY_INFO[id.to_string()].clone() LOTTERY_INFO[id.to_string()].clone()
} }
pub fn bonus(req: HttpRequest, body: String) -> HttpResponse { fn do_bonus(user_home: &mut JsonValue, bonuses: &mut JsonValue) -> JsonValue {
let key = global::get_login(req.headers(), &body);
let user = userdata::get_acc(&key);
let mut user_home = userdata::get_acc_home(&key);
let last_reset = global::timestamp_since_midnight(); let last_reset = global::timestamp_since_midnight();
let mut bonuses = userdata::get_acc_loginbonus(&key);
if bonuses["bonus_list"].is_empty() {
global::start_login_bonus(1, &mut bonuses);
}
let to_send; let to_send;
if bonuses["last_rewarded"].as_u64().unwrap() < last_reset { if bonuses["last_rewarded"].as_u64().unwrap() < last_reset {
let mut to_rm = array![]; let mut to_rm = array![];
@ -77,19 +68,58 @@ pub fn bonus(req: HttpRequest, body: String) -> HttpResponse {
} }
let item_id = crate::router::user::get_info_from_id(info["days"][current]["masterLoginBonusRewardId"].as_i64().unwrap()); let item_id = crate::router::user::get_info_from_id(info["days"][current]["masterLoginBonusRewardId"].as_i64().unwrap());
items::gift_item(&item_id, &format!("Login bonus day {}!", current+1), &mut user_home); items::gift_item(&item_id, &format!("Event login bonus day {}!", current+1), user_home);
data["day_counts"].push(current + 1).unwrap(); data["day_counts"].push(current + 1).unwrap();
} }
for (i, data) in to_rm.members().enumerate() { for (i, data) in to_rm.members().enumerate() {
bonuses["bonus_list"].array_remove(data.as_usize().unwrap() - i); bonuses["bonus_list"].array_remove(data.as_usize().unwrap() - i);
} }
bonuses["last_rewarded"] = last_reset.into(); bonuses["last_rewarded"] = last_reset.into();
userdata::save_acc_loginbonus(&key, bonuses.clone());
to_send = bonuses["bonus_list"].clone(); to_send = bonuses["bonus_list"].clone();
} else { } else {
to_send = array![]; to_send = array![];
} }
to_send
}
pub fn bonus(req: HttpRequest, body: String) -> HttpResponse {
let key = global::get_login(req.headers(), &body);
let user = userdata::get_acc(&key);
let mut user_home = userdata::get_acc_home(&key);
let mut bonuses = userdata::get_acc_loginbonus(&key);
if bonuses["bonus_list"].is_empty() {
global::start_login_bonus(1, &mut bonuses);
}
let to_send = do_bonus(&mut user_home, &mut bonuses);
userdata::save_acc_loginbonus(&key, bonuses.clone());
userdata::save_acc_home(&key, user_home);
let resp = object!{
"code": 0,
"server_time": global::timestamp(),
"data": {
"login_bonus_list": to_send,
"start_time": bonuses["start_time"].clone(),
"clear_mission_ids": user["clear_mission_ids"].clone()
}
};
global::send(resp)
}
pub fn bonus_event(req: HttpRequest, body: String) -> HttpResponse {
let key = global::get_login(req.headers(), &body);
let user = userdata::get_acc(&key);
let mut user_home = userdata::get_acc_home(&key);
let mut bonuses = userdata::get_acc_eventlogin(&key);
if bonuses["bonus_list"].is_empty() {
global::start_login_bonus(20039, &mut bonuses);
}
let to_send = do_bonus(&mut user_home, &mut bonuses);
userdata::save_acc_eventlogin(&key, bonuses.clone());
userdata::save_acc_home(&key, user_home); userdata::save_acc_home(&key, user_home);
let resp = object!{ let resp = object!{

View file

@ -33,7 +33,10 @@ fn setup_tables(conn: &SQLite) {
loginbonus TEXT NOT NULL, loginbonus TEXT NOT NULL,
sifcards TEXT NOT NULL, sifcards TEXT NOT NULL,
friends TEXT NOT NULL, friends TEXT NOT NULL,
friend_request_disabled INT NOT NULL friend_request_disabled INT NOT NULL,
event TEXT NOT NULL,
eventloginbonus TEXT NOT NULL,
server_data TEXT NOT NULL
)"); )");
} }
@ -75,7 +78,7 @@ fn create_acc(uid: i64, login: &str) {
new_user["user"]["id"] = uid.into(); new_user["user"]["id"] = uid.into();
new_user["stamina"]["last_updated_time"] = global::timestamp().into(); new_user["stamina"]["last_updated_time"] = global::timestamp().into();
DATABASE.lock_and_exec("INSERT INTO users (user_id, userdata, userhome, missions, loginbonus, sifcards, friends, friend_request_disabled) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)", params!( DATABASE.lock_and_exec("INSERT INTO users (user_id, userdata, userhome, missions, loginbonus, sifcards, friends, friend_request_disabled, event, eventloginbonus, server_data) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)", params!(
uid, uid,
json::stringify(new_user), json::stringify(new_user),
include_str!("new_user_home.json"), include_str!("new_user_home.json"),
@ -83,7 +86,10 @@ fn create_acc(uid: i64, login: &str) {
format!(r#"{{"last_rewarded": 0, "bonus_list": [], "start_time": {}}}"#, global::timestamp()), format!(r#"{{"last_rewarded": 0, "bonus_list": [], "start_time": {}}}"#, global::timestamp()),
"[]", "[]",
r#"{"friend_user_id_list":[],"request_user_id_list":[],"pending_user_id_list":[]}"#, r#"{"friend_user_id_list":[],"request_user_id_list":[],"pending_user_id_list":[]}"#,
0 0,
include_str!("new_user_event.json"),
format!(r#"{{"last_rewarded": 0, "bonus_list": [], "start_time": {}}}"#, global::timestamp()),
"{}"
)); ));
DATABASE.lock_and_exec("DELETE FROM tokens WHERE token=?1", params!(login)); DATABASE.lock_and_exec("DELETE FROM tokens WHERE token=?1", params!(login));
@ -175,6 +181,16 @@ pub fn get_acc_sif(auth_key: &str) -> JsonValue {
pub fn get_acc_friends(auth_key: &str) -> JsonValue { pub fn get_acc_friends(auth_key: &str) -> JsonValue {
get_data(auth_key, "friends") get_data(auth_key, "friends")
} }
pub fn get_acc_event(auth_key: &str) -> JsonValue {
let event = get_data(auth_key, "event");
if event.is_empty() {
return json::parse(include_str!("new_user_event.json")).unwrap();
}
event
}
pub fn get_acc_eventlogin(auth_key: &str) -> JsonValue {
get_data(auth_key, "eventloginbonus")
}
pub fn save_data(auth_key: &str, row: &str, data: JsonValue) { pub fn save_data(auth_key: &str, row: &str, data: JsonValue) {
let key = get_key(&auth_key); let key = get_key(&auth_key);
@ -198,6 +214,12 @@ pub fn save_acc_loginbonus(auth_key: &str, data: JsonValue) {
pub fn save_acc_friends(auth_key: &str, data: JsonValue) { pub fn save_acc_friends(auth_key: &str, data: JsonValue) {
save_data(auth_key, "friends", data); save_data(auth_key, "friends", data);
} }
pub fn save_acc_event(auth_key: &str, data: JsonValue) {
save_data(auth_key, "event", data);
}
pub fn save_acc_eventlogin(auth_key: &str, data: JsonValue) {
save_data(auth_key, "eventloginbonus", data);
}
fn generate_salt() -> Vec<u8> { fn generate_salt() -> Vec<u8> {
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();

View file

@ -0,0 +1,24 @@
{
"event_data": {
"point_ranking": {
"point": 0
},
"score_ranking": [],
"member_ranking": [],
"lottery_box": [],
"mission_list": [],
"policy_agreement": 0,
"incentive_lottery": 0,
"star_event": {
"star_level": 0,
"last_event_star_level": 0,
"star_music_list": [],
"music_change_count": 0,
"star_event_bonus_daily_count": 0,
"star_event_bonus_count": 0,
"star_event_play_times_bonus_count": 0,
"star_assist_bonus": 1
}
},
"server_event_data": {}
}