1
1
from datetime import datetime
2
2
from datetime import timezone
3
+ import requests
4
+ import time
5
+ import re
3
6
4
7
def ordinal (n : int ) -> str :
5
8
"""
@@ -13,4 +16,68 @@ def translate_date(a_date):
13
16
14
17
dayOrdinal = ordinal (date1 .day )
15
18
16
- return date1 .strftime (f'%A, { dayOrdinal .strip ()} %B %Y' )
19
+ return date1 .strftime (f'%A, { dayOrdinal .strip ()} %B %Y' )
20
+
21
+ def make_api_call (url ):
22
+ try :
23
+
24
+ # Issue a Request
25
+ response = requests .get (url )
26
+
27
+ # Fetch a Response
28
+ return response .json ()
29
+
30
+ except :
31
+
32
+ return None
33
+
34
+ def get_pages (User ):
35
+
36
+ codewars_user = "https://www.codewars.com/api/v1/users/{}/code-challenges/completed?page=0" .format (User )
37
+
38
+ response_json = make_api_call (codewars_user )
39
+
40
+ # Return Number of Completed Challenge Pages
41
+ return int (response_json ['totalPages' ])
42
+
43
+ def get_user_info (username ,platform ):
44
+ challenge_data = {}
45
+ user_data = {}
46
+
47
+ match platform :
48
+
49
+ case "Codewars" :
50
+
51
+ Pages = get_pages (User = username )
52
+ # Completed = response_json['totalItems']
53
+
54
+ for x in range (Pages ):
55
+ current_page = "https://www.codewars.com/api/v1/users/{}/code-challenges/completed?page={}" .format (username ,x )
56
+
57
+ response_json = make_api_call (current_page )
58
+
59
+ for challenge in response_json ['data' ]:
60
+ challenge_data [str (challenge ['id' ]).strip ()] = {'Name' : str (challenge ['name' ]).strip (), 'Completed at' : translate_date (challenge ['completedAt' ].strip ()), 'Additional Info' : {}}
61
+
62
+ for each in challenge_data :
63
+
64
+ challenge_info = "https://www.codewars.com/api/v1/code-challenges/{}" .format (each )
65
+
66
+ time .sleep (2 )
67
+
68
+ parsed_info = make_api_call (challenge_info )
69
+
70
+ challenge_data [each ]['Additional Info' ] = {'url' : str (parsed_info ['url' ] + '/python' ).strip (), 'rank' : str (re .sub (' ' ,'-' ,parsed_info ['rank' ]['name' ]).strip ()), 'tags' : parsed_info ['tags' ]}
71
+
72
+ user_data [username ] = { 'Total Completed' : int (response_json ['totalItems' ]), 'Statistics' : { "1-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "1-kyu" ]),
73
+ "2-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "2-kyu" ]),
74
+ "3-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "3-kyu" ]),
75
+ "4-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "4-kyu" ]),
76
+ "5-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "5-kyu" ]),
77
+ "6-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "6-kyu" ]),
78
+ "7-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "7-kyu" ]),
79
+ "8-kyu" : len ([k for k ,v in challenge_data .items () if v ['Additional Info' ]['rank' ] == "8-kyu" ])
80
+ },'Challenges' : challenge_data }
81
+
82
+ return user_data
83
+
0 commit comments