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}