#![doc = include_str!("../README.md")]
#![deny(clippy::pedantic)]
pub mod functions;
pub mod structs;
use anyhow::Result;
use log::{debug, info};
use reqwest::{blocking, Error};
use structs::{bans, friends, level, profile, summaries};
pub fn get_steam_level(steamids: &str, api_key: &str) -> Result<level::User, Error> {
info!("Calling GetSteamLevel on steamid: {}", &steamids);
debug!(
"{}",
functions::manage_api_url("GetSteamLevel", steamids, api_key)
);
Ok(blocking::get(functions::manage_api_url(
"GetSteamLevel",
steamids,
api_key,
))?
.json::<level::Response>()?
.response)
}
pub fn get_player_summaries(steamids: &str, api_key: &str) -> Result<Vec<summaries::User>, Error> {
info!("Calling GetPlayerSummaries on steamids: {}", &steamids);
debug!(
"{}",
functions::manage_api_url("GetPlayerSummaries", steamids, api_key)
);
Ok(blocking::get(functions::manage_api_url(
"GetPlayerSummaries",
steamids,
api_key,
))?
.json::<summaries::Response>()?
.response
.players)
}
pub fn get_player_bans(steamids: &str, api_key: &str) -> Result<Vec<bans::User>, Error> {
info!("Calling GetPlayerBans on steamids: {}", &steamids);
debug!(
"{}",
functions::manage_api_url("GetPlayerBans", steamids, api_key)
);
Ok(blocking::get(functions::manage_api_url(
"GetPlayerBans",
steamids,
api_key,
))?
.json::<bans::Response>()?
.players)
}
pub fn get_friends_list(steamids: &str, api_key: &str) -> Result<Vec<friends::User>, Error> {
info!("Calling GetFriendList on steamid: {}", &steamids);
debug!(
"{}",
functions::manage_api_url("GetFriendList", steamids, api_key)
);
Ok(blocking::get(functions::manage_api_url(
"GetFriendList",
steamids,
api_key,
))?
.json::<friends::Response>()?
.friendslist
.friends)
}
pub fn get_profile_info(steamids: &[&str], api_key: &str) -> Result<profile::Users, Error> {
let mut users: profile::Users = profile::Users::default();
let mut summaries_raw: summaries::Response = summaries::Response::default();
let mut bans_raw: bans::Response = bans::Response::default();
if steamids.len() > 32 {
info!("Steamids are >32, splitting them into multiple api calls");
let split_vec: Vec<&[&str]> = steamids.chunks(32).collect();
for i in split_vec {
let steamids_string = i.join(",");
let bans = get_player_bans(&steamids_string, api_key)?;
users.api_call_count += 1;
for i in bans {
bans_raw.players.push(i);
}
let summaries = get_player_summaries(&steamids_string, api_key)?;
users.api_call_count += 1;
for i in summaries {
summaries_raw.response.players.push(i);
}
}
} else {
let steamids_string = steamids.join(",");
let bans = get_player_bans(&steamids_string, api_key)?;
users.api_call_count += 1;
for i in bans {
bans_raw.players.push(i);
}
let summaries = get_player_summaries(&steamids_string, api_key)?;
users.api_call_count += 1;
for i in summaries {
summaries_raw.response.players.push(i);
}
}
bans_raw.players.sort_by(|a, b| b.SteamId.cmp(&a.SteamId));
summaries_raw
.response
.players
.sort_by(|a, b| b.steamid.cmp(&a.steamid));
for (index, player) in summaries_raw.response.players.iter().enumerate() {
let mut user = profile::User {
steamid: player.steamid.clone(),
communityvisibilitystate: player.communityvisibilitystate,
profilestate: player.profilestate,
personaname: player.personaname.clone(),
commentpermission: player.commentpermission.unwrap_or(0),
profileurl: player.profileurl.clone(),
avatar: player.avatar.clone(),
avatarmedium: player.avatarmedium.clone(),
avatarfull: player.avatarfull.clone(),
avatarhash: player.avatarhash.clone(),
lastlogoff: player.lastlogoff.unwrap_or(0),
personastate: player.personastate,
realname: player.realname.clone().unwrap_or_default(),
primaryclanid: player.primaryclanid.clone().unwrap_or_default(),
timecreated: player.timecreated.unwrap_or(0),
gameid: player.gameid.clone().unwrap_or_default(),
gameserverip: player.gameserverip.clone().unwrap_or_default(),
loccountrycode: player.loccountrycode.clone().unwrap_or_default(),
locstatecode: player.locstatecode.clone().unwrap_or_default(),
loccityid: player.loccityid.unwrap_or(0),
CommunityBanned: bans_raw.players[index].CommunityBanned,
VACBanned: bans_raw.players[index].VACBanned,
NumberOfVACBans: bans_raw.players[index].NumberOfVACBans,
DaysSinceLastBan: bans_raw.players[index].DaysSinceLastBan,
NumberOfGameBans: bans_raw.players[index].NumberOfGameBans,
EconomyBan: bans_raw.players[index].EconomyBan.clone(),
player_level: 0,
};
if user.communityvisibilitystate == 3 {
user.player_level = get_steam_level(&player.steamid, api_key)?
.player_level
.unwrap_or_default();
users.api_call_count += 1;
} else {
info!("{} is private, skipping GetSteamLevel", user.steamid);
}
users.user.push(user);
}
Ok(users)
}