Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.

Commit 123e7bc

Browse files
committed
Update, date - Thu 07/21/2022, time - 2:15:22.76
1 parent 7e46663 commit 123e7bc

File tree

5 files changed

+119
-17
lines changed

5 files changed

+119
-17
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ Scripts
1414
/test.json
1515
/README.md
1616
/build.bat
17+
Perks & IDs.json
18+
/Perks & IDs.json

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
632632
the "copyright" line and a pointer to where the full notice is found.
633633

634634
<one line to give the program's name and a brief idea of what it does.>
635-
Copyright (__C) <year> <name of author>
635+
Copyright (__C) 2022 Todo Lodo
636636

637637
This program is free software: you can redistribute it and/or modify
638638
it under the terms of the GNU General Public License as published by

cod_api/__init__.py

Lines changed: 114 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
# Imports
44
import asyncio
5+
from datetime import datetime
56
import enum
67
import json
78
import requests
@@ -84,19 +85,32 @@ def login(self, ssoToken: str):
8485
f'tfa_enrollment_seen=true;' \
8586
f'gtm.custom.bot.flag=human;'
8687

87-
r = requests.get(f"{self.__common.baseUrl}{self.__common.apiPath}/crm/cod/v2/identities/{ssoToken}", headers=self.__common.baseHeaders)
88+
r = requests.get(f"{self.__common.baseUrl}{self.__common.apiPath}/crm/cod/v2/identities/{ssoToken}",
89+
headers=self.__common.baseHeaders)
8890

8991
if r.json()['status'] == 'success':
9092
self.__common.loggedIn = True
91-
for sub in [self.Warzone, self.ModernWarfare, self.ColdWar, self.Vanguard, self.Shop, self.Me, self.Misc]:
93+
for sub in [self.Warzone, self.ModernWarfare, self.ColdWar,
94+
self.Vanguard, self.Shop, self.Me, self.Misc]:
9295
sub.loggedIn = self.__common.loggedIn
9396
sub.baseSsoToken = self.__common.baseSsoToken
9497
sub.baseHeaders = self.__common.baseHeaders
9598
sub.basePostHeaders = self.__common.basePostHeaders
99+
100+
# deleting scope data
101+
del ssoToken, sub, r
96102
else:
103+
# delete scope data
104+
del ssoToken, r
105+
106+
# system exit
97107
sys.exit(InvalidToken(ssoToken))
98108
except Exception as e:
99109
print(e)
110+
111+
# delete scope data
112+
del ssoToken
113+
100114
return e
101115

102116

@@ -117,7 +131,10 @@ def __init__(self):
117131

118132
# headers & cookies
119133
self.fakeXSRF = str(uuid.uuid4())
120-
self.userAgent: str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
134+
self.userAgent: str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " \
135+
"AppleWebKit/537.36 (KHTML, like Gecko) " \
136+
"Chrome/74.0.3729.169 " \
137+
"Safari/537.36"
121138
self.baseCookie: str = "new_SiteId=cod;ACT_SSO_LOCALE=en_US;country=US;"
122139
self.baseSsoToken: str = ''
123140
self.baseUrl: str = "https://my.callofduty.com"
@@ -163,8 +180,15 @@ async def __Request(self, method, url):
163180

164181
try:
165182
r = requests.request(method=method, url=url, headers=h, data=b)
183+
# delete scope data
184+
del method, url, h, b
185+
186+
# return data
166187
return r
167188
except Exception as e:
189+
# delete scope data
190+
del method, url, h, b
191+
168192
return e
169193

170194
async def __sendRequest(self, url: str):
@@ -175,13 +199,23 @@ async def __sendRequest(self, url: str):
175199
data = respond.json()
176200
if data['status'] == 'success':
177201
data = self.__mapping(data['data'])
202+
# delete scope data
203+
del url, respond
204+
205+
# return data
178206
return data
179207
else:
208+
# delete scope data
209+
del url, respond
210+
180211
sys.exit(StatusError())
181212
else:
213+
# delete scope data
214+
del url
215+
182216
return respond.status_code
183217
else:
184-
raise NotLoggedIn
218+
sys.exit(NotLoggedIn())
185219

186220
async def __sendPostRequest(self, url: str, body: dict):
187221
if self.loggedIn:
@@ -196,8 +230,8 @@ async def __sendPostRequest(self, url: str, body: dict):
196230
raise NotLoggedIn()
197231

