modio/
user.rs

1//! User interface
2use crate::prelude::*;
3use crate::types::files::File;
4use crate::types::games::Game;
5use crate::types::id::UserId;
6use crate::types::mods::Mod;
7
8pub use crate::types::mods::Rating;
9pub use crate::types::{Avatar, User};
10pub use crate::types::{Event, EventType};
11
12/// Interface for resources owned by the authenticated user or is team member of.
13#[derive(Clone)]
14pub struct Me {
15    modio: Modio,
16}
17
18impl Me {
19    pub(crate) fn new(modio: Modio) -> Self {
20        Self { modio }
21    }
22
23    /// Returns the current user if authenticated.
24    pub async fn current(self) -> Result<Option<User>> {
25        if self.modio.inner.credentials.token.is_some() {
26            let user = self.modio.request(Route::UserAuthenticated).send().await?;
27            Ok(Some(user))
28        } else {
29            Ok(None)
30        }
31    }
32
33    /// Returns a `Query` interface to retrieve all games the authenticated user added or
34    /// is team member of. [required: token]
35    ///
36    /// See [Filters and sorting](filters::games).
37    pub fn games(&self, filter: Filter) -> Query<Game> {
38        Query::new(self.modio.clone(), Route::UserGames, filter)
39    }
40
41    /// Returns a `Query` interface to retrieve all mods the authenticated user added or
42    /// is team member of. [required: token]
43    ///
44    /// See [Filters and sorting](filters::mods).
45    pub fn mods(&self, filter: Filter) -> Query<Mod> {
46        Query::new(self.modio.clone(), Route::UserMods, filter)
47    }
48
49    /// Returns a `Query` interface to retrieve all modfiles the authenticated user uploaded.
50    /// [required: token]
51    ///
52    /// See [Filters and sorting](filters::files).
53    pub fn files(&self, filter: Filter) -> Query<File> {
54        Query::new(self.modio.clone(), Route::UserFiles, filter)
55    }
56
57    /// Returns a `Query` interface to retrieve the events that have been fired specific to the
58    /// authenticated user. [required: token]
59    ///
60    /// See [Filters and sorting](filters::events).
61    pub fn events(self, filter: Filter) -> Query<Event> {
62        Query::new(self.modio, Route::UserEvents, filter)
63    }
64
65    /// Returns a `Query` interface to retrieve the mods the authenticated user is subscribed to.
66    /// [required: token]
67    ///
68    /// See [Filters and sorting](filters::subscriptions).
69    pub fn subscriptions(self, filter: Filter) -> Query<Mod> {
70        Query::new(self.modio, Route::UserSubscriptions, filter)
71    }
72
73    /// Returns a `Query` interface to retrieve the mod ratings submitted by the authenticated user.
74    /// [required: token]
75    ///
76    /// See [Filters and sorting](filters::ratings).
77    pub fn ratings(self, filter: Filter) -> Query<Rating> {
78        Query::new(self.modio, Route::UserRatings, filter)
79    }
80
81    /// Get all users muted by the authenticated user. [required: token]
82    pub fn muted_users(self) -> Query<User> {
83        Query::new(self.modio, Route::UserMuted, Filter::default())
84    }
85
86    /// Mute a user. [required: token]
87    ///
88    /// This will prevent mod.io from returning mods authored by the muted user.
89    pub async fn mute_user(self, user_id: UserId) -> Result<()> {
90        self.modio.request(Route::MuteUser { user_id }).send().await
91    }
92
93    /// Unmute a previously muted user. [required: token]
94    ///
95    /// This will re-enable mod.io return mods authored by the muted user again.
96    pub async fn unmute_user(self, user_id: UserId) -> Result<()> {
97        self.modio
98            .request(Route::UnmuteUser { user_id })
99            .send()
100            .await
101    }
102}
103
104/// Filters for events, subscriptions and ratings.
105#[rustfmt::skip]
106pub mod filters {
107    #[doc(inline)]
108    pub use crate::games::filters as games;
109    #[doc(inline)]
110    pub use crate::mods::filters as mods;
111    #[doc(inline)]
112    pub use crate::files::filters as files;
113
114    /// User event filters and sorting.
115    ///
116    /// # Filters
117    /// - `Id`
118    /// - `GameId`
119    /// - `ModId`
120    /// - `UserId`
121    /// - `DateAdded`
122    /// - `EventType`
123    ///
124    /// # Sorting
125    /// - `Id`
126    /// - `DateAdded`
127    ///
128    /// See the [modio docs](https://docs.mod.io/restapiref/#get-user-events) for more information.
129    ///
130    /// By default this returns up to `100` items. You can limit the result by using `limit` and
131    /// `offset`.
132    ///
133    /// # Example
134    /// ```
135    /// use modio::filter::prelude::*;
136    /// use modio::mods::EventType;
137    /// use modio::user::filters::events::EventType as Filter;
138    ///
139    /// let filter = Id::gt(1024).and(Filter::eq(EventType::MODFILE_CHANGED));
140    /// ```
141    pub mod events {
142        #[doc(inline)]
143        pub use crate::filter::prelude::Id;
144        #[doc(inline)]
145        pub use crate::filter::prelude::ModId;
146        #[doc(inline)]
147        pub use crate::filter::prelude::DateAdded;
148
149        #[doc(inline)]
150        pub use crate::mods::filters::events::UserId;
151        #[doc(inline)]
152        pub use crate::mods::filters::events::EventType;
153
154        filter!(GameId, GAME_ID, "game_id", Eq, NotEq, In, Cmp, OrderBy);
155    }
156
157    /// Subscriptions filters and sorting.
158    ///
159    /// # Filters
160    /// - `Fulltext`
161    /// - `Id`
162    /// - `GameId`
163    /// - `Status`
164    /// - `Visible`
165    /// - `SubmittedBy`
166    /// - `DateAdded`
167    /// - `DateUpdated`
168    /// - `DateLive`
169    /// - `MaturityOption`
170    /// - `Name`
171    /// - `NameId`
172    /// - `Summary`
173    /// - `Description`
174    /// - `Homepage`
175    /// - `Modfile`
176    /// - `MetadataBlob`
177    /// - `MetadataKVP`
178    /// - `Tags`
179    ///
180    /// # Sorting
181    /// - `Id`
182    /// - `Name`
183    /// - `Downloads`
184    /// - `Popular`
185    /// - `Ratings`
186    /// - `Subscribers`
187    ///
188    /// See the [mod.io docs](https://docs.mod.io/restapiref/#get-user-subscriptions) for more information.
189    ///
190    /// By default this returns up to `100` items. you can limit the result by using `limit` and
191    /// `offset`.
192    ///
193    /// # Example
194    /// ```
195    /// use modio::filter::prelude::*;
196    /// use modio::user::filters::subscriptions::Id;
197    ///
198    /// let filter = Id::_in(vec![1, 2]).order_by(Id::desc());
199    /// ```
200    pub mod subscriptions {
201        #[doc(inline)]
202        pub use crate::filter::prelude::Fulltext;
203        #[doc(inline)]
204        pub use crate::filter::prelude::Id;
205        #[doc(inline)]
206        pub use crate::filter::prelude::Name;
207        #[doc(inline)]
208        pub use crate::filter::prelude::NameId;
209
210        #[doc(inline)]
211        pub use crate::mods::filters::GameId;
212        #[doc(inline)]
213        pub use crate::mods::filters::Status;
214        #[doc(inline)]
215        pub use crate::mods::filters::Visible;
216        #[doc(inline)]
217        pub use crate::mods::filters::SubmittedBy;
218        #[doc(inline)]
219        pub use crate::mods::filters::DateAdded;
220        #[doc(inline)]
221        pub use crate::mods::filters::DateUpdated;
222        #[doc(inline)]
223        pub use crate::mods::filters::DateLive;
224        #[doc(inline)]
225        pub use crate::mods::filters::MaturityOption;
226        #[doc(inline)]
227        pub use crate::mods::filters::Summary;
228        #[doc(inline)]
229        pub use crate::mods::filters::Description;
230        #[doc(inline)]
231        pub use crate::mods::filters::Homepage;
232        #[doc(inline)]
233        pub use crate::mods::filters::Modfile;
234        #[doc(inline)]
235        pub use crate::mods::filters::MetadataBlob;
236        #[doc(inline)]
237        pub use crate::mods::filters::MetadataKVP;
238        #[doc(inline)]
239        pub use crate::mods::filters::Tags;
240
241        #[doc(inline)]
242        pub use crate::mods::filters::Downloads;
243        #[doc(inline)]
244        pub use crate::mods::filters::Popular;
245        #[doc(inline)]
246        pub use crate::mods::filters::Ratings;
247        #[doc(inline)]
248        pub use crate::mods::filters::Subscribers;
249    }
250
251    /// Rating filters and sorting.
252    ///
253    /// # Filters
254    /// - `GameId`
255    /// - `ModId`
256    /// - `Rating`
257    /// - `DateAdded`
258    ///
259    /// # Sorting
260    /// - `GameId`
261    /// - `ModId`
262    /// - `Rating`
263    /// - `DateAdded`
264    ///
265    /// See the [mod.io docs](https://docs.mod.io/restapiref/#get-user-ratings) for more information.
266    ///
267    /// By default this returns up to `100` items. You can limit the result by using `limit` and
268    /// `offset`.
269    ///
270    /// # Example
271    /// ```
272    /// use modio::filter::prelude::*;
273    /// use modio::user::filters::ratings::GameId;
274    /// use modio::user::filters::ratings::DateAdded;
275    /// use modio::user::filters::ratings::Rating;
276    ///
277    /// let filter = GameId::_in(vec![1, 2]).order_by(DateAdded::desc());
278    ///
279    /// let filter = Rating::positive().order_by(DateAdded::desc());
280    /// ```
281    pub mod ratings {
282        use crate::filter::prelude::*;
283
284        #[doc(inline)]
285        pub use crate::filter::prelude::ModId;
286
287        filter!(GameId, GAME_ID, "game_id", Eq, NotEq, In, Cmp, OrderBy);
288        filter!(Rating, RATING, "rating", Eq, NotEq, In, Cmp, OrderBy);
289        filter!(DateAdded, DATE_ADDED, "date_added", Eq, NotEq, In, Cmp, OrderBy);
290
291        impl Rating {
292            pub fn positive() -> Filter {
293                Rating::eq(1)
294            }
295
296            pub fn negative() -> Filter {
297                Rating::eq(-1)
298            }
299        }
300    }
301}