Skip to main content

roblox_api/api/inventory/
v1.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{AssetTypeId, Paging, endpoint};
4
5pub const URL: &str = "https://inventory.roblox.com/v1";
6
7#[repr(u8)]
8#[derive(Clone, Debug, Deserialize, Serialize)]
9pub enum ItemType {
10    Asset = 0,
11    Gamepass,
12    Badge,
13    Bundle,
14}
15
16#[derive(Clone, Debug, Deserialize, Serialize)]
17#[serde(rename_all = "camelCase")]
18pub struct AssetInfo {
19    pub id: u64,
20    #[serde(rename = "type")]
21    pub kind: String,
22    pub name: String,
23    pub instance_id: u64,
24}
25
26#[derive(Clone, Debug, Deserialize, Serialize)]
27pub struct UserOwnsAssets {
28    #[serde(rename = "nextPageCursor")]
29    pub next_cursor: Option<String>,
30    #[serde(rename = "previousPageCursor")]
31    pub previous_cursor: Option<String>,
32    #[serde(rename = "data")]
33    pub assets: Vec<AssetInfo>,
34}
35
36#[derive(Clone, Debug, Deserialize, Serialize)]
37#[serde(rename_all = "camelCase")]
38pub struct CollectibleInfo {
39    #[serde(rename = "assetId")]
40    pub id: u64,
41    pub original_price: u64,
42    pub recent_average_price: u64,
43    #[serde(rename = "assetStock")]
44    pub stock: u64,
45    #[serde(rename = "userAssetId")]
46    pub instance_id: u64,
47    pub name: String,
48    #[serde(rename = "buildersClubMembershipType")]
49    pub premium_membership_type: String,
50    #[serde(rename = "isOnHold")]
51    pub on_hold: bool,
52    #[serde(rename = "serialNumber")]
53    pub serial: Option<u64>,
54}
55
56#[derive(Clone, Debug, Deserialize, Serialize)]
57pub struct UserOwnedCollectibles {
58    #[serde(rename = "nextPageCursor")]
59    pub next_cursor: Option<String>,
60    #[serde(rename = "previousPageCursor")]
61    pub previous_cursor: Option<String>,
62    #[serde(rename = "data")]
63    pub assets: Vec<CollectibleInfo>,
64}
65
66endpoint! {
67    can_view_inventory(user_id: u64) -> bool {
68        GET "{URL}/users/{user_id}/can-view-inventory";
69
70        types {
71            Response {
72                can_view("canView"): bool,
73            }
74        }
75
76        map |r: Response| r.can_view
77    }
78
79    user_owns_assets(user_id: u64, id: u64, item_type: ItemType, paging: Paging<'_>) -> UserOwnsAssets {
80        GET "{URL}/users/{user_id}/items/{item_type_as_u8}/{id}";
81
82        prelude {
83            let item_type_as_u8 = item_type as u8;
84            let cursor = match paging.cursor {
85                Some(cursor) => cursor.to_string(),
86                None => String::new(),
87            };
88        }
89
90        query {
91            "cursor" => &cursor,
92        }
93    }
94
95    user_owned_collectibles(user_id: u64, asset_type_id: Option<AssetTypeId>, paging: Paging<'_>) -> UserOwnedCollectibles {
96        GET "{URL}/users/{user_id}/assets/collectibles";
97
98        paging_query { paging, limit = 10 }
99
100        prelude {
101            let asset_type = match asset_type_id {
102                Some(id) => (id as u8).to_string(),
103                None => String::new(),
104            };
105        }
106
107        query {
108            "assetType" => &asset_type,
109        }
110    }
111}