1use serde::{Deserialize, Serialize};
4use steamid::SteamID;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct TradeOffer {
9 pub tradeofferid: u64,
11 pub partner: TradeOfferPartner,
13 pub active: bool,
15 pub primary: TradeOfferItems,
17 pub secondary: TradeOfferItems,
19 #[serde(default)]
22 pub banner_text: String,
23 #[serde(default)]
26 pub banner_timestamp: Option<i64>,
27 #[serde(default)]
29 pub status: TradeOfferStatus,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
34#[non_exhaustive]
35pub enum TradeOfferStatus {
36 #[default]
38 Active,
39 Accepted,
41 Unavailable,
43 Countered,
45 Inactive,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct TradeOfferPartner {
52 #[serde(default)]
55 pub steamid: Option<SteamID>,
56 pub name: String,
58 pub avatar_hash: String,
60 pub link: String,
62 pub header: String,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct TradeOfferItems {
69 #[serde(default)]
72 pub steamid: Option<SteamID>,
73 pub items: Vec<TradeOfferItem>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct TradeOfferItem {
80 pub economy_item: String,
82 pub img: String,
84 #[serde(default)]
86 pub img_hi: String,
87 #[serde(default)]
89 pub missing: bool,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct TradeOffersResponse {
95 pub incoming_offers: TradeOfferSummary,
97 pub sent_offers: TradeOfferSummary,
99 pub trade_hold_count: u32,
101 pub trade_offers: Vec<TradeOffer>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct TradeOfferSummary {
108 pub link: String,
110 pub count: u32,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct TradeOfferAsset {
117 pub appid: u32,
119 pub contextid: String,
121 pub amount: u32,
123 pub assetid: String,
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct TradeOfferResult {
130 pub tradeofferid: String,
132 pub needs_mobile_confirmation: bool,
134 pub needs_email_confirmation: bool,
136 pub email_domain: Option<String>,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct ParsedTradeURL {
143 pub account_id: String,
145 pub steam_id: SteamID,
147 pub token: Option<String>,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct InventoryCursor {
154 pub time: u64,
155 pub time_frac: u32,
156 pub s: u32,
157}
158
159impl Default for InventoryCursor {
160 fn default() -> Self {
161 use std::time::{SystemTime, UNIX_EPOCH};
162 let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap_or_default().as_secs();
163
164 Self { time: now, time_frac: 0, s: 0 }
165 }
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct InventoryHistoryItem {
171 pub id: String,
172 pub timestamp: u64,
173 pub timestamp_str: String,
174 pub description: String,
175 pub plusminus: String,
176 pub trade_history_items: Vec<serde_json::Value>,
177 #[serde(default)]
180 pub steamid: Option<SteamID>,
181 pub trade_people: Option<TradePeople>,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
186pub struct TradePeople {
187 pub name: String,
188 pub url: String,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize)]
193pub struct InventoryHistoryResult {
194 pub cursor: Option<InventoryCursor>,
195 pub trade_history: Vec<InventoryHistoryItem>,
196}