From e67879bb25c8abe84a4475a55af3121cf8b4d7cb Mon Sep 17 00:00:00 2001 From: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com> Date: Thu, 9 May 2024 13:57:05 -0500 Subject: [PATCH] Implement base chat system --- src/router/chat.rs | 77 +++++++++++++++++++++++++++++--------- src/router/userdata/mod.rs | 12 +++++- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/src/router/chat.rs b/src/router/chat.rs index 416546d..e5e084c 100644 --- a/src/router/chat.rs +++ b/src/router/chat.rs @@ -1,31 +1,61 @@ -use json::object; +use json::{object, array, JsonValue}; use actix_web::{HttpResponse, HttpRequest}; +use lazy_static::lazy_static; use crate::router::{global, items, userdata}; +use crate::encryption; + +lazy_static! { + static ref CHATS: JsonValue = { + let mut chats = object!{}; + let items = json::parse(include_str!("json/chat_room.json")).unwrap(); + for (_i, data) in items.members().enumerate() { + if chats[data["masterChatId"].to_string()].is_null() { + chats[data["masterChatId"].to_string()] = object!{}; + } + chats[data["masterChatId"].to_string()][data["roomId"].to_string()] = data.clone(); + } + chats + }; + static ref CHAPTERS: JsonValue = { + let mut chats = object!{}; + let items = json::parse(include_str!("json/chat_chapter.json")).unwrap(); + for (_i, data) in items.members().enumerate() { + if chats[data["masterChatId"].to_string()].is_null() { + chats[data["masterChatId"].to_string()] = object!{}; + } + chats[data["masterChatId"].to_string()][data["roomId"].to_string()] = data.clone(); + } + chats + }; +} + + +pub fn add_chat(id: i64, num: i64, chats: &mut JsonValue) { + chats.push(object!{ + chat_id: id, + room_id: num, + chapter_id: CHAPTERS[id.to_string()][num.to_string()]["id"].clone(), + is_read: 0, + created_at: global::timestamp() + }).unwrap(); +} pub fn home(req: HttpRequest, body: String) -> HttpResponse { let key = global::get_login(req.headers(), &body); - let user = userdata::get_acc(&key); + let chats = userdata::get_acc_chats(&key); - let id = user["user"]["favorite_master_card_id"].as_i64().unwrap() / 10000; - - let chapter_id = (id * 100000) + 101; - let room_id = (id * 1000) + 1; + let mut rooms = array![]; + for (_i, data) in chats.members().enumerate() { + rooms.push(CHATS[data["chat_id"].to_string()][data["room_id"].to_string()]["id"].clone()).unwrap(); + } let resp = object!{ "code": 0, "server_time": global::timestamp(), "data": { - "progress_list": [ - { - "chat_id": id, - "room_id": 1, - "chapter_id": chapter_id, - "is_read": 0, - "created_at": global::timestamp() - } - ], - "master_chat_room_ids": [room_id], + "progress_list": chats, + "master_chat_room_ids": rooms, "master_chat_stamp_ids": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,11001003,22001001,33001001,44001002], "master_chat_attachment_ids": [] } @@ -45,10 +75,21 @@ pub fn start(req: HttpRequest, _body: String) -> HttpResponse { pub fn end(req: HttpRequest, body: String) -> HttpResponse { let key = global::get_login(req.headers(), &body); + let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap(); let mut missions = userdata::get_acc_missions(&key); - items::advance_mission(1169001, 1, 50, &mut missions); + let mut chats = userdata::get_acc_chats(&key); - userdata::save_acc_missions(&key, missions); + for (_i, data) in chats.members_mut().enumerate() { + if body["chapter_id"].as_i64().unwrap() == data["chapter_id"].as_i64().unwrap() { + if data["is_read"].as_i32().unwrap() != 1 { + items::advance_mission(1169001, 1, 50, &mut missions); + } + data["is_read"] = 1.into(); + userdata::save_acc_missions(&key, missions); + userdata::save_acc_chats(&key, chats); + break; + } + } let resp = object!{ "code": 0, diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index 79c82b9..4c17bc9 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -33,6 +33,7 @@ fn setup_tables(conn: &SQLite) { loginbonus TEXT NOT NULL, sifcards TEXT NOT NULL, friends TEXT NOT NULL, + chats TEXT NOT NULL, friend_request_disabled INT NOT NULL, event TEXT NOT NULL, eventloginbonus TEXT NOT NULL, @@ -78,7 +79,7 @@ fn add_user_to_database(uid: i64, user: JsonValue, user_home: JsonValue, user_mi let missions = json::stringify(user_missions.clone()); let cards = json::stringify(sif_cards.clone()); - 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!( + DATABASE.lock_and_exec("INSERT INTO users (user_id, userdata, userhome, missions, loginbonus, sifcards, friends, friend_request_disabled, event, eventloginbonus, server_data, chats) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)", params!( uid, json::stringify(user.clone()), if user_home.is_empty() {include_str!("new_user_home.json")} else {&home}, @@ -89,7 +90,8 @@ fn add_user_to_database(uid: i64, user: JsonValue, user_home: JsonValue, user_mi user["user"]["friend_request_disabled"].as_i32().unwrap(), include_str!("new_user_event.json"), format!(r#"{{"last_rewarded": 0, "bonus_list": [], "start_time": {}}}"#, global::timestamp()), - format!(r#"{{"server_time_set":{},"server_time":1709272800}}"#, global::timestamp()) + format!(r#"{{"server_time_set":{},"server_time":1709272800}}"#, global::timestamp()), + "[]" )); } @@ -189,6 +191,9 @@ pub fn get_acc_friends(auth_key: &str) -> JsonValue { pub fn get_server_data(auth_key: &str) -> JsonValue { get_data(auth_key, "server_data") } +pub fn get_acc_chats(auth_key: &str) -> JsonValue { + get_data(auth_key, "chats") +} pub fn get_acc_event(auth_key: &str) -> JsonValue { let event = get_data(auth_key, "event"); if event.is_empty() { @@ -231,6 +236,9 @@ pub fn save_acc_eventlogin(auth_key: &str, data: JsonValue) { pub fn save_server_data(auth_key: &str, data: JsonValue) { save_data(auth_key, "server_data", data); } +pub fn save_acc_chats(auth_key: &str, data: JsonValue) { + save_data(auth_key, "chats", data); +} fn generate_salt() -> Vec { let mut rng = rand::thread_rng();