idk man
This commit is contained in:
Generated
+97
@@ -0,0 +1,97 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "bincode"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740"
|
||||
dependencies = [
|
||||
"bincode_derive",
|
||||
"serde",
|
||||
"unty",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bincode_derive"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09"
|
||||
dependencies = [
|
||||
"virtue",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.95"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.219"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.219"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stats_tracker"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bincode",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||
|
||||
[[package]]
|
||||
name = "unty"
|
||||
version = "0.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
|
||||
|
||||
[[package]]
|
||||
name = "virtue"
|
||||
version = "0.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
|
||||
@@ -0,0 +1,18 @@
|
||||
[package]
|
||||
name = "stats_tracker"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
bincode = "2.0"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
name = "stats_tracker"
|
||||
|
||||
[profile.release]
|
||||
opt-level = "z"
|
||||
codegen-units = 1
|
||||
lto = "fat"
|
||||
overflow-checks = false
|
||||
panic = "abort"
|
||||
@@ -0,0 +1,98 @@
|
||||
use std::{
|
||||
ffi::{CStr, c_char},
|
||||
fs::File,
|
||||
};
|
||||
|
||||
use bincode::{Decode, Encode};
|
||||
|
||||
#[derive(Decode, Encode, Clone)]
|
||||
#[repr(C)]
|
||||
pub struct PlayerStat {
|
||||
kills: u32,
|
||||
deaths: u32,
|
||||
team_damage: u32,
|
||||
}
|
||||
|
||||
#[derive(Decode, Encode, Clone, Default)]
|
||||
#[repr(C)]
|
||||
pub struct ItemStat {
|
||||
item_name: String,
|
||||
item_count: u32,
|
||||
}
|
||||
|
||||
#[derive(Decode, Encode, Clone)]
|
||||
#[repr(C)]
|
||||
pub struct Player {
|
||||
player_id: String,
|
||||
player_stats: PlayerStat,
|
||||
player_items: [ItemStat; 256],
|
||||
}
|
||||
|
||||
impl Default for Player {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
player_id: String::new(),
|
||||
player_stats: PlayerStat {
|
||||
kills: 0,
|
||||
deaths: 0,
|
||||
team_damage: 0,
|
||||
},
|
||||
player_items: std::array::from_fn(|_| ItemStat::default()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
/// # Safety
|
||||
/// `player_id` must be a valid, null-terminated C string pointer.
|
||||
pub unsafe extern "C" fn get_player_stats(player_id: *const c_char) -> *const Player {
|
||||
let player_id = unsafe { CStr::from_ptr(player_id) }
|
||||
.to_string_lossy()
|
||||
.into_owned();
|
||||
|
||||
let db_location = "./stats.data";
|
||||
|
||||
let player_stats: Vec<Player> = match File::open(db_location) {
|
||||
Ok(mut data) => bincode::decode_from_std_read(&mut data, bincode::config::standard())
|
||||
.unwrap_or_default(),
|
||||
Err(_) => Vec::new(),
|
||||
};
|
||||
|
||||
player_stats
|
||||
.iter()
|
||||
.find(|p| p.player_id == player_id)
|
||||
.unwrap_or(&Player::default())
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
/// # Safety
|
||||
/// `player` must be a valid pointer to a `Player` struct.
|
||||
pub unsafe extern "C" fn save_player_stats(player: *const Player) -> bool {
|
||||
let player = unsafe { &*player };
|
||||
let db_location = "./stats.data";
|
||||
|
||||
let mut player_stats: Vec<Player> = match File::open(db_location) {
|
||||
Ok(mut data) => bincode::decode_from_std_read(&mut data, bincode::config::standard())
|
||||
.unwrap_or_default(),
|
||||
Err(_) => Vec::new(),
|
||||
};
|
||||
|
||||
// Find and update existing player or add new player
|
||||
if let Some(existing_player) = player_stats
|
||||
.iter_mut()
|
||||
.find(|p| p.player_id == player.player_id)
|
||||
{
|
||||
*existing_player = player.clone();
|
||||
} else {
|
||||
player_stats.push(player.clone());
|
||||
}
|
||||
|
||||
// Save updated stats
|
||||
match File::create(db_location) {
|
||||
Ok(mut file) => {
|
||||
bincode::encode_into_std_write(&player_stats, &mut file, bincode::config::standard())
|
||||
.is_ok()
|
||||
}
|
||||
Err(_) => false,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user