diff --git a/src/main.rs b/src/main.rs index 4e0d7be..3c31fc1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -221,6 +221,9 @@ async fn card_evolve(req: HttpRequest, body: String) -> HttpResponse { router::c #[post("/api/webui/login")] async fn webui_login(req: HttpRequest, body: String) -> HttpResponse { router::webui::login(req, body) } +#[post("/api/webui/startLoginbonus")] +async fn webui_start_loginbonus(req: HttpRequest, body: String) -> HttpResponse { router::webui::start_loginbonus(req, body) } + #[get("/api/webui/userInfo")] async fn webui_user(req: HttpRequest) -> HttpResponse { router::webui::user(req) } @@ -269,6 +272,7 @@ async fn main() -> std::io::Result<()> { }) .service(css) .service(js) + .service(webui_start_loginbonus) .service(webui_import) .service(webui_logout) .service(webui_user) diff --git a/src/router/global.rs b/src/router/global.rs index c3bffb5..f5e4b79 100644 --- a/src/router/global.rs +++ b/src/router/global.rs @@ -167,10 +167,13 @@ pub fn give_points(master_item_id: i64, amount: i64, user: &mut JsonValue) -> bo false } -pub fn start_login_bonus(id: i64, bonus: &mut JsonValue) { +pub fn start_login_bonus(id: i64, bonus: &mut JsonValue) -> bool { + if crate::router::login::get_login_bonus_info(id).is_empty() { + return false; + } for (_j, dataa) in bonus["bonus_list"].members().enumerate() { if dataa["master_login_bonus_id"].as_i64().unwrap() == id { - return; + return false; } } bonus["bonus_list"].push(object!{ @@ -178,6 +181,7 @@ pub fn start_login_bonus(id: i64, bonus: &mut JsonValue) { day_counts: [], event_bonus_list: [] }).unwrap(); + true } pub fn give_primogems(amount: i64, user: &mut JsonValue) -> bool { diff --git a/src/router/login.rs b/src/router/login.rs index aaf41ee..1044b09 100644 --- a/src/router/login.rs +++ b/src/router/login.rs @@ -49,7 +49,7 @@ lazy_static! { }; } -fn get_login_bonus_info(id: i64) -> JsonValue { +pub fn get_login_bonus_info(id: i64) -> JsonValue { LOTTERY_INFO[id.to_string()].clone() } diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index acf2490..efc1c16 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -478,7 +478,7 @@ pub fn webui_import_user(user: JsonValue) -> Result { }) } -pub fn webui_get_user(token: &str) -> Option { +fn webui_login_token(token: &str) -> Option { 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; @@ -494,17 +494,46 @@ pub fn webui_get_user(token: &str) -> Option { 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; } + Some(login_token) +} + +pub fn webui_get_user(token: &str) -> Option { + let login_token = webui_login_token(token)?; + return Some(object!{ userdata: get_acc(&login_token), loginbonus: get_acc_loginbonus(&login_token) }); } +pub fn webui_start_loginbonus(bonus_id: i64, token: &str) -> JsonValue { + let login_token = webui_login_token(token); + if login_token.is_none() { + return object!{ + result: "ERR", + message: "Failed to validate token" + }; + } + let login_token = login_token.unwrap(); + let mut bonuses = get_acc_loginbonus(&login_token); + if !global::start_login_bonus(bonus_id, &mut bonuses) { + return object!{ + result: "ERR", + message: "Login bonus ID is either already going or does not exist" + }; + } + save_acc_loginbonus(&login_token, bonuses); + + return object!{ + result: "OK", + id: bonus_id + }; +} + pub fn webui_logout(token: &str) { lock_and_exec("DELETE FROM webui WHERE token=?1", params!(token)); } diff --git a/src/router/webui.rs b/src/router/webui.rs index 2b2c9bb..51a79b9 100644 --- a/src/router/webui.rs +++ b/src/router/webui.rs @@ -83,6 +83,19 @@ pub fn user(req: HttpRequest) -> HttpResponse { .body(json::stringify(resp)) } +pub fn start_loginbonus(req: HttpRequest, body: String) -> HttpResponse { + let token = get_login_token(&req); + if token.is_none() { + return error("Not logged in"); + } + let body = json::parse(&body).unwrap(); + let resp = userdata::webui_start_loginbonus(body["bonus_id"].as_i64().unwrap(), &token.unwrap()); + + HttpResponse::Ok() + .insert_header(ContentType::json()) + .body(json::stringify(resp)) +} + pub fn logout(req: HttpRequest) -> HttpResponse { let token = get_login_token(&req); if !token.is_none() { diff --git a/webui/src/home/Home.css b/webui/src/home/Home.css index 2c3554b..87822a0 100644 --- a/webui/src/home/Home.css +++ b/webui/src/home/Home.css @@ -29,3 +29,8 @@ body { #logout:hover { background-color: red; } + +#error p { + color: orange; + grid-template-columns: auto auto auto; +} diff --git a/webui/src/home/Home.jsx b/webui/src/home/Home.jsx index 85e02da..92aa23d 100644 --- a/webui/src/home/Home.jsx +++ b/webui/src/home/Home.jsx @@ -1,6 +1,65 @@ import { useState, useParams, useEffect } from 'react' import './Home.css' import Request from '../Request.jsx' +let bonusItems = []; + +function Bonus() { + const [inputValue, setInputValue] = useState(''); + const error = useState(""); + + let itemz = []; + bonusItems.forEach((e) => { + itemz.push(e.master_login_bonus_id); + }) + + const [submittedItems, setSubmittedItems] = useState(itemz); + + const handleSubmit = async (event) => { + event.preventDefault(); + let input = parseInt(inputValue.trim()); + if (isNaN(input) || submittedItems.includes(input)) return; + let resp = await Request("/api/webui/startLoginbonus", { + bonus_id: input + }); + if (resp.result !== "OK") { + error[1](resp.message); + return; + } + + setSubmittedItems([...submittedItems, resp.id]); + setInputValue(''); + }; + + const handleRemoveItem = (index) => { + const updatedItems = [...submittedItems]; + updatedItems.splice(index, 1); + setSubmittedItems(updatedItems); + }; +// + return ( +
+

Current login bonus list

+
{ error[0] ?

Error: { error[0] }

:

}
+
    + {submittedItems.map((item, index) => ( +
  • + {item} +
  • + ))} +
+
+ setInputValue(event.target.value)} + placeholder="Enter login bonus ID" + /> + +
+

You can find a list of available login bonus IDs here. You should input the id field

+
+ ); +} function Home() { const [user, userdata] = useState(); @@ -18,12 +77,23 @@ function Home() { return; } let user = resp.data.userdata; - //let login = resp.data.loginbonus; + bonusItems = resp.data.loginbonus.bonus_list; + /* + bonusItems = [{"master_login_bonus_id":1,"day_counts":[1,2],"event_bonus_list":[]}]; + let user = { + user: { + id: 1, + rank: 3, + exp: 10, + last_login_time: 5 + } + }*/ userdata(

User id: { user.user.id }

Rank: { user.user.rank } ({ user.user.exp } exp)

Last Login: { (new Date(user.user.last_login_time * 1000)).toString() }

+
); })();