use std::fmt;
use std::sync::Arc;
use std::time::Duration;
use crate::base::generated::steam_language::{EClientPersonaStateFlag, EUniverse};
use crate::networking::steam3::protocol_type::ProtocolTypes;
use crate::steam::discovery::smart_cm_server_list::SmartCMServerList;
use super::i_machine_info_provider::IMachineInfoProvider;
use super::steam_configuration_builder::SteamConfigurationBuilder;
use super::steam_configuration_state::{PersonaStateFlags, SteamConfigurationState};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum HttpClientPurpose {
CMWebSocket,
WebAPI,
CDN,
}
pub type HttpClientFactory = Arc<dyn Fn(HttpClientPurpose) -> reqwest::Client + Send + Sync>;
pub fn default_web_api_base_address() -> reqwest::Url {
reqwest::Url::parse("https://api.steampowered.com/")
.expect("the default Steam Web API address is a valid URL")
}
pub fn default_user_agent() -> String {
format!("SteamKit/{}", env!("CARGO_PKG_VERSION"))
}
pub fn default_http_client_factory() -> HttpClientFactory {
Arc::new(|_purpose: HttpClientPurpose| {
reqwest::Client::builder()
.user_agent(default_user_agent())
.build()
.unwrap_or_else(|_| reqwest::Client::new())
})
}
pub struct SteamConfiguration {
state: Arc<SteamConfigurationState>,
server_list: Arc<SmartCMServerList>,
}
impl fmt::Debug for SteamConfiguration {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SteamConfiguration")
.field("state", &self.state)
.field("server_list", &"Arc<SmartCMServerList>")
.finish()
}
}
impl SteamConfiguration {
pub fn create<F>(configurator: F) -> SteamConfiguration
where
F: FnOnce(&mut SteamConfigurationBuilder),
{
let mut builder = SteamConfigurationBuilder::new();
configurator(&mut builder);
builder.build()
}
pub fn create_default() -> SteamConfiguration {
SteamConfigurationBuilder::create_default_state().into_configuration()
}
pub fn from_state(state: SteamConfigurationState) -> SteamConfiguration {
state.into_configuration()
}
pub fn state(&self) -> &Arc<SteamConfigurationState> {
&self.state
}
pub fn allow_directory_fetch(&self) -> bool {
self.state.allow_directory_fetch
}
pub fn cell_id(&self) -> u32 {
self.state.cell_id
}
pub fn connection_timeout(&self) -> Duration {
self.state.connection_timeout
}
pub fn default_persona_state_flags(&self) -> EClientPersonaStateFlag {
self.state
.default_persona_state_flags
.representative()
.unwrap_or(EClientPersonaStateFlag::PlayerName)
}
pub fn default_persona_state_flags_mask(&self) -> PersonaStateFlags {
self.state.default_persona_state_flags
}
pub fn http_client_factory(&self) -> &HttpClientFactory {
&self.state.http_client_factory
}
pub fn machine_info_provider(&self) -> &Arc<dyn IMachineInfoProvider> {
&self.state.machine_info_provider
}
pub fn protocol_types(&self) -> ProtocolTypes {
self.state.protocol_types
}
pub fn server_list_provider(&self) -> &Arc<dyn crate::steam::discovery::i_server_list_provider::IServerListProvider> {
&self.state.server_list_provider
}
pub fn universe(&self) -> EUniverse {
self.state.universe
}
pub fn web_api_base_address(&self) -> &reqwest::Url {
&self.state.web_api_base_address
}
pub fn web_api_key(&self) -> &str {
&self.state.web_api_key
}
pub fn server_list(&self) -> &Arc<SmartCMServerList> {
&self.server_list
}
}
impl SteamConfigurationState {
pub fn into_configuration(self) -> SteamConfiguration {
let state = Arc::new(self);
let server_list = Arc::new(SmartCMServerList::new(state.clone()));
SteamConfiguration { state, server_list }
}
}