A photo manager for VRChat.
1use serde::ser::{Serialize, SerializeStruct, Serializer};
2
3#[derive(Clone)]
4pub struct World {
5 id: String,
6 name: String,
7 author: String,
8 author_id: String,
9 desc: String,
10 img: String,
11 max_users: u64,
12 visits: u64,
13 favourites: u64,
14 tags: Vec<String>,
15 found: bool,
16}
17
18impl World {
19 pub fn new(world_id: String) -> World {
20 println!("Fetching world data for {}", &world_id);
21
22 let mut world = World {
23 id: world_id.clone(),
24 name: "".into(),
25 author: "".into(),
26 author_id: "".into(),
27 desc: "".into(),
28 img: "".into(),
29 max_users: 0,
30 visits: 0,
31 favourites: 0,
32 tags: vec!["".into()],
33 found: false,
34 };
35
36 let client = reqwest::blocking::Client::new();
37
38 let world_data = client
39 .get(format!("https://api.vrchat.cloud/api/1/worlds/{}", world_id))
40 .header("User-Agent", "VRChat-Photo-Manager-Rust/0.0.1")
41 .send()
42 .unwrap();
43
44 if world_data.status() != 200{ return world; }
45 world.found = true;
46
47 let world_data = world_data.text().unwrap();
48 let world_data: serde_json::Value = serde_json::from_str(&world_data).unwrap();
49
50 world.name = world_data["name"].as_str().unwrap().to_owned();
51 world.author = world_data["authorName"].as_str().unwrap().to_owned();
52 world.author_id = world_data["authorId"].as_str().unwrap().to_owned();
53 world.desc = world_data["description"].as_str().unwrap().to_owned();
54 world.img = world_data["imageUrl"].as_str().unwrap().to_owned();
55 world.tags = world_data["tags"].as_array().unwrap().clone().iter()
56 .map(| item | item.as_str().unwrap().to_owned())
57 .collect();
58 world.visits = world_data["visits"].as_u64().unwrap();
59 world.favourites = world_data["favorites"].as_u64().unwrap();
60 world.max_users = world_data["capacity"].as_u64().unwrap();
61
62 println!("Fetched world data for {}", &world_id);
63 world
64 }
65}
66
67impl Serialize for World {
68 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
69 where
70 S: Serializer,
71 {
72 let mut s = serializer.serialize_struct("World", 7)?;
73 s.serialize_field("id", &self.id)?;
74 s.serialize_field("name", &self.name)?;
75 s.serialize_field("author", &self.author)?;
76 s.serialize_field("authorId", &self.author_id)?;
77 s.serialize_field("desc", &self.desc)?;
78 s.serialize_field("img", &self.img)?;
79 s.serialize_field("maxUsers", &self.max_users)?;
80 s.serialize_field("visits", &self.visits)?;
81 s.serialize_field("favourites", &self.favourites)?;
82 s.serialize_field("tags", &self.tags)?;
83 s.serialize_field("found", &self.found)?;
84
85 s.end()
86 }
87}