198232
# client name url formatter
199-
def __cleanClientName(self, ganertage):
200-
return quote(ganertage.encode("utf-8"))
233+
def __cleanClientName(self, gamertag):
234+
return quote(gamertag.encode("utf-8"))
201235

202236
# helper
203237
def __helper(self, platform, gamertag):
@@ -213,24 +247,89 @@ def __helper(self, platform, gamertag):
213247
# mapping
214248
def __mapping(self, data):
215249
r = requests.get('https://engineer152.github.io/wz-data/weapon-ids.json')
216-
guns = r.json()['All Weapons']
250+
guns = r.json()
217251
r = requests.get('https://engineer152.github.io/wz-data/game-modes.json')
218-
modes = r.json()['modes']
252+
modes = r.json()
253+
r = requests.get('https://engineer152.github.io/wz-data/perks.json')
254+
perks = r.json()
219255

220256
# guns
221257
try:
222-
for m in data['matches']:
223-
for l in m['player']['loadouts']:
224-
if l['primaryWeapon']['label'] is None:
225-
l['primaryWeapon']['label'] = guns[l['primaryWeapon']['name']]
226-
227-
if l['secondaryWeapon']['label'] is None:
228-
l['secondaryWeapon']['label'] = guns[l['secondaryWeapon']['name']]
258+
for match in data['matches']:
259+
# time stamps
260+
try:
261+
match['utcStartDateTime'] = datetime.fromtimestamp(match['utcStartSeconds']).strftime("%A, %B %d, %Y, %I:%M:%S")
262+
match['utcEndDateTime'] = datetime.fromtimestamp(match['utcEndSeconds']).strftime("%A, %B %d, %Y, %I:%M:%S")
263+
except KeyError:
264+
pass
265+
266+
# loadouts list
267+
for loadout in match['player']['loadouts']:
268+
# weapons
269+
if loadout['primaryWeapon']['label'] is None:
270+
try:
271+
loadout['primaryWeapon']['label'] = guns[loadout['primaryWeapon']['name']]
272+
except KeyError:
273+
pass
274+
if loadout['secondaryWeapon']['label'] is None:
275+
try:
276+
loadout['secondaryWeapon']['label'] = guns[loadout['secondaryWeapon']['name']]
277+
except KeyError:
278+
pass
279+
280+
# perks list
281+
for perk in loadout['perks']:
282+
if perk['label'] is None:
283+
try:
284+
perk['label'] = perks[perk['name']]
285+
except KeyError:
286+
pass
287+
288+
# extra perks list
289+
for perk in loadout['extraPerks']:
290+
if perk['label'] is None:
291+
try:
292+
perk['label'] = perks[perk['name']]
293+
except KeyError:
294+
pass
295+
296+
# loadout list
297+
for loadout in match['player']['loadout']:
298+
if loadout['primaryWeapon']['label'] is None:
299+
try:
300+
loadout['primaryWeapon']['label'] = guns[loadout['primaryWeapon']['name']]
301+
except KeyError:
302+
pass
303+
if loadout['secondaryWeapon']['label'] is None:
304+
try:
305+
loadout['secondaryWeapon']['label'] = guns[loadout['secondaryWeapon']['name']]
306+
except KeyError:
307+
pass
308+
309+
# perks list
310+
for perk in loadout['perks']:
311+
if perk['label'] is None:
312+
try:
313+
perk['label'] = perks[perk['name']]
314+
except KeyError:
315+
pass
316+
317+
# extra perks list
318+
for perk in loadout['extraPerks']:
319+
if perk['label'] is None:
320+
try:
321+
perk['label'] = perks[perk['name']]
322+
except KeyError:
323+
pass
229324
except KeyError:
230325
pass
231326
except Exception as e:
232327
print(e)
233328

329+
# delete scope data
330+
del guns, modes, perks, match, loadout, perk
331+
332+
# return mapped or unmapped data
234333
return data
235334

236335
# API Requests

reuirements_dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
asyncio
2+
datetime
23
enum34
34
requests
45
twine

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from setuptools import setup
22

3-
requirements = ["asyncio", "requests", "uuid", "urllib3", "enum34", "json", "sys"]
3+
requirements = ["asyncio", "datetime", "requests", "uuid", "urllib3", "enum34", "json", "sys"]
44

55
setup(
66
name="cod_api",

0 commit comments

Comments
 (0)