use std::collections::HashMap;
use steamid::SteamID;
use crate::{error::SteamError, SteamClient};
#[derive(Debug, Clone)]
pub struct PublishedFileDetails {
pub publishedfileid: u64,
pub creator: Option<SteamID>,
pub consumer_appid: u32,
pub creator_appid: u32,
pub title: String,
pub description: String,
pub filename: String,
pub file_size: u64,
pub preview_url: Option<String>,
pub time_created: u32,
pub time_updated: u32,
pub visibility: u32,
pub banned: bool,
pub ban_reason: Option<String>,
pub subscriptions: u64,
pub favorited: u64,
pub lifetime_subscriptions: u64,
pub lifetime_favorited: u64,
pub views: u64,
pub tags: Vec<String>,
pub kvtags: HashMap<String, String>,
pub vote_data: Option<VoteData>,
}
#[derive(Debug, Clone)]
pub struct VoteData {
pub score: f32,
pub votes_up: u32,
pub votes_down: u32,
}
impl SteamClient {
pub async fn get_published_file_details(&mut self, ids: Vec<u64>) -> Result<HashMap<u64, PublishedFileDetails>, SteamError> {
if !self.is_logged_in() {
return Err(SteamError::NotLoggedOn);
}
let msg = steam_protos::CPublishedFileGetDetailsRequest {
publishedfileids: ids,
includetags: Some(true),
includeadditionalpreviews: Some(true),
includechildren: Some(true),
includekvtags: Some(true),
includevotes: Some(true),
includeforsaledata: Some(true),
includemetadata: Some(true),
language: Some(0),
..Default::default()
};
let response: steam_protos::CPublishedFileGetDetailsResponse = self.send_service_method_and_wait("PublishedFile.GetDetails#1", &msg).await?;
let mut results = HashMap::new();
for item in response.publishedfiledetails {
let publishedfileid = match item.publishedfileid {
Some(id) => id,
None => continue,
};
let creator = match item.creator {
Some(id) if id > 0 => Some(SteamID::from(id)),
_ => None,
};
let mut kvtags = HashMap::new();
for tag in item.kvtags {
if let (Some(k), Some(v)) = (tag.key, tag.value) {
kvtags.insert(k, v);
}
}
let tags = item.tags.into_iter().filter_map(|t| t.tag).collect();
let vote_data = item.vote_data.map(|v| VoteData { score: v.score.unwrap_or(0.0), votes_up: v.votes_up.unwrap_or(0), votes_down: v.votes_down.unwrap_or(0) });
results.insert(
publishedfileid,
PublishedFileDetails {
publishedfileid,
creator,
consumer_appid: item.consumer_appid.unwrap_or(0),
creator_appid: item.creator_appid.unwrap_or(0),
title: item.title.unwrap_or_default(),
description: item.file_description.unwrap_or_default(),
filename: item.filename.unwrap_or_default(),
file_size: item.file_size.unwrap_or(0),
preview_url: item.preview_url,
time_created: item.time_created.unwrap_or(0),
time_updated: item.time_updated.unwrap_or(0),
visibility: item.visibility.unwrap_or(0),
banned: item.banned.unwrap_or(false),
ban_reason: item.ban_reason,
subscriptions: item.subscriptions.map(|v| v as u64).unwrap_or(0),
favorited: item.favorited.map(|v| v as u64).unwrap_or(0),
lifetime_subscriptions: item.lifetime_subscriptions.map(|v| v as u64).unwrap_or(0),
lifetime_favorited: item.lifetime_favorited.map(|v| v as u64).unwrap_or(0),
views: item.views.map(|v| v as u64).unwrap_or(0),
tags,
kvtags,
vote_data,
},
);
}
Ok(results)
}
pub async fn get_published_file_detail(&mut self, id: u64) -> Result<Option<PublishedFileDetails>, SteamError> {
let results = self.get_published_file_details(vec![id]).await?;
Ok(results.into_values().next())
}
}