use std::time::Duration;
use steam_client::{AppsEvent, AuthEvent, ConnectionEvent, EPersonaState, FriendsEvent, LogOnDetails, SteamClient, SteamError, SteamEvent, SystemEvent};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt().with_max_level(tracing::Level::INFO).init();
let refresh_token = std::env::var("REFRESH_TOKEN").expect("Please set REFRESH_TOKEN environment variable");
let mut client = SteamClient::new(Default::default());
println!("🚀 Connecting to Steam...");
let response = client.log_on(LogOnDetails { refresh_token: Some(refresh_token), ..Default::default() }).await?;
println!("✅ Logged into Steam as {}", response.steam_id.steam3());
client.set_persona(EPersonaState::Online, Some("Playing with Rust 🦀".to_string())).await?;
println!("👤 Set persona to Online");
client.games_played(vec![440]).await?;
println!("🎮 Now playing Team Fortress 2");
println!("\n📡 Listening for events (Ctrl+C to stop)...\n");
loop {
match client.poll_event_timeout(Duration::from_secs(30)).await {
Ok(Some(event)) => {
match event {
SteamEvent::Friends(FriendsEvent::FriendsList { friends, .. }) => {
println!("👥 Friends list received: {} friends", friends.len());
}
SteamEvent::Friends(FriendsEvent::PersonaState(persona)) => {
println!("👤 {} is now {:?}", persona.player_name, persona.persona_state);
}
SteamEvent::Apps(AppsEvent::LicenseList { licenses }) => {
println!("📦 Account owns {} license(s)", licenses.len());
}
SteamEvent::Auth(AuthEvent::RefreshToken { token, account_name }) => {
println!("💾 New refresh token for {}: {}...", account_name, &token[..20.min(token.len())]);
}
SteamEvent::Connection(ConnectionEvent::Disconnected { reason, will_reconnect }) => {
if will_reconnect {
println!("🔄 Disconnected ({:?}), will reconnect...", reason);
} else {
println!("❌ Disconnected permanently: {:?}", reason);
break;
}
}
SteamEvent::Auth(AuthEvent::LoggedOff { result }) => {
println!("👋 Logged off: {:?}", result);
break;
}
SteamEvent::System(SystemEvent::Debug(msg)) => {
tracing::debug!("Debug: {}", msg);
}
SteamEvent::System(SystemEvent::Error(msg)) => {
println!("❌ Error: {}", msg);
}
_ => {
tracing::debug!("Unhandled event: {:?}", event);
}
}
}
Ok(None) => {
println!("⏰ Heartbeat: still connected...");
}
Err(SteamError::NotConnected) => {
println!("❌ Connection lost");
break;
}
Err(e) => {
println!("❌ Error: {:?}", e);
break;
}
}
}
client.log_off().await?;
println!("👋 Goodbye!");
Ok(())
}