diff --git a/assets/build/icon/128x128.png b/assets/build/icon/128x128.png deleted file mode 100644 index 463e9cf..0000000 Binary files a/assets/build/icon/128x128.png and /dev/null differ diff --git a/assets/build/icon/16x16.png b/assets/build/icon/16x16.png deleted file mode 100644 index cc6efb7..0000000 Binary files a/assets/build/icon/16x16.png and /dev/null differ diff --git a/assets/build/icon/256x256.png b/assets/build/icon/256x256.png deleted file mode 100644 index dfd0665..0000000 Binary files a/assets/build/icon/256x256.png and /dev/null differ diff --git a/assets/build/icon/32x32.png b/assets/build/icon/32x32.png deleted file mode 100644 index da2794a..0000000 Binary files a/assets/build/icon/32x32.png and /dev/null differ diff --git a/assets/build/icon/48x48.png b/assets/build/icon/48x48.png deleted file mode 100644 index 47f6e89..0000000 Binary files a/assets/build/icon/48x48.png and /dev/null differ diff --git a/assets/build/icon/512x512.png b/assets/build/icon/512x512.png deleted file mode 100644 index 68a0732..0000000 Binary files a/assets/build/icon/512x512.png and /dev/null differ diff --git a/assets/build/icon/64x64.png b/assets/build/icon/64x64.png deleted file mode 100644 index e6517c9..0000000 Binary files a/assets/build/icon/64x64.png and /dev/null differ diff --git a/assets/build/icon/icon.ico b/assets/icon.ico similarity index 100% rename from assets/build/icon/icon.ico rename to assets/icon.ico diff --git a/build.py b/build.py index 9b5a53e..0f798f8 100644 --- a/build.py +++ b/build.py @@ -5,7 +5,7 @@ import PyInstaller.__main__ # Constants for your project SCRIPT = "get_cod_stats.py" -ICON = "assets/build/icon/icon.ico" +ICON = "assets/icon.ico" NAME = "get_cod_stats" DIST_PATH = "bin" @@ -33,4 +33,4 @@ shutil.rmtree('build', ignore_errors=True) os.remove('get_cod_stats.spec') # Optional: Pause at the end (like the 'pause' in batch script) -input("Press Enter to continue...") \ No newline at end of file +input("Press Enter to continue...") diff --git a/cod_api/build.bat b/cod_api/build.bat new file mode 100644 index 0000000..4fa2f12 --- /dev/null +++ b/cod_api/build.bat @@ -0,0 +1 @@ +python setup.py bdist_wheel diff --git a/cod_api/setup.py b/cod_api/setup.py new file mode 100644 index 0000000..215152a --- /dev/null +++ b/cod_api/setup.py @@ -0,0 +1,6 @@ +from setuptools import setup, find_packages +setup( + name='cod_api', version='2.0.1', + packages=find_packages(), + install_requires=[], +) diff --git a/data/everything.json b/data/everything.json deleted file mode 100644 index f84191b..0000000 --- a/data/everything.json +++ /dev/null @@ -1,2185 +0,0 @@ -{ - "maps:mw-mp_hackney_yard:1": "Hackney Yard (Night)", - "maps:mw-mp_aniyah:1": "Aniyah Palace", - "maps:mw-mp_euphrates:1": "Euphrates Bridge", - "maps:mw-mp_raid:1": "Grazna Raid", - "maps:mw-mp_m_pine:1": "Pine", - "maps:mw-mp_m_stack:1": "Stack", - "maps:mw-mp_deadzone:1": "Arklov Peak", - "maps:mw-mp_quarry2:1": "Karst River Quarry", - "maps:mw-mp_m_overunder:1": "Docks", - "maps:mw-mp_cave_am:1": "Azhir Cave", - "maps:mw-mp_cave:1": "Azhir Cave (Night)", - "maps:mw-mp_runner:1": "Gun Runner", - "maps:mw-mp_runner_pm:1": "Gun Runner (Night)", - "maps:mw-mp_hackney_am:1": "Hackney Yard", - "maps:mw-mp_piccadilly:1": "Piccadilly", - "maps:mw-mp_spear:1": "Rammaza", - "maps:mw-mp_spear_pm:1": "Rammaza (Night)", - "maps:mw-mp_petrograd:1": "St. Petrograd", - "maps:mw-mp_m_hill:1": "Hill", - "maps:mw-mp_m_king:1": "King", - "maps:mw-mp_m_speedball:1": "Speedball", - "maps:mw-mp_m_showers:1": "Gulag Showers", - "maps:mw-mp_downtown_gw:1": "Tarvosk District", - "maps:mw-mp_m_speed:1": "Shoot House", - "maps:mw-mp_farms2_gw:1": "Krovnik Farmland", - "maps:mw-mp_port2_gw:1": "Port", - "maps:mw-mp_crash2:1": "Crash", - "maps:mw-mp_vacant:1": "Vacant", - "maps:mw-mp_shipment:1": "Shipment", - "maps:mw-mp_m_cargo:1": "Cargo", - "maps:mw-mp_m_cage:1": "Atrium", - "maps:mw-mp_m_overwinter:1": "Docks", - "maps:mw-mp_emporium:1": "Atlas Superstore", - "maps:mw-mp_rust:1": "Rust", - "maps:mw-mp_boneyard_gw:1": "Zhokov Boneyard", - "maps:mw-mp_m_fork:1": "Bazaar", - "maps:mw-mp_donetsk:1": "Verdansk", - "maps:mw-mp_hideout:1": "Khandor Hideout", - "maps:mw-loading_mp_hideout:1": "Khandor Hideout", - "maps:mw-mp_aniyah_tac:1": "Aniyah Incursion", - "maps:mw-mp_backlot2:1": "Talsik Backlot", - "maps:mw-mp_village2:1": "Hovec Sawmill", - "maps:mw-mp_hardhat:1": "Hardhat", - "maps:mw-mp_m_wallco2:1": "Aisle 9", - "maps:mw-mp_donetsk2:1": "Verdansk", - "maps:mw-mp_scrapyard:1": "Zhokov Scrapyard", - "maps:mw-mp_m_trench:1": "Trench", - "maps:mw-mp_promenade_gw:1": "Barakett Promenade", - "maps:mw-mp_don3:1": "Verdansk", - "maps:mw-mp_garden:1": "Cheshire Park", - "maps:mw-mp_oilrig:1": "Petrov Oil Rig", - "maps:mw-mp_harbor:1": "Suldal Harbor", - "maps:mw-mp_layover_gw:1": "Verdansk International Airport", - "maps:mw-mp_m_cornfield:1": "Livestock", - "maps:mw-mp_m_stadium:1": "Verdansk Stadium", - "maps:mw-mp_malyshev:1": "Mialstor Tank Factory", - "maps:mw-mp_malyshev_10v10:1": "Mialstor Tank Factory", - "maps:mw-mp_broadcast2:1": "Broadcast", - "maps:mw-mp_riverside_gw:1": "Verdansk Riverside", - "maps:mw-mp_m_train:1": "Station", - "maps:mw-mp_kstenod:1": "Verdansk (Night)", - "maps:mw-mp_escape2:1": "Rebirth", - "maps:mw-mp_herat:1": "Al-Raab Airbase", - "maps:mw-mp_killhouse:1": "Killhouse", - "maps:mw-mp_m_drainage:1": "Drainage", - "maps:cw-mp_cartel:1": "Cartel", - "maps:cw-mp_tank:1": "Garrison", - "maps:cw-mp_miami:1": "Miami", - "maps:cw-mp_moscow:1": "Moscow", - "maps:cw-mp_satellite:1": "Satellite", - "maps:cw-mp_kgb:1": "Checkmate", - "maps:cw-wz_forest:1": "Ruka", - "maps:cw-wz_ski_slopes:1": "Alpine", - "maps:cw-mp_nuketown6:1": "Nuketown '84", - "maps:cw-mp_tundra:1": "Crossroads", - "maps:cw-mp_black_sea:1": "Armada", - "maps:cw-mp_mall:1": "The Pines", - "maps:cw-mp_raid_rm:1": "Raid", - "maps:cw-mp_sm_berlin_tunnel:1": "U-Bahn", - "maps:cw-mp_sm_finance:1": "KGB", - "maps:cw-mp_sm_game_show:1": "Game Show", - "maps:cw-mp_sm_central:1": "ICBM", - "maps:cw-wz_sanatorium:1": "Sanatorium", - "maps:cw-nuketown6_holiday:1": "Nuketown '84 Holiday", - "maps:cw-mp_express_rm:1": "Express", - "maps:cw-mp_apocalypse:1": "Apocalypse", - "maps:cw-mp_sm_market:1": "Mansion", - "maps:cw-mp_miami_strike:1": "Miami Strike", - "maps:cw-wz_golova:1": "Golova", - "maps:cw-mp_cliffhanger:1": "Yamantau", - "maps:cw-mp_sm_gas_station:1": "Diesel", - "maps:mw-mp_don4:1": "Verdansk '84", - "maps:cw-wz_duga:1": "Duga", - "maps:cw-mp_village_rm:1": "Standoff", - "maps:cw-mp_sm_amsterdam:1": "Amsterdam", - "maps:cw-mp_dune:1": "Collateral", - "maps:cw-mp_hijacked_rm:1": "Hijacked", - "maps:mw-mp_escape3:1": "Rebirth", - "maps:cw-mp_paintball_rm:1": "Rush", - "maps:cw-mp_sm_deptstore:1": "Showroom", - "maps:cw-mp_slums_rm:1": "Slums", - "maps:cw-mp_echelon:1": "Echelon", - "maps:cw-mp_drivein_rm:1": "Drive In", - "maps:cw-mp_zoo_rm:1": "Zoo", - "maps:cw-mp_firebase:1": "Deprogram", - "maps:cw-mp_amerika:1": "Amerika", - "maps:cw-mp_sm_vault:1": "Gluboko", - "maps:cw-mp_don4_pm:1": "Nuketown '84 Halloween", - "maps:mw-mp_don4_pm:1": "Verdansk Halloween", - "maps:vg-mp_berlin_01:1": "Berlin", - "maps:vg-mp_bocage_2:1": "Bocage", - "maps:vg-mp_castle2:1": "Castle", - "maps:vg-mp_whitehouse_2:1": "Das Haus", - "maps:vg-mp_destruct_01:1": "Decoy", - "maps:vg-mp_winter:1": "Demyansk", - "maps:vg-mp_elalamein:1": "Desert Siege", - "maps:vg-mp_dome2:1": "Dome", - "maps:vg-mp_nest2:1": "Eagle\\u2019s Nest", - "maps:vg-mp_gavutu2:1": "Gavutu", - "maps:vg-mp_royal_hotel:1": "Hotel Royal", - "maps:vg-mp_24h_hill_01:1": "Numa Numa", - "maps:vg-mp_oasis_v3:1": "Oasis", - "maps:vg-mp_red_star:1": "Red Star", - "maps:vg-mp_subpen:1": "Sub Pens", - "maps:vg-mp_tuscan:1": "Tuscan", - "maps:vg-mp_arena_evo:1": "Champion Hill", - "maps:vg-mp_shipment_s4:1": "Shipment", - "maps:vg-mp_radar:1": "Radar", - "maps:mw-mp_wz_island:1": "Caldera", - "maps:vg-mp_paradise:1": "Paradise", - "maps:vg-mp_shipmas_s4:1": "Shipmas", - "maps:mw-mp_escape4:1": "Rebirth", - "maps:vg-mp_monsters:1": "Mayhem", - "maps:mp_sm_island_1:1": "Fortune's Keep", - "game-modes:mw-career:1": "Career", - "game-modes:mw-war:1": "Team Deathmatch", - "game-modes:mw-sd:1": "Search and Destroy", - "game-modes:mw-dom:1": "Domination", - "game-modes:mw-tdef:1": "Team Defender", - "game-modes:mw-dm:1": "Free-for-all", - "game-modes:mw-koth:1": "Hardpoint", - "game-modes:mw-hq:1": "Headquarters", - "game-modes:mw-arena:1": "Gunfight", - "game-modes:mw-arm:1": "Ground War", - "game-modes:mw-conf:1": "Kill Confirmed", - "game-modes:mw-cyber:1": "Cyber Attack", - "game-modes:mw-hc_war:1": "Team Deathmatch Hardcore", - "game-modes:mw-hc_arena:1": "Gunfight Hardcore", - "game-modes:mw-hc_arm:1": "Ground War Hardcore", - "game-modes:mw-hc_conf:1": "Kill Confirmed Hardcore", - "game-modes:mw-hc_cyber:1": "Cyber Attack Hardcore", - "game-modes:mw-hc_dm:1": "Free-for-all Hardcore", - "game-modes:mw-hc_hq:1": "Headquarters Hardcore", - "game-modes:mw-hc_dom:1": "Domination Hardcore", - "game-modes:mw-hc_sd:1": "Search and Destroy Hardcore", - "game-modes:mw-cyber_hc:1": "Cyber Attack Hardcore", - "game-modes:mw-war_hc:1": "Team Deathmatch Hardcore", - "game-modes:mw-dom_hc:1": "Domination Hardcore", - "game-modes:mw-sd_hc:1": "Search and Destroy Hardcore", - "game-modes:mw-conf_hc:1": "Kill Confirmed Hardcore", - "game-modes:mw-gun:1": "Gun Game", - "game-modes:mw-gun_hc:1": "Gun Game Hardcore", - "game-modes:mw-siege:1": "Reinforce", - "game-modes:mw-infect:1": "Infected", - "game-modes:mw-arena_osp:1": "Gunfight O.S.P.", - "game-modes:mw-hq_hc:1": "Headquarters Hardcore", - "game-modes:mw-grnd:1": "Grind", - "game-modes:mw-grind:1": "Grind", - "game-modes:mw-ctf:1": "Capture the Flag", - "game-modes:mw-br_all:1": "All", - "game-modes:mw-br:1": "Battle Royale", - "game-modes:mw-br_dmz:1": "Plunder", - "game-modes:mw-br_dmz_38:1": "Plunder Quads", - "game-modes:mw-br_87:1": "BR Solos", - "game-modes:mw-br_dmz_104:1": "Blood Money", - "game-modes:mw-koth_hc:1": "Hardpoint Hardcore", - "game-modes:mw-br_25:1": "BR Trios", - "game-modes:mw-br_89:1": "BR Quads", - "game-modes:mw-br_dmz_76:1": "Plunder Quads", - "game-modes:mw-br_77:1": "BR Scopes & Scatterguns", - "game-modes:mw-br_dmz_85:1": "Plunder Duos", - "game-modes:mw-dd_hc:1": "Demolition Hardcore", - "game-modes:mw-dd:1": "Demolition", - "game-modes:mw-br_71:1": "BR Solos", - "game-modes:mw-br_74:1": "BR Trios", - "game-modes:mw-br_88:1": "BR Duos", - "game-modes:mw-brtdm_113:1": "Warzone Rumble", - "game-modes:mw-brtdm_rmbl:1": "Warzone Rumble", - "game-modes:mw-br_brsolo:1": "BR Solos", - "game-modes:mw-br_brduos:1": "BR Duos", - "game-modes:mw-br_brtrios:1": "BR Trios", - "game-modes:mw-br_brquads:1": "BR Quads", - "game-modes:mw-br_dmz_plnbld:1": "Blood Money", - "game-modes:mw-br_br_real:1": "Realism Battle Royale", - "game-modes:mw-br_86:1": "Realism Battle Royale", - "game-modes:mw-br_brthquad:1": "BR 200 Quads", - "game-modes:mw-br_jugg_brtriojugr:1": "Juggernaut Royal Trios", - "game-modes:br_dmz_plunquad:1": "Plunder Quads", - "game-modes:br_dmz_bldmnytrio:1": "Blood Money Trios", - "game-modes:mw-br_dmz_plunquad:1": "Plunder Quads", - "game-modes:mw-br_dmz_bldmnytrio:1": "Blood Money Trios", - "game-modes:mw-br_mini_miniroyale:1": "Mini Royale", - "game-modes:br_mini_miniroyale:1": "Mini Royale", - "game-modes:mw-br_brbbsolo:1": "BR Buyback Solos", - "game-modes:mw-br_jugg_brquadjugr:1": "Juggernaut Royal Quads", - "game-modes:mw-br_kingslayer_kingsltrios:1": "King Slayer Trios", - "game-modes:mw-br_truckwar_trwarsquads:1": "Armored Royale Quads", - "game-modes:mw-br_zxp_zmbroy:1": "Zombie Royale", - "game-modes:mw-br_brhwntrios:1": "BR Trick-Or-Trios", - "game-modes:mw-rugby:1": "Onslaughter", - "game-modes:mw-br_brsolohwn:1": "BR Solo Survivor", - "game-modes:mw-br_dmz_plndcndy:1": "Plunder: Candy Collector", - "game-modes:mw-br_jugg_jugpmpkn:1": "Juggourdnaut Royale", - "game-modes:mw-br_rebirth_rbrthtrios:1": "Resurgence Trio", - "game-modes:mw-br_rebirth_rbrthduos:1": "Resurgence Duos", - "game-modes:mw-br_rebirth_rbrthquad:1": "Rebirth Resurgance Quads", - "game-modes:cw-tdm:1": "Team Deathmatch", - "game-modes:cw-tdm_hc:1": "Hardcore Team Deathmatch", - "game-modes:cw-dm:1": "Free For All", - "game-modes:cw-dm_hc:1": "Hardcore Free For All", - "game-modes:cw-sd:1": "Search and Destroy", - "game-modes:cw-sd_hc:1": "Hardcore Search and Destroy", - "game-modes:cw-dom:1": "Domination", - "game-modes:cw-dom_hc:1": "Hardcore Domination", - "game-modes:cw-koth:1": "Hardpoint", - "game-modes:cw-control:1": "Control", - "game-modes:cw-vip:1": "VIP Escort", - "game-modes:cw-conf:1": "Kill Confirmed", - "game-modes:cw-conf_hc:1": "Hardcore Kill Confirmed", - "game-modes:cw-dom10v10:1": "Combined Arms: Domination", - "game-modes:cw-war12v12:1": "Combined Arms: Assault", - "game-modes:cw-fireteam_dirty_bomb:1": "Fireteam: Dirty Bomb", - "game-modes:cw-prop:1": "Prop Hunt", - "game-modes:cw-gunfight:1": "Gunfight", - "game-modes:cw-gunfight_3v3:1": "Gunfight 3v3", - "game-modes:cw-war:1": "Team Deathmatch", - "game-modes:cw-dropkick:1": "Dropkick", - "game-modes:cw-dom_snipe_bb:1": "Snipers Only Domination", - "game-modes:cw-tdm_snipe_bb:1": "Snipers Only TDM", - "game-modes:cw-fireteam_dirty_bomb_endurance:1": "Fireteam: Endurance Dirty Bomb", - "game-modes:cw-gun:1": "Gun Game", - "game-modes:cw-clean:1": "St. Patrick's Stockpile", - "game-modes:cw-fireteam_koth:1": "Fireteam: Hardpoint", - "game-modes:mw-br_dmz_plndtrios:1": "Plunder Trios", - "game-modes:cw-sas:1": "Sticks and Stones", - "game-modes:mw-br_rebirth_resurgence_trios:1": "Verdansk Resurgence Trios", - "game-modes:mw-br_mini_rebirth_mini_royale_quads:1": "Rebirth Mini Royale Quads", - "game-modes:cw-koth_diehard:1": "Cranked Hardpoint", - "game-modes:mw-br_bodycount_pwergrb:1": "Power Grab", - "game-modes:cw-fireteam_elimination:1": "Fireteam: Elimination", - "game-modes:cw-gun_rambo:1": "Rambo's Gun Game", - "game-modes:mw-br_rebirth_resurgence_mini:1": "Verdansk Resurgence Mini", - "game-modes:cw-fireteam_satlink:1": "Multi-Team: Sat-Link", - "game-modes:cw-mp_hijacked_rm:1": "Hijacked", - "game-modes:cw-oic:1": "One in the Chamber", - "game-modes:cw-koth_hc:1": "Hardcore Hardpoint", - "game-modes:cw-koth_cdl:1": "Hardpoint CDL", - "game-modes:cw-sd_cdl:1": "Search And Destroy CDL", - "game-modes:cw-ctf:1": "Capture the Flag", - "game-modes:mw-br_payload_payload:1": "Payload", - "game-modes:cw-spy:1": "Double Agent", - "game-modes:mw-br_mini_rebirth_mini_royale_trios:1": "Rebirth Mini Royale Trios", - "game-modes:mw-br_x2_br_reveal_x2_event/event_title_x2:1": "Battle of Verdansk", - "game-modes:mw-br_rumble_clash:1": "Clash", - "game-modes:cw-dem:1": "Demolition", - "game-modes:mw-br_dbd_dbd:1": "Iron Trials '84", - "game-modes:mw-br_gxp_gov:1": "Ghosts of Verdansk", - "game-modes:cw-infect:1": "Infected", - "game-modes:cw-scream:1": "Scream Deathmatch", - "game-modes:vg-patrol:1": "Patrol", - "game-modes:vg-sd:1": "Search & Destroy", - "game-modes:vg-dom:1": "Domination", - "game-modes:vg-war:1": "Team Deathmatch", - "game-modes:vg-koth:1": "Hardpoint", - "game-modes:vg-dm:1": "Free-For-All", - "game-modes:vg-conf:1": "Kill Confirmed", - "game-modes:vg-war_hc:1": "HC Team Deathmatch", - "game-modes:vg-dom_hc:1": "HC Domination", - "game-modes:vg-conf_hc:1": "HC Kill Confirmed", - "game-modes:vg-sd_hc:1": "HC Search and Destroy", - "game-modes:vg-patrol_hc:1": "HC Patrol", - "game-modes:vg-dm_hc:1": "HC Free-For-All", - "game-modes:vg-koth_hc:1": "HC Hardpoint", - "game-modes:vg-arena_evo:1": "Champion Hill", - "game-modes:vg-arena_evo_doubles:1": "Champion Hill Duos", - "game-modes:vg-arena_evo_trios:1": "Champion Hill Trios", - "game-modes:mw-br_dbd_iron_trials_duos:1": "Iron Trials '84 Duos", - "game-modes:mw-br_vg_royale_quads:1": "Vanguard Royale Quads", - "game-modes:mw-br_vg_royale_duos:1": "Vanguard Royale Duos", - "game-modes:mw-br_vg_royale_solo:1": "Vanguard Royale Solo", - "game-modes:mw-br_rebirth_cal_res_royale:1": "Vanguard Resurgence Quads", - "game-modes:mw-br_vg_royale_trios:1": "Vanguard Royale Trios", - "game-modes:mw-br_rumble_clash_caldera:1": "Caldera Clash", - "game-modes:br_rebirth_playlist_wz340/fortkeep_res_quad:1": "Fortune Resurgence Quads", - "game-modes:br_respect_playlist_wz335/respect:1": "Champion of Caldera", - "game-modes:mw-br_olaride_playlist_wz350/olaride:1": "operation: last call", - "game-modes:mw-br_dbd_playlist_wz320/rbrthdbd_quads:1": "Rebirth iron trials quads", - "game-modes:mw-br_rebirth_playlist_wz340/fortkeep_res_quads:1": "Fortune\\u2019s keep resurgence quads", - "game-modes:mw-br_rebirth_playlist_wz340/fortkeep_res_trios:1": "Fortune\\u2019s keep resurgence trios", - "game-modes:mw-br_rebirth_playlist_wz340/fortkeep_res_duos:1": "Fortune\\u2019s keep resurgence duos", - "game-modes:mw-br_rebirth_playlist_wz340/fortkeep_res_solos:1": "Fortune\\u2019s keep resurgence solos", - "general:search-for-players-header:1": "Search for players", - "general:username-text:1": "username", - "general:something-went-wrong-error-text:1": "Something went wrong. Try again.", - "general:go-to-profile-text:1": "Go to profile", - "general:your-text:1": "your", - "general:bo4-title:1": "Black Ops 4", - "general:wwii-title:1": "WWII", - "general:iw-title:1": "Infinite Warfare", - "general:cw-title:1": "Cold War", - "general:bocw-title:1": "Black Ops Cold War", - "general:multiplayer-text:1": "Multiplayer", - "general:getting-user:1": "Getting user...", - "general:error-getting-user:1": "Error getting user.", - "general:zombies-title:1": "Zombies", - "general:alert-taken-to:1": "You will be taken to", - "general:seconds-ago:1": "$time seconds ago", - "general:minutes-ago:1": "$time minutes ago", - "general:hours-ago:1": "$time hours ago", - "general:days-ago:1": "$time days ago", - "general:weeks-ago:1": "$time weeks ago", - "general:months-ago:1": "$time months ago", - "general:years-ago:1": "$time years ago", - "general:second-ago:1": "$time second ago", - "general:minute-ago:1": "$time minute ago", - "general:hour-ago:1": "$time hour ago", - "general:day-ago:1": "$time day ago", - "general:week-ago:1": "$time week ago", - "general:month-ago:1": "$time month ago", - "general:year-ago:1": "$time year ago", - "general:close-text:1": "close", - "general:ok-text:1": "okay", - "general:got-it-text:1": "got it", - "general:all-label:1": "All", - "general:search-for-a-player-header:1": "Search for a player", - "general:mp-text:1": "Multiplayer", - "general:wz-mw-text:1": "Warzone", - "general:zm-text:1": "Zombies", - "general:psn-text:1": "PLAYSTATION", - "general:xbl-text:1": "XBOX", - "general:battle-text:1": "Battle.net", - "general:page-text:1": "Page", - "general:learn-more-text:1": "Learn More", - "general:view-heatmap-text:1": "View Heatmap", - "general:go-back-text:1": "Go back", - "general:mw-title:1": "Modern Warfare", - "general:error-popup-title:1": "Oops, something went wrong", - "general:error-popup-body:1": "Sorry, for the inconvenience, please try again.", - "general:placement1:1": "1st Place", - "general:placement2:1": "2nd Place", - "general:placement3:1": "3rd Place", - "general:go-to-combat-record-text:1": "Go to Combat Record", - "general:go-to-squads-text:1": "Go to Squads", - "general:add-friend-text:1": "Add Friend", - "general:view-profile-text:1": "View Profile", - "general:error-require-alphabetical-value:1": "Must be an alphabetical value", - "general:error-require-alphanumerical-value:1": "Must be an alphanumerical value", - "general:error-require-valid-email:1": "Must be a valid email", - "general:error-require-numerical-value:1": "Must be a numerical value", - "general:required-text:1": "Required", - "general:playing-now-text:1": "Playing Now", - "general:view-all-friends-title:1": "View All Friends", - "general:minimum-text:1": "Minimum", - "general:dismiss-button:1": "Dismiss", - "general:available:1": "Available", - "general:total:1": "Total", - "general:copy:1": "Copy", - "general:countdown-days:1": "d", - "general:countdown-hours:1": "h", - "general:countdown-minutes:1": "m", - "general:countdown-seconds:1": "s", - "general:sort-label:1": "Sort", - "general:filter-label:1": "Filter", - "general:warzone-title:1": "Warzone", - "general:sku-200002-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/cdl_incentive_xp_white.png", - "general:sku-200002-description:1": "15 Minutes of Double XP", - "general:recent-text:1": "Recent", - "general:sku-171205-description:1": "Atlanta Faze Player Card", - "general:sku-171205-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_atlanta_faze_reward_01.png", - "general:sku-171206-description:1": "Chicago Huntsmen Player Card", - "general:sku-171206-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_chicago_huntsmen_reward_01.png", - "general:sku-171207-description:1": "Dallas Empire Player Card", - "general:sku-171207-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_dallas_empire_reward_01.png", - "general:sku-171208-description:1": "Florida Mutineers Player Card", - "general:sku-171208-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_florida_mutineers_reward_01.png", - "general:sku-171209-description:1": "Los Angeles Guerrillas Player Card", - "general:sku-171209-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_los_angeles_guerrillas_reward_01.png", - "general:sku-171210-description:1": "Optic Gaming Los Angeles Player Card", - "general:sku-171210-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_optic_gaming_los_angeles_reward_01.png", - "general:sku-171211-description:1": "London Royal Ravens Player Card", - "general:sku-171211-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_london_royal_ravens_reward_01.png", - "general:sku-171212-description:1": "Minnesota Røkkr Player Card", - "general:sku-171212-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_minnesota_rokkr_reward_01.png", - "general:sku-171213-description:1": "New York Subliners Player Card", - "general:sku-171213-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_new_york_subliners_reward_01.png", - "general:sku-171214-description:1": "Paris Legion Player Card", - "general:sku-171214-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_paris_legion_reward_01.png", - "general:sku-171215-description:1": "Seattle Surge Player Card", - "general:sku-171215-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_seattle_surge_reward_01.png", - "general:sku-171216-description:1": "Toronto Ultra Player Card", - "general:sku-171216-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_playercard_toronto_ultra_reward_01.png", - "general:sku-180987-description:1": "Atlanta Faze Emblem", - "general:sku-180987-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_atlanta_faze_reward_01.png", - "general:sku-180988-description:1": "Chicago Huntsmen Emblem", - "general:sku-180988-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_chicago_huntsmen_reward_01.png", - "general:sku-180989-description:1": "Dallas Empire Emblem", - "general:sku-180989-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_dallas_empire_reward_01.png", - "general:sku-180990-description:1": "Florida Mutineers Emblem", - "general:sku-180990-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_florida_mutineers_reward_01.png", - "general:sku-180991-description:1": "Los Angeles Guerrillas Emblem", - "general:sku-180991-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_los_angeles_guerrillas_reward_01.png", - "general:sku-180992-description:1": "Optic Gaming Los Angeles Emblem", - "general:sku-180992-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_optic_gaming_los_angeles_reward_01.png", - "general:sku-180993-description:1": "London Royal Ravens Emblem", - "general:sku-180993-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_london_royal_ravens_reward_01.png", - "general:sku-180994-description:1": "Minnesota Røkkr Emblem", - "general:sku-180994-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_minnesota_rokkr_reward_01.png", - "general:sku-180995-description:1": "New York Subliners Emblem", - "general:sku-180995-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_new_york_subliners_reward_01.png", - "general:sku-180996-description:1": "Paris Legion Emblem", - "general:sku-180996-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_paris_legion_reward_01.png", - "general:sku-180997-description:1": "Seattle Surge Emblem", - "general:sku-180997-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_seattle_surge_reward_01.png", - "general:sku-180998-description:1": "Toronto Ultra Emblem", - "general:sku-180998-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_emblem_toronto_ultra_reward_01.png", - "general:sku-190485-description:1": "Atlanta Faze Spray", - "general:sku-190485-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_atlanta_faze_reward_01.png", - "general:sku-190486-description:1": "Chicago Huntsmen Spray", - "general:sku-190486-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_chicago_huntsmen_reward_01.png", - "general:sku-190487-description:1": "Dallas Empire Spray", - "general:sku-190487-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_dallas_empire_reward_01.png", - "general:sku-190488-description:1": "Florida Mutineers Spray", - "general:sku-190488-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_florida_mutineers_reward_01.png", - "general:sku-190489-description:1": "Los Angeles Guerrillas Spray", - "general:sku-190489-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_los_angeles_guerrillas_reward_01.png", - "general:sku-190490-description:1": "Optic Gaming Los Angeles Spray", - "general:sku-190490-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_optic_gaming_los_angeles_reward_01.png", - "general:sku-190491-description:1": "London Royal Ravens Spray", - "general:sku-190491-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_london_royal_ravens_reward_01.png", - "general:sku-190492-description:1": "Minnesota Røkkr Spray", - "general:sku-190492-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_minnesota_rokkr_reward_01.png", - "general:sku-190493-description:1": "New York Subliners Spray", - "general:sku-190493-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_new_york_subliners_reward_01.png", - "general:sku-190494-description:1": "Paris Legion Spray", - "general:sku-190494-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_paris_legion_reward_01.png", - "general:sku-190495-description:1": "Seattle Surge Spray", - "general:sku-190495-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_seattle_surge_reward_01.png", - "general:sku-190496-description:1": "Toronto Ultra Spray", - "general:sku-190496-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/ui_spray_toronto_ultra_reward_01.png", - "general:sku-200030-description:1": "15 Minutes of Double Weapon XP", - "general:sku-200030-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/cdl_incentive_xp_gun_white.png", - "general:sku-200032-description:1": "30 Minutes of Double XP", - "general:sku-200032-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/cdl_incentive_xp_white.png", - "general:sku-200033-description:1": "30 Minutes of Double Weapon XP", - "general:sku-200033-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/cdl_incentive_xp_gun_white.png", - "general:sku-200038-description:1": "60 Minutes of Double XP", - "general:sku-200038-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/cdl_incentive_xp_white.png", - "general:sku-200039-description:1": "60 Minutes of Double Weapon XP", - "general:sku-200039-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/home-series-rewards-2020-regular-season/cdl_incentive_xp_gun_white.png", - "general:sku-181165-description:1": "Glory Isn't Given Emblem", - "general:sku-181165-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/ui_emblem_glory_isnt_given_01.png", - "general:sku-330357-description:1": "Glory Isn't Given Sticker", - "general:sku-330357-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/ui_sticker_glory_isnt_given_01.jpg", - "general:sku-190519-description:1": "Glory Isn't Given Spray", - "general:sku-190519-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/ui_spray_glory_isnt_given_01.png", - "general:sku-171374-description:1": "Glory Isn't Given Player Card", - "general:sku-171374-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/reward_playercard_glory_isnt_given.png", - "general:sku-835-description:1": "CDL Champs Knife Blueprint", - "general:sku-835-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/cdl-champs-knife-blueprint.png", - "general:sku-171375-description:1": "Atlanta Faze CDL Championship Player Card", - "general:sku-171375-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/reward_playercard_atlanta.png", - "general:sku-171376-description:1": "Chicago Huntsmen CDL Championship Player Card", - "general:sku-171376-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/reward_playercard_huntsmen.png", - "general:sku-171377-description:1": "Dallas Empire CDL Championship Player Card", - "general:sku-171377-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_empire.png", - "general:sku-171378-description:1": "Florida Mutineers CDL Championship Player Card", - "general:sku-171378-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_mutineers.png", - "general:sku-171381-description:1": "London Royal Ravens CDL Championship Player Card", - "general:sku-171381-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_royal_ravens.png", - "general:sku-171379-description:1": "Los Angeles Guerrillas CDL Championship Player Card", - "general:sku-171379-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_guerrillas.png", - "general:sku-171382-description:1": "Minnesota Røkkr CDL Championship Player Card", - "general:sku-171382-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_rokkr.png", - "general:sku-171383-description:1": "New York Subliners CDL Championship Player Card", - "general:sku-171383-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_subliners.png", - "general:sku-171380-description:1": "Optic Gaming Los Angeles CDL Championship Player Card", - "general:sku-171380-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/reward_playercard_optic_gaming.png", - "general:sku-171384-description:1": "Paris Legion CDL Championship Player Card", - "general:sku-171384-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_legion.png", - "general:sku-171385-description:1": "Seattle Surge CDL Championship Player Card", - "general:sku-171385-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_surge.png", - "general:sku-171386-description:1": "Toronto Ultra CDL Championship Player Card", - "general:sku-171386-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/cdl-champs-rewards-2020/champs_reward_playercard_ultra.png", - "general:sku-beta-description:1": "Congratulations you have received an early access code to the Call of Duty: Modern Warfare II Open Beta", - "general:sku-beta-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl_mwii_beta_drop.png", - "general:sku-beta-name:1": "Call of Duty: Modern Warfare II Open Beta Code", - "general:sku-beta-sub-message:1": "Please allow up to two weeks for your reward code to be delivered to your Activision account email address", - "general:sku-champs-description:1": "Congratulations you have received a CDL Champs Pack Code", - "general:sku-champs-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_rewards_ring_sticker.png", - "general:sku-champs-name:1": "CDL Champs Pack Code", - "general:sku-champs-sub-message:1": "Please allow up to two weeks for your reward code to be delivered to your Activision account email address", - "general:sku-111111-description:1": "Toronto Ultra Calling Card", - "general:sku-111111-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_ultra.png", - "general:sku-222222-description:1": "Seattle Surge Calling Card", - "general:sku-222222-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_surge.png", - "general:sku-333333-description:1": "Paris Legion Calling Card", - "general:sku-333333-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_legion.png", - "general:sku-444444-description:1": "LA Guerrillas Calling Card", - "general:sku-444444-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_guerrillas.png", - "general:sku-555555-description:1": "Minnesota Rokkr Calling Card", - "general:sku-555555-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_rokkr.png", - "general:sku-666666-description:1": "New Subliners Calling Card", - "general:sku-666666-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_subliners.png", - "general:sku-777777-description:1": "Atlanta Faze Calling Card", - "general:sku-777777-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/reward_playercard_atlanta.png", - "general:sku-000000-description:1": "London Royal Ravens Calling Card", - "general:sku-000000-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_royal_ravens.png", - "general:sku-888888-description:1": "Florida Mutineers Calling Card", - "general:sku-888888-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_mutineers.png", - "general:sku-999999-description:1": "Dallas Empire Calling Card", - "general:sku-999999-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/champs_reward_playercard_empire.png", - "general:sku-23703918-32830271-description:1": "Cash Stack Weapon Charm & 30 Minute Double XP Token", - "general:sku-23703918-32830271-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-cash-stack-charm.png", - "general:sku-32830271-description:1": "30 Minute Double XP Token", - "general:sku-32830271-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-double-xp-rare-icon.png", - "general:sku-18881964-description:1": "30 Minute Double Weapon XP Token", - "general:sku-18881964-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-double-weapon-xp-rare-icon.png", - "general:sku-27293684-description:1": "Iced Out Calling Card", - "general:sku-27293684-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-iced-out-card.png", - "general:sku-23774301-description:1": "Turn Me Up Calling Card", - "general:sku-23774301-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-turn-me-up-calling-card.png", - "general:sku-19413288-description:1": "Snaked Calling Card", - "general:sku-19413288-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-snaked-calling-card.png", - "general:sku-31068182-description:1": "Salty Emblem", - "general:sku-31068182-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-salty-emblem.png", - "general:sku-21698187-description:1": "Heart Emblem", - "general:sku-21698187-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-heart-emblem.png", - "general:sku-27121748-description:1": "Press F Calling Card", - "general:sku-27121748-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-press-f-calling-card.png", - "general:sku-29953838-description:1": "Hard Carry Emblem", - "general:sku-29953838-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-hard-cary-emblem.png", - "general:sku-31261751-description:1": "Sweaty Hours Calling Card", - "general:sku-31261751-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-sweaty-hours-calling-card.png", - "general:sku-23774301-29941161-description:1": "One Shot & Turn Me Up Calling Cards", - "general:sku-23774301-29941161-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/stage_ii_reward_oneshot_turnmeup-compress.gif", - "general:sku-22362792-description:1": "Cracked Calling Card", - "general:sku-22362792-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-cracked-card.png", - "general:sku-21837766-description:1": "Fully Tilted Calling Card", - "general:sku-21837766-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-fully-tilted-calling-card.png", - "general:sku-29602690-description:1": "Chalked Calling Card", - "general:sku-29602690-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-chalked-card.png", - "general:sku-21175524-description:1": "You Tried Emblem", - "general:sku-21175524-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-you-tried-emblem.png", - "general:sku-18898952-description:1": "Frag Emblem", - "general:sku-18898952-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_top-frag_emblem.png", - "general:sku-22599419-description:1": "LOOK AT MY BANK ACCOUNT Calling Card", - "general:sku-22599419-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_look-at-my-bank-account_calling-card.png", - "general:sku-26822422-description:1": "Built Different Emblem", - "general:sku-26822422-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_built-different_emblem.png", - "general:sku-27280284-description:1": "SKRRR Calling Card", - "general:sku-27280284-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_skrrrr_calling-card.png", - "general:sku-29453716-description:1": "Free Dubs Calling Card", - "general:sku-29453716-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_w-free-dubs_calling-card.png", - "general:sku-32785678-description:1": "GGEZ Emblem", - "general:sku-32785678-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_ggez_emblem.png", - "general:sku-18324289-description:1": "Early Rotation Calling Card", - "general:sku-18324289-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_early-rotation_calling-card.png", - "general:sku-23003377-description:1": "Dragons Calling Card", - "general:sku-23003377-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl_stage_4_rewards_dragons_calling-card.png", - "general:sku-31535973-description:1": "1 Hour of Double XP", - "general:sku-31535973-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/ui_icon_mtx_tier_player_xp_token_legendary.png", - "general:sku-31280783-description:1": "1 Hour of Double Weapon XP", - "general:sku-31280783-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/ui_icon_mtx_tier_weapon_xp_token_legendary.png", - "general:sku-27859048-description:1": "WSOW Competitive Spirit Emblem", - "general:sku-27859048-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/wsow-vi-competitive-spirit-sticker.png", - "general:sku-30360620-description:1": "WSOW Trios Calling Card", - "general:sku-30360620-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/wsow-vi-na-trios-calling-card.png", - "general:sku-33378742-description:1": "WSOW Competitive Spirit Emblem", - "general:sku-33378742-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/wsow-vi-competitive-spirit-sticker.png", - "general:sku-28314192-description:1": "1 Hour of Battle Pass Double XP", - "general:sku-28314192-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-bp-xp-stage-v.png", - "general:sku-32258933-description:1": "CDL Season Theme Music Wartrack", - "general:sku-32258933-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/wsow-vi-eu-trios-wartrack.jpg", - "general:sku-31097373-description:1": "COD Timing Calling Card", - "general:sku-31097373-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-cod-timing.png", - "general:sku-27762413-description:1": "Sweep Emblem", - "general:sku-27762413-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-sweep.png", - "general:sku-33356260-description:1": "Thunderclap Calling Card", - "general:sku-33356260-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-thunderclap.png", - "general:sku-20459603-description:1": "CDL Champs 2021 XM4 Blueprint", - "general:sku-20459603-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-xm4.png", - "general:sku-23999057-20234553-description:1": "Shane & Zaptius Weapon Stickers", - "general:sku-23999057-20234553-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-shane_zaptius.png", - "general:sku-23823863-27544956-description:1": "Zed & PaulEhx Weapon Stickers", - "general:sku-23823863-27544956-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-zed_paulx.png", - "general:sku-28101310-21844065-28789489-description:1": "Venom, Classic & Vivid Weapon Stickers", - "general:sku-28101310-21844065-28789489-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-venom_classic_vivid.png", - "general:sku-32844359-25349062-22205562-description:1": "Standy, Temp & Huke Weapon Stickers", - "general:sku-32844359-25349062-22205562-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-standy_temp_huke.png", - "general:sku-19191606-24913278-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-shane_zaptius.png", - "general:sku-19191606-24913278-description:1": "Shane & Zaptius Weapon Stickers", - "general:sku-17964045-23218687-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-zed_paulx.png", - "general:sku-17964045-23218687-description:1": "Zed & PaulEhx Weapon Stickers", - "general:sku-27977920-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-cod-timing.png", - "general:sku-27977920-description:1": "COD Timing Calling Card", - "general:sku-22520011-22516845-24935312-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-venom_classic_vivid.png", - "general:sku-22520011-22516845-24935312-description:1": "Venom, Classic & Vivid Weapon Stickers", - "general:sku-28240003-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-sweep.png", - "general:sku-28240003-description:1": "Sweep Emblem", - "general:sku-18009552-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-thunderclap.png", - "general:sku-18009552-description:1": "Thunderclap Calling Card", - "general:sku-23262678-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-xm4.png", - "general:sku-23262678-description:1": "CDL Champs 2021 XM4", - "general:sku-20780365-23212523-28088480-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/cdl-2021-champs-vi-standy_temp_huke.png", - "general:sku-20780365-23212523-28088480-description:1": "Standy, Temp & Huke Weapon Stickers", - "general:sku-19441479-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/wsow-vi-no-bots.png", - "general:sku-19441479-description:1": "No Bots Emblem", - "general:sku-27701149-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2021-cdl-viewership-rewards/wsow-vi-stacked.png", - "general:sku-27701149-description:1": "Stacked Emblem", - "general:sku-33724851-33724850-33724852-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-next-up.png", - "general:sku-33724851-33724850-33724852-description:1": "Next Up Calling Card", - "general:sku-33724848-33724847-33724849-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-good-vibes-only.png", - "general:sku-33724848-33724847-33724849-description:1": "Good Vibes Calling Card", - "general:sku-33734594-33734593-33734592-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-demon-mode.png", - "general:sku-33734594-33734593-33734592-description:1": "Demon Mode Emblem", - "general:sku-33634603-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-salt-shaker-charm.png", - "general:sku-33634603-description:1": "Salt Shaker Weapon Charm (Available 1/28)", - "general:sku-33754434-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity02.png", - "general:sku-33754434-description:1": "15 Minute Double XP Token", - "general:sku-33754464-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity03.png", - "general:sku-33754464-description:1": "30 Minute Double XP Token", - "general:sku-33754470-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity04.png", - "general:sku-33754470-description:1": "45 Minute Double XP Token", - "general:sku-33754467-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity05.png", - "general:sku-33754467-description:1": "1 Hour Double XP Token", - "general:sku-33754462-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity02_weapon.png", - "general:sku-33754462-description:1": "15 Minute Double Weapon XP Token", - "general:sku-33754465-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity03_weapon.png", - "general:sku-33754465-description:1": "30 Minute Double Weapon XP Token", - "general:sku-33754471-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity04_weapon.png", - "general:sku-33754471-description:1": "45 Minute Double Weapon XP Token", - "general:sku-33754468-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity05_weapon.png", - "general:sku-33754468-description:1": "1 Hour Double Weapon XP Token", - "general:sku-33754475-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity02_battlepass.png", - "general:sku-33754475-description:1": "15 Minute Battlepass Double XP Token", - "general:sku-33754476-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity03_battlepass.png", - "general:sku-33754476-description:1": "30 Minute Battlepass Double XP Token", - "general:sku-33754478-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity04_battlepass.png", - "general:sku-33754478-description:1": "45 Minute Battlepass Double XP Token", - "general:sku-33754477-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/v_ui_icon_2xp_token_rarity05_battlepass.png", - "general:sku-33754477-description:1": "1 Hour Battlepass Double XP Token", - "general:sku-33724944-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-shot-throught-heart.png", - "general:sku-33724944-description:1": "Shot Through The Heart CC (Available 2/10)", - "general:sku-33734650-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-be-mine.png", - "general:sku-33734650-description:1": "Be Mine Emblem (Available 2/10)", - "general:sku-33724943-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-off-season.png", - "general:sku-33724943-description:1": "Off Season Calling Card (Available 2/10)", - "general:sku-33734653-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-itsofficial.png", - "general:sku-33734653-description:1": "It's Official Emblem (Available 2/10)", - "general:sku-33555463-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-armed-to-teeth-weapon-blueprint.png", - "general:sku-33555463-description:1": "Armed to the Teeth Blueprint", - "general:sku-33734696-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-500IQ.png", - "general:sku-33734696-description:1": "500 IQ Emblem", - "general:sku-33734647-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-deadman.png", - "general:sku-33734647-description:1": "Deadman Emblem", - "general:sku-33724941-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-they-can-smell-blood-calling-card.png", - "general:sku-33724941-description:1": "They Can Smell Blood Calling Card", - "general:sku-33734644-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-blood-bath.png", - "general:sku-33734644-description:1": "Blood Bath Emblem", - "general:sku-36194686-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-snake-camo-2.png", - "general:sku-36194686-description:1": "Snake Bite Camo", - "general:sku-33724942-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-incentives-first-frag-calling-card.png", - "general:sku-33724942-description:1": "First Frag Calling Card", - "general:sku-33734730-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl_youre_a_burger_emblem.png", - "general:sku-33734730-description:1": "You're a Burger Emblem", - "general:sku-33725045-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-catch-me-on-lan-calling-card.png", - "general:sku-33725045-description:1": "Catch Me on LAN Calling Card", - "general:sku-33725047-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-reverse-sweep-calling-card.png", - "general:sku-33725047-description:1": "Reverse Sweep Calling Card", - "general:sku-33734698-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-wtb-teamate-emblem.png", - "general:sku-33734698-description:1": "WTB Teammate Emblem", - "general:sku-33555530-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-stg-norsemen-blueprint.png", - "general:sku-33555530-description:1": "Norseman STG Blueprint", - "general:sku-33725044-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-nordic-storm-calling-card.png", - "general:sku-33725044-description:1": "Nordic Storm Calling Card", - "general:sku-33725023-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdlr-like-if-bae-emblem.png", - "general:sku-33725023-description:1": "I'm Beaming Calling Card", - "general:sku-33734695-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdlr-like-if-bae-emblem.png", - "general:sku-33734695-description:1": "Fave If BAE Emblem", - "general:sku-33734816-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-mountie-hats-emblem.png", - "general:sku-33734816-description:1": "Up North Emblem", - "general:sku-33734818-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cd-moosehead-emblem.png", - "general:sku-33734818-description:1": "Moosehead Emblem", - "general:sku-33725193-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-mountie-calling-card.png", - "general:sku-33725193-description:1": "True North Calling Card", - "general:sku-33725194-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-northern-lights-calling-card.png", - "general:sku-33725194-description:1": "Northern Lights Calling Card", - "general:sku-33734817-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-aboot-emblem.png", - "general:sku-33734817-description:1": "A-Boot Emblem", - "general:sku-33555637-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-hyankee44-blueprint.png", - "general:sku-33555637-description:1": "Maple Blossom Weapon Blueprint", - "general:sku-33725190-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/cdl-snowball-fight-calling-card.png", - "general:sku-33725190-description:1": "Snowball Fight Calling Card", - "general:sku-33734878-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_cup_of_joe_emblem.png", - "general:sku-33734878-description:1": "A Cup of Joe Emblem", - "general:sku-33734875-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_operatorliberty_emblem.png", - "general:sku-33734875-description:1": "Give Me Liberty Emblem", - "general:sku-33725267-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_just_scratch_calling_card.png", - "general:sku-33725267-description:1": "Just a Scratch Calling Card", - "general:sku-33725270-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_stand_clear_calling_card.png", - "general:sku-33725270-description:1": "Stand Clear Calling Card", - "general:sku-33725269-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_tactical_sprint_calling_card.png", - "general:sku-33725269-description:1": "Tactical Sprint NYC Calling Card", - "general:sku-33734877-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_phantom_emblem.png", - "general:sku-33734877-description:1": "CDL Phantom Emblem", - "general:sku-33554505-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/collecting_fare_weapon_blueprint.png", - "general:sku-33554505-description:1": "Collecting Fare Weapon Blueprint", - "general:sku-33725268-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/icon_lets_go_calling_card.png", - "general:sku-33725268-description:1": "Let's Go!!! Calling Card", - "general:sku-33586086-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/c_s4_mp_fra_beatrice_cdl.png", - "general:sku-33586086-description:1": "Down To The Wire Operator", - "general:sku-33554519-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/Automaton-Gunsmith_with_logo.png", - "general:sku-33554519-description:1": "Champs Automaton Weapon Blueprint", - "general:sku-33555694-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/Volk-Blueprint_Donut-Camo.png", - "general:sku-33555694-description:1": "Sprinkles Weapon Blueprint", - "general:sku-33634787-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/Champs_incent_weapon_charm.png", - "general:sku-33634787-description:1": "CDL Champs Ring Weapon Charm", - "general:sku-33634786-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/MTX_Charm_Donut.png", - "general:sku-33634786-description:1": "Donut Weapon Charm", - "general:sku-33594577-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ChampsWatch_COD_TIMING.png", - "general:sku-33594577-description:1": "COD Timing Watch", - "general:sku-33725331-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_callingcards_roastingmarshmallows_960.png", - "general:sku-33725331-description:1": "Camper Calling Card", - "general:sku-33725332-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_callingcards_Spawn_Trapped960.png", - "general:sku-33725332-description:1": "Spawn Trapped Calling Card", - "general:sku-33725333-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_callingcards_egochall_960.png", - "general:sku-33725333-description:1": "EGO CHALL Calling Card", - "general:sku-33725337-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_callingcards_Wall-Banged_960.png", - "general:sku-33725337-description:1": "Wall Banged Calling Card", - "general:sku-33734912-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_emblems_Poker-chip_512.png", - "general:sku-33734912-description:1": "The Chip Emblem", - "general:sku-33734915-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_emblems_S_dstar512.png", - "general:sku-33734915-description:1": "S&D Star Emblem", - "general:sku-33734914-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_icon_emblem_round11star_512.png", - "general:sku-33734914-description:1": "Round 11 Emblem", - "general:sku-33725048-image:1": "https://callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/ui_callingcards__firstblooded.png", - "general:sku-33725048-description:1": "First Blooded Calling Card", - "general:sku-33725335-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/wsow-incentive-pop-dead-calling-card.png", - "general:sku-33725335-description:1": "Popping a Deady Calling Card", - "general:sku-33725336-image:1": "https://www.callofduty.com/content/dam/atvi/callofduty/esports-new/2022-viewership-rewards/wsow-incentive-melting-faces-calling-card.png", - "general:sku-33725336-description:1": "Melting Faces Calling Card", - "general:optional-text:1": "(Optional)", - "general:of-text:1": "Of", - "general:no-atvi-account-text:1": "No Activision Account", - "general:placement-1-text:1": "1st", - "general:placement-2-text:1": "2nd", - "general:placement-3-text:1": "3rd", - "general:copied-clipboard-text:1": "Copied to Clipboard", - "general:remove-text:1": "Remove", - "general:cancel-text:1": "Cancel", - "general:submit-text:1": "Submit", - "general:continue-tex:1": "Continue", - "general:vg-title:1": "Vanguard", - "sign-in:log-in-via-network-title:1": "Log In via your network", - "sign-in:log-in-via-activision-button:1": "Log In via Activision", - "sign-in:log-in-via-activision-title:1": "Log In via your Activision Account", - "sign-in:enter-email-textbox:1": "Enter Email", - "sign-in:enter-password-textbox:1": "Enter Password", - "sign-in:email-textbox:1": "Email", - "sign-in:sign-up-button:1": "Sign Up", - "sign-in:forgot-password-button:1": "Forgot Password?", - "sign-in:log-in-button:1": "Log In", - "sign-in:dont-have-activision-text:1": "Don't have an Activision account?", - "sign-in:create-account-button:1": "Create an Account", - "sign-in:already-have-activision-account-text:1": "Already have an Activision account?", - "sign-in:log-in-now-button:1": "Log In Now", - "sign-in:forgot-password-title:1": "Forgot your password?", - "sign-in:submit-button:1": "submit", - "sign-in:email-sent-title:1": "Email Sent", - "sign-in:will-receive-email-with-password-reset-title:1": "You will receive an email shortly with a password reset link.", - "sign-in:ok-button:1": "OK", - "sign-in:or-text:1": "or", - "sign-in:password-text:1": "Password", - "sign-in:create-password-textbox:1": "Create Password", - "sign-in:country-text:1": "country", - "sign-in:birthday-text:1": "birthday", - "sign-in:checkbox-text:1": "By checking the box I accept the", - "sign-in:terms-of-use-button:1": "terms of use", - "sign-in:privacy-policy-button:1": "privacy policy", - "sign-in:and-text:1": "and", - "sign-in:playstation-text:1": "PLAYSTATION", - "sign-in:xbox-text:1": "XBOX", - "sign-in:steam-text:1": "STEAM", - "sign-in:battle-net-text:1": "BATTLE-NET", - "sign-in:no-internet-connection-text:1": "No Internet Connection", - "sign-in:please-connect-internet-text:1": "Please connect to the Internet", - "sign-in:invalid-email-text:1": "Please enter a valid email address.", - "sign-in:email-in-use-text:1": "That email address is already in use. Please try logging in.", - "sign-in:go-back-select-first-party-text:1": "Go back to select a new first party account.", - "sign-in:missing-battle-tag-text:1": "Please create a BattleTag for your Battle.Net account to continue", - "sign-in:unable-to-auth-text:1": "We are unable to authenticate your account at this time. Please try again later.", - "sign-in:create-atvi-account-text:1": "No Call of Duty Account is associated with this gamer account. Please create one below.", - "sign-in:no-linked-accounts-title:1": "No Game Account Available", - "sign-in:no-linked-accounts-body:1": "You have no linked game accounts. We will take you to the login screen.", - "sign-in:access-denied-text:1": "You must be logged in to access this page.", - "sign-in:invalide-email-password-combo:1": "You have entered an invalid email / password combination.", - "sign-in:show-password-text:1": "Show Password", - "sign-in:hide-password-text:1": "Hide Password", - "sign-in:connecting-to-service-text:1": "Connecting to online service...", - "sign-in:new-player-text:1": "New to Call of Duty?", - "sign-in:already-have-account-text:1": "Already have a Call of Duty account?", - "sign-in:sign-in-text-button:1": "Sign In", - "sign-in:sign-up-now-button:1": "Sign Up Now", - "sign-in:continue-button:1": "Continue", - "sign-in:need-help-button:1": "Need Help?", - "sign-in:sign-in-account-title:1": "Sign In to Your Call Of Duty Account", - "sign-in:enter-birthday-text:1": "Enter Birthday", - "sign-in:enter-details-title:1": "Enter Your Details and Password", - "sign-in:display-name-text:1": "Display Name", - "sign-in:newsletter-text:1": "By checking the box, you agree to receive news, updates, promotions and exclusive content by email from Activision.", - "sign-in:access-stats-text:1": "Log In to see your stats and access the rest of the MyCOD site.", - "sign-in:email-textbox-placeholder:1": "Enter Email", - "sign-in:create-account-title:1": "Create Account", - "sign-in:create-a-password-title:1": "Create a Password", - "sign-in:select-country-text:1": "Select Country", - "sign-in:connected-accounts-title:1": "Connected Accounts", - "sign-in:connected-accounts-description:1": "Connect your Call of Duty account to other networks for stats tracking.", - "sign-in:account-created-title:1": "Account Created!", - "sign-in:account-created-description:1": "Your player account has been successfully connected to your new Call of Duty Account!", - "sign-in:confirmation-button:1": "Got It!", - "sign-in:account-already-linked-title:1": "This account is already connected to a Call of Duty Account:", - "sign-in:account-already-linked-description:1": "If you know your login info for this account, or have access to the email above:", - "sign-in:cod-sign-in-button:1": "Sign in to current Call of Duty Account", - "sign-in:enter-birthday-country-title:1": "Enter your birthday and country of residency", - "sign-in:enter-info-title:1": "Enter your info", - "sign-in:invalid-username-text:1": "This name is invalid.", - "sign-in:username-in-use-text:1": "This name is already in use.", - "sign-in:first-name-textbox:1": "First Name", - "sign-in:last-name-textbox:1": "Last Name", - "sign-in:reset-email-title:1": "Password Reset Sent", - "sign-in:reset-email-text:1": "Check your email for a link to reset your password.", - "sign-in:link-your-account-button:1": "Link Your Account", - "sign-in:account-not-linked-description:1": "Your player account has not been linked to your Call of Duty account. Please log into your Call of Duty account first.", - "sign-in:account-not-registered-description:1": "If you don not have a Call of Duty account, you can create one by pressing the button below.", - "sign-in:2fa-login-title:1": "Enter the Security Code to Continue", - "sign-in:2fa-backup-title:1": "Enter a Backup Code", - "sign-in:2fa-login-description:1": "This appears to be a new device, browser, or location. Please enter the security code from your authenticator app.", - "sign-in:2fa-backup-description:1": "Backup codes were sent to your email upon 2-FA sign up. Each backup code may be used only once. If you need new codes please contact support.", - "sign-in:enable-2fa-title:1": "Enable 2-Factor Authentication", - "sign-in:enable-2fa-body:1": "2-Factor Authentication must be enabled before you can gift this item\\u003cbr>After 2-FA is enabled, you will need to log in with 2-FA then you can begin gifting!", - "sign-in:set-up-2fa-text:1": "Set Up 2-FA", - "profile:loading-profile-text:1": "Loading Profile...", - "profile:level-text:1": "Level", - "profile:prestige-text:1": "Prestige", - "profile:messages-tab-title:1": "Messages", - "profile:account-info-tab-title:1": "Account Info", - "profile:settings-tab-title:1": "Settings", - "profile:log-out-button:1": "Log Out", - "profile:basic-info-title:1": "Basic Info", - "profile:basic-info-text:1": "Basic Info", - "profile:basic-info-body-text:1": "You will be taken to callofduty.com where you can edit your basic info.", - "profile:go-text:1": "Go", - "profile:cancel-text:1": "Cancel", - "profile:log-out-text:1": "Log out", - "profile:delete-account-title:1": "Delete Account", - "profile:delete-account-text:1": "Delete Account", - "profile:are-you-sure-delete-text:1": "Are you sure you want to delete your account?", - "profile:delete-text:1": "Delete", - "profile:delete-account-body-text:1": "You will be taken to callofduty.com where you can log in and delete your account.", - "profile:linked-account-text:1": "Linked Accounts", - "profile:link-playstation-text:1": "Link PlayStation Account", - "profile:link-xbox-text:1": "Link Xbox Account", - "profile:link-battle-text:1": "Link Battle.net Account", - "profile:unlink-account-text:1": "Unlink Account", - "profile:link-account-text:1": "Link Account", - "profile:linked-text:1": "Link", - "profile:account-text:1": "Account", - "profile:support-text:1": "Support", - "profile:about-text:1": "About", - "profile:are-you-sure-log-out-text:1": "Are you sure you want to log out?", - "profile:account-settings-text:1": "Account Settings", - "profile:cod-user-text:1": "Call Of Duty User", - "profile:friends-list-text:1": "Friends List", - "profile:no-stat-data-text:1": "No Stat Data", - "profile:view-squad:1": "View Squad", - "profile:echelon-text:1": "Echelon", - "profile:support-body-text:1": "You will be taken to callofduty.com.", - "profile:about-body-text:1": "You will be taken to callofduty.com.", - "profile:allow-gamertag-search-text:1": "Allow gamertag to be searched", - "profile:master-prestige-text:1": "Master Prestige", - "profile:settings-text:1": "Settings", - "profile:paragon-text:1": "Paragon", - "profile:manage-account-body-text:1": "You will be taken to callofduty.com where you can log in and manage your account", - "profile:unlink-text:1": "Unlink", - "profile:sign-out-button:1": "Sign Out", - "profile:sign-up-button:1": "Sign Up", - "profile:sign-in-button:1": "Sign In", - "profile:deactivate-account-body-text:1": "This will log you out of your account, and you will no longer have access to account information, Activision Communities, or other Activision services associated with this account. You will also be unsubscribed from receiving email communications from Activision. Once the account is deactivated, you will be unable to create a new account using the email address associated with this account.", - "profile:deactivate-account-text:1": "Deactivate Account", - "profile:deactivate-account-title:1": "Deactivate Account", - "profile:personal-info-text:1": "Do Not Sell My Personal Info", - "profile:notifications-privacy-text:1": "Notifications and Privacy", - "profile:privacy-policy-text:1": "Privacy Policy", - "profile:enable-notifications-text:1": "Enable Notifications", - "profile:enable-notifications-msg-text:1": "Push notifications are turned off. Turn them on in your settings to control what messages you want to receive.", - "home:dashboard-header:1": "Home", - "home:section-label:1": "Home", - "home:section-title:1": "Home", - "home:motd-title:1": "Message of the Day", - "home:briefing-title:1": "Intel", - "home:upcoming-events-title:1": "Upcoming Events", - "home:operations-title:1": "Ops", - "home:vote-on-objective-title:1": "Vote on this Week\\u2019s Squad Objective", - "home:vote-on-objective-subtitle:1": "Select or view the task your squad must complete this week to earn rewards.", - "home:objective-in-progress-title:1": "Check Your Squad\\u2019s Objective Progress", - "home:objective-in-progress-subtitle:1": "Find out how close you are to earning this week\\u2019s rewards.", - "home:latest-news-title:1": "Latest News", - "home:weekly-stats-title:1": "Weekly Stats", - "home:lifetime-stats-title:1": "Lifetime Stats", - "home:updated-text:1": "Updated", - "home:kd-ratio-text:1": "KD Ratio", - "home:kills-text:1": "Kills", - "home:deaths-text:1": "Deaths", - "home:view-stats-button:1": "View Stats", - "home:friends-title:1": "Friends", - "home:you-have-text:1": "You have", - "home:friends-text:1": "Friends", - "home:play-text:1": "Play", - "home:online-text:1": "Online", - "home:view-all-button:1": "View All", - "home:briefing-text:1": "Briefing", - "home:learn-from-your-progress-last-week-text:1": "Learn from your progress last week.", - "home:weekend-brief-subtext:1": "Briefing you on your performance over the past week.", - "home:online-title:1": "Online", - "home:view-progress-button:1": "View All", - "home:operations-text:1": "Operations", - "home:your-weekly-stats-text:1": "Your Weekly Stats", - "home:your-lifetime-stats-text:1": "Your Lifetime Stats", - "home:weekly-reward-title:1": "Weekly Reward", - "home:friends-feed-label:1": "Recent Friend Achievements", - "home:view-friends-feed-text:1": "View Friend Feed", - "home:view-recent-matches-button:1": "View Match Details", - "home:weekly-reward-body:1": "You've earned a weekly reward for use in Call of Duty: Black Ops Cold War! Come back to the App after each week for exclusive rewards, including in-game items, just for using the App! [Game restart may be required. Weekly reset on Mondays at 12:00am PST]", - "home:privacy-policy-header:1": "privacy policy update", - "home:privacy-policy-body:1": "We\\u2019ve Updated our Privacy Policy. By continuing to use Activision\\u2019s apps, websites, products and services, you acknowledge this revised Privacy Policy.", - "home:privacy-policy-button-text:1": "view revised policy", - "home:view-notification-button-text:1": "View Notification Settings", - "home:cancel-button-text:1": "Cancel", - "intel:section-label:1": "Intel", - "intel:section-title:1": "Intel", - "intel:match-analysis-tab-title:1": "Match Analysis", - "intel:maps-tab-title:1": "Maps", - "intel:heatmaps-description:1": "Heat maps provide individual, match, and community information on your kills, deaths, and areas where you can improve your KD ratio (or EKIA/D). Kill maps show where players were located when they eliminated their enemies. Death maps show where players died the most. KDR maps show areas where players can increase their KDR. Blue areas are where players want to be to get more kills.", - "intel:loadouts-tab-title:1": "Loadouts", - "intel:xp-text:1": "XP", - "intel:see-more-button:1": "See More", - "intel:kd-ratio-text:1": "KD Ratio", - "intel:view-loadout-button:1": "View Loadout", - "intel:wins-text:1": "Wins", - "intel:losses-text:1": "Losses", - "intel:heat-map-header:1": "Heat Map", - "intel:type-text:1": "Type:", - "intel:match-stats-text:1": "match stats", - "intel:match-analysis-wz-kills:1": "kills", - "intel:match-analysis-wz-damage:1": "damage", - "intel:match-analysis-wz-merits:1": "merits", - "intel:match-analysis-wz-placement:1": "placement", - "intel:match-analysis-zm-score:1": "score", - "intel:match-analysis-zm-revives:1": "revives", - "intel:match-analysis-zm-xp:1": "XP", - "intel:match-analysis-zm-headshots:1": "headshots", - "intel:community-label:1": "Community", - "intel:all-label:1": "All", - "intel:news-text:1": "Latest News", - "intel:news-tab-title:1": "News", - "intel:boot-camp-tab-title:1": "Guides", - "player:section-title:1": "Player", - "player:combat-record-tab-title:1": "Combat Record", - "player:weapon-stats-header:1": "Weapon Stats", - "player:recent-matches-header:1": "Recent Matches", - "player:highest-kill-streak-text:1": "Highest Kill Streak", - "player:friend-comparison-tab-title:1": "Friend Comparison", - "player:loadout-editor-tab-title:1": "Loadout Editor", - "player:overall-usage-title:1": "Overall Usage", - "player:recent-stats-title:1": "Recent Matches", - "player:view-matches-button:1": "View Matches", - "player:kdr-history-title:1": "KDR History", - "player:matches-text:1": "Matches", - "player:kills-minute-text:1": "Kills/Minute", - "player:deaths-minute-text:1": "Deaths/Minute", - "player:headshots-minute-text:1": "Headshots/Minute", - "player:last-5-matches-text:1": "Last 5 Matches", - "player:kills-text:1": "Kills", - "player:kdr-text:1": "KDR", - "player:spm-history-title:1": "SPM History", - "player:score-per-minute-text:1": "Score Per Minute", - "player:weekly-stats-title:1": "Weekly Stats", - "player:wins-text:1": "Wins", - "player:losses-text:1": "Losses", - "player:lifetime-stats-title:1": "Lifetime Stats", - "player:view-more-button:1": "View More", - "player:view-more-items-text:1": "View More Items", - "player:kd-ratio-text:1": "K/D Ratio", - "player:kill-streak-text:1": "Kill Streak", - "player:score-per-min-text:1": "Score Per Min", - "player:accuracy-text:1": "Accuracy", - "player:score-text:1": "Score", - "player:name-text:1": "Name", - "player:experience-text:1": "Experience", - "player:prestige-level-text:1": "Prestige Level", - "player:time-in-use-text:1": "Time In Use", - "player:time-played-text:1": "Time Played", - "player:shots-text:1": "Shots", - "player:hits-text:1": "Hits", - "player:headshots-text:1": "Headshots", - "player:hipfire-kills-text:1": "Hipfire Kills", - "player:assists-text:1": "Assists", - "player:multi-kills-text:1": "Multi-Kills", - "player:score-minute-text:1": "Score/Minute", - "player:xp-gained-text:1": "XP Gained", - "player:match-time-text:1": "Match Time", - "player:shots-fired-text:1": "Shots Fired", - "player:shots-landed-text:1": "Shots Landed", - "player:win-loss-ratio-text:1": "W/L Ratio", - "player:score-per-minute-spm-text:1": "SPM", - "player:kill-death-ratio-kdr-text:1": "KDR", - "player:kill-death-ratio-text:1": "Kill Death Ratio", - "player:kills-k-text:1": "K", - "player:death-d-text:1": "D", - "player:win-w:1": "W", - "player:lose-l:1": "L", - "player:uses-text:1": "Uses", - "player:since-launch-text:1": "Since Launch", - "player:friends-text:1": "Friends", - "player:average-text:1": "average", - "player:you-text:1": "you", - "player:top-friend-text:1": "Top Friend", - "player:total-games-played-text:1": "Total Games Played", - "player:total-time-played-text:1": "Total Time Played", - "player:best-lethal-text:1": "Best Lethal", - "player:best-lethal-killstreak-text:1": "Best Lethal Killstreak", - "player:best-support-killstreak-text:1": "Best Support Killstreak", - "player:best-scorestreak-support-text:1": "Best Scorestreak Support", - "player:best-scorestreak-attack-text:1": "Best Scorestreak Attack", - "player:best-secondary-text:1": "Best Secondary", - "player:best-tactical-text:1": "Best Tactical", - "player:best-primary-text:1": "Best Primary", - "player:best-mode-text:1": "Best Mode", - "player:deaths-text:1": "Deaths", - "player:hours-hrs-text:1": "HRS", - "player:average-avg-text:1": "(AVG)", - "player:ekiad-history-text:1": "Elims/D History", - "player:average-ekiad-text:1": "Average Elims/D", - "player:average-kills-text:1": "Average Kills", - "player:kills-history-text:1": "Kills History", - "player:kd-text:1": "K/D", - "player:xp-earned-text:1": "XP Earned", - "player:shots-missed-text:1": "Shots Missed", - "player:ekia-text:1": "Elims", - "player:ekiad-text:1": "Elims/D", - "player:ekia-per-game-text:1": "Elims Per Game", - "player:placement-text:1": "Placement", - "player:merits-earned-text:1": "Merits Earned", - "player:misses-text:1": "Misses", - "player:round-reached-text:1": "Round Reached", - "player:revives-text:1": "Revives", - "player:downs-text:1": "Downs", - "player:score-earned-text:1": "Score Earned", - "player:score-spent-text:1": "Score Spent", - "player:grenade-kills-text:1": "Grenade Kills", - "player:perks-drank-text:1": "Perks Drank", - "player:doors-purchased-text:1": "Doors Purchased", - "player:wonder-weapon-kills-text:1": "Wonder Weapon Kills", - "player:match-details-text:1": "Match Details", - "player:average-spm-text:1": "Average SPM", - "player:ekiad-ratio-text:1": "Elims/D Ratio", - "player:avg-round-reached-text:1": "AVG Round Reached", - "player:matches-played-text:1": "Matches Played", - "player:total-matches-text:1": "Total Matches", - "player:melee-kills-text:1": "Melee Kills", - "player:kill-game-text:1": "Kill/Game", - "player:ekia-game-text:1": "Elims/Game", - "player:damage-per-game-text:1": "Damage Per Game", - "player:score-per-game-text:1": "Score Per Game", - "player:top-placement-text:1": "Top Placements", - "player:highest-round-reached-text:1": "Highest Round Reached", - "player:all-text:1": "All", - "player:best-spm-text:1": "Best SPM", - "player:longest-kill-streak-text:1": "Longest Kill Streak", - "player:best-score-text:1": "Best Score", - "player:highest-kills-text:1": "Highest Kills", - "player:headshots-percentage-text:1": "Headshot %", - "player:daily-chart-overall-kdr:1": "Overall KDR", - "player:daily-chart-scorePerMinute:1": "SPM", - "player:best-accuracy:1": "Best Accuracy", - "player:heals-game-text:1": "Health Restored/Game", - "player:heals-life-text:1": "Health Restored/Life", - "player:damage-minute-text:1": "Damage/Minute", - "player:kills-game-text:1": "Kills/Game", - "player:damage-text:1": "Damage", - "player:zombie-kills-text:1": "Zombie Kills", - "player:best-game-stats-text:1": "Best Game Stats", - "player:most-kills-text:1": "Most Kills", - "player:best-kill-streak-text:1": "Best Kill Streak", - "player:highest-spm-text:1": "Highest SPM", - "player:highest-accuracy-text:1": "Highest Accuracy", - "player:highest-score-text:1": "Highest Score", - "player:no-friend-stats-text:1": "You do not have any friends with stats to compare to.", - "player:my-kdr-text:1": "MY KDR", - "player:my-kills-text:1": "My Kills", - "player:my-deaths-text:1": "My Deaths", - "player:fewer-kills-text:1": "Fewer Kills", - "player:more-kills-text:1": "More Kills", - "player:fewer-deaths-text:1": "Fewer Deaths", - "player:more-deaths-text:1": "More Deaths", - "player:additional-stats-title:1": "Additional Stats", - "player:time-played-mins-text:1": "mins", - "player:rounds-text:1": "Rounds", - "player:direct-action-kills-title:1": "Direct Action Kills", - "player:score-game-text:1": "Score/Game", - "player:black-market:1": "Black Market", - "player:ends-in:1": "Ends In", - "player:tiers:1": "Tiers", - "player:tier:1": "Tier", - "player:current-supported-loot-season:1": "5", - "player:current-supported-loot-season-start:1": "2022-08-24 09:00:00", - "player:current-supported-loot-season-end:1": "2022-10-25 09:00:00", - "player:current-supported-loot-season-title:1": "loot_season_5", - "player:previous-supported-loot-season-title:1": "loot_season_4", - "player:base-item:1": "Base", - "player:common-item:1": "Common", - "player:rare-item:1": "Rare", - "player:legendary-item:1": "Legendary", - "player:epic-item:1": "Epic", - "player:ultra-item:1": "Ultra", - "player:heroic-item:1": "Heroic", - "player:reserve-rewards:1": "Reserve Rewards", - "player:reserves:1": "Reserves", - "player:chase-description:1": "View potential rewards from the Reserves.", - "player:reserve-guarantee:1": "Reserve Guarantee", - "player:attachment-stats-header:1": "Attachment Stats", - "player:gear-stats-header:1": "Gear Stats", - "player:equipment-stats-header:1": "Equipment Stats", - "player:scorestreak-stats-header:1": "Scorestreak Stats", - "player:usage-count-text:1": "Usage Count", - "player:killed-by-text:1": "Killed By", - "player:draws-text:1": "Draws", - "player:flash-ekia-text:1": "Flash Elims", - "player:boosted-ekia-text:1": "Boosted Elims", - "player:assault-pack-bonus-ekia-text:1": "Assault Pack Bonus Elims", - "player:shocked-enemy-ekia-text:1": "Shocked Enemy Elims", - "player:tagged-ekia-text:1": "Tagged Elims", - "player:pulsed-enemy-ekia-text:1": "Pulsed Enemy Elims", - "player:detected-enemy-ekia-text:1": "Detected Enemies Elims", - "player:ekia-just-after-spawn-text:1": "Elims just after spawn", - "player:ekia-slowed-enemy-text:1": "Elims Slowed Enemy", - "player:hacked-ekia-text:1": "Hacked Elims", - "player:disrupted-ekia-text:1": "Disrupted Elims", - "player:barracks-text:1": "Barracks", - "player:barracks-data-text:1": "Barracks data is a combination between Multiplayer and Warzone.", - "player:average-objective-text:1": "Average Objective", - "player:objective-text:1": "Objective", - "player:average-ekia-text:1": "Average Elims", - "player:win-loss-text:1": "W/L %", - "player:burned-enemies-text:1": "Burned Enemies", - "player:map-stats-header:1": "Map Stats", - "player:total-heals-text:1": "Total Heals", - "player:wall-buy-weapons-purchased-text:1": "Wall Buy Weapons Purchased", - "player:ammo-purchased-text:1": "Ammo Purchased", - "player:windows-boarded-text:1": "Windows Boarded", - "player:pack-a-punch-picked-up-text:1": "Pack a Punch Picked Up", - "player:rounds-no-downs-text:1": "Rounds No Downs", - "player:rounds-no-damage-text:1": "Rounds No Damage", - "player:suicides-text:1": "Suicides", - "player:distance-traveled-text:1": "Distance Traveled", - "player:longest-distance-kill-text:1": "Longest Distance Kill", - "player:revives-game-text:1": "Revives/Game", - "player:kills-after-revive-text:1": "Kills After Revive", - "player:cargo-supply-opened-text:1": "Cargo Supply Opened", - "player:frag-kills-text:1": "FRAG Kills", - "player:wraith-fire-kills-text:1": "Wraith Fire Kills", - "player:sentry-kills-text:1": "Sentry Kills", - "player:claymore-kills-text:1": "Claymore Kills", - "player:acid-bomb-kills-text:1": "Acid Bomb Kills", - "player:ekia-just-after-text:1": "Elims just after", - "player:global-text:1": "Global", - "player:career-text:1": "Career", - "player:career-best-text:1": "Career Best", - "player:core-text:1": "Core", - "player:hc-text:1": "Hardcore", - "player:arena-text:1": "World League", - "player:alltime-text:1": "All Time", - "player:monthly-text:1": "Monthly", - "player:weekly-text:1": "Weekly", - "player:avg-damage-text:1": "AVG Damage", - "player:avg-objectives-text:1": "AVG Objectives", - "player:avg-objective-time-text:1": "AVG Objective Time", - "player:plants-text:1": "Plants", - "player:defuses-text:1": "Defuses", - "player:defends-text:1": "Defends", - "player:captures-text:1": "Captures", - "player:returns-text:1": "Returns", - "player:confirms-text:1": "Confirms", - "player:denies-text:1": "Denies", - "player:vs-text:1": "VS", - "player:rank-text:1": "Rank", - "player:player-text:1": "Player", - "player:rank-title:1": "Rank", - "player:cleanups-text:1": "Cleanups", - "player:smoke-ekia-text:1": "Smoke Elims", - "player:paragon-level-text:1": "Paragon Level", - "player:recent-achievements-text:1": "Recent Achievements", - "player:view-all-achievements-button:1": "View All Achievements", - "player:rare-label:1": "rare", - "player:legendary-label:1": "legendary", - "player:epic-label:1": "epic", - "player:common-label:1": "common", - "player:achievements-text:1": "ACHIEVEMENTS", - "player:remove-pinned-header:1": "REMOVE PINNED ACHIEVEMENT", - "player:remove-pinned-body:1": "By removing this pinned achievement, it won't be visible on your profile after 2 weeks.", - "player:view-all-matches-button:1": "VIEW ALL MATCHES", - "player:upgrade-battle-pass:1": "Purchase Battle Pass", - "player:battle-pass:1": "Battle Pass", - "player:battle-pass-upgrade:1": "Battle Pass", - "player:battle-pass-upgrade-bundle:1": "Battle Pass Upgrade Bundle", - "player:battle-pass-upgrade-description:1": "Access up to 100+ tiers of next-level content, and up to 1300 Call of Duty Points. PLUS, unlock a new Operator instantly!", - "player:battle-pass-upgrade-number-tiers:1": "Battle Pass + 20 tiers", - "player:battle-pass-upgrade-unlocked:1": "Please restart Call of Duty & Redeem your Battle Pass token", - "player:battle-pass-view-progress:1": "View Progress", - "player:battle-pass-purchase-required:1": "Battle Pass Purchase Required", - "player:battle-pass-next-unlock:1": "Next Unlock", - "player:battle-pass-battle-pass-active:1": "Battle Pass Active", - "player:battle-pass-buy-the-pass:1": "Buy the Pass", - "player:cod-points-left:1": "COD Points Left", - "player:insufficient-funds:1": "Insufficient Funds", - "player:upgrade-required:1": "Purchase Required", - "player:upgrade-text:1": "Upgrade", - "player:season-ends:1": "Season Ends", - "player:season:1": "Season", - "player:season-details:1": "Season Details", - "player:battle-pass-learn-more-title:1": "How the Pass Works", - "player:battle-pass-learn-more-description:1": "Learn about the new system for earning rewards and leveling your battle pass up.", - "player:battle-pass-thank-you:1": "Thanks for purchasing the Call of Duty: Battle Pass.", - "player:percent-extra-value:1": "", - "player:free:1": "Free", - "player:bonus:1": "Instant Reward", - "player:store:1": "Store", - "player:lethals-stats-header:1": "Lethal", - "player:tacticals-stats-header:1": "Tactical", - "player:percentage-of-time-moving-text:1": "Percentage of Time Moving", - "player:contracts-text:1": "Contracts", - "player:topfive-text:1": "Top 5", - "player:topten-text:1": "Top 10", - "player:toptwentyfive-text:1": "Top 25", - "player:cash-text:1": "Cash", - "player:gulag-kills-text:1": "Gulag Kills", - "player:gulag-deaths-text:1": "Gulag Deaths", - "player:executions-text:1": "Executions", - "player:objectiveteamwiped-text:1": "Teams Wiped", - "player:objectivebrmissionpickuptablet-text:1": "Contracts Collected", - "player:objectivebrcacheopen-text:1": "Caches Looted", - "player:gulagkills-text:1": "Gulag Wins", - "player:avglifetime-text:1": "Average Lifetime", - "player:damagetaken-text:1": "Damage Taken", - "player:damage-done-text:1": "Damage Dealt", - "player:longest-streak-text:1": "Longest Streak", - "player:draw-d:1": "D", - "player:tier-skip-tiers-text:1": "tier(s)", - "player:highlights-title:1": "Highlights", - "player:last-20-matches-title:1": "Last 20 Matches", - "player:recent-best-title:1": "Recent Best", - "player:stats-header:1": "Stats", - "player:match-history-tab-title:1": "Match History", - "player:no-matches:1": "No Matches", - "player:no-matches-description:1": "Looks like we don't have any stats to show you right now, play a match or two and come back here to see the results.", - "player:your-stats-text:1": "Your Stats", - "player:scoreboard-text:1": "Scoreboard", - "player:loadouts-text:1": "Loadouts", - "player:heatmap-text:1": "Heatmap", - "player:allegiance-name-text:1": "Allegiance", - "player:coalition-name-text:1": "Coalition", - "player:team-results-header:1": "Team Results", - "player:axis-text:1": "Allegiance", - "player:allies-text:1": "Coalition", - "player:most-kills-against-text:1": "Most Kills Against", - "player:most-kills-by-text:1": "Most Kills By", - "player:season-number:1": "Season $number", - "player:best-kd-text:1": "Best KD", - "player:view-all-career-stats-label:1": "View All Career Stats", - "player:progression-level:1": "Progression Level", - "player:career-level:1": "Career Level", - "player:view-all-weekly-stats:1": "View All Weekly Stats", - "player:weekly-snapshot-title:1": "Weekly Snapshot", - "player:achievements-body:1": "You have $number total achievements", - "player:daily-tracking-title:1": "Daily Tracking", - "player:view-achievements:1": "View Achievements", - "player:career-average-title:1": "Career Average", - "player:weekly-snapshot-date:1": "Your Weekly Snapshot of $date", - "player:private-profile-text:1": "Private Profile", - "player:additional-stats:1": "Additional Stats", - "player:daily-chart-matchesPlayed:1": "Matches Played", - "player:section-label:1": "Player", - "player:exclusive:1": "Exclusive", - "player:win-match-placement:1": "W", - "player:lose-match-placement:1": "L", - "player:loss-match-placement:1": "L", - "player:draw-match-placement:1": "D", - "player:none-match-placement:1": "D", - "player:current-supported-loot-season-mw:1": "15", - "player:current-supported-loot-season-cw:1": "11", - "player:current-supported-loot-season-vg:1": "5", - "player:battle-pass-upgrade-unlocked-subtext:1": "Please restart Call of Duty & Redeem your Battle Pass token", - "player:stats-details-lifetime-title:1": "Career Stats", - "player:stats-details-weekly-title:1": "Weekly Stats", - "player:current-supported-battlepass-title:1": "cw", - "player:current-supported-loot-season-game-title-do-not-localize:1": "vg", - "feed:section-title:1": "Feed", - "feed:section-label:1": "Feed", - "feed:cod-tab-title:1": "Call Of Duty", - "feed:friends-tab-title:1": "Friends", - "feed:view-friends-list-btn:1": "View Friends List", - "feed:no-friend-events:1": "No Recent Friend Events", - "intro:title-1:1": "Enlist Now", - "intro:copy-1:1": "Sign-up or log-in for the latest Call of Duty news, post-match analysis, and more.", - "intro:title-2:1": "Connect with Friends", - "intro:copy-2:1": "See who\\u2019s online and how you stack up. Bragging rights have never been easier.", - "intro:title-3:1": "Improve Your Skills", - "intro:copy-3:1": "Want to get more out of your play style? We\\u2019ve got you covered (and then some).", - "intro:title-4:1": "The Latest Intel", - "intro:copy-4:1": "Stay up to date on all the Call of Duty news and events, like game details, COD League, and more.", - "intro:title-5:1": "Your Combat Record", - "intro:copy-5:1": "Get your personalized stats across titles, maps, modes, and weapons.", - "intro:login-button:1": "Log In", - "intro:signup-button:1": "Sign Up", - "options:enable-match-analysis:1": "", - "options:enable-loadout-editor:1": "", - "options:enable-loadout-editor-v2:1": "1", - "options:enable-loot-stream:1": "1", - "options:enable-leaderboard:1": "1", - "options:enable-external-push-sound:1": "1", - "options:minimum-version-required:1": "3.0.0:1", - "options:enable-leaderboard-v2:1": "1", - "options:enable-loot-stream-v2:1": "1", - "options:enable-battle-pass-purchase:1": "1", - "options:enable-store-v1:1": "1", - "options:enable-cdl-autoplay:1": "0", - "options:enable-cdl-mute:1": "0", - "options:enable-boot-camp:1": "1", - "options:enable-boot-camp-map:1": "1", - "options:enable-battle-pass-tierskip-purchase:1": "1", - "options:last-privacy-policy-update-mmddyyyy:1": "04132020", - "options:enable-battle-pass-gifting:1": "", - "options:enable-store-gifting:1": "1", - "options:cdl-home-series:1": "", - "options:enable-promotions:1": "1", - "options:enable-cdl-progress:1": "1", - "options:enable-cdl-bonus-widget:1": "", - "options:enable-cdl-bonus-widget-unearned:1": "", - "options:enable-cdl-bonus-widget-home:1": "", - "options:enable-cdl-code-grants:1": "1", - "options:refresh-interval:1": "30000", - "options:enable-cdl-livestream:1": "1", - "options:store-gifting-whitelist:1": "mw,cw", - "options:store-title-gifting-whitelist:1": "mw,cw", - "options:store-platform-gifting-whitelist:1": "xbl,psn", - "options:store-purchasable-whitelist:1": "wz,mw,vg", - "options:enable-mycod-battle-pass-purchase:1": "1", - "options:enable-mycod-battle-pass-gifting:1": "", - "options:enable-mycod-store-gifting:1": "1", - "options:mycod-store-gifting-whitelist:1": "mw,cw", - "options:cdl-championship-rewards-link:1": "https://www.callofdutyleague.com/en-us/championship-rewards?utm_source=codcompanion&utm_medium=viewershipincentives&utm_campaign=general", - "options:store-public-purchasable-title:1": "vg", - "errors:no-gameplay-data:1": "Sorry, we weren't able to find any gameplay data for your account. Check your profile to verify the correct first-party account is linked. Please note that we currently do not have stats for Call of Duty Mobile.", - "errors:no-recent-data:1": "You\\u2019ve been dark for too long. Rejoin the fight to get new data.", - "errors:no-friends-online:1": "No friends online. Rally the troops!", - "errors:no-friends:1": "No friends found.", - "errors:no-internet:1": "You\\u2019re not connected to the Internet. Are you okay? We\\u2019re sending help. Oh no! We can\\u2019t find you without internet! You\\u2019re on your own. Good luck.", - "errors:already-have-account:1": "Looks like you already have an Activision account tied to that email. Sign in below or reset your password to continue.", - "errors:general-error:1": "Warning: Something went wrong with this page. Your phone will self destruct in 3...2...1\\u2026 FRAG Out!", - "errors:go-to-profile:1": "Go to Profile", - "errors:private-profile:1": "You need a higher clearance to access this private information.", - "errors:fill-in-fields:1": "Please fill in all fields.", - "errors:invalid-email-password:1": "Invalid email or password.", - "errors:do-not-have-account:1": "Looks like you haven\\'t set up an Activision account yet, fill in a few more details to complete your sign up", - "errors:password-must-be-8-characters:1": "Password must be at least 8 characters with a non-sequential number, letter and special character", - "errors:minimum-age:1": "We\\u2019re sorry. You are not eligible to create an account at this time.", - "errors:review-privacy-policy:1": "Please review and accept the terms of use and privacy policy.", - "errors:error-title:1": "error", - "errors:network:1": "Your network token has expired. Please login via your network to restore your token.", - "errors:retry-text:1": "retry", - "errors:update-now-button:1": "Update Now", - "errors:close-app-button:1": "Close APP", - "errors:new-version-required-body:1": "There is an update to the Call of Duty Companion App that includes new features and improvements. This is a required update.", - "errors:new-version-required-title:1": "Update Required", - "errors:not-right-now-button:1": "Not Right Now", - "errors:new-version-available-body:1": "There is an update to the Call of Duty Companion App that includes new features and improvements. Download and update now?", - "errors:new-version-available-title:1": "New App Version Available", - "errors:no-results:1": "No Results", - "errors:default:1": "Something went wrong. Please try again.", - "errors:hang-tight-error-title:1": "Hang Tight", - "errors:updating-store-error-Message:1": "We're working on updating the Store.", - "errors:session-expired-title:1": "Session Expired", - "errors:no-internet-title:1": "No Internet Connection", - "errors:no-data-title:1": "No Data Available", - "errors:session-expired-body:1": "Sorry your session has expired. Please login again to access the Companion App.", - "errors:no-internet-body:1": "Cannot contact Call of Duty servers. Please try again.", - "errors:no-data-body:1": "We're having a problem finding data for this.", - "errors:relog-text:1": "Relog Now", - "errors:2fa-unknown:1": "Something went wrong. Please try again.", - "errors:2fa-throttle:1": "Please wait.", - "errors:2fa-expired:1": "2FA Token Expired. Please log in again.", - "errors:age-gate-failed:1": "We cannot process your request at this time.", - "errors:2fa-incorrect-code:1": "Incorrect Code. Please try again.", - "stats:accuracy:1": "Accuracy", - "stats:assault:1": "Assaults", - "stats:ball_score_assist:1": "Assists", - "stats:bombsdefused:1": "Bombs Defused", - "stats:bombsplanted:1": "Bombs Planted", - "stats:deaths:1": "Deaths", - "stats:defends:1": "Defends", - "stats:elimination:1": "Opponents Eliminated", - "stats:fieldgoal:1": "Field Goals", - "stats:flagcarrierkills:1": "Flag Carrier Kills", - "stats:flagscaptured:1": "Flags Captured", - "stats:flagscarried:1": "Flags Carried", - "stats:flagsreturned:1": "Flags Returned", - "stats:grenades_used:1": "Grenade Kills", - "stats:headshots:1": "Headshots", - "stats:hits:1": "Shots", - "stats:hp_secure:1": "Captures", - "stats:interception:1": "Interceptions", - "stats:kdr:1": "K/D Ratio", - "stats:kill_denied_retrieved:1": "Denies Recovered", - "stats:kill_while_capture:1": "Kills While Capturing", - "stats:kill_with_ads:1": "ADS Kills", - "stats:kill_with_ball:1": "Kills with Ball", - "stats:killedballcarrier:1": "Ball Carrier Kills", - "stats:kills:1": "Kills", - "stats:killsasflagcarrier:1": "Kills as Flag Carrier", - "stats:killsconfirmed:1": "Kills Confirmed", - "stats:killsdenied:1": "Kills Denied", - "stats:last_man_defuse:1": "Defuses as Last Man Standing", - "stats:last_man_standing:1": "Last Man Standing", - "stats:loadouts_used:1": "Number of Loadouts Used", - "stats:ninja_defuse:1": "Ninja Defuses", - "stats:pass_kill_pickup:1": "Pass Kill Pickups", - "stats:pointscaptured:1": "Points Captured", - "stats:raids_build_objective:1": "Build Objectives", - "stats:raids_construct:1": "Constructs", - "stats:raids_destruct:1": "Destructs", - "stats:raids_escort:1": "Escorts", - "stats:raids_hostage_release:1": "Hostages Released", - "stats:raids_progress:1": "Progress", - "stats:raids_retreat:1": "Retreats", - "stats:scorestreak_kills:1": "Scorestreak Kills", - "stats:targetsdestroyed:1": "Targets Destroyed", - "stats:touchdown:1": "Touchdowns", - "stats:zombie_kills:1": "zombie kills", - "stats:num_waves:1": "zombie waves", - "stats:downs:1": "downs", - "stats:highest_multiplier:1": "highest multiplier", - "stats:perks_drank:1": "elixirs", - "stats:hits_taken:1": "shots taken", - "stats:doors_purchased:1": "purchased doors", - "stats:wallbuy_weapons_purchased:1": "purchased weapons", - "stats:ammo_purchased:1": "purchased ammo", - "stats:use_magicbox:1": "mystery box purchases", - "stats:pickedup_stuff:1": "zombie power-ups picked up", - "stats:contaminations_received:1": "zombie contamination", - "stats:contaminations_given:1": "contaminated your team", - "stats:revives:1": "teammate revives", - "stats:failed_revives:1": "failed revives", - "stats:sacrifices:1": "sacrifices", - "stats:failed_sacrifices:1": "failed sacrifices", - "stats:use_pap:1": "pack-a-punch", - "stats:melee_kills:1": "melee kills", - "stats:wonder_weapon_kills:1": "wonder weapon kills", - "stats:grenade_kills:1": "grenade kills", - "stats:ScoreEarned:1": "money earned", - "stats:scoreSpent:1": "money spent", - "stats:score:1": "points", - "stats:xp:1": "XP", - "stats:rank_progressed:1": "merits", - "stats:timeAlive:1": "minutes", - "stats:weapons_picked_up:1": "weapons", - "stats:assists:1": "assists", - "stats:player_placement:1": "place", - "stats:kdratio:1": "K/D Ratio", - "stats:plunder-banked:1": "Plunder Banked", - "stats:total-plunder:1": "Total Plunder", - "stats:topFive:1": "Top 5", - "stats:topTen:1": "Top 10", - "stats:topTwentyFive:1": "Top 25", - "stats:contracts-completed:1": "Contracts Completed", - "stats:teams-wiped:1": "Teams Wiped", - "stats:avg-lifetime:1": "AVG Lifetime", - "stats:damage-taken:1": "Damage Taken", - "stats:caches-looted:1": "Caches Looted", - "stats:contracts-collected:1": "Contracts Collected", - "stats:best-assists:1": "Best Assists", - "stats:best-defuses:1": "Best Defuses", - "stats:best-denied:1": "Best Denied", - "stats:best-deconstructions:1": "Best Destructions", - "stats:best-field-goals:1": "Best Field Goals", - "stats:best-kills-as-survivor:1": "Best Kills As Survivor", - "stats:best-misc-xp:1": "Best Misc Xp", - "stats:best-plants:1": "Best Plants", - "stats:best-rescues:1": "Best Rescues", - "stats:best-score:1": "Best Score", - "stats:best-setbacks:1": "Best Setbacks", - "stats:best-total-xp:1": "Best Total Xp", - "stats:avenger-kills:1": "Avenger Kills", - "stats:bombs-detonated:1": "Bombs Detonated", - "stats:carrier-kills:1": "Carrier Kills", - "stats:comeback-kills:1": "Comeback Kills", - "stats:deaths-from-behind:1": "Deaths From Behind", - "stats:defender-kills:1": "Defender Kills", - "stats:destroyed-killstreaks:1": "Destroyed Killstreaks", - "stats:execution-kills:1": "Execution Kills", - "stats:kills-from-behind:1": "Kills From Behind", - "stats:longshot-kills:1": "Longshot Kills", - "stats:one-shot-one-kills:1": "One Shot One Kills", - "stats:point-blank-kills:1": "Point Blank Kills", - "stats:revenge-kills:1": "Revenge Kills", - "stats:tags-captured:1": "Tags Captured", - "stats:percentage-of-time-moving:1": "% of time moving", - "stats:most-ads-kills:1": "Most ADS Kills", - "stats:most-avenger-kills:1": "Most Avenger Kills", - "stats:most-captures-text:1": "Most Captures", - "stats:most-comebacks:1": "Most Comebacks", - "stats:most-damage-dealt:1": "Most Damage Dealt", - "stats:most-damage-taken:1": "Most Damage Taken", - "stats:most-deaths-from-behind:1": "Most Deaths From Behind", - "stats:most-killstreaks-destroyed:1": "Most Killstreaks Destroyed", - "stats:longest-distance-traveled:1": "Longest Distance Traveled", - "stats:most-headshots:1": "Most Headshots", - "stats:most-hipfire-kills:1": "Most Hipfire Kills", - "stats:most-kills-from-behind:1": "Most Kills From Behind", - "stats:most-one-shot-kills:1": "Most one shot kills", - "stats:most-point-blank-kills:1": "Most Point Blank Kills", - "stats:most-shots-fired:1": "Most Shots Fired", - "stats:most-tags-captured:1": "Collected the Most Tags", - "stats:most-tags-denied:1": "Denied the Most Tags", - "stats:most-defused:1": "Most Defused", - "stats:most-detonated:1": "Most Detonated", - "stats:most-planted:1": "Most Planted", - "stats:most-defends-kills:1": "Most defend kills", - "stats:most-finishing-move-kills:1": "Most Finishing Move Kills", - "stats:longest-killstreak:1": "Longest Killstreak", - "stats:most-longshots:1": "Most Longshots", - "stats:most-throwing-knife-kills:1": "Most Throwing Knife Kills", - "stats:ekia-d:1": "Elims/D", - "stats:objectives:1": "Objectives", - "stats:ties:1": "Ties", - "stats:avgLifeTime:1": "Average Lifetime", - "stats:multikills:1": "Multi Kills", - "stats:curWinStreak:1": "Current Win Streak", - "stats:objective-ekia:1": "Objective EKIA", - "stats:offends:1": "offends", - "arsenal:scorestreak:1": "scorestreak", - "arsenal:equipment:1": "equipment", - "arsenal:gear:1": "gear", - "arsenal:weapon_bare_hands:1": "bare hands", - "arsenal:weapon_tactical_rifle:1": "tactical rifle", - "arsenal:weapon_shotgun:1": "shotgun", - "arsenal:weapon_sniper:1": "sniper", - "arsenal:weapon_lmg:1": "light machine guns", - "arsenal:weapon_launcher:1": "launcher", - "arsenal:weapon_pistol:1": "pistol", - "arsenal:weapon_smg:1": "submachine guns", - "arsenal:weapon_melee:1": "melee", - "arsenal:weapon_assault_rifle:1": "assault rifle", - "arsenal:attachments:1": "Attachments", - "arsenal:weapons:1": "Weapons", - "arsenal:specialist:1": "Specialist", - "arsenal:remove-comparison-label:1": "remove comparison", - "arsenal:compare-a-friend-label:1": "compare a friend", - "arsenal:weapon_ww:1": "wonder weapons", - "arsenal:weapon:1": "weapon", - "arsenal:weapon_special:1": "special", - "arsenal:weapons_iw8_ar_akilo47:1": "AK-47", - "arsenal:weapons_iw8_ar_kilo433:1": "Kilo-141", - "arsenal:weapons_iw8_ar_mcharlie:1": "M13", - "arsenal:weapons_iw8_ar_falima:1": "FAL", - "arsenal:weapons_iw8_ar_asierra12:1": "Oden", - "arsenal:weapons_iw8_sm_mpapa7:1": "MP7", - "arsenal:weapons_iw8_sm_augolf:1": "AUG", - "arsenal:weapons_iw8_sm_uzulu:1": "Uzi", - "arsenal:weapons_iw8_sh_romeo870:1": "Model 680", - "arsenal:weapons_iw8_sh_charlie725:1": "725", - "arsenal:weapons_iw8_sh_oscar12:1": "Origin 12", - "arsenal:weapons_iw8_lm_pkilo:1": "PKM", - "arsenal:weapons_iw8_lm_mgolf34:1": "MG34", - "arsenal:weapons_iw8_lm_lima86:1": "SA87", - "arsenal:weapons_iw8_lm_dblmg:1": "MP Juggernaut", - "arsenal:weapons_iw8_sn_mike14:1": "EBR-14", - "arsenal:weapons_iw8_sn_delta:1": "Dragunov", - "arsenal:weapons_iw8_sn_alpha50:1": "AX-50", - "arsenal:weapons_iw8_sn_hdromeo:1": "HDR", - "arsenal:weapons_iw8_sn_sbeta:1": "Mk2 Carbine", - "arsenal:weapons_iw8_pi_papa320:1": "M19", - "arsenal:weapons_iw8_pi_cpapa:1": ".357", - "arsenal:weapons_iw8_la_rpapa7:1": "RPG-7", - "arsenal:weapons_iw8_la_juliet:1": "JOKR", - "arsenal:weapons_iw8_la_gromeo:1": "PILA", - "arsenal:weapons_iw8_la_kgolf:1": "Strela-P", - "arsenal:weapons_iw8_me_riotshield:1": "Riot Shield", - "arsenal:weapons_equip_gas_grenade:1": "Gas Grenade", - "arsenal:weapons_equip_snapshot_grenade:1": "Snapshot Grenade", - "arsenal:weapons_equip_decoy:1": "Decoy Grenade", - "arsenal:weapons_equip_smoke:1": "Smoke Grenade", - "arsenal:weapons_equip_concussion:1": "Stun Grenade", - "arsenal:weapons_equip_hb_sensor:1": "Heartbeat Sensor", - "arsenal:weapons_equip_flash:1": "Flash Grenade", - "arsenal:weapons_equip_adrenaline:1": "Stim", - "arsenal:weapons_equip_frag:1": "Frag Grenade", - "arsenal:weapons_equip_thermite:1": "Thermite", - "arsenal:weapons_equip_semtex:1": "Semtex", - "arsenal:weapons_equip_claymore:1": "Claymore", - "arsenal:weapons_equip_c4:1": "C4", - "arsenal:weapons_equip_at_mine:1": "Proximity Mine", - "arsenal:weapons_equip_throwing_knife:1": "Throwing Knife", - "arsenal:weapons_equip_molotov:1": "Molotov Cocktail", - "arsenal:weapons_iw8_knife:1": "Combat Knife", - "arsenal:weapon_other:1": "Primary Melee", - "arsenal:weapons_iw8_ar_tango21:1": "RAM-7", - "arsenal:weapons_iw8_ar_falpha:1": "FR 5.56", - "arsenal:weapons_iw8_ar_mike4:1": "M4A1", - "arsenal:weapons_iw8_sm_papa90:1": "P90", - "arsenal:weapons_iw8_sm_mpapa5:1": "MP5", - "arsenal:weapons_iw8_sm_beta:1": "PP19 Bizon", - "arsenal:weapons_iw8_sh_dpapa12:1": "R9-0", - "arsenal:weapons_iw8_lm_mgolf36:1": "Holger-26", - "arsenal:weapons_iw8_sn_kilo98:1": "Kar98k", - "arsenal:weapons_iw8_pi_mike1911:1": "1911", - "arsenal:weapons_iw8_pi_golf21:1": "X16", - "arsenal:weapons_iw8_pi_decho:1": ".50 GS", - "arsenal:weapon_marksman:1": "marksman rifles", - "arsenal:weapons_iw8_lm_kilo121:1": "M91", - "arsenal:weapons_iw8_ar_scharlie:1": "FN Scar 17", - "arsenal:weapons_iw8_ar_sierra552:1": "Grau 5.56", - "arsenal:weapons_iw8_sm_smgolf45:1": "Striker 45", - "arsenal:weapons_iw8_pi_mike9a3:1": "Renetti", - "arsenal:weapons_iw8_lm_mkilo3:1": "Bruen MK9", - "arsenal:weapons_iw8_sh_mike26:1": "VLK Rogue", - "arsenal:weapons_iw8_sn_crossbow:1": "Crossbow", - "arsenal:weapons_iw8_sn_sksierra:1": "SKS", - "arsenal:weapons_iw8_ar_galima:1": "CR-56 AMAX", - "arsenal:weapons_iw8_me_kalistick:1": "Kali Sticks", - "arsenal:weapons_iw8_sm_victor:1": "Fennec Mk9", - "arsenal:weapons_iw8_sn_xmike109:1": "Rytec AMR", - "arsenal:weapons_iw8_pi_mike9:1": "Renetti", - "arsenal:weapons_iw8_me_akimboblunt:1": "Kali Sticks", - "arsenal:weapons_iw8_ar_anovember94:1": "AN-94", - "arsenal:weapons_iw8_sm_charlie9:1": "ISO", - "arsenal:weapons_iw8_me_akimboblades:1": "Dual Kodachis", - "arsenal:weapons_iw8_lm_sierrax:1": "FiNN", - "arsenal:weapons_iw8_ar_valpha:1": "AS VAL", - "arsenal:weapons_iw8_sn_romeo700:1": "SP-R 208", - "arsenal:streak_cruise_predator:1": "Cruise Missile", - "arsenal:streak_manual_turret:1": "Shield Turret", - "arsenal:streak_toma_strike:1": "Cluster Strike", - "arsenal:streak_sentry_gun:1": "Sentry Gun", - "arsenal:streak_hover_jet:1": "VTOL Jet", - "arsenal:streak_precision_airstrike:1": "Precision Airstrike", - "arsenal:streak_juggernaut:1": "Juggernaut", - "arsenal:streak_pac_sentry:1": "", - "arsenal:streak_chopper_gunner:1": "Chopper Gunner", - "arsenal:streak_gunship:1": "Gunship", - "arsenal:streak_white_phosphorus:1": "White Phosphorus", - "arsenal:streak_nuke:1": "Nuke", - "arsenal:streak_chopper_support:1": "Support Helo", - "arsenal:streak_bradley:1": "Infantry Assault Vehicle", - "arsenal:streak_uav:1": "UAV", - "arsenal:streak_directional_uav:1": "Advanced UAV", - "arsenal:streak_airdrop:1": "Care Package", - "arsenal:streak_airdrop_multiple:1": "Emergency Airdrop", - "arsenal:streak_radar_drone_overwatch:1": "Personal Radar", - "arsenal:streak_scrambler_drone_guard:1": "Counter UAV", - "social:favorite-a-friend-title:1": "Favorite a Friend", - "social:private-user-stats-text:1": "This user does not share their stats", - "social:section-title:1": "Social", - "social:section-label:1": "Social", - "social:feed-tab-title:1": "Feed", - "social:you-text:1": "You", - "social:achievement-earned-text:1": "earned an achievement.", - "social:cod-friends:1": "Activision Friends", - "social:activision-friend-invites-label:1": "Activision Friend Invites", - "social:playing-cod-label:1": "Playing Call of Duty", - "social:psn-friends:1": "PSN Friends", - "social:xbl-friends:1": "XBL Friends", - "social:battle-friends:1": "Battle Friends", - "social:social-tab-title:1": "Feed", - "social:add-atvi-friend-text:1": "Add Activision Friend", - "social:pending-atvi-friend-text:1": "Invite Pending...", - "social:remove-friend-text:1": "Remove Friend", - "social:block-text:1": "Block Player", - "social:unblock-text:1": "Unblock Player", - "social:activision-friend-blocked-players-label:1": "Blocked Players", - "social:activision-friend-sent-requests-label:1": "Sent Requests", - "social:no-activision-p1:1": "To see friends in the app you can add them as an Activision Friend in Modern Warfare or search for their username in this app and add them here.", - "social:no-activision-p2:1": "They will need to accept your invite either in Modern Warfare or the app.", - "social:bnet-unavailable-p1:1": "We\\u2019re hard at work fixing some issues that are preventing us from accessing your Battle.net friends. We apologize for the inconvenience.", - "social:bnet-unavailable-p2:1": "In the meantime, to see your friends in the app you can add them as an Activision Friend in Modern Warfare or search for their Battle.net username in this app and add them here.", - "social:bnet-unavailable-p3:1": "They will need to accept your invite either in Modern Warfare or the app.", - "social:auth-needed-error:1": "To view your ${auths} friends, you must re-authenticate with your first party ID. \\u003ca href=\"https://profile.callofduty.com/do_logout?redirectUrl=https%3A%2F%2Fprofile.callofduty.com%2Fcod%2Flogin\">Log out\\u003c\\/a> and re-login using your first party ID.", - "loadouts:accuracy-text:1": "Accuracy", - "loadouts:assault-rifles-text:1": "Assault Rifles", - "loadouts:attachments-text:1": "Attachments", - "loadouts:attachment-text:1": "Attachment", - "loadouts:back-text:1": "Back", - "loadouts:camo-text:1": "Camo", - "loadouts:confirm-unlock-token-use:1": "Are you sure you want to use one permanent unlock token?", - "loadouts:create-a-class-text:1": "Create a class", - "loadouts:damage-text:1": "Damage", - "loadouts:default-choose-attachment-text:1": "Choose an attachment to review its stats and equip it", - "loadouts:default-choose-gear-text:1": "Choose gear to review its benefits and equip it.", - "loadouts:default-choose-op-mod-text:1": "Choose an operator mod to review its stats and equip it", - "loadouts:default-choose-optic-text:1": "Choose an optic to review its stats and equip it.", - "loadouts:default-choose-perk-text:1": "Choose a perk to review its benefits and equip it.", - "loadouts:default-chooser-wildcard-text:1": "Choose a wildcard to review its benefits and equip it.", - "loadouts:default-choose-specialist-equipment:1": "Choose between using assigned Specialist Equipment at no cost or spend a point on equipment of your choice when available.", - "loadouts:default-choose-weapon-text:1": "Choose a weapon to review its stats and equip it", - "loadouts:ekiad-ratio-text:1": "Elims/D ratio", - "loadouts:ekia-text:1": "Elims", - "loadouts:equipment-text:1": "equipment", - "loadouts:equip-text:1": "equip", - "loadouts:fire-rate-text:1": "Fire Rate", - "loadouts:gear-text:1": "Gear", - "loadouts:headshots-text:1": "Headshots", - "loadouts:launchers-text:1": "Launchers", - "loadouts:level-text:1": "Level", - "loadouts:light-machine-guns-text:1": "Light Machine Guns", - "loadouts:loadouts-text:1": "", - "loadouts:loadout-editor-text:1": "Loadout Editor", - "loadouts:loadout-name-text:1": "Loadout Name", - "loadouts:loadout-pushed-failed-text:1": "Unable to push loadout to game.", - "loadouts:loadout-pushed-reboot-game-text:1": "Your Multiplayer Public Matchmaking Loadouts have been saved successfully. Visit Multiplayer Create A Class in the game to continue.", - "loadouts:loadout-pushed-text:1": "Loadout has been pushed to the game.", - "loadouts:lvl-text:1": "LVL", - "loadouts:mags-text:1": "MAGS", - "loadouts:mark-two-abbreviation-text:1": "MK", - "loadouts:max-items-choose-text:1": "You have the maximum number of items. Choose {{}} or more item(s) to replace.", - "loadouts:max-items-text:1": "maximum number of items", - "loadouts:max-text:1": "max", - "loadouts:max-weapon-level-text:1": "max weapon level", - "loadouts:melee-text:1": "melee", - "loadouts:multiplayer-text:1": "multiplayer", - "loadouts:nevermind-text:1": "nevermind", - "loadouts:no-cost-text:1": "no cost", - "loadouts:no-op-mod-text:1": "no operator mod", - "loadouts:ok-text:1": "OK", - "loadouts:operator-modifier-text:1": "operator modifier", - "loadouts:operator-mod-text:1": "operator mod", - "loadouts:optics-text:1": "optics", - "loadouts:optic-text:1": "optic", - "loadouts:performance-text:1": "performance", - "loadouts:perk-gluttony-text:1": "Perk Gluttony", - "loadouts:perk-greed-text:1": "Perk Greed", - "loadouts:perks-text:1": "Perks", - "loadouts:perk-text:1": "Perk", - "loadouts:personalize-text:1": "Personalize", - "loadouts:pick-text:1": "Pick", - "loadouts:pistols-text:1": "Pistols", - "loadouts:primary-text:1": "Primary", - "loadouts:range-text:1": "Range", - "loadouts:reflex-text:1": "Reflex", - "loadouts:remove-items-warning:1": "If you equip this item, it will remove the following", - "loadouts:remove-replace-items-text:1": "remove/replace items", - "loadouts:removes-items-text:1": "removes items", - "loadouts:reticles-text:1": "reticles", - "loadouts:retry-text:1": "retry", - "loadouts:rounds-mag-text:1": "rounds/mag", - "loadouts:save-text:1": "save", - "loadouts:secondary-text:1": "secondary", - "loadouts:select-a-color-text:1": "select a color", - "loadouts:shotguns-text:1": "shotguns", - "loadouts:signature-weapon-text:1": "signature weapon", - "loadouts:sniper-rifles-text:1": "sniper rifles", - "loadouts:special-issue-equipment-text:1": "special issue equipment", - "loadouts:submachine-guns-text:1": "submachine guns", - "loadouts:tactical-rifles-text:1": "tactical rifles", - "loadouts:token-available-text:1": "You have {{}} token available.", - "loadouts:unequip-text:1": "unequip", - "loadouts:unlock-confirmation-text:1": "unlock confirmation", - "loadouts:unlocked-text:1": "unlocked", - "loadouts:unlocks-at-level-text:1": "unlocks at level", - "loadouts:unlocks-text:1": "unlocks", - "loadouts:unlock-text:1": "unlock", - "loadouts:weapon-level-text:1": "weapon level", - "loadouts:wildcards-text:1": "wildcards", - "loadouts:wildcard-text:1": "wildcard", - "loadouts:zombies-text:1": "zombies", - "loadouts:xp-per-kill-text:1": "+25% XP per kill", - "loadouts:black-market-unlock-text:1": "Black Market Unlock", - "loadouts:available-at-text:1": "available at level", - "loadouts:custom-class-text:1": "Custom Class", - "loadouts:default-choose-equipment-text:1": "Choose equipment to review its benefits and equip it.", - "loadouts:operator-test:1": "operator", - "loadouts:mk-ii-text:1": "MK II", - "loadouts:no-op-mod-available-text:1": "No Operator Mod available for this weapon.", - "loadouts:primary-weapon-text:1": "primary weapon", - "loadouts:secondary-weapon-text:1": "secondary weapon", - "loadouts:perk-1-text:1": "perk 1", - "loadouts:perk-2-text:1": "perk 2", - "loadouts:perk-3-text:1": "perk 3", - "loadouts:perk-1-greed-text:1": "perk 1 greed", - "loadouts:perk-2-greed-text:1": "perk 2 greed", - "loadouts:perk-3-greed-text:1": "perk 3 greed", - "loadouts:perk-1-gluttony-text:1": "perk 1 gluttony", - "loadouts:perk-2-gluttony-text:1": "perk 2 gluttony", - "loadouts:perk-3-gluttony-text:1": "perk 3 gluttony", - "loadouts:error-generic:1": "There was an error getting your custom classes. Try logging out and logging back in.", - "loadouts:error-lowlevel:1": "Create a Class is unlocked at level 5. Get to level 5 to start editing your classes.", - "loadouts:error-unauthorized:1": "There was an error getting your custom classes. Please try again.", - "loadouts:not-equipped:1": "Not Equipped", - "loadouts:special:1": "special", - "loadouts:knives-text:1": "knives", - "loadouts:level-5-req-text:1": "Level 5 Required", - "loadouts:level-5-access-text:1": "You must be Level 5 to gain access to the Class Editor", - "loadouts:gunsmith-text:1": "Gunsmith", - "loadouts:customize-text:1": "Customize", - "loadouts:activate-specialist-text:1": "Activate Specialist", - "loadouts:deactivate-specialist-text:1": "Deactivate Specialist", - "loadouts:lethal-text:1": "Lethal", - "loadouts:tactical-text:1": "Tactical", - "loadouts:kill-text:1": "Kill", - "loadouts:kills-text:1": "Kills", - "loadouts:select-replace-text:1": "Select the loadout you would like to replace with", - "loadouts:copy-replace-text:1": "Copy & Replace", - "loadouts:set-favorite-text:1": "Set As Favorite", - "loadouts:armory-text:1": "Armory", - "loadouts:weapon-armory-text:1": "Weapon Armory", - "loadouts:show-info-text:1": "Show Info", - "loadouts:hide-info-text:1": "Hide Info", - "loadouts:stats-text:1": "Stats", - "loadouts:next-unlocks-text:1": "Next Unlocks", - "loadouts:swap-attachments-text:1": "Swap Attachments", - "loadouts:clear-attachments-text:1": "Clear All Attachments", - "loadouts:view-unlocks-text:1": "View Next Unlocks", - "loadouts:clear-attachments-confirm-text:1": "Are you sure you want to clear all your attachments?", - "loadouts:cancel-text:1": "Cancel", - "loadouts:clear-text:1": "Clear", - "loadouts:specialist-warzone-text:1": "Specialist has no effect in Warzone game modes", - "loadouts:pros-cons-text:1": "Pros/Cons", - "loadouts:enter-name-text:1": "Enter Loadout Name", - "loadouts:category-weapon_melee2:1": "Melee", - "loadouts:category-weapon_projectile:1": "Launchers", - "loadouts:category-weapon_pistol:1": "Handguns", - "loadouts:category-weapon_assault:1": "Assault Rifles", - "loadouts:category-weapon_lmg:1": "LMGs", - "loadouts:category-weapon_melee:1": "Melee", - "loadouts:category-weapon_shotgun:1": "Shotguns", - "loadouts:category-weapon_smg:1": "SMGs", - "loadouts:category-weapon_sniper:1": "Sniper Rifles", - "loadouts:category-weapon_dmr:1": "Marksman Rifles", - "loadouts:camouflage-text:1": "Camouflage", - "loadouts:reticle-text:1": "Reticle", - "loadouts:charm-text:1": "Charm", - "loadouts:sticker-text:1": "Sticker", - "loadouts:weapon-gunsmith-text:1": "Weapon Gunsmith", - "loadouts:save-custom-mod-text:1": "Save custom mod", - "loadouts:item-unlock-text:1": "Item unlocked at level", - "loadouts:classified-text:1": "Classified", - "loadouts:create-custom-mod-text:1": "Create custom mod", - "loadouts:update-custom-mod-text:1": "Update custom mod", - "loadouts:delete-custom-mod-text:1": "Delete custom mod", - "loadouts:delete-custom-mod-confirm-title:1": "Delete mod", - "loadouts:delete-custom-mod-confirm-msg:1": "Are you sure you want to delete this mod?", - "loadouts:customize-weapon-text:1": "Customize Weapon", - "loadouts:view-weapon-armory-text:1": "View Weapon Armory", - "loadouts:modified-weapon-text:1": "Modified Weapon", - "loadouts:blueprint-text:1": "Blueprint", - "loadouts:loadout-number:1": "Loadout $number", - "dashboard:companion-app-title:1": "Companion App", - "dashboard:companion-app-download-text:1": "Download App", - "dashboard:news-title:1": "News", - "dashboard:zombies-authentication-title:1": "Zombies Authentication", - "dashboard:learn-more-text:1": "Learn More", - "dashboard:videos-title:1": "Latest Videos", - "dashboard:view-more-text:1": "View More", - "dashboard:warzone-guide-title:1": "Warzone Guide", - "mycod-general:loading-text:1": "Loading", - "mycod-general:previous-text:1": "Prev", - "mycod-general:next-text:1": "Next", - "mycod-general:error-text:1": "Error", - "mycod-general:continue-text:1": "Continue", - "mycod-general:cancel-text:1": "Cancel", - "mycod-general:videos-title:1": "Videos", - "mycod-general:categories-text:1": "Categories", - "mycod-general:autoplay-text:1": "Autoplay", - "mycod-general:zoomin-text:1": "Zoom in", - "mycod-general:zoomout-text:1": "Zoom out", - "mycod-general:reset-text:1": "Reset", - "mycod-general:route-dashboard-text:1": "Dashboard", - "mycod-general:route-player-text:1": "Player", - "mycod-general:route-combatrecord-text:1": "Combat Record", - "mycod-general:route-recentmatches-text:1": "Recent Matches", - "mycod-general:route-loadouts-text:1": "Create a Class", - "mycod-general:route-blackmarket-text:1": "Black Market", - "mycod-general:route-zombiesauth-text:1": "Zombies Authentication", - "mycod-general:route-orders-text:1": "Orders & Contracts", - "mycod-general:route-intel-text:1": "Intel", - "mycod-general:route-actionreport-text:1": "Action Report", - "mycod-general:route-weeklybrief-text:1": "Weekly Brief", - "mycod-general:route-matchanalysis-text:1": "Match Analysis", - "mycod-general:route-maps-text:1": "Maps", - "mycod-general:route-videos-text:1": "Videos", - "mycod-general:route-social-text:1": "Social", - "mycod-general:route-feed-text:1": "Feed", - "mycod-general:route-friends-text:1": "Friends", - "mycod-general:route-friendcomparison-text:1": "Friend Comparison", - "mycod-general:route-leaderboard-text:1": "Leaderboard", - "mycod-general:route-battlepass-text:1": "Battle Pass", - "mycod-general:route-store-text:1": "Store", - "mycod-general:route-strategyguide-text:1": "Strategy Guide", - "mycod-general:confirm-text:1": "Confirm", - "friends:friends-subtitle:1": "See what your friends are up to on Call of Duty!", - "friends:add-friends-text:1": "Add friends via first party account", - "friends:friends-error-text:1": "We are unable to get your friends. Please ensure your first party account is authenticated.", - "player:time-left:1": "Time Left", - "player:private-profile-error:1": "\\u003ch1>Private Profile\\u003c\\/h1> \\u003cp>This user does not share their stats\\u003c\\/p>", - "player:click-to-go-back:1": "Click here to go back", - "player:back-to:1": "Back to", - "player:no-stats:1": "\\u003ch1>No Gameplay Found\\u003c\\/h1> \\u003cp>You\\u2019ve reached peak anonymity. If you\\u2019ve never played Call of Duty before, get to it!\\u003c\\/p> \\u003cp>Otherwise, we recommend you double check your account info on your account info on your \\u003ca href=\"https://profile.callofduty.com/cod/profile\" target=\"_blank\">Profile page\\u003c\\/a>.\\u003c\\/p>", - "player:no-identity:1": "\\u003ch1>No Linked Network Account\\u003c\\/h1> \\u003cp>Connect your Call of Duty account to other networks to enable stat tracking and in-game integrations.\\u003c\\/p>", - "player:tier-progress:1": "Tier Progress", - "player:recent-stats:1": "Recent Stats", - "player:points-scored-text:1": "Points Scored", - "player:battlepass-popup-image:1": "https://www.callofduty.com/cdn/app/banners/battle_pass/cw/mycod-bp-zeus-s6-pop-up.jpg", - "player:battlepass-main-image:1": "https://www.callofduty.com/cdn/app/banners/battle_pass/cw/mycod-bp-zeus-s6-main.jpg", - "player:battlepass-main-season-icon-image:1": "https://www.callofduty.com/cdn/app/banners/battle_pass/cw/mycod-bp-zeus-s6-logo.png", - "player:battlepass-icon-image:1": "/content/dam/atvi/callofduty/cod-touchui/kronos/battlepass/bp-s6-icon.png", - "leaderboard:leaderboard-settings-text:1": "Leaderboard Settings", - "leaderboard:global-text:1": "Global", - "leaderboard:friends-text:1": "Friends Only", - "leaderboard:mp-text:1": "Multiplayer", - "leaderboard:zombies-text:1": "Zombies", - "leaderboard:playstation-text:1": "Playstation", - "leaderboard:xbox-text:1": "Xbox", - "leaderboard:bnet-text:1": "Battle.net", - "leaderboard:core-text:1": "Core", - "leaderboard:hardcore-text:1": "Hardcore", - "leaderboard:world-text:1": "World League", - "leaderboard:leaderboard-title:1": "Leaderboard", - "zombies-auth:form-header:1": "Black Ops Authenticity Stamp System", - "zombies-auth:form-description:1": "Welcome to the Black Ops Authenticity Stamp entry page! Please enter the code provided along with your Player ID to authenticate your latest Zombies achievements in all their unique, fully customized glory. Thanks for playing!", - "zombies-auth:gamertag:1": "Player ID", - "zombies-auth:enter-zombies-code:1": "Enter Zombies Code Here...", - "zombies-auth:results-for-code:1": "Results for code", - "zombies-auth:map:1": "Map", - "zombies-auth:difficulty:1": "Difficulty", - "zombies-auth:game-type:1": "Game Type", - "zombies-auth:host:1": "HOST", - "zombies-auth:party-members:1": "Party Members", - "zombies-auth:number-of-players:1": "Number of Players", - "zombies-auth:date:1": "Date", - "zombies-auth:share-stats:1": "Share your stats", - "zombies-auth:primary-stats-for:1": "Primary Stats For", - "zombies-auth:player-rank:1": "Player Rank", - "zombies-auth:level:1": "Level", - "zombies-auth:prestige:1": "Prestige", - "zombies-auth:master-prestige:1": "Master Prestige", - "zombies-auth:kills:1": "Kills", - "zombies-auth:deaths:1": "Deaths", - "zombies-auth:match-duration:1": "Match Duration", - "zombies-auth:final-round:1": "Final Round", - "zombies-auth:total-downs:1": "Total Downs", - "zombies-auth:total-revives:1": "Total Revives", - "zombies-auth:total-headshots:1": "Total Headshots", - "zombies-auth:special-weapon:1": "Special Weapon", - "zombies-auth:special-weapon-used:1": "Special Weapon Used", - "zombies-auth:equipment:1": "Equipment", - "zombies-auth:perk:1": "Perk", - "zombies-auth:elixir:1": "Elixir", - "zombies-auth:easter-egg:1": "Main Quest Completed", - "zombies-auth:elixirs-consumed:1": "Elixirs Consumed", - "zombies-auth:empty-elixirs:1": "Empty", - "zombies-auth:talisman-used:1": "Talisman", - "zombies-auth:final-score:1": "Final Score", - "zombies-auth:score-spent:1": "Score Spent", - "zombies-auth:all-on:1": "All On", - "zombies-auth:always-on:1": "Always On", - "zombies-auth:bar:1": "Bar", - "zombies-auth:bars:1": "Bars", - "zombies-auth:default:1": "Default", - "zombies-auth:disabled:1": "Disabled", - "zombies-auth:double:1": "Double", - "zombies-auth:easy:1": "Easy", - "zombies-auth:enabled:1": "Enabled", - "zombies-auth:fast:1": "Fast", - "zombies-auth:firesale-only:1": "Firesale Only", - "zombies-auth:half:1": "Half", - "zombies-auth:hard:1": "Hard", - "zombies-auth:insane:1": "Insane", - "zombies-auth:instant:1": "Instant", - "zombies-auth:large:1": "Large", - "zombies-auth:locked:1": "Locked", - "zombies-auth:long:1": "Long", - "zombies-auth:loose:1": "Loose", - "zombies-auth:medium:1": "Medium", - "zombies-auth:normal:1": "Normal", - "zombies-auth:off:1": "Off", - "zombies-auth:on:1": "On", - "zombies-auth:only:1": "Only", - "zombies-auth:open:1": "Open", - "zombies-auth:point:1": "Point", - "zombies-auth:quadruple:1": "Quadruple", - "zombies-auth:reflect:1": "Reflect", - "zombies-auth:round:1": "Round", - "zombies-auth:run:1": "Run", - "zombies-auth:shared:1": "Shared", - "zombies-auth:short:1": "Short", - "zombies-auth:slow:1": "Slow", - "zombies-auth:small:1": "Small", - "zombies-auth:sprint:1": "Sprint", - "zombies-auth:supersprint:1": "SuperSprint", - "zombies-auth:tight:1": "Tight", - "zombies-auth:walk:1": "Walk", - "orders:orders-title:1": "Orders", - "orders:your-orders:1": "Your Orders", - "orders:available-contracts:1": "Available Contracts", - "orders:your-contracts:1": "Your Contracts", - "orders:available-orders:1": "Available Orders", - "orders:orders-description:1": "Complete Orders. Get Rewarded", - "orders:contracts-description:1": "Ante up and get the job done. Clock's Ticking.", - "orders:progress:1": "Progress", - "orders:steps-completed:1": "Steps Completed", - "orders:special-orders:1": "Special Order", - "orders:rewards:1": "Rewards", - "orders:you-picked-this-order:1": "You picked this order on", - "orders:special-order:1": "Special Order", - "orders:new-orders-available:1": "New Orders Available in", - "orders:new-contracts-available:1": "New Contracts Available in", - "orders:daily-orders-completed:1": "Daily Orders Completed", - "orders:daily-orders-completed-description:1": "Complete and Redeem six Daily Orders to receive a Supply Drop.", - "orders:weekly-orders-completed:1": "Weekly Orders Completed", - "orders:weekly-orders-completed-description:1": "Complete and Redeem three Weekly Orders to receive a Rare Supply Drop.", - "orders:contracts-title:1": "Contracts", - "orders:completion-time:1": "Completion Time", - "orders:contract-cost:1": "Contract Cost", - "orders:you-picked-this-contract:1": "You picked this contract on", - "orders:order-complete:1": "Order Complete!", - "orders:contract-complete:1": "Contract complete!", - "orders:nowwii-error:1": "You must play Call of Duty®: WWII to access Orders & Contracts", - "store:purchase:1": "Purchase!", - "store:purchased:1": "Purchased", - "store:confirm-purchase:1": "Confirm Purchase", - "store:problem-occurred-try-again:1": "Problem occurred, please try again.", - "store:buy-text:1": "Buy", - "store:buy-bundle:1": "Buy Bundle", - "store:wish-to-purchase:1": "Do you wish to purchase", - "store:next-unlock:1": "Next Unlock", - "store:max-tier-reached:1": "Max Tier Reached", - "store:battle-pass-purchase-required:1": "Battle Pass Purchase Required", - "store:view-progress:1": "View Progress", - "store:buy-the-pass:1": "Buy the Pass", - "store:view-bundle:1": "View Bundle", - "store:buy-now:1": "Buy Now", - "store:limited-time:1": "Limited Time", - "store:featured-category:1": "Featured", - "store:operator-category:1": "Operators & Identity", - "store:weapon-category:1": "Blueprints", - "store:operator_skin_type:1": "Operator Skin", - "store:watch_type:1": "Watch", - "store:xp_token_type:1": "XP Token", - "store:blueprint_type:1": "Blueprint", - "store:player_card_type:1": "Player Card", - "store:wxp_token_type:1": "WXP Token", - "store:emblem_type:1": "Emblem", - "store:knife_skin_type:1": "Knife Skin", - "store:cp_type:1": "CP", - "store:charm_type:1": "Charm", - "store:spray_type:1": "Spray", - "store:new_weapon_type:1": "New Weapon", - "store:processing-text:1": "Processing . . .", - "store:buy-number-tiers:1": "Buy $number Tier(s)", - "store:purchase-success-text:1": "Purchase Successful!", - "store:purchase-failed-text:1": "Purchase Failed", - "store:purchase-failed-message-text:1": "Your purchase could not be completed at this time. Please try again later or try your purchase in-game.", - "store:tier-purchase-warning-text:1": "You must purchase a Battle Pass Upgrade to gain access to all purchased tiers, otherwise only tiers marked 'Free' will be accessible.", - "store:tier-transaction-confirmation-text:1": "Do you wish to purchase $number tier(s)?", - "store:tier-skip-purchased-text:1": "Tier Skip(s) Purchased Successfully!", - "store:tier-skip-instructions-text:1": "Please restart Modern Warfare & redeem your Tier Skip token(s)", - "store:tier-skip-available-text:1": "Available Tier Skips", - "store:tier-skip-available-instructions-text:1": "Please redeem in-game. A restart may be required.", - "store:gift-pass-text:1": "Gift the pass", - "store:gift-select-friend-title:1": "Choose friend to gift", - "store:gift-select-friend-msg-text:1": "Once you purchase this item for your friend, they will receive a notification in their Call of Duty Companion App as well as in-game. They may need to restart their game to see the gift.", - "store:gift-friends-error-text:1": "We are unable to get your friends. Please try again.", - "store:gift-confirm-purchase:1": "Confirm Gift Purchase", - "store:gift-do-you-wish-purchase:1": "Give $itemName to $giftFriendUsername", - "store:gift-remaining-text:1": "You have $remainingGifts gifts left out of your 3 gift weekly limit. Only 1 gift can be given to a single user each week.", - "store:gift-send-gift-text:1": "Send Gift", - "store:clipboard-instructions-text:1": "Tell your friend to claim their new gift! Copy message below.", - "store:clipboard-content-text:1": "You\\u2019ve got a gift waiting for you in Call of Duty. Open the app or check your game to see what'you\\u2019ve got! https://www.callofduty.com/app/gifting", - "store:confirm-gift-purchase-msg:1": "Do you wish to purchase a $item as a gift for $username?", - "store:gifting-limit-reached-text:1": "Gifting Limit Reached", - "store:gifting-limit-reached-msg:1": "You have sent this player a gift this week and reached your weekly limit for a single player. Please try again next week.", - "store:gifting-limit-disclaimer-msg:1": "Please try again one week from the time of purchase.", - "store:already-owned-text:1": "Already Owned", - "store:already-owned-msg:1": "This player already owns or has been previously gifted this item. Please select a different player.", - "store:no-atvi-account-msg:1": "This user does not have an Activision ID. This might be because they have not played Modern Warfare or Warzone yet. Have them sign up first to gift this item.", - "store:gifting-weekly-limit-reached-msg:1": "You have sent the maximum number of gifts and reached your daily limit, please try again tomorrow.", - "store:max-reached-text:1": "Max Reached", - "store:owned-text:1": "Owned", - "store:gift-text:1": "Gift", - "store:sticker_type:1": "Sticker", - "store:bundle-items-text:1": "Bundle Items", - "store:not-giftable-text:1": "Gifting Unavailable", - "store:not-giftable-msg:1": "Sorry for the inconvenience, please try again another time. If you recently added this person as an Activision friend there is a 7 day waiting period before gifting becomes available.", - "store:purchased-category:1": "Purchased", - "store:store-gifting-banner-title:1": "Store Gifting", - "store:store-gifting-banner-body:1": "Now you can gift store bundles to your friends!", - "store:store-gifting-banner-button:1": "Visit the store", - "store:gift-bundle:1": "Gift Bundle", - "store:gifting-banner-title:1": "Store Gifting", - "store:gifting-banner-body:1": "Now you can gift store bundles to your friends!", - "store:gifting-banner-button:1": "Visit the Store", - "store:category-name-justforyou:1": "Just For You", - "store:category-name-operator:1": "Operators & Identity", - "store:category-name-weapon:1": "Blueprints", - "store:category-name-featured:1": "Featured", - "store:category-name-operator_recommended:1": "Operators & Identity", - "store:category-name-weapon_recommended:1": "Blueprints", - "store:category-name-featured_recommended:1": "Featured", - "store:category-name-purchased:1": "Purchased", - "store:view-all-owned-bundles:1": "View All Owned Bundles", - "store:owned-bundles-title:1": "Owned Bundles", - "store:redeem-bundle:1": "Redeem Bundle", - "store:wish-to-redeem:1": "Do you wish to redeem", - "store:confirm-redemption:1": "Confirm Redemption", - "store:redeem-now:1": "Redeem Now", - "store:redeemed:1": "Redeemed!", - "store:for-you-title:1": "Just For You", - "store:view-store:1": "View Store", - "store:back-to-store:1": "Back to Store", - "store:error-no-bundle-title:1": "Store Bundle Not Found", - "store:error-no-bundle-body:1": "Looks like we can't find that bundle right now.", - "store:wz-store-title:1": "Warzone Store", - "store:cw-store-title:1": "Black Ops: Cold War Store", - "store:mw-store-title:1": "Modern Warfare Store", - "store:exclusive-title-mw:1": "Modern Warfare Bundle Exclusive", - "store:exclusive-body-mw:1": "All items in this bundle can be equipped in Modern Warfare and Warzone only. Items from this bundle cannot be equipped in Black Ops", - "store:exclusive-title-cw:1": "Cold War Bundle Exclusive", - "store:exclusive-body-cw:1": "All items in this bundle can be equipped in Black Ops: Cold War and Warzone only.", - "store:login-to-purchase:1": "Login to Purchase", - "store:calling_card:1": "Calling Card", - "store:emblem:1": "Emblem", - "store:wrist_accessory:1": "Wrist Accessory", - "store:character_outfit:1": "Operator Skin", - "store:blueprint:1": "Weapon Blueprint", - "store:charm:1": "Charm", - "store:execution:1": "Finishing Move", - "store:how-to-use:1": "To view your purchase, please go into \\u003ci>Warzone\\u003c\\/i> or \\u003ci>Black Ops Cold War\\u003c\\/i> where you can access the bundle contents (Game restart may be required).", - "store:gestures:1": "Gestures", - "store:vehicle_horn:1": "Vehicle Horn", - "store:vehicle_skin:1": "Vehicle Skin", - "store:recent-friend-giftable-text:1": "Gifting Unavailable", - "store:recent-friend-giftable-msg:1": "You recently added this person as an Activision friend there is a 7 day waiting period before gifting becomes available. Sorry for the inconvenience.", - "store:gift-2fa-code-required-title:1": "Enter two-factor authentication code", - "store:gift-2fa-code-required-msg:1": "To complete your order, enter the two-factor authentication code from the authentication app (Google Authenticator).", - "store:category-name-featured_recommended_mw:1": "Featured", - "store:section-label:1": "Store", - "store:exclusive-title-vg:1": "Vanguard Bundle Exclusive", - "store:exclusive-body-vg:1": "All items in this bundle can be equipped in Vanguard and Warzone only.", - "store:operator_quip_type:1": "Operator Quip", - "store:mvp_highlight_type:1": "MVP Highlight", - "store:highlight_intro_type:1": "Highlight Intro", - "store:reticle_type:1": "Reticle", - "store:vg-store-title:1": "Vanguard Store", - "news:filtercategory-all:1": "All", - "news:filtercategory-news:1": "News", - "news:no-results:1": "No Results", - "news:filtercategory-cdl:1": "COD League", - "news:codleague-title:1": "COD League", - "inbox:no-updates-description:1": "We have no updates. Please check again later.", - "inbox:no-updates-title:1": "No Updates", - "inbox:delete-message-test:1": "Delete Message", - "inbox:inbox-title:1": "Inbox", - "inbox:friend-reaction-card-title:1": "Reacted to Something", - "inbox:gift-card-title:1": "Sent you a Gift", - "inbox:gift-battle-pass-card-title:1": "Sent you a Battle Pass" -} \ No newline at end of file diff --git a/depricated_dev_scripts/beautify_data.py b/depricated_dev_scripts/beautify_data.py deleted file mode 100644 index a9c3fb2..0000000 --- a/depricated_dev_scripts/beautify_data.py +++ /dev/null @@ -1,298 +0,0 @@ -import json - -def replace_and_sort_keys_in_json(file_path, replacements): - """Replace keys in the JSON file based on the replacements dictionary and sort Accolades.""" - - with open(file_path, 'r') as file: - data = json.load(file) - - def recursive_key_replace(obj, replacements): - if isinstance(obj, dict): - new_obj = {} - for key, value in obj.items(): - new_key = replacements.get(key, key) - new_obj[new_key] = recursive_key_replace(value, replacements) - - if new_key == "mode": # Sort Game Modes by 'timePlayed' in descending order - sorted_modes = dict(sorted(new_obj[new_key].items(), key=lambda item: item[1]['properties']['timePlayed'], reverse=True)) - new_obj[new_key] = sorted_modes - - if new_key in ["Assault Rifles", "Shotguns", "Marksman Rifles", "Snipers", "LMGs", "Launchers", "Pistols", "SMGs", "Melee"]: # Sort Weapons by 'kills' in descending order - sorted_weapons = dict(sorted(new_obj[new_key].items(), key=lambda item: item[1]['properties']['kills'], reverse=True)) - new_obj[new_key] = sorted_weapons - - if new_key in ["Field Upgrades"]: # Sort Field Upgrades by 'uses' in descending order - sorted_fieldupgrades = dict(sorted(new_obj[new_key].items(), key=lambda item: item[1]['properties']['uses'], reverse=True)) - new_obj[new_key] = sorted_fieldupgrades - - if new_key in ["Tactical Equipment", "Lethal Equipment"]: # Sort Lethal and Tactical equipment by 'uses' in descending order - sorted_equipment = dict(sorted(new_obj[new_key].items(), key=lambda item: item[1]['properties']['uses'], reverse=True)) - new_obj[new_key] = sorted_equipment - - if new_key == "Scorestreaks": # Sort Lethal and Support Scorestreaks by 'awardedCount' in descending order - for subcategory, scorestreaks in new_obj[new_key].items(): - sorted_scorestreaks = dict(sorted(scorestreaks.items(), key=lambda item: item[1]['properties']['awardedCount'], reverse=True)) - new_obj[new_key][subcategory] = sorted_scorestreaks - - # Sort Accolades in descending order - if new_key == "Accolades": - sorted_accolades = dict(sorted(new_obj[new_key]['properties'].items(), key=lambda item: item[1], reverse=True)) - new_obj[new_key]['properties'] = sorted_accolades - - return new_obj - elif isinstance(obj, list): - for index, value in enumerate(obj): - obj[index] = recursive_key_replace(value, replacements) - return obj - - data = recursive_key_replace(data, replacements) - - with open(file_path, 'w') as file: - json.dump(data, file, indent=4) - -if __name__ == "__main__": - # Define the keys to be replaced and their replacements - replacements = { - # Gamemodes - "dom": "Domination", - "hc_dom": "Hardcore Domination", - "war": "Team Deathmatch", - "hc_war": "Hardcore Team Deathmatch", - "hq": "Headquarters", - "hc_hq": "Hardcore Headquarters", - "conf": "Kill Confirmed", - "hc_conf": "Hardcore Kill Confirmed", - "koth": "Hardpoint", - "koth_hc": "Hardcore Hardpoint", - "sd": "Search and Destroy", - "hc_sd": "Hardcore Search and Destroy", - "cyber": "Cyber Attack", - "hc_cyber": "Hardcore Cyber Attack", - "grnd": "Grind", - "arm": "Ground War", - "infect": "Infected", - "gun": "Gun Game", - "arena": "Gunfight", - "br": "Battle Royale (Warzone)", - "br_dmz": "Plunder", - "br_all": "Battle Royale (Warzone & Plunder)", - # Weapons - "weapon_assault_rifle": "Assault Rifles", - "weapon_shotgun": "Shotguns", - "weapon_marksman": "Marksman Rifles", - "weapon_sniper": "Snipers", - "tacticals": "Tactical Equipment", - "lethals": "Lethal Equipment", - "weapon_lmg": "LMGs", - "weapon_launcher": "Launchers", - "supers": "Field Upgrades", - "weapon_pistol": "Pistols", - "weapon_other": "Primary Melee", - "weapon_smg": "SMGs", - "weapon_melee": "Melee", - "scorestreakData": "Scorestreaks", - "lethalScorestreakData": "Lethal Scorestreaks", - "supportScorestreakData": "Support Scorestreaks", - # Guns - ## Assault Rifles - "iw8_ar_tango21": "RAM-7", - "iw8_ar_mike4": "M4A1", - "iw8_ar_valpha": "AS VAL", - "iw8_ar_falpha": "FR 5.56", - "iw8_ar_mcharlie": "M13", - "iw8_ar_akilo47": "AK-47", - "iw8_ar_asierra12": "Oden", - "iw8_ar_galima": "CR-56 AMAX", - "iw8_ar_sierra552": "Grau 5.56", - "iw8_ar_falima": "FAL", - "iw8_ar_anovember94": "AN-94", - "iw8_ar_kilo433": "Kilo 141", - "iw8_ar_scharlie": "FN Scar 17", - "iw8_sh_mike26": "VLK Rogue", - ## Shotguns - "iw8_sh_charlie725": "725", - "iw8_sh_oscar12": "Origin 12 Shotgun", - "iw8_sh_aalpha12": "JAK-12", - "iw8_sh_romeo870": "Model 680", - "iw8_sh_dpapa12": "R9-0 Shotgun", - ## Marksman Rifles - "iw8_sn_sbeta": "MK2 Carbine", - "iw8_sn_crossbow": "Crossbow", - "iw8_sn_romeo700": "SP-R 208", - "iw8_sn_kilo98": "Kar98k", - "iw8_sn_mike14": "EBR-14", - "iw8_sn_sksierra": "SKS", - ## Sniper Rifles - "iw8_sn_alpha50": "AX-50", - "iw8_sn_hdromeo": "HDR", - "iw8_sn_delta": "Dragunov", - "iw8_sn_xmike109": "Rytec AMR", - ## Tactical Equipment - "equip_gas_grenade": "Gas Grenade", - "equip_snapshot_grenade": "Snapshot Grenade", - "equip_decoy": "Decoy Grenade", - "equip_smoke": "Smoke Grenade", - "equip_concussion": "Concussion Grenade", - "equip_hb_sensor": "Heartbeat Sensor", - "equip_flash": "Flash Grenade", - "equip_adrenaline": "Stim", - ## Lethal Equipment - "equip_frag": "Frag Grenade", - "equip_thermite": "Thermite", - "equip_semtex": "Semtex", - "equip_claymore": "Claymore", - "equip_c4": "C4", - "equip_at_mine": "Proximity Mine", - "equip_throwing_knife": "Throwing Knife", - "equip_molotov": "Mototov Cocktail", - ## LMGs - "iw8_lm_kilo121": "M91", - "iw8_lm_mkilo3": "Bruen Mk9", - "iw8_lm_mgolf34": "MG34", - "iw8_lm_lima86": "SA87", - "iw8_lm_pkilo": "PKM", - "iw8_lm_sierrax": "FiNN LMG", - "iw8_lm_mgolf36": "Holger-26", - # "": "", ### RAAL LMG not implemented - ## Launchers - "iw8_la_gromeo": "PILA", - "iw8_la_rpapa7": "RPG-7", - "iw8_la_juliet": "JOKR", - "iw8_la_kgolf": "Strela-P", - # "": "", ### Unknown Launcher - ## Field Upgrades - "super_emp_drone": "EMP Drone", - "super_trophy": "Trophy System", - "super_ammo_drop": "Munitions Box", - "super_weapon_drop": "Weapon Drop", - "super_fulton": "Cash Deposit Balloon", - "super_armor_drop": "Armor Box", - "super_select": "Field Upgrade Pro (Any)", - "super_tac_insert": "Tactical Insertion", - "super_recon_drone": "Recon Drone", - "super_deadsilence": "Dead Silence", - "super_supply_drop": "Loadout Drop", ### Unsure if this is Loadout Drop - "super_tac_cover": "Deployable Cover", - "super_support_box": "Stopping Power Rounds", - ## Pistols - "iw8_pi_cpapa": ".357", - "iw8_pi_mike9": "Renetti", - "iw8_pi_mike1911": "1911", - "iw8_pi_golf21": "X16", - "iw8_pi_decho": ".50 GS", - "iw8_pi_papa320": "M19", - # "": "", ### Sykov not implemented - ## Primary Melee - "iw8_me_riotshield": "Riot Shield", - ## SMGs - "iw8_sm_mpapa7": "MP7", - "iw8_sm_augolf": "AUG", - "iw8_sm_papa90": "P90", - "iw8_sm_charlie9": "ISO", - "iw8_sm_mpapa5": "MP5", - "iw8_sm_smgolf45": "Striker 45", - "iw8_sm_beta": "PP19 Bizon", - "iw8_sm_victor": "Fennec", - "iw8_sm_uzulu": "Uzi", - # "": "", ### CX9 not implemented - ## Melee - "iw8_me_akimboblunt": "Kali Sticks", - "iw8_me_akimboblades": "Dual Kodachis", - "iw8_knife": "Knife", - # Scorestreaks - "precision_airstrike": "Precision Airstrike", - "cruise_predator": "Cruise Missile", - "manual_turret": "Shield Turret", - "white_phosphorus": "White Phosphorus", - "hover_jet": "VTOL Jet", - "chopper_gunner": "Chopper Gunner", - "gunship": "Gunship", - "sentry_gun": "Sentry Gun", - "toma_strike": "Cluster Strike", - "nuke": "Nuke", - "juggernaut": "Juggernaut", - "pac_sentry": "Wheelson", - "chopper_support": "Support Helo", - "bradley": "Infantry Assault Vehicle", - "airdrop": "Care Package", - "radar_drone_overwatch": "Personal Radar", - "scrambler_drone_guard": "Counter UAV", - "uav": "UAV", - "airdrop_multiple": "Emergency Airdrop", - "directional_uav": "Advanced UAV", - # Accolades - # "accoladeData": "Accolades", - # "classChanges": "Most classes changed (Evolver)", - # "highestAvgAltitude": "Highest average altitude (High Command)", - # "killsFromBehind": "Most kills from behind (Flanker)", - # "lmgDeaths": "Most LMG deaths (Target Practice)", - # "riotShieldDamageAbsorbed": "Most damage absorbed with Riot Shield (Guardian)", - # "flashbangHits": "Most Flashbang hits (Blinder)", - # "meleeKills": "Most Melee kills (Brawler)", - # "tagsLargestBank": "Largest bank (Bank Account)", - # "shotgunKills": "Most Shotgun kills (Buckshot)", - # "sniperDeaths": "Most Sniper deaths (Zeroed In)", - # "timeProne": "Most time spent Prone (Grassy Knoll)", - # "killstreakWhitePhosphorousKillsAssists": "Most kills and assists with White Phosphorus (Burnout)", - # "shortestLife": "Shortest life (Terminal)", - # "deathsFromBehind": "Most deaths from behind (Blindsided)", - # "higherRankedKills": "Most kills on higher ranked scoreboard players (Upriser)", - # "mostAssists": "Most assists (Wingman)", - # "leastKills": "Fewest kills (The Fearful)", - # "tagsDenied": "Denied the most tags (Denied)", - # "killstreakWheelsonKills": "Most Wheelson kills", - # "sniperHeadshots": "Most Sniper headshots (Dead Aim)", - # "killstreakJuggernautKills": "Most Juggernaut kills (Heavy Metal)", - # "smokesUsed": "Most Smoke Grenades used (Chimney)", - # "avengerKills": "Most avenger kills (Avenger)", - # "decoyHits": "Most Decoy Grenade hits (Made You Look)", - # "killstreakCarePackageUsed": "Most Care Packages called in (Helping Hand)", - # "molotovKills": "Most Molotov kills (Arsonist)", - # "gasHits": "Most Gas Grenade hits (Gaseous)", - # "comebackKills": "Most comebacks (Rally)", - # "lmgHeadshots": "Most LMG headshots (LMG Expert)", - # "smgDeaths": "Most SMG deaths (Run and Gunned)", - # "carrierKills": "Most kills as carrier (Carrier)", - # "deployableCoverUsed": "Most Deployable Covers used (Combat Engineer)", - # "thermiteKills": "Most Thermite kills (Red Iron)", - # "arKills": "Most assault rifle kills (AR Specialist)", - # "c4Kills": "Most C4 kills (Handle With Care)", - # "suicides": "Most suicides (Accident Prone)", - # "clutch": "Most kills as the last alive (Clutched)", - # "survivorKills": "Most kills as survivor (Survivalist)", - # "killstreakGunshipKills": "Most Gunship kills (Death From Above)", - # "timeSpentAsPassenger": "Most time spent as a passenger (Navigator)", - # "returns": "Most flags returned (Flag Returner)", - # "smgHeadshots": "Most SMG headshots (SMG Expert)", - # "launcherDeaths": "Most launcher deaths (Fubar)", - # "oneShotOneKills": "Most one shot kills (One Shot Kill)", - # "ammoBoxUsed": "Most Munitions Boxes used (Provider)", - # #"spawnSelectSquad": "", - # "weaponPickups": "Most picked up weapons (Loaner)", - # "pointBlankKills": "Most point blank kills (Personal Space)", - # "tagsCaptured": "Collected the most tags (Confirmed Kills)", - # "killstreakGroundKills": "Most ground based killstreak kills (Ground Control)", - # "distanceTraveledInVehicle": "Longest distance travelled in a vehicle (Cross Country)", - # "longestLife": "Longest life (Lifer)", - # "stunHits": "Most Stun Grenade hits (Stunner)", - # "spawnSelectFlag": "Most FOB Spawns (Objective Focused)", # Unsure - # "shotgunHeadshots": "Most Shotgun headshots (Boomstick)", - # "bombDefused": "Most defuses (Defuser)", - # "snapshotHits": "Most Snapshot Grenade hits (Photographer)", - # "noKillsWithDeath": "No kills with at least 1 death (Participant)", - # "killstreakAUAVAssists": "Most Advanced UAV assists (Target Rich Environment)", - # "killstreakPersonalUAVKills": "Most kills with a Personal Radar active (Nothing Personal)", - # "tacticalInsertionSpawns": "Most Tactical Insertions used (Revenant)", - # "launcherKills": "Most Launcher kills (Explosive)", - # "spawnSelectVehicle": "Most vehicle spawns (Oscar Mike)", - # "mostKillsLeastDeaths": "Most kills and fewest deaths (MVP)", - # "mostKills": "Most kills (The Feared)", - # "defends": "Most defend kills (Defense)", - # "timeSpentAsDriver": "Most time spent driving (Driver)", - # "": "" # WIP - Still adding more - } - - file_path = "stats.json" - - replace_and_sort_keys_in_json(file_path, replacements) - print(f"Keys sorted and replaced in {file_path}!") \ No newline at end of file diff --git a/depricated_dev_scripts/beautify_data_match_info.py b/depricated_dev_scripts/beautify_data_match_info.py deleted file mode 100644 index b23aa39..0000000 --- a/depricated_dev_scripts/beautify_data_match_info.py +++ /dev/null @@ -1,283 +0,0 @@ -import json - -def replace_and_sort_keys_in_json(file_path, replacements): - """Replace keys and values in the JSON file based on the replacements dictionary.""" - - with open(file_path, 'r') as file: - data = json.load(file) - - def recursive_key_replace(obj, replacements): - if isinstance(obj, dict): - new_obj = {} - for key, value in obj.items(): - # Replace the key - new_key = replacements.get(key, key) - - # Check if the value is a string and replace if necessary - if isinstance(value, str): - new_value = replacements.get(value, value) - new_obj[new_key] = recursive_key_replace(new_value, replacements) - else: - new_obj[new_key] = recursive_key_replace(value, replacements) - - return new_obj - elif isinstance(obj, list): - for index, value in enumerate(obj): - obj[index] = recursive_key_replace(value, replacements) - else: - # If the object is a string, check and replace - if isinstance(obj, str): - return replacements.get(obj, obj) - return obj - - data = recursive_key_replace(data, replacements) - - with open(file_path, 'w') as file: - json.dump(data, file, indent=4) - -if __name__ == "__main__": - # Define the keys to be replaced and their replacements - replacements = { - # Gamemodes - "dom": "Domination", - "hc_dom": "Hardcore Domination", - "war": "Team Deathmatch", - "hc_war": "Hardcore Team Deathmatch", - "hq": "Headquarters", - "hc_hq": "Hardcore Headquarters", - "conf": "Kill Confirmed", - "hc_conf": "Hardcore Kill Confirmed", - "koth": "Hardpoint", - "koth_hc": "Hardcore Hardpoint", - "sd": "Search and Destroy", - "hc_sd": "Hardcore Search and Destroy", - "cyber": "Cyber Attack", - "hc_cyber": "Hardcore Cyber Attack", - "grnd": "Grind", - "arm": "Ground War", - "infect": "Infected", - "gun": "Gun Game", - "arena": "Gunfight", - "br": "Battle Royale (Warzone)", - "br_dmz": "Plunder", - "br_all": "Battle Royale (Warzone & Plunder)", - # Weapons - "weapon_assault_rifle": "Assault Rifles", - "weapon_shotgun": "Shotguns", - "weapon_marksman": "Marksman Rifles", - "weapon_sniper": "Snipers", - "tacticals": "Tactical Equipment", - "lethals": "Lethal Equipment", - "weapon_lmg": "LMGs", - "weapon_launcher": "Launchers", - "supers": "Field Upgrades", - "weapon_pistol": "Pistols", - "weapon_other": "Primary Melee", - "weapon_smg": "SMGs", - "weapon_melee": "Melee", - "scorestreakData": "Scorestreaks", - "lethalScorestreakData": "Lethal Scorestreaks", - "supportScorestreakData": "Support Scorestreaks", - # Guns - ## Assault Rifles - "iw8_ar_tango21": "RAM-7", - "iw8_ar_mike4": "M4A1", - "iw8_ar_valpha": "AS VAL", - "iw8_ar_falpha": "FR 5.56", - "iw8_ar_mcharlie": "M13", - "iw8_ar_akilo47": "AK-47", - "iw8_ar_asierra12": "Oden", - "iw8_ar_galima": "CR-56 AMAX", - "iw8_ar_sierra552": "Grau 5.56", - "iw8_ar_falima": "FAL", - "iw8_ar_anovember94": "AN-94", - "iw8_ar_kilo433": "Kilo 141", - "iw8_ar_scharlie": "FN Scar 17", - "iw8_sh_mike26": "VLK Rogue", - ## Shotguns - "iw8_sh_charlie725": "725", - "iw8_sh_oscar12": "Origin 12 Shotgun", - "iw8_sh_aalpha12": "JAK-12", - "iw8_sh_romeo870": "Model 680", - "iw8_sh_dpapa12": "R9-0 Shotgun", - ## Marksman Rifles - "iw8_sn_sbeta": "MK2 Carbine", - "iw8_sn_crossbow": "Crossbow", - "iw8_sn_romeo700": "SP-R 208", - "iw8_sn_kilo98": "Kar98k", - "iw8_sn_mike14": "EBR-14", - "iw8_sn_sksierra": "SKS", - ## Sniper Rifles - "iw8_sn_alpha50": "AX-50", - "iw8_sn_hdromeo": "HDR", - "iw8_sn_delta": "Dragunov", - "iw8_sn_xmike109": "Rytec AMR", - ## Tactical Equipment - "equip_gas_grenade": "Gas Grenade", - "equip_snapshot_grenade": "Snapshot Grenade", - "equip_decoy": "Decoy Grenade", - "equip_smoke": "Smoke Grenade", - "equip_concussion": "Concussion Grenade", - "equip_hb_sensor": "Heartbeat Sensor", - "equip_flash": "Flash Grenade", - "equip_adrenaline": "Stim", - ## Lethal Equipment - "equip_frag": "Frag Grenade", - "equip_thermite": "Thermite", - "equip_semtex": "Semtex", - "equip_claymore": "Claymore", - "equip_c4": "C4", - "equip_at_mine": "Proximity Mine", - "equip_throwing_knife": "Throwing Knife", - "equip_molotov": "Mototov Cocktail", - ## LMGs - "iw8_lm_kilo121": "M91", - "iw8_lm_mkilo3": "Bruen Mk9", - "iw8_lm_mgolf34": "MG34", - "iw8_lm_lima86": "SA87", - "iw8_lm_pkilo": "PKM", - "iw8_lm_sierrax": "FiNN LMG", - "iw8_lm_mgolf36": "Holger-26", - # "": "", ### RAAL LMG not implemented - ## Launchers - "iw8_la_gromeo": "PILA", - "iw8_la_rpapa7": "RPG-7", - "iw8_la_juliet": "JOKR", - "iw8_la_kgolf": "Strela-P", - # "": "", ### Unknown Launcher - ## Field Upgrades - "super_emp_drone": "EMP Drone", - "super_trophy": "Trophy System", - "super_ammo_drop": "Munitions Box", - "super_weapon_drop": "Weapon Drop", - "super_fulton": "Cash Deposit Balloon", - "super_armor_drop": "Armor Box", - "super_select": "Field Upgrade Pro (Any)", - "super_tac_insert": "Tactical Insertion", - "super_recon_drone": "Recon Drone", - "super_deadsilence": "Dead Silence", - "super_supply_drop": "Loadout Drop", ### Unsure if this is Loadout Drop - "super_tac_cover": "Deployable Cover", - "super_support_box": "Stopping Power Rounds", - ## Pistols - "iw8_pi_cpapa": ".357", - "iw8_pi_mike9": "Renetti", - "iw8_pi_mike1911": "1911", - "iw8_pi_golf21": "X16", - "iw8_pi_decho": ".50 GS", - "iw8_pi_papa320": "M19", - # "": "", ### Sykov not implemented - ## Primary Melee - "iw8_me_riotshield": "Riot Shield", - ## SMGs - "iw8_sm_mpapa7": "MP7", - "iw8_sm_augolf": "AUG", - "iw8_sm_papa90": "P90", - "iw8_sm_charlie9": "ISO", - "iw8_sm_mpapa5": "MP5", - "iw8_sm_smgolf45": "Striker 45", - "iw8_sm_beta": "PP19 Bizon", - "iw8_sm_victor": "Fennec", - "iw8_sm_uzulu": "Uzi", - # "": "", ### CX9 not implemented - ## Melee - "iw8_me_akimboblunt": "Kali Sticks", - "iw8_me_akimboblades": "Dual Kodachis", - "iw8_knife": "Knife", - # Scorestreaks - "precision_airstrike": "Precision Airstrike", - "cruise_predator": "Cruise Missile", - "manual_turret": "Shield Turret", - "white_phosphorus": "White Phosphorus", - "hover_jet": "VTOL Jet", - "chopper_gunner": "Chopper Gunner", - "gunship": "Gunship", - "sentry_gun": "Sentry Gun", - "toma_strike": "Cluster Strike", - "nuke": "Nuke", - "juggernaut": "Juggernaut", - "pac_sentry": "Wheelson", - "chopper_support": "Support Helo", - "bradley": "Infantry Assault Vehicle", - "airdrop": "Care Package", - "radar_drone_overwatch": "Personal Radar", - "scrambler_drone_guard": "Counter UAV", - "uav": "UAV", - "airdrop_multiple": "Emergency Airdrop", - "directional_uav": "Advanced UAV", - # Accolades - # "accoladeData": "Accolades", - # "classChanges": "Most classes changed (Evolver)", - # "highestAvgAltitude": "Highest average altitude (High Command)", - # "killsFromBehind": "Most kills from behind (Flanker)", - # "lmgDeaths": "Most LMG deaths (Target Practice)", - # "riotShieldDamageAbsorbed": "Most damage absorbed with Riot Shield (Guardian)", - # "flashbangHits": "Most Flashbang hits (Blinder)", - # "meleeKills": "Most Melee kills (Brawler)", - # "tagsLargestBank": "Largest bank (Bank Account)", - # "shotgunKills": "Most Shotgun kills (Buckshot)", - # "sniperDeaths": "Most Sniper deaths (Zeroed In)", - # "timeProne": "Most time spent Prone (Grassy Knoll)", - # "killstreakWhitePhosphorousKillsAssists": "Most kills and assists with White Phosphorus (Burnout)", - # "shortestLife": "Shortest life (Terminal)", - # "deathsFromBehind": "Most deaths from behind (Blindsided)", - # "higherRankedKills": "Most kills on higher ranked scoreboard players (Upriser)", - # "mostAssists": "Most assists (Wingman)", - # "leastKills": "Fewest kills (The Fearful)", - # "tagsDenied": "Denied the most tags (Denied)", - # "killstreakWheelsonKills": "Most Wheelson kills", - # "sniperHeadshots": "Most Sniper headshots (Dead Aim)", - # "killstreakJuggernautKills": "Most Juggernaut kills (Heavy Metal)", - # "smokesUsed": "Most Smoke Grenades used (Chimney)", - # "avengerKills": "Most avenger kills (Avenger)", - # "decoyHits": "Most Decoy Grenade hits (Made You Look)", - # "killstreakCarePackageUsed": "Most Care Packages called in (Helping Hand)", - # "molotovKills": "Most Molotov kills (Arsonist)", - # "gasHits": "Most Gas Grenade hits (Gaseous)", - # "comebackKills": "Most comebacks (Rally)", - # "lmgHeadshots": "Most LMG headshots (LMG Expert)", - # "smgDeaths": "Most SMG deaths (Run and Gunned)", - # "carrierKills": "Most kills as carrier (Carrier)", - # "deployableCoverUsed": "Most Deployable Covers used (Combat Engineer)", - # "thermiteKills": "Most Thermite kills (Red Iron)", - # "arKills": "Most assault rifle kills (AR Specialist)", - # "c4Kills": "Most C4 kills (Handle With Care)", - # "suicides": "Most suicides (Accident Prone)", - # "clutch": "Most kills as the last alive (Clutched)", - # "survivorKills": "Most kills as survivor (Survivalist)", - # "killstreakGunshipKills": "Most Gunship kills (Death From Above)", - # "timeSpentAsPassenger": "Most time spent as a passenger (Navigator)", - # "returns": "Most flags returned (Flag Returner)", - # "smgHeadshots": "Most SMG headshots (SMG Expert)", - # "launcherDeaths": "Most launcher deaths (Fubar)", - # "oneShotOneKills": "Most one shot kills (One Shot Kill)", - # "ammoBoxUsed": "Most Munitions Boxes used (Provider)", - # #"spawnSelectSquad": "", - # "weaponPickups": "Most picked up weapons (Loaner)", - # "pointBlankKills": "Most point blank kills (Personal Space)", - # "tagsCaptured": "Collected the most tags (Confirmed Kills)", - # "killstreakGroundKills": "Most ground based killstreak kills (Ground Control)", - # "distanceTraveledInVehicle": "Longest distance travelled in a vehicle (Cross Country)", - # "longestLife": "Longest life (Lifer)", - # "stunHits": "Most Stun Grenade hits (Stunner)", - # "spawnSelectFlag": "Most FOB Spawns (Objective Focused)", # Unsure - # "shotgunHeadshots": "Most Shotgun headshots (Boomstick)", - # "bombDefused": "Most defuses (Defuser)", - # "snapshotHits": "Most Snapshot Grenade hits (Photographer)", - # "noKillsWithDeath": "No kills with at least 1 death (Participant)", - # "killstreakAUAVAssists": "Most Advanced UAV assists (Target Rich Environment)", - # "killstreakPersonalUAVKills": "Most kills with a Personal Radar active (Nothing Personal)", - # "tacticalInsertionSpawns": "Most Tactical Insertions used (Revenant)", - # "launcherKills": "Most Launcher kills (Explosive)", - # "spawnSelectVehicle": "Most vehicle spawns (Oscar Mike)", - # "mostKillsLeastDeaths": "Most kills and fewest deaths (MVP)", - # "mostKills": "Most kills (The Feared)", - # "defends": "Most defend kills (Defense)", - # "timeSpentAsDriver": "Most time spent driving (Driver)", - # "": "" # WIP - Still adding more - } - - file_path = "match_info.json" - - replace_and_sort_keys_in_json(file_path, replacements) - print(f"Keys replaced in {file_path}!") \ No newline at end of file diff --git a/depricated_dev_scripts/convert_epoch.py b/depricated_dev_scripts/convert_epoch.py deleted file mode 100644 index 472745e..0000000 --- a/depricated_dev_scripts/convert_epoch.py +++ /dev/null @@ -1,20 +0,0 @@ -import datetime - -def epoch_to_human_readable(epoch_timestamp, timezone='GMT'): - # Convert the epoch timestamp to a datetime object - dt_object = datetime.datetime.utcfromtimestamp(epoch_timestamp) - - # Format the datetime object to a human-readable string - if timezone == 'GMT': - date_str = dt_object.strftime("GMT: %A, %B %d, %Y %I:%M:%S %p") - elif timezone == 'EST': - dt_object -= datetime.timedelta(hours=4) # Subtract 5 hours from GMT to get EST - date_str = dt_object.strftime("EST: %A, %B %d, %Y %I:%M:%S %p") - else: - raise ValueError("Unsupported timezone!") - - return date_str - -epoch_timestamp = 1697528478724 -print(epoch_to_human_readable(epoch_timestamp)) -print(epoch_to_human_readable(epoch_timestamp, 'EST')) \ No newline at end of file diff --git a/depricated_dev_scripts/curl/beautify_json.py b/depricated_dev_scripts/curl/beautify_json.py deleted file mode 100644 index 1b13f56..0000000 --- a/depricated_dev_scripts/curl/beautify_json.py +++ /dev/null @@ -1,23 +0,0 @@ -import json -import os -from json.decoder import JSONDecodeError - -def pretty_print_json_file(input_file, output_file): - try: - with open(input_file, 'r', encoding='utf-8') as infile: - content = infile.read() - data = json.loads(content) - with open(output_file, 'w', encoding='utf-8') as outfile: - json.dump(data, outfile, indent=4) - except JSONDecodeError as e: - print(f"Error decoding JSON in {input_file}: {e}") - -# Hardcoding the input and output file paths -input_file = 'stats.json' -output_file = 'stats_temp.json' - -pretty_print_json_file(input_file, output_file) - -# Remove the original file and rename the beautified file -os.remove(input_file) -os.rename(output_file, input_file) \ No newline at end of file diff --git a/depricated_dev_scripts/curl/curl_links.txt b/depricated_dev_scripts/curl/curl_links.txt deleted file mode 100644 index dd2864e..0000000 --- a/depricated_dev_scripts/curl/curl_links.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Get Stats Using Battle.NET (Requires Numbers) -https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/battle/gamer/$PROF/profile/type/mp - -# Get Stats Using PSN -https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/psn/gamer/$PROF/profile/type/mp - -# Get Stats Using Xbox Live -https://my.callofduty.com/api/papi-client/stats/cod/v1/title/mw/platform/xbl/gamer/$PROF/profile/type/mp - -# Get Recent Games -https://my.callofduty.com/api/papi-client/crm/cod/v2/title/mw/platform/battle/gamer/$PROF/matches/mp/start/0/end/0/details - -# Get Maps & Game Modes (No $PROF Variable Needed) -https://my.callofduty.com/api/papi-client/ce/v1/title/mw/platform/battle/gameType/mp/communityMapData/availability - -# Get friendFeedEvents -https://my.callofduty.com/api/papi-client/userfeed/v1/friendFeed/platform/battle/gamer/$PROF/friendFeedEvents/en - -# Get eventFeed -https://my.callofduty.com/api/papi-client/userfeed/v1/friendFeed/rendered/en/{acct_sso_token} - -# Get CP -https://my.callofduty.com/api/papi-client/inventory/v1/title/mw/platform/battle/gamer/$PROF/currency - -https://my.callofduty.com/api/papi-client/crm/cod/v2/accounts/platform/battle/gamer/$PROF/ - -https://my.callofduty.com/api/papi-client/preferences/v1/platform/battle/gamer/$PROF/list - -# Get Bundle Info -https://my.callofduty.com/api/papi-client/inventory/v1/title/mw/bundle/400525/en \ No newline at end of file diff --git a/depricated_dev_scripts/curl/get_stats_curl.ps1 b/depricated_dev_scripts/curl/get_stats_curl.ps1 deleted file mode 100644 index 164494a..0000000 --- a/depricated_dev_scripts/curl/get_stats_curl.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -# Set your default values here -$PROF = "" # The % replaces the # for the Activision ID (e.g. Ahrimdon%231597) -# You do not need numbers for PSN or XBL -# Delete $PROF when getting maps and game modes. -$COOKIE_VALUE = "ACCT_SSO_COOKIE" - -$URL = "AddLinkHere" -$USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" -$OUTPUT_FILE = "stats.json" - -curl -v $URL -H "Cookie: ACT_SSO_COOKIE=$COOKIE_VALUE" -H "User-Agent: $USER_AGENT" -o $OUTPUT_FILE \ No newline at end of file diff --git a/depricated_dev_scripts/fetch_playerdata.py b/depricated_dev_scripts/fetch_playerdata.py deleted file mode 100644 index c408af3..0000000 --- a/depricated_dev_scripts/fetch_playerdata.py +++ /dev/null @@ -1,45 +0,0 @@ -import json -import os -from cod_api import API, platforms - -# initiating the API class -api = API() - -COOKIE_FILE = 'cookie.txt' - -# Check if cookie file exists -if os.path.exists(COOKIE_FILE): - with open(COOKIE_FILE, 'r') as f: - api_key = f.read().strip() -else: - api_key = input("Please enter your ACT_SSO_COOKIE: ") - with open(COOKIE_FILE, 'w') as f: - f.write(api_key) - -# Get player name from user -player_name = input("Please enter the player's username (with #1234567): ") - -# login with sso token -api.login(api_key) - -player_stats = api.ModernWarfare.fullData(platforms.Activision, player_name) -match_info = api.ModernWarfare.combatHistory(platforms.Activision, player_name) -season_loot = api.ModernWarfare.seasonLoot(platforms.Activision, player_name) -map_list = api.ModernWarfare.mapList(platforms.Activision) -identities = api.Me.loggedInIdentities() - -# Save results to a JSON file -with open('stats.json', 'w') as json_file: - json.dump(player_stats, json_file, indent=4) - -with open('match_info.json', 'w') as json_file: - json.dump(match_info, json_file, indent=4) - -with open('season_loot.json', 'w') as json_file: - json.dump(season_loot, json_file, indent=4) - -with open('map_list.json', 'w') as json_file: - json.dump(map_list, json_file, indent=4) - -with open('identities.json', 'w') as json_file: - json.dump(identities, json_file, indent=4) \ No newline at end of file diff --git a/src/CSharp-CODAPI/.editorconfig b/src/CSharp-CODAPI/.editorconfig deleted file mode 100644 index abb819f..0000000 --- a/src/CSharp-CODAPI/.editorconfig +++ /dev/null @@ -1,4 +0,0 @@ -[*.cs] - -# IDE1006: Naming Styles -dotnet_diagnostic.IDE1006.severity = none diff --git a/src/CSharp-CODAPI/.gitignore b/src/CSharp-CODAPI/.gitignore deleted file mode 100644 index 8a30d25..0000000 --- a/src/CSharp-CODAPI/.gitignore +++ /dev/null @@ -1,398 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml diff --git a/src/CSharp-CODAPI/ALT.cs b/src/CSharp-CODAPI/ALT.cs deleted file mode 100644 index 3692186..0000000 --- a/src/CSharp-CODAPI/ALT.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace CSharp_CODAPI -{ - public class ALT - { - public async Task search(string gamertag, Platforms platform) - { - (gamertag, var platformStr, _) = Helpers.mapGamertagToPlatform(gamertag, platform, true); - return await Http.sendRequest($"/crm/cod/v2/platform/{platformStr}/username/{gamertag}/search"); - } - } -} diff --git a/src/CSharp-CODAPI/CODAPI.cs b/src/CSharp-CODAPI/CODAPI.cs deleted file mode 100644 index 404d46b..0000000 --- a/src/CSharp-CODAPI/CODAPI.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace CSharp_CODAPI -{ - public static class CODAPI - { - public static bool login(string ssoToken) => Http.login(ssoToken); - - private static MW modernWarfare = new(); - public static MW ModernWarfare { get => modernWarfare; set => modernWarfare = value; } - - private static MW2 modernWarfare2 = new(); - public static MW2 ModernWarfare2 { get => modernWarfare2; set => modernWarfare2 = value; } - - private static WZ warzone = new(); - public static WZ Warzone { get => warzone; set => warzone = value; } - - private static CW coldWar = new(); - public static CW ColdWar { get => coldWar; set => coldWar = value; } - - private static VG vanguard = new(); - public static VG Vanguard { get => vanguard; set => vanguard = value; } - - private static SHOP store = new(); - public static SHOP Store { get => store; set => store = value; } - - private static USER me = new(); - public static USER Me { get => me; set => me = value; } - - private static ALT misc = new(); - public static ALT Misc { get => misc; set => misc = value; } - } -} diff --git a/src/CSharp-CODAPI/CSharp-CODAPI.csproj b/src/CSharp-CODAPI/CSharp-CODAPI.csproj deleted file mode 100644 index 1c6f69f..0000000 --- a/src/CSharp-CODAPI/CSharp-CODAPI.csproj +++ /dev/null @@ -1,44 +0,0 @@ - - - - net6.0 - CSharp_CODAPI - enable - enable - True - Call of Duty API - Liam Gaskell - API wrapper for the call of duty API - https://codapi.dev - android-chrome-512x512.png - README.md - https://github.com/Lierrmm/CSharp-CODAPI - cod,call of duty, api, c#, vanguard, modern warfare, black ops, warzone, cold war - en - True - symbols.nupkg - 1.0.2 - 1.0.2 - $(AssemblyVersion) - - - - - True - \ - - - - - - - - - - - True - \ - - - - diff --git a/src/CSharp-CODAPI/CSharp-CODAPI.sln b/src/CSharp-CODAPI/CSharp-CODAPI.sln deleted file mode 100644 index c6db21c..0000000 --- a/src/CSharp-CODAPI/CSharp-CODAPI.sln +++ /dev/null @@ -1,30 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.3.32929.385 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSharp-CODAPI", "CSharp-CODAPI.csproj", "{0ACCF325-BE2F-4837-A17E-8D7FD6556F3D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FE246F73-36EC-44C9-8CFB-99E2381FD87E}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0ACCF325-BE2F-4837-A17E-8D7FD6556F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0ACCF325-BE2F-4837-A17E-8D7FD6556F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0ACCF325-BE2F-4837-A17E-8D7FD6556F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0ACCF325-BE2F-4837-A17E-8D7FD6556F3D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {750FF877-B5B2-4F52-A57C-5992143FFFB0} - EndGlobalSection -EndGlobal diff --git a/src/CSharp-CODAPI/CW.cs b/src/CSharp-CODAPI/CW.cs deleted file mode 100644 index 8809635..0000000 --- a/src/CSharp-CODAPI/CW.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace CSharp_CODAPI -{ - public class CW - { - public async Task fullData(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/stats/cod/v1/title/cw/platform/{platformStr}/{lookupType}/{gamertag}/profile/type/mp"); - } - - public async Task combatHistory(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/cw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0/details"); - } - - public async Task combatHistory(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/cw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}/details"); - } - - public async Task breakdown(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/cw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0"); - } - - public async Task breakdown(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/cw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}"); - } - - public async Task seasonLoot(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/loot/title/cw/platform/{platformStr}/{lookupType}/{gamertag}/status/en"); - } - - public async Task mapList(Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/ce/v1/title/cw/platform/${platformStr}/gameType/mp/communityMapData/availability"); - } - - public async Task matchInfo(string matchId, Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/crm/cod/v2/title/cw/platform/{platformStr}/fullMatch/mp/{matchId}/en"); - } - } -} diff --git a/src/CSharp-CODAPI/Helpers.cs b/src/CSharp-CODAPI/Helpers.cs deleted file mode 100644 index 6314b33..0000000 --- a/src/CSharp-CODAPI/Helpers.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; -using System.Web; - -namespace CSharp_CODAPI -{ - public class Helpers - { - public static string? GetEnumMemberValue(T value) where T : struct, IConvertible - { - return typeof(T).GetTypeInfo().DeclaredMembers.SingleOrDefault(x => x.Name == value.ToString()) - ?.GetCustomAttribute(false) - ?.Value ?? string.Empty; - } - - public static (string, string, string) mapGamertagToPlatform(string gamertag, Platforms platform, bool steamSupport = false) - { - var lookupType = "gamer"; - - if (!steamSupport && platform.Equals(Platforms.Steam)) throw new Exception(generics.STEAM_UNSUPPORTED); - - if (platform == Platforms.Battlenet || platform == Platforms.Activision || platform == Platforms.Uno) - if (gamertag.Length > 0) gamertag = HttpUtility.UrlEncode(gamertag); - - if (platform.Equals(Platforms.Uno)) lookupType = "id"; - if (platform.Equals(Platforms.Uno) || platform.Equals(Platforms.Activision)) - platform = Platforms.Uno; - - return (gamertag, GetEnumMemberValue(platform)?.ToLower() ?? "uno", lookupType); - } - } -} diff --git a/src/CSharp-CODAPI/Http.cs b/src/CSharp-CODAPI/Http.cs deleted file mode 100644 index 8e03dd3..0000000 --- a/src/CSharp-CODAPI/Http.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Newtonsoft.Json; -using RestSharp; - -namespace CSharp_CODAPI -{ - public static class Http - { - private static readonly RestClient apiClient = new("https://my.callofduty.com"); - private const string apiPath = "/api/papi-client"; - private const string baseCookie = "new_SiteId=cod;ACT_SSO_LOCALE=en_US;country=US;"; - public static string globalSsoToken = string.Empty; - - public static async Task sendRequest(string uri) - { - var requestUrl = $"{apiPath}{uri}"; - - Console.WriteLine(requestUrl); - - var request = new RestRequest - { - Method = Method.Get, - Resource = requestUrl, - }; - - var response = await apiClient.ExecuteAsync(request); - - if (response.IsSuccessStatusCode && response.Content != null) - { - var responseBody = JsonConvert.DeserializeObject(response.Content); - - return responseBody; - } - else throw new Exception(response.ErrorMessage ?? "Something went wrong"); - } - - public static bool login(string ssoToken) - { - if (ssoToken == null || ssoToken.Length == 0) return false; - - var fakeXSRF = "68e8b62e-1d9d-4ce1-b93f-cbe5ff31a041"; - - var defaultParams = apiClient.DefaultParameters; - - foreach (var parameter in defaultParams.ToList()) - { - apiClient.DefaultParameters.RemoveParameter(parameter); - } - - apiClient.AddDefaultHeaders(new Dictionary - { - { "X-XSRF-TOKEN", fakeXSRF }, - { "X-CSRF-TOKEN", fakeXSRF }, - { "Atvi-Auth", ssoToken }, - { "ACT_SSO_COOKIE", ssoToken }, - { "atkn", ssoToken } - }); - - apiClient.AddDefaultHeader("cookie", $"{baseCookie}ACT_SSO_COOKIE={ssoToken};XSRF-TOKEN={fakeXSRF};API_CSRF_TOKEN={fakeXSRF};ACT_SSO_EVENT=\"LOGIN_SUCCESS:1644346543228\";ACT_SSO_COOKIE_EXPIRY=1645556143194;comid=cod;ssoDevId=63025d09c69f47dfa2b8d5520b5b73e4;tfa_enrollment_seen=true;gtm.custom.bot.flag=human;"); - - apiClient.AddDefaultHeader("Content-Type", "application/json"); - - apiClient.AddDefaultHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"); - - globalSsoToken = ssoToken; - return true; - } - } -} diff --git a/src/CSharp-CODAPI/LICENSE b/src/CSharp-CODAPI/LICENSE deleted file mode 100644 index ad62aee..0000000 --- a/src/CSharp-CODAPI/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Liam - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/CSharp-CODAPI/MW.cs b/src/CSharp-CODAPI/MW.cs deleted file mode 100644 index 15b5fc7..0000000 --- a/src/CSharp-CODAPI/MW.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace CSharp_CODAPI -{ - public class MW - { - public async Task fullData(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/stats/cod/v1/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/profile/type/mp"); - } - - public async Task combatHistory(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0/details"); - } - - public async Task combatHistory(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}/details"); - } - - public async Task breakdown(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0"); - } - - public async Task breakdown(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}"); - } - - public async Task seasonLoot(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/loot/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/status/en"); - } - - public async Task mapList(Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/ce/v1/title/mw/platform/${platformStr}/gameType/mp/communityMapData/availability"); - } - - public async Task matchInfo(string matchId, Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/fullMatch/mp/{matchId}/en"); - } - } -} diff --git a/src/CSharp-CODAPI/MW2.cs b/src/CSharp-CODAPI/MW2.cs deleted file mode 100644 index bb46e82..0000000 --- a/src/CSharp-CODAPI/MW2.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace CSharp_CODAPI -{ - public class MW2 - { - public async Task fullData(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/stats/cod/v1/title/mw2/platform/{platformStr}/{lookupType}/{gamertag}/profile/type/mp"); - } - - public async Task combatHistory(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw2/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0/details"); - } - - public async Task combatHistory(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw2/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}/details"); - } - - public async Task breakdown(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw2/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0"); - } - - public async Task breakdown(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw2/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}"); - } - - public async Task seasonLoot(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/loot/title/mw2/platform/{platformStr}/{lookupType}/{gamertag}/status/en"); - } - - public async Task mapList(Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/ce/v1/title/mw2/platform/${platformStr}/gameType/mp/communityMapData/availability"); - } - - public async Task matchInfo(string matchId, Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw2/platform/{platformStr}/fullMatch/mp/{matchId}/en"); - } - } -} diff --git a/src/CSharp-CODAPI/Properties/launchSettings.json b/src/CSharp-CODAPI/Properties/launchSettings.json deleted file mode 100644 index 2a58480..0000000 --- a/src/CSharp-CODAPI/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "CSharp-CODAPI": { - "commandName": "Project", - "nativeDebugging": true - } - } -} \ No newline at end of file diff --git a/src/CSharp-CODAPI/README.md b/src/CSharp-CODAPI/README.md deleted file mode 100644 index a2b7f45..0000000 --- a/src/CSharp-CODAPI/README.md +++ /dev/null @@ -1,24 +0,0 @@ -[![https://www.github.com/sponsors/lierrmm](https://img.shields.io/badge/github-donate-teal.svg)](https://www.github.com/sponsors/lierrmm) -[![https://www.paypal.me/liammm](https://img.shields.io/badge/paypal-donate-blue.svg)](https://www.paypal.me/liammm) -[![https://www.nuget.org/packages/CSharp-CODAPI](https://img.shields.io/nuget/v/CSharp-CODAPI)](https://www.nuget.org/packages/CSharp-CODAPI) - -# Call Of Duty API Wrapper - -Call of Duty Api is a promised based wrapper for the "private" API that Activision use on the callofduty.com website. - -This wrapper is written in C# and is publicly available on nuget. - -# Discord - -Join the discord: [here](https://discord.gg/NuUpvzC) - -# Website -https://codapi.dev - -# Documentation -You can find documentation [here](https://docs.codapi.dev/). - -# Libraries - -[node-callofduty](https://github.com/lierrmm/node-callofduty) - NodeJS implementation of the wrapper -[cod-python-api](https://github.com/TodoLodo/cod-python-api) - Python implementation of the wrapper written by Engineer15 & TodoLodo \ No newline at end of file diff --git a/src/CSharp-CODAPI/SHOP.cs b/src/CSharp-CODAPI/SHOP.cs deleted file mode 100644 index 604bc06..0000000 --- a/src/CSharp-CODAPI/SHOP.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace CSharp_CODAPI -{ - public class SHOP - { - public async Task purchasableItems(string gameId) - { - return await Http.sendRequest($"/inventory/v1/title/{gameId}/platform/psn/purchasable/public/en"); - } - - public async Task bundleInformation(string title, string bundleId) - { - return await Http.sendRequest($"/inventory/v1/title/{title}/bundle/{bundleId}/en"); - } - - public async Task battlePassLoot(long season, Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform, true); - return await Http.sendRequest($"/loot/title/mw/platform/{platformStr}/list/loot_season_{season}/en"); - } - } -} diff --git a/src/CSharp-CODAPI/Types.cs b/src/CSharp-CODAPI/Types.cs deleted file mode 100644 index c27f617..0000000 --- a/src/CSharp-CODAPI/Types.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Runtime.Serialization; - -namespace CSharp_CODAPI -{ - public class generics - { - public const string STEAM_UNSUPPORTED = "Steam platform not supported by this game. Try `battle` instead."; - } - - public class BaseAPIResponse - { - public string? status { get; set; } - public object? data { get; set; } - } - - public enum Platforms : int - { - [EnumMember(Value = "all")] - All, - [EnumMember(Value = "acti")] - Activision, - [EnumMember(Value = "battle")] - Battlenet, - [EnumMember(Value = "psn")] - PSN, - [EnumMember(Value = "steam")] - Steam, - [EnumMember(Value = "uno")] - Uno, - [EnumMember(Value = "xbl")] - XBOX - } -} diff --git a/src/CSharp-CODAPI/USER.cs b/src/CSharp-CODAPI/USER.cs deleted file mode 100644 index e950cbf..0000000 --- a/src/CSharp-CODAPI/USER.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace CSharp_CODAPI -{ - public class USER - { - public async Task friendFeed(string gamertag, Platforms platform) - { - (gamertag, var platformStr, _) = Helpers.mapGamertagToPlatform(gamertag, platform, true); - return await Http.sendRequest($"/userfeed/v1/friendFeed/platform/{platformStr}/gamer/{gamertag}/friendFeedEvents/en"); - } - - public async Task eventFeed() - { - return await Http.sendRequest($"/userfeed/v1/friendFeed/rendered/en/{Http.globalSsoToken}"); - } - - public async Task loggedInIdentities() - { - return await Http.sendRequest($"/crm/cod/v2/identities/{Http.globalSsoToken}"); - } - - public async Task codPoints(string gamertag, Platforms platform) - { - (gamertag, var platformStr, _) = Helpers.mapGamertagToPlatform(gamertag, platform, true); - return await Http.sendRequest($"/inventory/v1/title/mw/platform/{platformStr}/gamer/{gamertag}/currency"); - } - - public async Task connectedAccounts(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform, true); - return await Http.sendRequest($"/crm/cod/v2/accounts/platform/{platformStr}/{lookupType}/{gamertag}"); - } - - public async Task settings(string gamertag, Platforms platform) - { - (gamertag, var platformStr, _) = Helpers.mapGamertagToPlatform(gamertag, platform, true); - return await Http.sendRequest($"/preferences/v1/platform/{platformStr}/gamer/{gamertag}/list"); - } - } -} diff --git a/src/CSharp-CODAPI/VG.cs b/src/CSharp-CODAPI/VG.cs deleted file mode 100644 index 3ad8cf9..0000000 --- a/src/CSharp-CODAPI/VG.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace CSharp_CODAPI -{ - public class VG - { - public async Task fullData(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/stats/cod/v1/title/vg/platform/{platformStr}/{lookupType}/{gamertag}/profile/type/mp"); - } - - public async Task combatHistory(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/vg/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0/details"); - } - - public async Task combatHistory(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/vg/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}/details"); - } - - public async Task breakdown(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/vg/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/0/end/0"); - } - - public async Task breakdown(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/vg/platform/{platformStr}/{lookupType}/{gamertag}/matches/mp/start/{startTime}/end/{endTime}"); - } - - public async Task seasonLoot(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/loot/title/vg/platform/{platformStr}/{lookupType}/{gamertag}/status/en"); - } - - public async Task mapList(Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/ce/v1/title/vg/platform/${platformStr}/gameType/mp/communityMapData/availability"); - } - - public async Task matchInfo(string matchId, Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/crm/cod/v2/title/vg/platform/{platformStr}/fullMatch/mp/{matchId}/en"); - } - } -} diff --git a/src/CSharp-CODAPI/WZ.cs b/src/CSharp-CODAPI/WZ.cs deleted file mode 100644 index a70ceab..0000000 --- a/src/CSharp-CODAPI/WZ.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace CSharp_CODAPI -{ - public class WZ - { - public async Task fullData(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/stats/cod/v1/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/profile/type/wz"); - } - - public async Task combatHistory(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/wz/start/0/end/0/details"); - } - - public async Task combatHistory(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/wz/start/{startTime}/end/{endTime}/details"); - } - - public async Task breakdown(string gamertag, Platforms platform) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/wz/start/0/end/0"); - } - - public async Task breakdown(string gamertag, Platforms platform, long startTime, long endTime) - { - (gamertag, var platformStr, var lookupType) = Helpers.mapGamertagToPlatform(gamertag, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/{lookupType}/{gamertag}/matches/wz/start/{startTime}/end/{endTime}"); - } - - public async Task matchInfo(string matchId, Platforms platform) - { - (_, var platformStr, _) = Helpers.mapGamertagToPlatform(string.Empty, platform); - return await Http.sendRequest($"/crm/cod/v2/title/mw/platform/{platformStr}/fullMatch/mp/{matchId}/en"); - } - } -} diff --git a/src/Node-CallOfDuty/.gitignore b/src/Node-CallOfDuty/.gitignore deleted file mode 100644 index 9d23035..0000000 --- a/src/Node-CallOfDuty/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules -/package-lock.json -/?.?s -/dist -/test.mjs \ No newline at end of file diff --git a/src/Node-CallOfDuty/.gitmodules b/src/Node-CallOfDuty/.gitmodules deleted file mode 100644 index 566cb60..0000000 --- a/src/Node-CallOfDuty/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src/wz-data"] - path = src/wz-data - url = https://github.com/Engineer152/wz-data diff --git a/src/Node-CallOfDuty/.npmignore b/src/Node-CallOfDuty/.npmignore deleted file mode 100644 index 912cd4e..0000000 --- a/src/Node-CallOfDuty/.npmignore +++ /dev/null @@ -1 +0,0 @@ -/test.mjs \ No newline at end of file diff --git a/src/Node-CallOfDuty/CODE_OF_CONDUCT.md b/src/Node-CallOfDuty/CODE_OF_CONDUCT.md deleted file mode 100644 index d48954b..0000000 --- a/src/Node-CallOfDuty/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at lierrmm@gmail.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq \ No newline at end of file diff --git a/src/Node-CallOfDuty/CONTRIBUTING.md b/src/Node-CallOfDuty/CONTRIBUTING.md deleted file mode 100644 index 0fc545a..0000000 --- a/src/Node-CallOfDuty/CONTRIBUTING.md +++ /dev/null @@ -1,90 +0,0 @@ -# Contributing - -When contributing to this repository, please first discuss the change you wish to make via issue, -email, or any other method with the owners of this repository before making a change. - -Please note we have a code of conduct, please follow it in all your interactions with the project. - -## Pull Request Process - -1. Ensure any install or build dependencies are removed before the end of the layer when doing a - build. -2. Update the README.md with details of changes to the interface, this includes new environment - variables, exposed ports, useful file locations and container parameters. -3. Increase the version numbers in any examples files and the README.md to the new version that this - Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). - -## Code of Conduct - -### Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -### Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -### Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -### Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at lierrmm@gmail.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/src/Node-CallOfDuty/LICENCE b/src/Node-CallOfDuty/LICENCE deleted file mode 100644 index c167c45..0000000 --- a/src/Node-CallOfDuty/LICENCE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Liam Gaskell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/src/Node-CallOfDuty/README.md b/src/Node-CallOfDuty/README.md deleted file mode 100644 index 5e667c8..0000000 --- a/src/Node-CallOfDuty/README.md +++ /dev/null @@ -1,31 +0,0 @@ -[![npm version](https://badge.fury.io/js/call-of-duty-api.svg)](https://www.npmjs.com/package/call-of-duty-api) -[![https://www.github.com/sponsors/lierrmm](https://img.shields.io/badge/github-donate-teal.svg)](https://www.github.com/sponsors/lierrmm) -[![https://www.paypal.me/liammm](https://img.shields.io/badge/paypal-donate-blue.svg)](https://www.paypal.me/liammm) - -![https://npmjs.org/package/call-of-duty-api](https://github.com/Lierrmm/Node-CallOfDuty/blob/master/logo.png?raw=true) - -# Call Of Duty API Wrapper - -Call of Duty Api is a promised based wrapper for the "private" API that Activision use on the [Call Of Duty](https://callofduty.com) website. - -This wrapper is written in NodeJS and is publicly available on [npm](https://npmjs.org/package/call-of-duty-api). - -# Discord - -Join the discord: [here](https://discord.gg/NuUpvzC) - -# Website - -https://codapi.dev - -# Documentation - -You can find documentation [here](https://docs.codapi.dev/). - -# Other Languages - -[CSharp-CODAPI](https://github.com/Lierrmm/CSharp-CODAPI) - C# nuget package maintained by myself - -[Flutter-CODAPI](https://pub.dev/packages/cod_api) - Flutter package maintained by myself - -[cod-python-api](https://github.com/TodoLodo/cod-python-api) - Python implementation of the wrapper written by Engineer15 & TodoLodo diff --git a/src/Node-CallOfDuty/logo.png b/src/Node-CallOfDuty/logo.png deleted file mode 100644 index dc176ec..0000000 Binary files a/src/Node-CallOfDuty/logo.png and /dev/null differ diff --git a/src/Node-CallOfDuty/package.json b/src/Node-CallOfDuty/package.json deleted file mode 100644 index 4371198..0000000 --- a/src/Node-CallOfDuty/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "call-of-duty-api", - "version": "3.5.0", - "description": "NodeJS Wrapper for the Call Of Duty API.", - "main": "dist/index", - "types": "dist/index", - "files": [ - "dist" - ], - "scripts": { - "prebuild": "rimraf dist", - "build": "tsc", - "prepublishOnly": "npm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Lierrmm/Node-CallOfDuty.git" - }, - "keywords": [ - "br", - "warzone", - "call-of-duty", - "call of duty", - "modern warfare", - "black ops", - "iw", - "battle royale", - "Cold War", - "cw", - "3arc", - "vanguard", - "Treyarch", - "Infinity Ward", - "Sledgehammer", - "Raven", - "Modern Warfare 2", - "Warzone 2", - "Blue Moon", - "Beenox" - ], - "bugs": { - "url": "https://github.com/Lierrmm/Node-CallOfDuty/issues" - }, - "homepage": "https://codapi.dev", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Lierrmm" - }, - "author": "Liam Gaskell", - "license": "MIT", - "devDependencies": { - "@types/node": "^18.11.4", - "rimraf": "^3.0.2", - "typescript": "^4.8.4" - }, - "dependencies": { - "tslib": "^2.4.0", - "undici": "^5.12.0" - } -} diff --git a/src/Node-CallOfDuty/src/index.ts b/src/Node-CallOfDuty/src/index.ts deleted file mode 100644 index 5ef56df..0000000 --- a/src/Node-CallOfDuty/src/index.ts +++ /dev/null @@ -1,591 +0,0 @@ -import { IncomingHttpHeaders } from "http"; -import { request } from "undici"; -import weaponMappings from './wz-data/weapon-ids.json'; -import wzMappings from './wz-data/game-modes.json'; - -const userAgent: string = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"; -let baseCookie: string = "new_SiteId=cod;ACT_SSO_LOCALE=en_US;country=US;"; -let baseSsoToken: string = ''; -let debugMode = false; - -interface CustomHeaders extends IncomingHttpHeaders { - "X-XSRF-TOKEN"?: string | undefined; - "X-CSRF-TOKEN"?: string | undefined; - "Atvi-Auth"?: string | undefined; - "ACT_SSO_COOKIE"?: string | undefined; - "atkn"?: string | undefined; - 'cookie'?: string | undefined; - 'content-type'?: string | undefined; -}; - -let baseHeaders: CustomHeaders = { - 'content-type': 'application/json', - 'cookie': baseCookie, - 'user-agent': userAgent -}; - -let basePostHeaders: CustomHeaders = { - 'content-type': 'text/plain', - 'cookie': baseCookie, - 'user-agent': userAgent -}; - -let baseUrl: string = "https://my.callofduty.com"; -let apiPath: string = "/api/papi-client"; -let loggedIn: boolean = false; - -enum platforms { - All = 'all', - Activision = 'acti', - Battlenet = 'battle', - PSN = 'psn', - Steam = 'steam', - Uno = 'uno', - XBOX = 'xbl', - NULL = '_' -}; - -enum games { - ModernWarfare = 'mw', - ModernWarfare2 = 'mw2', - Vanguard = 'vg', - ColdWar = 'cw', - NULL = '_' -}; - -enum modes { - Multiplayer = 'mp', - Warzone = 'wz', - Warzone2 = 'wz2', - NULL = '_' -}; - -enum friendActions { - Invite = "invite", - Uninvite = "uninvite", - Remove = "remove", - Block = "block", - Unblock = "unblock" -}; - -enum generics { - STEAM_UNSUPPORTED = "Steam platform not supported by this game. Try `battle` instead.", - UNO_NO_NUMERICAL_ID = `You must use a numerical ID when using the platform 'uno'.\nIf using an Activision ID, please use the platform 'acti'.` -}; - -const enableDebugMode = () => debugMode = true; - -const disableDebugMode = () => debugMode = false; - -const sendRequest = async (url: string) => { - try { - if (!loggedIn) throw new Error("Not Logged In."); - let requestUrl = `${baseUrl}${apiPath}${url}`; - - if (debugMode) console.log(`[DEBUG]`, `Request Uri: ${requestUrl}`); - if (debugMode) console.time("Round Trip"); - - const { body, statusCode } = await request(requestUrl, { - headers: baseHeaders - }); - - if (debugMode) console.timeEnd("Round Trip"); - - if (statusCode >= 500) - throw new Error(`Received status code: '${statusCode}'. Route may be down or not exist.`); - - let response = await body.json(); - - if (debugMode) - console.log(`[DEBUG]`, `Body Size: ${JSON.stringify(response).length} bytes.`); - - return response; - } - catch (exception: unknown) { - throw exception; - } -}; - -const sendPostRequest = async (url: string, data: string) => { - try { - if (!loggedIn) throw new Error("Not Logged In."); - let requestUrl = `${baseUrl}${apiPath}${url}`; - const { body, statusCode } = await request(requestUrl, { - method: 'POST', - headers: basePostHeaders, - body: data - }); - - if (statusCode >= 500) - throw new Error(`Received status code: '${statusCode}'. Route may be down or not exist.`); - - let response = await body.json(); - - return response; - } - catch (exception: unknown) { - throw exception; - } -}; - -const cleanClientName = (gamertag: string): string => { - return encodeURIComponent(gamertag); -} - -const login = (ssoToken: string): boolean => { - if (!ssoToken || ssoToken.trim().length <= 0) return false; - let fakeXSRF = "68e8b62e-1d9d-4ce1-b93f-cbe5ff31a041"; - baseHeaders["X-XSRF-TOKEN"] = fakeXSRF; - baseHeaders["X-CSRF-TOKEN"] = fakeXSRF; - baseHeaders["Atvi-Auth"] = ssoToken; - baseHeaders["ACT_SSO_COOKIE"] = ssoToken; - baseHeaders["atkn"] = ssoToken; - baseHeaders["cookie"] = `${baseCookie}ACT_SSO_COOKIE=${ssoToken};XSRF-TOKEN=${fakeXSRF};API_CSRF_TOKEN=${fakeXSRF};ACT_SSO_EVENT="LOGIN_SUCCESS:1644346543228";ACT_SSO_COOKIE_EXPIRY=1645556143194;comid=cod;ssoDevId=63025d09c69f47dfa2b8d5520b5b73e4;tfa_enrollment_seen=true;gtm.custom.bot.flag=human;`; - baseSsoToken = ssoToken; - basePostHeaders["X-XSRF-TOKEN"] = fakeXSRF; - basePostHeaders["X-CSRF-TOKEN"] = fakeXSRF; - basePostHeaders["Atvi-Auth"] = ssoToken; - basePostHeaders["ACT_SSO_COOKIE"] = ssoToken; - basePostHeaders["atkn"] = ssoToken; - basePostHeaders["cookie"] = `${baseCookie}ACT_SSO_COOKIE=${ssoToken};XSRF-TOKEN=${fakeXSRF};API_CSRF_TOKEN=${fakeXSRF};ACT_SSO_EVENT="LOGIN_SUCCESS:1644346543228";ACT_SSO_COOKIE_EXPIRY=1645556143194;comid=cod;ssoDevId=63025d09c69f47dfa2b8d5520b5b73e4;tfa_enrollment_seen=true;gtm.custom.bot.flag=human;`; - loggedIn = true; - return loggedIn; -}; - -const handleLookupType = (platform: platforms) => { - return platform === platforms.Uno ? 'id' : 'gamer'; -}; - -const checkForValidPlatform = (platform: platforms, gamertag?: string) => { - if (!Object.values(platforms).includes(platform as unknown as platforms)) - throw new Error(`Platform '${platform}' is not valid.\nTry one of the following:\n${JSON.stringify(Object.values(platforms), null, 2)}`); - - if (gamertag && isNaN(Number(gamertag)) && platform === platforms.Uno) - throw new Error(generics.UNO_NO_NUMERICAL_ID); -}; - -const mapGamertagToPlatform = (gamertag: string, platform: platforms, steamSupport: boolean = false) => { - checkForValidPlatform(platform, gamertag); - - const lookupType = handleLookupType(platform); - - if (!steamSupport && platform === platforms.Steam) throw new Error(generics.STEAM_UNSUPPORTED); - - if (platform == platforms.Battlenet || platform == platforms.Activision || platform == platforms.Uno) - if (gamertag && gamertag.length > 0) gamertag = cleanClientName(gamertag); - - if (platform === platforms.Uno || platform === platforms.Activision) - platform = platforms.Uno; - - return { gamertag, _platform: platform as platforms, lookupType }; -}; - -class Endpoints { - - game: games | undefined; - gamertag: string| undefined; - platform: platforms| undefined; - lookupType: string | undefined; - mode: string | undefined; - - constructor(game?: games, gamertag?: string, platform?: platforms, mode?: string, lookupType?: string) { - this.game = game; - this.gamertag = gamertag; - this.platform = platform; - this.lookupType = lookupType; - this.mode = mode; - } - - fullData = () => `/stats/cod/v1/title/${this.game}/platform/${this.platform}/${this.lookupType}/${this.gamertag}/profile/type/${this.mode}`; - combatHistory = () => `/crm/cod/v2/title/${this.game}/platform/${this.platform}/${this.lookupType}/${this.gamertag}/matches/${this.mode}/start/0/end/0/details`; - combatHistoryWithDate = (startTime: number, endTime: number) => `/crm/cod/v2/title/${this.game}/platform/${this.platform}/${this.lookupType}/${this.gamertag}/matches/${this.mode}/start/${startTime}/end/${endTime}/details`; - breakdown = () => `/crm/cod/v2/title/${this.game}/platform/${this.platform}/${this.lookupType}/${this.gamertag}/matches/${this.mode}/start/0/end/0`; - breakdownWithDate = (startTime: number, endTime: number) => `/crm/cod/v2/title/${this.game}/platform/${this.platform}/${this.lookupType}/${this.gamertag}/matches/${this.mode}/start/${startTime}/end/${endTime}`; - matchInfo = (matchId: string) => `/crm/cod/v2/title/${this.game}/platform/${this.platform}/fullMatch/wz/${matchId}/en`; - seasonLoot = () => `/loot/title/${this.game}/platform/${this.platform}/${this.lookupType}/${this.gamertag}/status/en`; - mapList = () => `/ce/v1/title/${this.game}/platform/${this.platform}/gameType/${this.mode}/communityMapData/availability`; - purchasableItems = (gameId: string) => `/inventory/v1/title/${gameId}/platform/psn/purchasable/public/en`; - bundleInformation = (gameId: string, bundleId: string) => `/inventory/v1/title/${gameId}/bundle/${bundleId}/en`; - battlePassLoot = (season: number) => `/loot/title/${this.game}/platform/${this.platform}/list/loot_season_${season}/en`; - friendFeed = () => `/userfeed/v1/friendFeed/platform/${this.platform}/${this.lookupType}/${this.gamertag}/friendFeedEvents/en`; - eventFeed = () => `/userfeed/v1/friendFeed/rendered/en/${baseSsoToken}`; - loggedInIdentities = () => `/crm/cod/v2/identities/${baseSsoToken}`; - codPoints = () => `/inventory/v1/title/mw/platform/${this.platform}/${this.lookupType}/${this.gamertag}/currency`; - connectedAccounts = () => `/crm/cod/v2/accounts/platform/${this.platform}/${this.lookupType}/${this.gamertag}`; - settings = () => `/preferences/v1/platform/${this.platform}/${this.lookupType}/${this.gamertag}/list`; - friendAction = (action: friendActions) => `/codfriends/v1/${action}/${this.platform}/${this.lookupType}/${this.gamertag}`; - search = () => `/crm/cod/v2/platform/${this.platform}/username/${this.gamertag}/search`; -} - -class WZ { - fullData = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Warzone, lookupType); - return await sendRequest(endpoint.fullData()); - }; - - combatHistory = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Warzone, lookupType); - return await sendRequest(endpoint.combatHistory()); - }; - - combatHistoryWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Warzone, lookupType); - return await sendRequest(endpoint.combatHistoryWithDate(startTime, endTime)); - }; - - breakdown = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Warzone, lookupType); - return await sendRequest(endpoint.breakdown()); - }; - - breakdownWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Warzone, lookupType); - return await sendRequest(endpoint.breakdownWithDate(startTime, endTime)); - }; - - matchInfo = async (matchId: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Warzone, lookupType); - return await sendRequest(endpoint.matchInfo(matchId)); - }; - - cleanGameMode = async (mode: string): Promise => { - //@ts-ignore - const foundMode: string = wzMappings["modes"][mode]; - if (!foundMode) - return mode; - return foundMode; - } -} - -class MW { - fullData = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.fullData()); - }; - - combatHistory = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistory()); - }; - - combatHistoryWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistoryWithDate(startTime, endTime)); - }; - - breakdown = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdown()); - }; - - breakdownWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdownWithDate(startTime, endTime)); - }; - - matchInfo = async (matchId: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.matchInfo(matchId)); - }; - - seasonloot = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.seasonLoot()); - }; - - mapList = async (platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.ModernWarfare, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.mapList()); - }; - -} - -class MW2 { - fullData = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.fullData()); - }; - - combatHistory = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistory()); - }; - - combatHistoryWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistoryWithDate(startTime, endTime)); - }; - - breakdown = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdown()); - }; - - breakdownWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdownWithDate(startTime, endTime)); - }; - - seasonloot = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.seasonLoot()); - }; - - mapList = async (platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.mapList()); - }; - - matchInfo = async (matchId: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform, true); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.matchInfo(matchId)); - }; -} - -class WZ2 { - fullData = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Warzone2, lookupType); - return await sendRequest(endpoint.fullData()); - }; - - combatHistory = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Warzone2, lookupType); - return await sendRequest(endpoint.combatHistory()); - }; - - combatHistoryWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Warzone2, lookupType); - return await sendRequest(endpoint.combatHistoryWithDate(startTime, endTime)); - }; - - breakdown = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Warzone2, lookupType); - return await sendRequest(endpoint.breakdown()); - }; - - breakdownWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Warzone2, lookupType); - return await sendRequest(endpoint.breakdownWithDate(startTime, endTime)); - }; - - matchInfo = async (matchId: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.ModernWarfare2, gamertag, platform, modes.Warzone2, lookupType); - return await sendRequest(endpoint.matchInfo(matchId)); - }; -} - -class CW { - fullData = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.fullData()); - }; - - combatHistory = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistory()); - }; - - combatHistoryWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistoryWithDate(startTime, endTime)); - }; - - breakdown = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdown()); - }; - - breakdownWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdownWithDate(startTime, endTime)); - }; - - seasonloot = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.seasonLoot()); - }; - - mapList = async (platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.mapList()); - }; - - matchInfo = async (matchId: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.ColdWar, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.matchInfo(matchId)); - }; -} - -class VG { - fullData = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.fullData()); - }; - - combatHistory = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistory()); - }; - - combatHistoryWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.combatHistoryWithDate(startTime, endTime)); - }; - - breakdown = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdown()); - }; - - breakdownWithDate = async (gamertag: string, startTime: number, endTime: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.breakdownWithDate(startTime, endTime)); - }; - - seasonloot = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.seasonLoot()); - }; - - mapList = async (platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.mapList()); - }; - - matchInfo = async (matchId: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(games.Vanguard, gamertag, platform, modes.Multiplayer, lookupType); - return await sendRequest(endpoint.matchInfo(matchId)); - }; -} - -class SHOP { - purchasableItems = async (gameId: string) => { - const endpoint = new Endpoints(games.NULL, "", platforms.NULL, modes.NULL, ""); - return await sendRequest(endpoint.purchasableItems(gameId)); - }; - - bundleInformation = async(title: string, bundleId: string) => { - const endpoint = new Endpoints(games.NULL, "", platforms.NULL, modes.NULL, ""); - return await sendRequest(endpoint.bundleInformation(title, bundleId)); - }; - - battlePassLoot = async (title: games, season: number, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform("", platform); - const endpoint = new Endpoints(title, gamertag, platform, modes.NULL, lookupType); - return await sendRequest(endpoint.battlePassLoot(season)); - }; -} - -class USER { - friendFeed = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.NULL, gamertag, platform, modes.NULL, lookupType); - return await sendRequest(endpoint.friendFeed()); - }; - - eventFeed = async() => { - const endpoint = new Endpoints(games.NULL, "", platforms.NULL, modes.NULL, ""); - return await sendRequest(endpoint.eventFeed()); - }; - - loggedInIdentities = async () => { - const endpoint = new Endpoints(games.NULL, "", platforms.NULL, modes.NULL, ""); - return await sendRequest(endpoint.loggedInIdentities()); - }; - - codPoints = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.NULL, gamertag, platform, modes.NULL, lookupType); - return await sendRequest(endpoint.codPoints()); - }; - - connectedAccounts = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.NULL, gamertag, platform, modes.NULL, lookupType); - return await sendRequest(endpoint.connectedAccounts()); - }; - - settings = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.NULL, gamertag, platform, modes.NULL, lookupType); - return await sendRequest(endpoint.settings()); - }; - - friendAction = async (gamertag: string, platform: platforms, action: friendActions) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform); - const endpoint = new Endpoints(games.NULL, gamertag, platform, modes.NULL, lookupType); - return await sendPostRequest(endpoint.friendAction(action), "{}"); - }; -} - -class ALT { - search = async (gamertag: string, platform: platforms) => { - var { gamertag , _platform: platform, lookupType } = mapGamertagToPlatform(gamertag, platform, true); - const endpoint = new Endpoints(games.NULL, gamertag, platform, modes.NULL, lookupType); - return await sendRequest(endpoint.search()); - } - - cleanWeapon = async (weapon: string): Promise => { - //@ts-ignore - const foundWeapon: string = weaponMappings["All Weapons"][weapon]; - if (!foundWeapon) - return weapon; - return foundWeapon; - } -} - -const Warzone = new WZ(); -const ModernWarfare = new MW(); -const ModernWarfare2 = new MW2(); -const Warzone2 = new WZ2(); -const ColdWar = new CW(); -const Vanguard = new VG(); -const Store = new SHOP(); -const Me = new USER(); -const Misc = new ALT(); - -export { login, platforms, friendActions, Warzone, ModernWarfare, ModernWarfare2, Warzone2, ColdWar, Vanguard, Store, Me, Misc, enableDebugMode, disableDebugMode }; \ No newline at end of file diff --git a/src/Node-CallOfDuty/tsconfig.json b/src/Node-CallOfDuty/tsconfig.json deleted file mode 100644 index b40a483..0000000 --- a/src/Node-CallOfDuty/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "forceConsistentCasingInFileNames": true, - "importHelpers": true, - "resolveJsonModule": true, - "module": "CommonJS", - "target": "es2015", - "esModuleInterop": true, - "lib": ["esnext"], - "outDir": "dist", - "sourceMap": true, - "declaration": true, - "skipLibCheck": true, - "typeRoots": [ - "./@types", - "./node_modules/@types" - ] - }, - "include": ["src/**/*"], - "exclude": ["node_modules"] -} \ No newline at end of file diff --git a/src/cod-python-api/CODE_OF_CONDUCT.md b/src/cod-python-api/CODE_OF_CONDUCT.md deleted file mode 100644 index 69ece55..0000000 --- a/src/cod-python-api/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -me@todolodo.xyz. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/src/cod-python-api/CONTRIBUTING.rst b/src/cod-python-api/CONTRIBUTING.rst deleted file mode 100644 index 4531d04..0000000 --- a/src/cod-python-api/CONTRIBUTING.rst +++ /dev/null @@ -1,65 +0,0 @@ -Contributing to Transcriptase -============================= -We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: - -- Reporting a bug -- Discussing the current state of the code -- Submitting a fix -- Proposing new features -- Becoming a maintainer - -We Develop with Github ----------------------- -We use github to host code, to track issues and feature requests, as well as accept pull requests. - -We Use `Github Flow `_, So All Code Changes Happen Through Pull Requests --------------------------------------------------------------------------------------------------------------------------------- -Pull requests are the best way to propose changes to the codebase (we use `Github Flow `_). We actively welcome your pull requests: - -1. Fork the repo and create your branch from `main`. -2. If you've added code that should be tested, add tests. -3. If you've changed APIs, update the documentation. -4. Ensure the test suite passes. -5. Make sure your code lints. -6. Issue that pull request! - -Any contributions you make will be under the GNU General Public License (`GPL `_) -------------------------------------------------------------------------------------------------------------------------------- -In short, when you submit code changes, your submissions are understood to be under the same GPL-3.0 license that covers the project. Feel free to contact the maintainers if that's a concern. - -Report bugs using Github's `issues `_ --------------------------------------------------------------------------------------------- -We use GitHub issues to track public bugs. Report a bug by `opening a new issue `_ - -Write bug reports with detail, background, and sample code ----------------------------------------------------------- -**Great Bug Reports** tend to have: - -- A quick summary and/or background -- Steps to reproduce - - Be specific! - - Give sample code if you can. -- What you expected would happen -- What actually happens -- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) - -People *love* thorough bug reports. I'm not even kidding. - -Use a Consistent Coding Style ------------------------------ - -* 4 spaces or tabs for indentation -* Use reasonable and understandable variable names -* Use proper error handling -* Add comments where necessary -* You can try running `pylint example.py` for style unification - -License -------- -By contributing, you agree that your contributions will be licensed under its GPL-3.0 license. - ----------------------------------------------------------------------------------------------------------------------------------------------------------------- - -References ----------- -This document was adapted from a gist by `briandk `_ diff --git a/src/cod-python-api/LICENSE b/src/cod-python-api/LICENSE deleted file mode 100644 index 0e27290..0000000 --- a/src/cod-python-api/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (__C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (__C) 2022 Todo Lodo - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - cod-api Copyright (__C) 2022 Todo Lodo & Engineer15 - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/src/cod-python-api/README.rst b/src/cod-python-api/README.rst deleted file mode 100644 index 94eb087..0000000 --- a/src/cod-python-api/README.rst +++ /dev/null @@ -1,891 +0,0 @@ -=================== -**cod-python-api** -=================== - -.. meta:: - :description: Call Of Duty API Library for python with the implementation of both public and private API used by activision on callofduty.com - :key: CallOfDuty API, CallOfDuty python API, CallOfDuty python - -.. image:: https://github.com/TodoLodo/cod-python-api/actions/workflows/codeql-analysis.yml/badge.svg?branch=main - :target: https://github.com/TodoLodo/cod-python-api.git - -.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=version - :target: https://badge.fury.io/py/cod-api - -.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=downloads - :target: https://badge.fury.io/gh/TodoLodo2089%2Fcod-python-api - ------------------------------------------------------------------------------------------------------------------------- - -**Call Of Duty API Library** for **python** with the implementation of both public and private API used by activision on -callofduty.com - -==== -Devs -==== -* `Todo Lodo`_ -* `Engineer15`_ - -.. _Todo Lodo: https://todolodo.xyz -.. _Engineer15: https://github.com/Engineer152 - -============ -Contributors -============ -* `Werseter`_ - -.. _Werseter: https://github.com/Werseter - -=============== -Partnered Code -=============== -`Node-CallOfDuty`_ by: `Lierrmm`_ - -.. _Node-CallOfDuty: https://github.com/Lierrmm/Node-CallOfDuty -.. _Lierrmm: https://github.com/Lierrmm - -============= -Documentation -============= -This package can be used directly as a python file or as a python library. - -Installation -============ - -Install cod-api library using `pip`_: - -.. code-block:: bash - - pip install -U cod-api - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - -Usage -===== - -Initiation ----------- - -Import module with its classes: - -.. code-block:: python - - from cod_api import API - - api = API() - - -.. _`logged in`: - -Login with your sso token: - -.. code-block:: python - - api.login('Your sso token') - -Your sso token can be found by longing in at `callofduty`_, opening dev tools (ctr+shift+I), going to Applications > -Storage > Cookies > https://callofduty.com, filter to search 'ACT_SSO_COOKIE' and copy the value. - -.. _callofduty: https://my.callofduty.com/ - -Game/Other sub classes ----------------------- - -Following importation and initiation of the class ``API``, its associated subclasses can be called by -``API.subClassName``. - -Below are the available sub classes: - -+-------------------+----------+ -| sub class | category | -+===================+==========+ -|* `ColdWar`_ | game | -+-------------------+----------+ -|* `ModernWarfare`_ | game | -+-------------------+----------+ -|* `ModernWarfare2`_| game | -+-------------------+----------+ -|* `Vanguard`_ | game | -+-------------------+----------+ -|* `Warzone`_ | game | -+-------------------+----------+ -|* `Warzone2`_ | game | -+-------------------+----------+ -|* `Me`_ | other | -+-------------------+----------+ -|* `Shop`_ | other | -+-------------------+----------+ -|* `Misc`_ | other | -+-------------------+----------+ - - - -For a detailed description, ``__doc__`` (docstring) of each sub class can be called as shown below: - -.. _`ColdWar`: - -``ColdWar``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.ColdWar.__doc__) - -.. _`ModernWarfare`: - -``ModernWarfare``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.ModernWarfare.__doc__) - -.. _`ModernWarfare2`: - -``ModernWarfare2``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.ModernWarfare2.__doc__) - -.. _`Vanguard`: - -``Vanguard``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.Vanguard.__doc__) - -.. _`Warzone`: - -``Warzone``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.Warzone.__doc__) - -.. _`Warzone2`: - -``Warzone2``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.Warzone2.__doc__) - -.. _`Me`: - -``Me``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.Me.__doc__) - -.. _`Shop`: - -``Shop``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.Shop.__doc__) - - -.. _`Misc`: - -``Misc``: - -.. code-block:: python - - from cod_api import API - - api = API() - - # print out the docstring - print(api.Misc.__doc__) - -Full Profile History --------------------- - -Any sub class of ``API`` that is of game category, has methods to check a player's combat history. -Note that before calling any sub class methods of ``API`` you must be `logged in`_. -Main method is ``fullData()`` and ``fullDataAsync()`` which is available for ``ColdWar``, ``ModernWarfare``, -``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. - -Here's an example for retrieving **Warzone** full profile history of a player whose gamer tag is **Username#1234** on platform -**Battlenet**: - -.. code-block:: python - - from cod_api import API, platforms - import asyncio - - ## sync - # initiating the API class - api = API() - - # login in with sso token - api.login('your_sso_token') - - # retrieving combat history - profile = api.Warzone.fullData(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(profile) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving combat history - profile = await api.Warzone.fullDataAsync(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(profile) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - - -Combat History --------------- - -Main methods are ``combatHistory()`` and ``combatHistoryWithDate()`` for sync environments and ``combatHistoryAsync()`` -and ``combatHistoryWithDateAsync()`` for async environments which are available for all ``ColdWar``, ``ModernWarfare``, -``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. - -The ``combatHistory()`` and ``combatHistoryAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of -type `cod_api.platforms`_ and string respectively. - -Here's an example for retrieving **Warzone** combat history of a player whose gamer tag is **Username#1234** on platform -**Battlenet**: - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving combat history - hist = api.Warzone.combatHistory(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(hist) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving combat history - hist = await api.Warzone.combatHistoryAsync(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(hist) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -The ``combatHistoryWithDate()`` and ``combatHistoryWithDateAsync()`` takes 4 input parameters which are ``platform``, -``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. - -``start`` and ``end`` parameters are utc timestamps in microseconds. - -Here's an example for retrieving **ModernWarfare** combat history of a player whose gamer tag is **Username#1234567** on -platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) and **1657949309** -(Saturday, 16 July 2022 05:28:29): - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving combat history - hist = api.Warzone.combatHistoryWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict - - # printing results to console - print(hist) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving combat history - hist = await api.Warzone.combatHistoryWithDateAsync(platforms.Battlenet, "Username#1234", 1657919309, 1657949309) # returns data of type dict - - # printing results to console - print(hist) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -Additionally the methods ``breakdown()`` and ``breakdownWithDate()`` for sync environments and ``breakdownAsync()`` and -``breakdownWithDateAsync()`` for async environments, can be used to retrieve combat history without details, where only -the platform played on, game title, UTC timestamp, type ID, match ID and map ID is returned for every match. These -methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, ``Vanguard``, ``Warzone`` and -``Warzone2`` classes. - -The ``breakdown()`` and `breakdownAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of type -`cod_api.platforms`_ and string respectively. - -Here's an example for retrieving **Warzone** combat history breakdown of a player whose gamer tag is **Username#1234** -on platform **Battlenet**: - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving combat history breakdown - hist_b = api.Warzone.breakdown(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(hist_b) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving combat history breakdown - hist_b = await api.Warzone.breakdownAsync(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(hist_b) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -The ``breakdownWithDate()`` and ``breakdownWithDateAsync()`` takes 4 input parameters which are ``platform``, -``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. - -``start`` and ``end`` parameters are utc timestamps in microseconds. - -Here's an example for retrieving **ModernWarfare** combat history breakdown of a player whose gamer tag is -**Username#1234567** on platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) -and **1657949309** (Saturday, 16 July 2022 05:28:29): - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving combat history breakdown - hist_b = api.Warzone.breakdownWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict - - # printing results to console - print(hist_b) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving combat history breakdown - hist_b = await api.Warzone.breakdownWithDateAsync(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict - - # printing results to console - print(hist_b) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -Match Details -------------- - -To retrieve details of a specific match, the method ``matchInfo()`` for sync environments and ``matchInfoAsync()`` for -async environments can be used. These methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, -``Vanguard``, ``Warzone`` and ``Warzone2`` classes. Details returned by this method contains additional data than that -of details returned by the **combat history** methods for a single match. - -The ``matchInfo()`` and ``matchInfoAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type -`cod_api.platforms`_ and integer respectively. - -*Optionally the match ID can be retrieved during your gameplay where it will be visible on bottom left corner* - -Here's an example for retrieving **Warzone** match details of a match where its id is **9484583876389482453** -on platform **Battlenet**: - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving match details - details = api.Warzone.matchInfo(platforms.Battlenet, 9484583876389482453) # returns data of type dict - - # printing results to console - print(details) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving match details - details = await api.Warzone.matchInfoAsync(platforms.Battlenet, 9484583876389482453) # returns data of type dict - - # printing results to console - print(details) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -Season Loot ------------ - -Using the ``seasonLoot()`` for sync environments and ``seasonLootAsync()`` for async environments, player's obtained -season loot can be retrieved for a specific game and this method is available for ``ColdWar``, ``ModernWarfare``, -``ModernWarfare2`` and ``Vanguard`` classes. - -The ``seasonLoot()`` and ``seasonLootAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type -`cod_api.platforms`_ and integer respectively. - -Here's an example for retrieving **ColdWar** season loot obtained by a player whose gamer tag is **Username#1234** on -platform **Battlenet**: - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving season loot - loot = api.ColdWar.seasonLoot(platforms.Battlenet, "Username#1234") # returns data of type dict) - - # printing results to console - print(loot) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving season loot - loot = await api.ColdWar.seasonLootAsync(platforms.Battlenet, "Username#1234") # returns data of type dict - - # printing results to console - print(loot) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -Map List --------- - -Using the ``mapList()`` for sync environments and ``mapListAsync()`` for async environments, all the maps and its -available modes can be retrieved for a specific game. These methods are available for ``ColdWar``, ``ModernWarfare``, -``ModernWarfare2`` and ``Vanguard`` classes. - -The ``mapList()`` and ``mapListAsync()`` takes 1 input parameters which is ``platform`` of type `cod_api.platforms`_. - -Here's an example for retrieving **Vanguard** map list and available modes respectively on platform PlayStation -(**PSN**): - -.. code-block:: python - - from cod_api import API, platforms - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving maps and respective modes available - maps = api.Vanguard.mapList(platforms.PSN) # returns data of type dict - - # printing results to console - print(maps) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving season loot - maps = await api.Vanguard.mapListAsync(platforms.PSN) # returns data of type dict - - # printing results to console - print(maps) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - - -.. _cod_api.platforms: - -platforms ---------- - -``platforms`` is an enum class available in ``cod_api`` which is used to specify the platform in certain method calls. - -Available ``platforms`` are as follows: - -+----------------------+----------------------------------------+ -|Platform | Remarks | -+======================+========================================+ -|platforms.All | All (no usage till further updates) | -+----------------------+----------------------------------------+ -|platforms.Activision | Activision | -+----------------------+----------------------------------------+ -|platforms.Battlenet | Battlenet | -+----------------------+----------------------------------------+ -|platforms.PSN | PlayStation | -+----------------------+----------------------------------------+ -|platforms.Steam | Steam (no usage till further updates) | -+----------------------+----------------------------------------+ -|platforms.Uno | Uno (activision unique id) | -+----------------------+----------------------------------------+ -|platforms.XBOX | Xbox | -+----------------------+----------------------------------------+ - -``platforms`` can be imported and used as follows: - -.. code-block:: python - - from cod_api import platforms - - platforms.All # All (no usage till further updates) - - platforms.Activision # Activision - - platforms.Battlenet # Battlenet - - platforms.PSN # PlayStation - - platforms.Steam # Steam (no usage till further updates) - - platforms.Uno # Uno (activision unique id) - - platforms.XBOX # Xbox - -User Info ----------- - -Using the ``info()`` method in sub class ``Me`` of ``API`` user information can be retrieved of the sso-token logged in -with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - # login in with sso token - api.login('your_sso_token') - - # retrieving user info - userInfo = api.Me.info() # returns data of type dict - - # printing results to console - print(userInfo) - -User Friend Feed ----------------- - -Using the methods, ``friendFeed()`` for sync environments and ``friendFeedAsync()`` for async environments, in sub class -``Me`` of ``API``, user's friend feed can be retrieved of the sso-token logged in with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving user friend feed - friendFeed = api.Me.friendFeed() # returns data of type dict - - # printing results to console - print(friendFeed) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving user friend feed - friendFeed = await api.Me.friendFeedAsync() # returns data of type dict - - # printing results to console - print(friendFeed) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -User Event Feed ----------------- - -Using the methods ``eventFeed()`` for sync environments and ``eventFeedAsync()`` for async environments, in sub class -``Me`` of ``API`` user's event feed can be retrieved of the sso-token logged in with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving user event feed - eventFeed = api.Me.eventFeed() # returns data of type dict - - # printing results to console - print(eventFeed) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving user event feed - eventFeed = await api.Me.eventFeedAsync() # returns data of type dict - - # printing results to console - print(eventFeed) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -User Identities ----------------- - -Using the methods ``loggedInIdentities()`` for sync environments and ``loggedInIdentitiesAsync()`` for async -environments, in sub class ``Me`` of ``API`` user's identities can be retrieved of the sso-token logged in with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving user identities - identities = api.Me.loggedInIdentities() # returns data of type dict - - # printing results to console - print(identities) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving user identities - identities = await api.Me.loggedInIdentitiesAsync() # returns data of type dict - - # printing results to console - print(identities) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -User COD Points ----------------- - -Using the methods ``codPoints()`` for sync environments and ``codPointsAsync()`` for async environments, in sub class -``Me`` of ``API`` user's cod points can be retrieved of the sso-token logged in with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving user cod points - cp = api.Me.codPoints() # returns data of type dict - - # printing results to console - print(cp) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving user cod points - cp = await api.Me.codPointsAsync() # returns data of type dict - - # printing results to console - print(cp) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -User Accounts ----------------- - -Using the methods ``connectedAccounts()`` for sync environments and ``connectedAccountsAsync()`` for async environments, -in sub class ``Me`` of ``API`` user's connected accounts can be retrieved of the sso-token logged in with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving user connected accounts - accounts = api.Me.connectedAccounts() # returns data of type dict - - # printing results to console - print(accounts) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving user connected accounts - accounts = await api.Me.connectedAccountsAsync() # returns data of type dict - - # printing results to console - print(accounts) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -User settings ----------------- - -Using the methods ``settings()`` for sync environments and ``settingsAsync()`` for async environments, in sub class -``Me`` of ``API`` user's settings can be retrieved of the sso-token logged in with - -.. code-block:: python - - from cod_api import API - - # initiating the API class - api = API() - - ## sync - # login in with sso token - api.login('your_sso_token') - - # retrieving user settings - settings = api.Me.settings() # returns data of type dict - - # printing results to console - print(settings) - - ## async - # in an async function - async def example(): - # login in with sso token - await api.loginAsync('your_sso_token') - - # retrieving user settings - settings = await api.Me.settingsAsync() # returns data of type dict - - # printing results to console - print(settings) - - # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT - -------------------------------------------------------------------------------------------------------------------------------- - -Donate -====== - -* `Donate Todo Lodo`_ -* `Donate Engineer152`_ -* `Donate Werseter`_ - -.. _Donate Todo Lodo: https://www.buymeacoffee.com/todolodo2089 -.. _Donate Engineer152: https://www.paypal.com/paypalme/engineer15 -.. _Donate Werseter: https://paypal.me/werseter diff --git a/src/cod-python-api/cod_api/__init__.py b/src/cod-python-api/cod_api/__init__.py deleted file mode 100644 index e2302f2..0000000 --- a/src/cod-python-api/cod_api/__init__.py +++ /dev/null @@ -1,719 +0,0 @@ -__version__ = "2.0.1" - -# Imports -import asyncio -import enum -import json -import uuid -from abc import abstractmethod -from datetime import datetime -from urllib.parse import quote - -import aiohttp -import requests -from aiohttp import ClientResponseError - - -# Enums - -class platforms(enum.Enum): - All = 'all' - Activision = 'acti' - Battlenet = 'battle' - PSN = 'psn' - Steam = 'steam' - Uno = 'uno' - XBOX = 'xbl' - - -class games(enum.Enum): - ColdWar = 'cw' - ModernWarfare = 'mw' - ModernWarfare2 = 'mw2' - Vanguard = 'vg' - Warzone = 'wz' - Warzone2 = 'wz2' - - -class friendActions(enum.Enum): - Invite = "invite" - Uninvite = "uninvite" - Remove = "remove" - Block = "block" - Unblock = "unblock" - - -class API: - """ - Call Of Duty API Wrapper - - Developed by Todo Lodo & Engineer152 - - Contributors - - Werseter - - Source Code: https://github.com/TodoLodo/cod-python-api - """ - def __init__(self): - # sub classes - self.Warzone = self.__WZ() - self.ModernWarfare = self.__MW() - self.Warzone2 = self.__WZ2() - self.ModernWarfare2 = self.__MW2() - self.ColdWar = self.__CW() - self.Vanguard = self.__VG() - self.Shop = self.__SHOP() - self.Me = self.__USER() - self.Misc = self.__ALT() - - async def loginAsync(self, sso_token: str) -> None: - await API._Common.loginAsync(sso_token) - - # Login - def login(self, ssoToken: str): - API._Common.login(ssoToken) - - class _Common: - requestHeaders = { - "content-type": "application/json", - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/74.0.3729.169 " - "Safari/537.36", - "Accept": "application/json", - "Connection": "Keep-Alive" - } - cookies = {"new_SiteId": "cod", "ACT_SSO_LOCALE": "en_US", "country": "US", - "ACT_SSO_COOKIE_EXPIRY": "1645556143194"} - cachedMappings = None - - fakeXSRF = str(uuid.uuid4()) - baseUrl: str = "https://my.callofduty.com/api/papi-client" - loggedIn: bool = False - - # endPoints - - # game platform lookupType gamertag type - fullDataUrl = "/stats/cod/v1/title/%s/platform/%s/%s/%s/profile/type/%s" - # game platform lookupType gamertag type start end [?limit=n or ''] - combatHistoryUrl = "/crm/cod/v2/title/%s/platform/%s/%s/%s/matches/%s/start/%d/end/%d/details" - # game platform lookupType gamertag type start end - breakdownUrl = "/crm/cod/v2/title/%s/platform/%s/%s/%s/matches/%s/start/%d/end/%d" - # game platform lookupType gamertag - seasonLootUrl = "/loot/title/%s/platform/%s/%s/%s/status/en" - # game platform - mapListUrl = "/ce/v1/title/%s/platform/%s/gameType/mp/communityMapData/availability" - # game platform type matchId - matchInfoUrl = "/crm/cod/v2/title/%s/platform/%s/fullMatch/%s/%d/en" - - @staticmethod - async def loginAsync(sso_token: str) -> None: - API._Common.cookies["ACT_SSO_COOKIE"] = sso_token - API._Common.baseSsoToken = sso_token - r = await API._Common.__Request(f"{API._Common.baseUrl}/crm/cod/v2/identities/{sso_token}") - if r['status'] == 'success': - API._Common.loggedIn = True - else: - raise InvalidToken(sso_token) - - @staticmethod - def login(sso_token: str) -> None: - API._Common.cookies["ACT_SSO_COOKIE"] = sso_token - API._Common.baseSsoToken = sso_token - - r = requests.get(f"{API._Common.baseUrl}/crm/cod/v2/identities/{sso_token}", - headers=API._Common.requestHeaders, cookies=API._Common.cookies) - - if r.json()['status'] == 'success': - API._Common.loggedIn = True - API._Common.cookies.update(r.cookies) - else: - raise InvalidToken(sso_token) - - @staticmethod - def sso_token() -> str: - return API._Common.cookies["ACT_SSO_COOKIE"] - - # Requests - - @staticmethod - async def __Request(url): - async with aiohttp.client.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=True), - timeout=aiohttp.ClientTimeout(total=30)) as session: - try: - async with session.get(url, cookies=API._Common.cookies, - headers=API._Common.requestHeaders) as resp: - try: - resp.raise_for_status() - except ClientResponseError as err: - return {'status': 'error', 'data': {'type': type(err), 'message': err.message}} - else: - API._Common.cookies.update({c.key: c.value for c in session.cookie_jar}) - return await resp.json() - except asyncio.TimeoutError as err: - return {'status': 'error', 'data': {'type': type(err), 'message': str(err)}} - - async def __sendRequest(self, url: str): - if self.loggedIn: - response = await API._Common.__Request(f"{self.baseUrl}{url}") - if response['status'] == 'success': - response['data'] = await self.__perform_mapping(response['data']) - return response - else: - raise NotLoggedIn - - # client name url formatter - def __cleanClientName(self, gamertag): - return quote(gamertag.encode("utf-8")) - - # helper - def __helper(self, platform, gamertag): - lookUpType = "gamer" - if platform == platforms.Uno: - lookUpType = "id" - if platform == platforms.Activision: - platform = platforms.Uno - if platform not in [platforms.Activision, platforms.Battlenet, platforms.Uno, platforms.All, platforms.PSN, - platforms.XBOX]: - raise InvalidPlatform(platform) - else: - gamertag = self.__cleanClientName(gamertag) - return lookUpType, gamertag, platform - - async def __get_mappings(self): - if API._Common.cachedMappings is None: - API._Common.cachedMappings = ( - await API._Common.__Request('https://engineer152.github.io/wz-data/weapon-ids.json'), - await API._Common.__Request('https://engineer152.github.io/wz-data/game-modes.json'), - await API._Common.__Request('https://engineer152.github.io/wz-data/perks.json')) - return API._Common.cachedMappings - - # mapping - async def __perform_mapping(self, data): - guns, modes, perks = await self.__get_mappings() - if not isinstance(data, list) or 'matches' not in data: - return data - try: - for match in data['matches']: - # time stamps - try: - match['utcStartDateTime'] = datetime.fromtimestamp( - match['utcStartSeconds']).strftime("%A, %B %d, %Y, %I:%M:%S") - match['utcEndDateTime'] = datetime.fromtimestamp( - match['utcEndSeconds']).strftime("%A, %B %d, %Y, %I:%M:%S") - except KeyError: - pass - - # loadouts list - for loadout in match['player']['loadouts']: - # weapons - if loadout['primaryWeapon']['label'] is None: - try: - loadout['primaryWeapon']['label'] = guns[loadout['primaryWeapon']['name']] - except KeyError: - pass - if loadout['secondaryWeapon']['label'] is None: - try: - loadout['secondaryWeapon']['label'] = guns[loadout['secondaryWeapon']['name']] - except KeyError: - pass - - # perks list - for perk in loadout['perks']: - if perk['label'] is None: - try: - perk['label'] = perks[perk['name']] - except KeyError: - pass - - # extra perks list - for perk in loadout['extraPerks']: - if perk['label'] is None: - try: - perk['label'] = perks[perk['name']] - except KeyError: - pass - - # loadout list - for loadout in match['player']['loadout']: - if loadout['primaryWeapon']['label'] is None: - try: - loadout['primaryWeapon']['label'] = guns[loadout['primaryWeapon']['name']] - except KeyError: - pass - if loadout['secondaryWeapon']['label'] is None: - try: - loadout['secondaryWeapon']['label'] = guns[loadout['secondaryWeapon']['name']] - except KeyError: - pass - - # perks list - for perk in loadout['perks']: - if perk['label'] is None: - try: - perk['label'] = perks[perk['name']] - except KeyError: - pass - - # extra perks list - for perk in loadout['extraPerks']: - if perk['label'] is None: - try: - perk['label'] = perks[perk['name']] - except KeyError: - pass - except KeyError: - pass - - # return mapped or unmapped data - return data - - # API Requests - async def _fullDataReq(self, game, platform, gamertag, type): - lookUpType, gamertag, platform = self.__helper(platform, gamertag) - return await self.__sendRequest(self.fullDataUrl % (game, platform.value, lookUpType, gamertag, type)) - - async def _combatHistoryReq(self, game, platform, gamertag, type, start, end): - lookUpType, gamertag, platform = self.__helper(platform, gamertag) - return await self.__sendRequest( - self.combatHistoryUrl % (game, platform.value, lookUpType, gamertag, type, start, end)) - - async def _breakdownReq(self, game, platform, gamertag, type, start, end): - lookUpType, gamertag, platform = self.__helper(platform, gamertag) - return await self.__sendRequest( - self.breakdownUrl % (game, platform.value, lookUpType, gamertag, type, start, end)) - - async def _seasonLootReq(self, game, platform, gamertag): - lookUpType, gamertag, platform = self.__helper(platform, gamertag) - return await self.__sendRequest(self.seasonLootUrl % (game, platform.value, lookUpType, gamertag)) - - async def _mapListReq(self, game, platform): - return await self.__sendRequest(self.mapListUrl % (game, platform.value)) - - async def _matchInfoReq(self, game, platform, type, matchId): - return await self.__sendRequest(self.matchInfoUrl % (game, platform.value, type, matchId)) - - class __GameDataCommons(_Common): - """ - Methods - ======= - Sync - ---- - fullData(platform:platforms, gamertag:str) - returns player's game data of type dict - - combatHistory(platform:platforms, gamertag:str) - returns player's combat history of type dict - - combatHistoryWithDate(platform:platforms, gamertag:str, start:int, end:int) - returns player's combat history within the specified timeline of type dict - - breakdown(platform:platforms, gamertag:str) - returns player's combat history breakdown of type dict - - breakdownWithDate(platform:platforms, gamertag:str, start:int, end:int) - returns player's combat history breakdown within the specified timeline of type dict - - seasonLoot(platform:platforms, gamertag:str) - returns player's season loot - - mapList(platform:platforms) - returns available maps and available modes for each - - matchInfo(platform:platforms, matchId:int) - returns details match details of type dict - - Async - ---- - fullDataAsync(platform:platforms, gamertag:str) - returns player's game data of type dict - - combatHistoryAsync(platform:platforms, gamertag:str) - returns player's combat history of type dict - - combatHistoryWithDateAsync(platform:platforms, gamertag:str, start:int, end:int) - returns player's combat history within the specified timeline of type dict - - breakdownAsync(platform:platforms, gamertag:str) - returns player's combat history breakdown of type dict - - breakdownWithDateAsync(platform:platforms, gamertag:str, start:int, end:int) - returns player's combat history breakdown within the specified timeline of type dict - - seasonLootAsync(platform:platforms, gamertag:str) - returns player's season loot - - mapListAsync(platform:platforms) - returns available maps and available modes for each - - matchInfoAsync(platform:platforms, matchId:int) - returns details match details of type dict - """ - - def __init_subclass__(cls, **kwargs): - cls.__doc__ = cls.__doc__ + super(cls, cls).__doc__ - - @property - @abstractmethod - def _game(self) -> str: - raise NotImplementedError - - @property - @abstractmethod - def _type(self) -> str: - raise NotImplementedError - - async def fullDataAsync(self, platform: platforms, gamertag: str): - data = await self._fullDataReq(self._game, platform, gamertag, self._type) - return data - - def fullData(self, platform: platforms, gamertag: str): - return asyncio.run(self.fullDataAsync(platform, gamertag)) - - async def combatHistoryAsync(self, platform: platforms, gamertag: str): - data = await self._combatHistoryReq(self._game, platform, gamertag, self._type, 0, 0) - return data - - def combatHistory(self, platform: platforms, gamertag: str): - return asyncio.run(self.combatHistoryAsync(platform, gamertag)) - - async def combatHistoryWithDateAsync(self, platform, gamertag: str, start: int, end: int): - data = await self._combatHistoryReq(self._game, platform, gamertag, self._type, start, end) - return data - - def combatHistoryWithDate(self, platform, gamertag: str, start: int, end: int): - return asyncio.run(self.combatHistoryWithDateAsync(platform, gamertag, start, end)) - - async def breakdownAsync(self, platform, gamertag: str): - data = await self._breakdownReq(self._game, platform, gamertag, self._type, 0, 0) - return data - - def breakdown(self, platform, gamertag: str): - return asyncio.run(self.breakdownAsync(platform, gamertag)) - - async def breakdownWithDateAsync(self, platform, gamertag: str, start: int, end: int): - data = await self._breakdownReq(self._game, platform, gamertag, self._type, start, end) - return data - - def breakdownWithDate(self, platform, gamertag: str, start: int, end: int): - return asyncio.run(self.breakdownWithDateAsync(platform, gamertag, start, end)) - - async def matchInfoAsync(self, platform, matchId: int): - data = await self._matchInfoReq(self._game, platform, self._type, matchId) - return data - - def matchInfo(self, platform, matchId: int): - return asyncio.run(self.matchInfoAsync(platform, matchId)) - - async def seasonLootAsync(self, platform, gamertag): - data = await self._seasonLootReq(self._game, platform, gamertag) - return data - - def seasonLoot(self, platform, gamertag): - return asyncio.run(self.seasonLootAsync(platform, gamertag)) - - async def mapListAsync(self, platform): - data = await self._mapListReq(self._game, platform) - return data - - def mapList(self, platform): - return asyncio.run(self.mapListAsync(platform)) - # WZ - - class __WZ(__GameDataCommons): - """ - Warzone class: A class to get players warzone stats, warzone combat history and specific warzone match details - classCategory: game - gameId/gameTitle: mw or wz - gameType: wz - - """ - - @property - def _game(self) -> str: - return "mw" - - @property - def _type(self) -> str: - return "wz" - - async def seasonLootAsync(self, platform, gamertag): - raise InvalidEndpoint - - async def mapListAsync(self, platform): - raise InvalidEndpoint - - # WZ2 - - class __WZ2(__GameDataCommons): - """ - Warzone 2 class: A class to get players warzone 2 stats, warzone 2 combat history and specific warzone 2 match details - classCategory: game - gameId/gameTitle: mw or wz - gameType: wz2 - - """ - - @property - def _game(self) -> str: - return "mw2" - - @property - def _type(self) -> str: - return "wz2" - - async def seasonLootAsync(self, platform, gamertag): - raise InvalidEndpoint - - async def mapListAsync(self, platform): - raise InvalidEndpoint - - # MW - - class __MW(__GameDataCommons): - """ - ModernWarfare class: A class to get players modernwarfare stats, modernwarfare combat history, a player's modernwarfare season loot, modernwarfare map list and specific modernwarfare match details - classCategory: game - gameId/gameTitle: mw - gameType: mp - - """ - - @property - def _game(self) -> str: - return "mw" - - @property - def _type(self) -> str: - return "mp" - - # CW - - class __CW(__GameDataCommons): - """ - ColdWar class: A class to get players coldwar stats, coldwar combat history, a player's coldwar season loot, coldwar map list and specific coldwar match details - classCategory: game - gameId/gameTitle: cw - gameType: mp - - """ - @property - def _game(self) -> str: - return "cw" - - @property - def _type(self) -> str: - return "mp" - - # VG - - class __VG(__GameDataCommons): - """ - Vanguard class: A class to get players vanguard stats, vanguard combat history, a player's vanguard season loot, vanguard map list and specific vanguard match details - classCategory: game - gameId/gameTitle: vg - gameType: pm - - """ - - @property - def _game(self) -> str: - return "vg" - - @property - def _type(self) -> str: - return "mp" - - # MW2 - - class __MW2(__GameDataCommons): - """ - ModernWarfare 2 class: A class to get players modernwarfare 2 stats, modernwarfare 2 combat history, a player's modernwarfare 2 season loot, modernwarfare 2 map list and specific modernwarfare 2 match details - classCategory: game - gameId/gameTitle: mw - gameType: mp - - """ - - @property - def _game(self) -> str: - return "mw2" - - @property - def _type(self) -> str: - return "mp" - - # USER - class __USER(_Common): - def info(self): - if self.loggedIn: - rawData = requests.get(f"https://profile.callofduty.com/cod/userInfo/{self.sso_token()}", - headers=API._Common.requestHeaders) - rawData = json.loads(rawData.text.replace( - 'userInfo(', '').replace(');', '')) - - data = {'userName': rawData['userInfo']['userName'], 'identities': []} - for i in rawData['identities']: - data['identities'].append({ - 'platform': i['provider'], - 'gamertag': i['username'], - 'accountID': i['accountID'] - }) - return data - else: - raise NotLoggedIn - - def __priv(self): - d = self.info() - return d['identities'][0]['platform'], quote(d['identities'][0]['gamertag'].encode("utf-8")) - - async def friendFeedAsync(self): - p, g = self.__priv() - data = await self._Common__sendRequest( - f"/userfeed/v1/friendFeed/platform/{p}/gamer/{g}/friendFeedEvents/en") - return data - - def friendFeed(self): - return asyncio.run(self.friendFeedAsync()) - - async def eventFeedAsync(self): - data = await self._Common__sendRequest(f"/userfeed/v1/friendFeed/rendered/en/{self.sso_token()}") - return data - - def eventFeed(self): - return asyncio.run(self.eventFeedAsync()) - - async def loggedInIdentitiesAsync(self): - data = await self._Common__sendRequest(f"/crm/cod/v2/identities/{self.sso_token()}") - return data - - def loggedInIdentities(self): - return asyncio.run(self.loggedInIdentitiesAsync()) - - async def codPointsAsync(self): - p, g = self.__priv() - data = await self._Common__sendRequest(f"/inventory/v1/title/mw/platform/{p}/gamer/{g}/currency") - return data - - def codPoints(self): - return asyncio.run(self.codPointsAsync()) - - async def connectedAccountsAsync(self): - p, g = self.__priv() - data = await self._Common__sendRequest(f"/crm/cod/v2/accounts/platform/{p}/gamer/{g}") - return data - - def connectedAccounts(self): - return asyncio.run(self.connectedAccountsAsync()) - - async def settingsAsync(self): - p, g = self.__priv() - data = await self._Common__sendRequest(f"/preferences/v1/platform/{p}/gamer/{g}/list") - return data - - def settings(self): - return asyncio.run(self.settingsAsync()) - - # SHOP - class __SHOP(_Common): - """ - Shop class: A class to get bundle details and battle pass loot - classCategory: other - - Methods - ======= - Sync - ---- - purchasableItems(game: games) - returns purchasable items for a specific gameId/gameTitle - - bundleInformation(game: games, bundleId: int) - returns bundle details for the specific gameId/gameTitle and bundleId - - battlePassLoot(game: games, platform: platforms, season: int) - returns battle pass loot for specific game and season on given platform - - Async - ---- - purchasableItemsAsync(game: games) - returns purchasable items for a specific gameId/gameTitle - - bundleInformationAsync(game: games, bundleId: int) - returns bundle details for the specific gameId/gameTitle and bundleId - - battlePassLootAsync(game: games, platform: platforms, season: int) - returns battle pass loot for specific game and season on given platform - """ - - async def purchasableItemsAsync(self, game: games): - data = await self._Common__sendRequest(f"/inventory/v1/title/{game.value}/platform/uno/purchasable/public/en") - return data - - def purchasableItems(self, game: games): - return asyncio.run(self.purchasableItemsAsync(game)) - - async def bundleInformationAsync(self, game: games, bundleId: int): - data = await self._Common__sendRequest(f"/inventory/v1/title/{game.value}/bundle/{bundleId}/en") - return data - - def bundleInformation(self, game: games, bundleId: int): - return asyncio.run(self.bundleInformationAsync(game, bundleId)) - - async def battlePassLootAsync(self, game: games, platform: platforms, season: int): - data = await self._Common__sendRequest( - f"/loot/title/{game.value}/platform/{platform.value}/list/loot_season_{season}/en") - return data - - def battlePassLoot(self, game: games, platform: platforms, season: int): - return asyncio.run(self.battlePassLootAsync(game, platform, season)) - - # ALT - class __ALT(_Common): - - async def searchAsync(self, platform, gamertag: str): - lookUpType, gamertag, platform = self._Common__helper(platform, gamertag) - data = await self._Common__sendRequest(f"/crm/cod/v2/platform/{platform.value}/username/{gamertag}/search") - return data - - def search(self, platform, gamertag: str): - return asyncio.run(self.searchAsync(platform, gamertag)) - - -# Exceptions - -class NotLoggedIn(Exception): - def __str__(self): - return "Not logged in!" - - -class InvalidToken(Exception): - def __init__(self, token): - self.token = token - - def __str__(self): - return f"Token is invalid, token: {self.token}" - - -class InvalidPlatform(Exception): - def __init__(self, platform: platforms): - self.message: str - if platform == platforms.Steam: - self.message = "Steam cannot be used till further updates." - else: - self.message = "Invalid platform, use platform class!" - - - super().__init__(self.message) - - def __str__(self): - return self.message - - -class InvalidEndpoint(Exception): - def __str__(self): - return "This endpoint is not available for selected title" - - -class StatusError(Exception): - def __str__(self): - return "Status Error, Check if your sso token is valid or try again later." diff --git a/src/cod-python-api/requirements_dev.txt b/src/cod-python-api/requirements_dev.txt deleted file mode 100644 index 727dd46..0000000 --- a/src/cod-python-api/requirements_dev.txt +++ /dev/null @@ -1,8 +0,0 @@ -asyncio -datetime -enum34 -requests -twine -urllib3 -uuid -sphinx-tabs \ No newline at end of file diff --git a/src/cod-python-api/setup.cfg b/src/cod-python-api/setup.cfg deleted file mode 100644 index 436ed37..0000000 --- a/src/cod-python-api/setup.cfg +++ /dev/null @@ -1,19 +0,0 @@ -[metadata] -version = attr: cod_api.__version__ -description-file = README.rst -url = https://codapi.dev/ -project_urls = - Source Code = https://github.com/TodoLodo2089/cod-python-api - Issue Tracker = https://github.com/TodoLodo2089/cod-python-api/issues -license = GPL-3.0 -author = Todo Lodo -author_email = me@todolodo.xyz -maintainer = Engineer15 -maintainer_email = engineergamer15@gmail.com -description = Call Of Duty API. -long_description = file: README.rst -long_description_content_type = text/x-rst -classifiers = - Intended Audience :: Developers - Operating System :: OS Independent - Programming Language :: Python \ No newline at end of file diff --git a/src/cod-python-api/setup.py b/src/cod-python-api/setup.py deleted file mode 100644 index 08d7c0a..0000000 --- a/src/cod-python-api/setup.py +++ /dev/null @@ -1,9 +0,0 @@ -from setuptools import setup - -requirements = ["asyncio", "aiohttp", "datetime", "requests", "uuid", "urllib3", "enum34"] - -setup( - name="cod_api", - packages=['cod_api'], - install_requires=requirements -) diff --git a/src/cod_api-2.0.1-py3-none-any.whl b/src/cod_api-2.0.1-py3-none-any.whl deleted file mode 100644 index 6af470d..0000000 Binary files a/src/cod_api-2.0.1-py3-none-any.whl and /dev/null differ diff --git a/src/cod_api-2.0.1.tar b/src/cod_api-2.0.1.tar deleted file mode 100644 index 459d94c..0000000 Binary files a/src/cod_api-2.0.1.tar and /dev/null differ