Properly implement exchange endpoint

This commit is contained in:
Ethan O'Brien
2026-07-04 10:25:53 -05:00
parent 82e8606ea1
commit cdcc3811c2
4 changed files with 106 additions and 27 deletions

View File

@@ -1,4 +1,4 @@
use jzon::{object, array};
use jzon::{object, array, JsonValue};
use actix_web::{web, HttpRequest, Responder};
use crate::router::{global, userdata, items, databases};
@@ -9,7 +9,29 @@ pub fn routes(cfg: &mut web::ServiceConfig) {
}
async fn exchange(req: HttpRequest) -> impl Responder {
global::api(&req, Some(object!{"exchange_list":[]}))
let key = global::get_login(req.headers(), "");
let exchange = userdata::get_acc_exchange(&key);
global::api(&req, Some(object!{
"exchange_list": exchange
}))
}
fn exchange_updated_value_list(is_card: bool, granted_id: i64, consumed_id: i64, user: &mut JsonValue) -> JsonValue {
if consumed_id != 0 && !user["item_list"].members().any(|it| it["master_item_id"].as_i64() == Some(consumed_id)) {
items::give_item(consumed_id, 0, user);
}
let mut item_list = array![];
for it in user["item_list"].members() {
let mid = it["master_item_id"].as_i64();
if mid == Some(granted_id) || mid == Some(consumed_id) {
item_list.push(it.clone()).unwrap();
}
}
let mut rv = object!{ item_list: item_list };
if is_card {
rv["card_list"] = user["card_list"].clone();
}
rv
}
async fn exchange_post(req: HttpRequest, body: String) -> impl Responder {
@@ -18,28 +40,53 @@ async fn exchange_post(req: HttpRequest, body: String) -> impl Responder {
let mut user = userdata::get_acc(&key);
let mut missions = userdata::get_acc_missions(&key);
let mut chats = userdata::get_acc_chats(&key);
let mut exchanges = userdata::get_acc_exchange(&key);
let mut cleared_missions = array![];
let item = &databases::EXCHANGE_LIST[body["master_exchange_item_id"].to_string()];
items::use_item(item, body["count"].as_i64().unwrap(), &mut user);
let exchange_id = body["master_exchange_item_id"].as_i64().unwrap();
let count = body["count"].as_i64().unwrap();
let item = databases::EXCHANGE_LIST[exchange_id.to_string()].clone();
let consumed_id = item["value"].as_i64().unwrap_or(0);
items::use_item(&item, count, &mut user);
let mut gift = databases::EXCHANGE_REWARD[item["masterExchangeItemRewardId"].to_string()].clone();
gift["reward_type"] = gift["type"].clone();
gift["amount"] = (gift["amount"].as_i64().unwrap() * body["count"].as_i64().unwrap()).into();
gift["amount"] = (gift["amount"].as_i64().unwrap() * count).into();
let granted_id = gift["value"].as_i64().unwrap_or(0);
let is_card = gift["type"] == 2;
items::give_gift(&gift, &mut user, &mut missions, &mut cleared_missions, &mut chats);
let mut total = count;
let mut found = false;
for entry in exchanges.members_mut() {
if entry["master_exchange_item_id"].as_i64() == Some(exchange_id) {
total = entry["count"].as_i64().unwrap() + count;
entry["count"] = total.into();
found = true;
break;
}
}
if !found {
exchanges.push(object!{
master_exchange_item_id: exchange_id,
count: total
}).unwrap();
}
let updated_value_list = exchange_updated_value_list(is_card, granted_id, consumed_id, &mut user);
userdata::save_acc(&key, user.clone());
userdata::save_acc_missions(&key, missions);
userdata::save_acc_chats(&key, chats);
userdata::save_acc_exchange(&key, exchanges);
global::api(&req, Some(object!{
"exchange": body,
"updated_value_list": {
"card_list": user["card_list"].clone(),
"item_list": user["item_list"].clone(),
"point_list": user["point_list"].clone()
"clear_mission_ids": cleared_missions,
"exchange": {
master_exchange_item_id: exchange_id,
count: total
},
"clear_mission_ids": cleared_missions
"updated_value_list": updated_value_list
}))
}