From 55b39597979b89c017bb37beb85122d6336a846e Mon Sep 17 00:00:00 2001 From: red binder Date: Mon, 6 Apr 2026 13:35:55 +0000 Subject: [PATCH] Add NEX results and fix timers --- Cargo.lock | 372 +++++++++++++++++++++++- rnex-core/Cargo.toml | 4 +- rnex-core/src/nex/matchmake.rs | 32 +- rnex-core/src/nex/user.rs | 152 +++++++++- rnex-core/src/rmc/message.rs | 3 +- rnex-core/src/rmc/protocols/ranking.rs | 54 ++-- rnex-core/src/rmc/structures/qbuffer.rs | 3 +- rnex-core/src/rmc/structures/ranking.rs | 18 +- 8 files changed, 586 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b010331..d34993e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -162,6 +162,35 @@ dependencies = [ "inout", ] +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +dependencies = [ + "cookie", + "document-features", + "idna", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -232,12 +261,38 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + [[package]] name = "dotenv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "flate2" version = "1.1.5" @@ -254,6 +309,15 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + [[package]] name = "futures-core" version = "0.3.31" @@ -337,6 +401,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hex" version = "0.4.3" @@ -393,6 +463,118 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "inout" version = "0.1.4" @@ -441,6 +623,18 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + [[package]] name = "lock_api" version = "0.4.13" @@ -605,6 +799,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -828,6 +1031,8 @@ dependencies = [ "paste", "rand 0.8.5", "rc4", + "serde", + "serde_json", "simplelog", "thiserror", "tokio", @@ -935,24 +1140,47 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn 2.0.104", ] +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + [[package]] name = "sha1" version = "0.10.6" @@ -1018,6 +1246,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "subtle" version = "2.6.1" @@ -1046,6 +1280,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -1108,6 +1353,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tokio" version = "1.47.1" @@ -1209,11 +1464,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d39cb1dbab692d82a977c0392ffac19e188bd9186a9f32806f0aaa859d75585a" dependencies = [ "base64", + "cookie_store", "flate2", "log", "percent-encoding", "rustls", "rustls-pki-types", + "serde", + "serde_json", "ureq-proto", "utf-8", "webpki-roots", @@ -1231,12 +1489,29 @@ dependencies = [ "log", ] +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "v-byte-helpers" version = "0.1.1" @@ -1505,6 +1780,35 @@ version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.26" @@ -1525,8 +1829,68 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/rnex-core/Cargo.toml b/rnex-core/Cargo.toml index d44c000..ff2b7b3 100644 --- a/rnex-core/Cargo.toml +++ b/rnex-core/Cargo.toml @@ -25,7 +25,9 @@ paste = "1.0.15" typenum = "1.18.0" json = "0.12.4" anyhow = "1.0.100" -ureq = "3.1.4" +ureq = { version = "3.1.4", features = [ "json" ] } +serde = { version = "1.0.228", features = [ "derive" ] } +serde_json = "1.0.149" [dev-dependencies] # criterion = "0.7.0" diff --git a/rnex-core/src/nex/matchmake.rs b/rnex-core/src/nex/matchmake.rs index 0a155fa..032fbad 100644 --- a/rnex-core/src/nex/matchmake.rs +++ b/rnex-core/src/nex/matchmake.rs @@ -247,27 +247,29 @@ impl ExtendedMatchmakeSession { param_3: self.connected_players.len() as _, }) .await; - } + } } for old_conns in &old_particip { let Some(old_conns) = old_conns.upgrade() else { continue; }; - - let older_pid = old_conns.pid; - - initiating_user - .remote - .process_notification_event(NotificationEvent { - pid_source: initiating_pid, - notif_type: 3001, - param_1: self.session.gathering.self_gid as PID, - param_2: older_pid, - str_param: join_msg.clone(), - param_3: self.connected_players.len() as _, - }) - .await; + if old_conns.pid != self.session.gathering.host_pid{ + continue; + } + for new_conn_pid in conns.iter().filter_map(Weak::upgrade).map(|c| c.pid){ + old_conns + .remote + .process_notification_event(NotificationEvent { + pid_source: initiating_pid, + notif_type: 3001, + param_1: self.session.gathering.self_gid as PID, + param_2: new_conn_pid, + str_param: join_msg.clone(), + param_3: self.connected_players.len() as _, + }) + .await; + } } } pub fn has_active_players(&self) -> bool { diff --git a/rnex-core/src/nex/user.rs b/rnex-core/src/nex/user.rs index d8450e9..2e63b98 100644 --- a/rnex-core/src/nex/user.rs +++ b/rnex-core/src/nex/user.rs @@ -5,10 +5,14 @@ use crate::nex::remote_console::RemoteConsole; use crate::rmc::protocols::matchmake::{ Matchmake, RawMatchmake, RawMatchmakeInfo, RemoteMatchmake, }; +use serde::{Serialize, Deserialize}; +use std::env; +use std::str::FromStr; use crate::rmc::protocols::nat_traversal::{ NatTraversal, RawNatTraversal, RawNatTraversalInfo, RemoteNatTraversal, RemoteNatTraversalConsole, }; +use rnex_core::kerberos::KerberosDateTime; use rnex_core::PID; use rnex_core::prudp::station_url::StationUrl; use rnex_core::prudp::station_url::UrlOptions::{ @@ -29,12 +33,15 @@ use rnex_core::rmc::structures::matchmake::{ }; use crate::rmc::protocols::notifications::{NotificationEvent, RemoteNotification}; -use log::info; +use log::{info, error}; use macros::rmc_struct; +use rnex_core::rmc::structures::qbuffer::QBuffer; use rnex_core::prudp::socket_addr::PRUDPSockAddr; use rnex_core::rmc::response::ErrorCode::{Core_InvalidArgument, RendezVous_AccountExpired}; use rnex_core::rmc::structures::qresult::QResult; use std::sync::{Arc, Weak}; +use rnex_core::rmc::protocols::ranking::{CompetitionRankingScoreData, CompetitionRankingGetParam, CompetitionRankingScoreInfo}; +use rnex_core::rmc::structures::ranking::{UploadCompetitionData}; use tokio::sync::{Mutex, RwLock}; define_rmc_proto!( @@ -582,4 +589,145 @@ impl NatTraversal for User { } } -impl Ranking for User {} +#[derive(Serialize, Deserialize)] +pub struct CompetitionPostResults { + pub splatfest_id: u32, + pub score: u32, + pub team_id: u8, + pub team_win: u8, + pub user: PID, +} + +// Seperate function because I cannot give a fuck right now +fn fetch_team_votes(fest_id: u32) -> Result, ErrorCode> { + let endpoint_votes = env::var("RNEX_SPLATOON_RESULTS_VOTES_GET").map_err(|_| { + error!("RNEX_SPLATOON_RESULTS_VOTES_GET not set"); + ErrorCode::RendezVous_InvalidConfiguration + })?; + + let url_votes = format!("{}?splatfest_id={}", endpoint_votes, fest_id); + let mut response = ureq::get(&url_votes).call().map_err(|e| { + error!("GET for votes failed: {:?}", e); + ErrorCode::RendezVous_InvalidConfiguration + })?; + + let body = response.body_mut().read_to_string().map_err(|e| { + error!("failed to read votes body: {:?}", e); + ErrorCode::RendezVous_InvalidConfiguration + })?; + + let body = body.trim().trim_start_matches('[').trim_end_matches(']'); + let votes: Result, _> = body + .split(',') + .map(|s| u32::from_str(s.trim())) + .collect(); + + votes.map_err(|e| { + error!("failed to parse votes: {:?}", e); + ErrorCode::RendezVous_InvalidConfiguration + }) +} + +impl Ranking for User { + async fn competition_ranking_get_param( + &self, + param: CompetitionRankingGetParam, + ) -> Result, ErrorCode> { + let fest_id = param.festival_ids.get(0).copied().unwrap_or(0); + + let endpoint_results = env::var("RNEX_SPLATOON_RESULTS_GET") + .map_err(|_| { + error!("RNEX_SPLATOON_RESULTS_GET not set"); + ErrorCode::RendezVous_InvalidConfiguration + })?; + + let url_results = format!("{}?splatfest_id={}", endpoint_results, fest_id); + let response_results = ureq::get(&url_results).call(); + + let results: Vec = match response_results { + Ok(mut res) => res + .body_mut() + .read_json() + .map_err(|e| { + error!("failed to parse JSON: {:?}", e); + ErrorCode::RendezVous_InvalidConfiguration + })?, + Err(e) => { + error!("GET failed: {:?}", e); + return Err(ErrorCode::RendezVous_InvalidConfiguration); + } + }; + + let team_votes = fetch_team_votes(fest_id)?; + + let score_data: Vec = results + .iter() + .map(|r| CompetitionRankingScoreData { + unk: 1, + pid: r.user, + score: r.score, + modified: KerberosDateTime::now(), + unk2: 1, + appdata: QBuffer(vec![]), + }) + .collect(); + + let info = CompetitionRankingScoreInfo { + fest_id, + score_data, + unk: 0, + team_wins: results.iter().map(|r| r.team_win as u32).collect(), + team_votes, + }; + + Ok(vec![info]) + } + + async fn upload_competition_ranking_score(&self, param: UploadCompetitionData) -> Result { + info!("fest results for user {:?}:", self.pid); + info!("fest id: {:?}", param.splatfest_id); + info!("score: {:?}", param.score); + info!("team id: {:?}", param.team_id); + info!("did current team win: {:?}", param.team_win); + + let endpoint = match env::var("RNEX_SPLATOON_RESULTS_POST") { + Ok(url) => url, + Err(_) => { + error!("RNEX_SPLATOON_RESULTS_POST not set"); + return Ok(false); + } + }; + + let payload = CompetitionPostResults { + splatfest_id: param.splatfest_id, + score: param.score, + team_id: param.team_id, + team_win: param.team_win, + user: self.pid, + }; + + let json_body = match serde_json::to_string(&payload) { + Ok(j) => j, + Err(e) => { + error!("error making json_body: {:?}", e); + return Ok(false); + } + }; + + let response = ureq::post(&endpoint) + .header("Content-Type", "application/json") + .send(json_body); + + match response { + Ok(res) => { + info!("POST worked: {}", res.status()); + } + Err(e) => { + error!("POST borked: {:?}", e); + } + } + + Ok(true) + } +} + diff --git a/rnex-core/src/rmc/message.rs b/rnex-core/src/rmc/message.rs index cf951bf..4fcdfbe 100644 --- a/rnex-core/src/rmc/message.rs +++ b/rnex-core/src/rmc/message.rs @@ -42,7 +42,8 @@ impl RMCMessage{ error!("received incorrect rmc packet: expected size {} but found {}", size, header_size + rest_of_data.len()); } - + // println!("rmc packet: protoid: {}, method id: {}", protocol_id, method_id); + // println!("{}", hex::encode(&rest_of_data)); //stream. Ok(Self{ diff --git a/rnex-core/src/rmc/protocols/ranking.rs b/rnex-core/src/rmc/protocols/ranking.rs index 93dcb87..b9dba06 100644 --- a/rnex-core/src/rmc/protocols/ranking.rs +++ b/rnex-core/src/rmc/protocols/ranking.rs @@ -1,33 +1,51 @@ -use macros::{rmc_struct, rmc_proto, RmcSerialize}; +use macros::{rmc_struct, rmc_proto, RmcSerialize, method_id}; + +use rnex_core::kerberos::KerberosDateTime; +use rnex_core::rmc::structures::qbuffer::QBuffer; + +use rnex_core::rmc::response::ErrorCode; +use rnex_core::rmc::structures::ranking::UploadCompetitionData; #[derive(RmcSerialize, Debug, Default, Clone)] -struct ResultsRange{ - offset: u32, - size: u32 +#[rmc_struct(0)] +pub struct ResultsRange{ + pub offset: u32, + pub size: u32 } #[derive(RmcSerialize, Debug, Default, Clone)] #[rmc_struct(1)] -struct CompetitionRankingGetParam{ - unk: u32, - range: ResultsRange, - festival_ids: Vec, +pub struct CompetitionRankingGetParam { + pub unk: u32, + pub range: ResultsRange, + pub festival_ids: Vec, } #[derive(RmcSerialize, Debug, Default, Clone)] #[rmc_struct(0)] -struct CompetitionRankingScoreInfo{ - fest_id: u32, - score_data: Vec, - unk: u32, - team_wins: Vec, - team_votes: Vec +pub struct CompetitionRankingScoreInfo{ + pub fest_id: u32, + pub score_data: Vec, + pub unk: u32, + pub team_wins: Vec, + pub team_votes: Vec } - +#[derive(RmcSerialize, Debug, Clone)] +#[rmc_struct(0)] +pub struct CompetitionRankingScoreData{ + pub unk: u32, + pub pid: u32, + pub score: u32, + pub modified: KerberosDateTime, + pub unk2: u8, + pub appdata: QBuffer +} #[rmc_proto(112)] pub trait Ranking{ - //#[method_id(16)] - //async fn competition_ranking_get_param(&self, param: CompetitionRankingGetParam) -> Result,ErrorCode>; -} \ No newline at end of file + #[method_id(16)] + async fn competition_ranking_get_param(&self, param: CompetitionRankingGetParam) -> Result,ErrorCode>; + #[method_id(18)] + async fn upload_competition_ranking_score(&self, param: UploadCompetitionData) -> Result; +} diff --git a/rnex-core/src/rmc/structures/qbuffer.rs b/rnex-core/src/rmc/structures/qbuffer.rs index fb30e64..2f7b23a 100644 --- a/rnex-core/src/rmc/structures/qbuffer.rs +++ b/rnex-core/src/rmc/structures/qbuffer.rs @@ -3,8 +3,7 @@ use bytemuck::bytes_of; use v_byte_helpers::{IS_BIG_ENDIAN, ReadExtensions}; use crate::rmc::structures::{Result, RmcSerialize}; - -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct QBuffer(pub Vec); impl RmcSerialize for QBuffer{ diff --git a/rnex-core/src/rmc/structures/ranking.rs b/rnex-core/src/rmc/structures/ranking.rs index 778c5cf..773889d 100644 --- a/rnex-core/src/rmc/structures/ranking.rs +++ b/rnex-core/src/rmc/structures/ranking.rs @@ -4,15 +4,15 @@ use rnex_core::rmc::structures::qbuffer::QBuffer; #[derive(RmcSerialize, Debug)] #[rmc_struct(0)] -struct UploadCompetitionData { - winning_team: u32, - splatfest_id: u32, - unk_2: u32, - unk_3: u32, - team_id_1: u8, - team_id_2: u8, - unk_5: u32, - player_data: QBuffer, +pub struct UploadCompetitionData{ + pub unk_1/*?*/: u32, + pub splatfest_id: u32, + pub unk_2/*?*/: u32, + pub score: u32, + pub team_id: u8, + pub team_win: u8, + pub is_first_upload: bool, + pub appdata: QBuffer, } #[derive(Copy, Clone, Pod, Zeroable)]