@@ -3,7 +3,9 @@ use serde_json::json;
3
3
use crate :: {
4
4
error:: Errors ,
5
5
resources:: {
6
- data_profile:: ProfileData , fav_list:: FavoriteList , notification:: NotificationsData ,
6
+ beat_stats:: BeatStats , data_profile:: ProfileData , fav_list:: FavoriteList ,
7
+ lang_stats:: LanguageStats , notification:: NotificationsData ,
8
+ pub_data_profile:: UserFoundData , skill_stats:: SkillStats , subm_list:: RecentSubmList ,
7
9
} ,
8
10
} ;
9
11
@@ -227,7 +229,7 @@ impl MyProfile {
227
229
"operationName" : operation_name
228
230
} ) ;
229
231
230
- let query = serde_json:: to_string ( & json_data) . unwrap ( ) ;
232
+ let query = serde_json:: to_string ( & json_data) ? ;
231
233
232
234
let data_info = self
233
235
. client
@@ -241,3 +243,149 @@ impl MyProfile {
241
243
Ok ( serde_json:: from_str :: < ProfileData > ( & data_info) ?)
242
244
}
243
245
}
246
+
247
+ #[ derive( Debug ) ]
248
+ pub struct UserProfile {
249
+ pub ( crate ) client : reqwest:: Client ,
250
+ pub ( crate ) username : String ,
251
+ }
252
+
253
+ impl UserProfile {
254
+ pub async fn user_stats ( & self ) -> Result < UserFoundData , Errors > {
255
+ let query = json ! ( {
256
+ "query" : "query userPublicProfile($username: String!) {\n matchedUser(username: $username) {\n contestBadge {\n name\n expired\n hoverText\n icon\n }\n username\n githubUrl\n twitterUrl\n linkedinUrl\n profile {\n ranking\n userAvatar\n realName\n aboutMe\n school\n websites\n countryName\n company\n jobTitle\n skillTags\n postViewCount\n postViewCountDiff\n reputation\n reputationDiff\n solutionCount\n solutionCountDiff\n categoryDiscussCount\n categoryDiscussCountDiff\n }\n }\n }" ,
257
+ "variables" : {
258
+ "username" : self . username
259
+ } ,
260
+ "operationName" : "userPublicProfile"
261
+ } ) ;
262
+
263
+ let query = serde_json:: to_string ( & query) ?;
264
+
265
+ let data_info = self
266
+ . client
267
+ . post ( "https://leetcode.com/graphql/" )
268
+ . body ( query)
269
+ . send ( )
270
+ . await ?
271
+ . text ( )
272
+ . await ?;
273
+
274
+ Ok ( serde_json:: from_str :: < UserFoundData > ( & data_info) ?)
275
+ }
276
+
277
+ pub async fn language_stats ( & self ) -> Result < LanguageStats , Errors > {
278
+ let query = json ! ( {
279
+ "query" : "query languageStats($username: String!) {\n matchedUser(username: $username) {\n languageProblemCount {\n languageName\n problemsSolved\n }\n }\n }" ,
280
+ "variables" : {
281
+ "username" : self . username
282
+ } ,
283
+ "operationName" : "languageStats"
284
+ } ) ;
285
+
286
+ let query = serde_json:: to_string ( & query) ?;
287
+
288
+ let data_info = self
289
+ . client
290
+ . post ( "https://leetcode.com/graphql/" )
291
+ . body ( query)
292
+ . send ( )
293
+ . await ?
294
+ . text ( )
295
+ . await ?;
296
+
297
+ Ok ( serde_json:: from_str :: < LanguageStats > ( & data_info) ?)
298
+ }
299
+
300
+ pub async fn skill_stats ( & self ) -> Result < SkillStats , Errors > {
301
+ let query = json ! ( {
302
+ "query" : r#"
303
+ query skillStats($username: String!) {
304
+ matchedUser(username: $username) {
305
+ tagProblemCounts {
306
+ advanced {
307
+ tagName
308
+ tagSlug
309
+ problemsSolved
310
+ }
311
+ intermediate {
312
+ tagName
313
+ tagSlug
314
+ problemsSolved
315
+ }
316
+ fundamental {
317
+ tagName
318
+ tagSlug
319
+ problemsSolved
320
+ }
321
+ }
322
+ }
323
+ }
324
+ "# ,
325
+ "variables" : {
326
+ "username" : "1101-1"
327
+ } ,
328
+ "operationName" : "skillStats"
329
+ } ) ;
330
+
331
+ let query = serde_json:: to_string ( & query) ?;
332
+
333
+ let data_info = self
334
+ . client
335
+ . post ( "https://leetcode.com/graphql/" )
336
+ . body ( query)
337
+ . send ( )
338
+ . await ?
339
+ . text ( )
340
+ . await ?;
341
+
342
+ Ok ( serde_json:: from_str :: < SkillStats > ( & data_info) ?)
343
+ }
344
+
345
+ pub async fn problem_beat_stats ( & self ) -> Result < BeatStats , Errors > {
346
+ let query = json ! ( {
347
+ "query" : "query userProblemsSolved($username: String!) {\n matchedUser(username: $username) {\n problemsSolvedBeatsStats {\n difficulty\n percentage\n }\n submitStatsGlobal {\n acSubmissionNum {\n difficulty\n count\n }\n }\n }\n }" ,
348
+ "variables" : {
349
+ "username" : self . username
350
+ } ,
351
+ "operationName" : "userProblemsSolved"
352
+ } ) ;
353
+
354
+ let query = serde_json:: to_string ( & query) ?;
355
+
356
+ let data_info = self
357
+ . client
358
+ . post ( "https://leetcode.com/graphql/" )
359
+ . body ( query)
360
+ . send ( )
361
+ . await ?
362
+ . text ( )
363
+ . await ?;
364
+
365
+ Ok ( serde_json:: from_str :: < BeatStats > ( & data_info) ?)
366
+ }
367
+
368
+ pub async fn recent_subm_list ( & self ) -> Result < RecentSubmList , Errors > {
369
+ let query = json ! ( {
370
+ "query" : "query recentAcSubmissions($username: String!, $limit: Int!) {\n recentAcSubmissionList(username: $username, limit: $limit) {\n id\n title\n titleSlug\n timestamp\n }\n }" ,
371
+ "variables" : {
372
+ "username" : self . username,
373
+ "limit" : 15
374
+ } ,
375
+ "operationName" : "recentAcSubmissions"
376
+ } ) ;
377
+
378
+ let query = serde_json:: to_string ( & query) ?;
379
+
380
+ let data_info = self
381
+ . client
382
+ . post ( "https://leetcode.com/graphql/" )
383
+ . body ( query)
384
+ . send ( )
385
+ . await ?
386
+ . text ( )
387
+ . await ?;
388
+
389
+ Ok ( serde_json:: from_str :: < RecentSubmList > ( & data_info) ?)
390
+ }
391
+ }
0 commit comments