diff --git a/README.md b/README.md index 28d9fe8..a54e5d8 100644 --- a/README.md +++ b/README.md @@ -49,15 +49,33 @@ A Nuget package is available at [www.nuget.org/packages/HaloSharp](https://www.n ### Changelog ### -###### v.1.1.00 (2015-12-26) +###### v.1.2.0.0 (2016-01-31) -1. Rate Limiter: Optional rate limiter with timeout settings. +1. Query validation. + * Validation exceptions will be thrown for bad queries (missing mandatory fields, invalid gamertags etc.). -2. JSON Structural Validation (JSON Schema): A significant update to the test harness. Using JSON schemas to detect changes to API responses. +2. Updated GetArenaServiceRecord query. + * New SeasonId parameter. -3. Serialization: Strongly typed models are now serializable. +3. Updated ArenaServiceRecord model. + * New property: ArenaPlaylistStatsSeasonId + * New property: HighestCsrSeasonId -4. Metadata Endpoints +4. Updated Requisition model. + * New property: LevelRequirement + +###### v.1.1.0.0 (2015-12-26) + +1. Rate Limiter + * Optional rate limiter with timeout settings. + +2. JSON Structural Validation (JSON Schema). + * A significant update to the test harness. Using JSON schemas to detect changes to API responses. + +3. Serialization. + * Strongly typed models are now serializable. + +4. Metadata Endpoints. * Seasons 5. Profile Endpoints diff --git a/Source/HaloSharp.Test/JSON/Metadata/requisition.json b/Source/HaloSharp.Test/JSON/Metadata/requisition.json index a9d41da..3feb5a8 100644 --- a/Source/HaloSharp.Test/JSON/Metadata/requisition.json +++ b/Source/HaloSharp.Test/JSON/Metadata/requisition.json @@ -1,24 +1,24 @@ { "supportedGameModes":[ - "Arena", "Warzone" ], - "name":"AIR ASSAULT", - "description":"The AIR ASSAULT helmet's long-range comm system makes it popular with Spartan fireteam leaders, but Naphtali also markets this helmet to Army special forces.", - "rarityType":"Common", - "rarity":"Common", - "isMythic":false, + "name":"Nornfang", + "description":"A master-crafted instrument of death and destruction. Mythic Sniper Rifle firing high explosive armor piercing (APHE) rounds that increases overall damage. In addition, Linda's modifications ensure the Motion Tracker is visible even when using Zoom.", + "rarityType":"Legendary", + "rarity":"Legendary", + "isMythic":true, "isCertification":false, - "isWearable":true, - "useType":"Durable", - "largeImageUrl":"https://image.halocdn.com:443/h5/requisitions/0a55d3d9-16c8-400b-a830-e65a0543a5df?locale=en&width=200&hash=EAoqR%2bLHiAJInycTKC6ycHdSacxulR8IggjGTm83diQ%3d", - "categoryName":"Customization", - "internalCategoryName":"Customization", - "subcategoryName":"Helmet", - "internalSubcategoryName":"Helmet", + "isWearable":false, + "useType":"Consumable", + "largeImageUrl":"https://image.halocdn.com:443/h5/requisitions/a23a896d-57e6-45c3-970b-27550f0e7184?locale=en&width=200&hash=H%2b0SkJV2oQsDv%2fDiUafVqoTeCmx2gebaSeTsg%2bX0oRk%3d", + "categoryName":"Power and Vehicle", + "internalCategoryName":"PowerAndVehicle", + "subcategoryName":"Power Weapon", + "internalSubcategoryName":"PowerWeapon", "subcategoryOrder":1, - "sellPrice":0, - "certificationRequisitionId":null, - "id":"0a55d3d9-16c8-400b-a830-e65a0543a5df", - "contentId":"0a55d3d9-16c8-400b-a830-e65a0543a5df" + "sellPrice":200, + "levelRequirement":7, + "certificationRequisitionId":"f1e71491-cd08-4c14-9517-ddd07b67652e", + "id":"a23a896d-57e6-45c3-970b-27550f0e7184", + "contentId":"a23a896d-57e6-45c3-970b-27550f0e7184" } \ No newline at end of file diff --git a/Source/HaloSharp.Test/JSON/Metadata/requisition.schema.json b/Source/HaloSharp.Test/JSON/Metadata/requisition.schema.json index 53ec55d..3830ed1 100644 --- a/Source/HaloSharp.Test/JSON/Metadata/requisition.schema.json +++ b/Source/HaloSharp.Test/JSON/Metadata/requisition.schema.json @@ -55,6 +55,9 @@ "sellPrice": { "type": "integer" }, + "levelRequirement": { + "type": "integer" + }, "certificationRequisitionId": { "type": [ "string", "null" ] }, @@ -82,6 +85,7 @@ "internalSubcategoryName", "subcategoryOrder", "sellPrice", + "levelRequirement", "certificationRequisitionId", "id", "contentId" diff --git a/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.json b/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.json index d936907..f0dcf71 100644 --- a/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.json +++ b/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.json @@ -10,24 +10,24 @@ "PlaylistId":"2323b76a-db98-4e03-aa37-e171cfbdd1a4", "MeasurementMatchesLeft":0, "HighestCsr":{ - "Tier":2, + "Tier":3, "DesignationId":4, "Csr":0, - "PercentToNextTier":60, + "PercentToNextTier":86, "Rank":null }, "Csr":{ - "Tier":2, + "Tier":3, "DesignationId":4, "Csr":0, - "PercentToNextTier":48, + "PercentToNextTier":36, "Rank":null }, - "TotalKills":191, - "TotalHeadshots":183, - "TotalWeaponDamage":8913.5334253311157, - "TotalShotsFired":1225, - "TotalShotsLanded":416, + "TotalKills":537, + "TotalHeadshots":511, + "TotalWeaponDamage":24801.026315689087, + "TotalShotsFired":3141, + "TotalShotsLanded":1140, "WeaponWithMostKills":{ "WeaponId":{ "StockId":4096745987, @@ -35,65 +35,65 @@ ] }, - "TotalShotsFired":518, - "TotalShotsLanded":220, - "TotalHeadshots":108, - "TotalKills":112, - "TotalDamageDealt":5328.5230188369751, - "TotalPossessionTime":"PT27M14.1499S" + "TotalShotsFired":1614, + "TotalShotsLanded":696, + "TotalHeadshots":340, + "TotalKills":352, + "TotalDamageDealt":16740.288637161255, + "TotalPossessionTime":"PT1H32M8.9332S" }, - "TotalMeleeKills":3, - "TotalMeleeDamage":105.0044994354248, - "TotalAssassinations":0, - "TotalGroundPoundKills":0, - "TotalGroundPoundDamage":0.0, - "TotalShoulderBashKills":0, - "TotalShoulderBashDamage":0.0, + "TotalMeleeKills":8, + "TotalMeleeDamage":345.00899275951087, + "TotalAssassinations":2, + "TotalGroundPoundKills":1, + "TotalGroundPoundDamage":21.666664123535156, + "TotalShoulderBashKills":2, + "TotalShoulderBashDamage":87.571727752685547, "TotalGrenadeDamage":0.0, "TotalPowerWeaponKills":0, "TotalPowerWeaponDamage":0.0, "TotalPowerWeaponGrabs":0, "TotalPowerWeaponPossessionTime":"PT0S", - "TotalDeaths":115, - "TotalAssists":16, - "TotalGamesCompleted":13, - "TotalGamesWon":10, - "TotalGamesLost":3, + "TotalDeaths":340, + "TotalAssists":50, + "TotalGamesCompleted":35, + "TotalGamesWon":22, + "TotalGamesLost":13, "TotalGamesTied":0, - "TotalTimePlayed":"PT58M25.0078772S", + "TotalTimePlayed":"PT2H45M25.3121885S", "TotalGrenadeKills":0, "MedalAwards":[ { "MedalId":3261908037, - "Count":183 + "Count":511 }, { "MedalId":2078758684, - "Count":30 + "Count":92 }, { "MedalId":2763748638, - "Count":5 + "Count":10 }, { "MedalId":2430242797, - "Count":7 + "Count":19 }, { "MedalId":2782465081, - "Count":15 + "Count":58 }, { "MedalId":824733727, - "Count":10 + "Count":28 }, { "MedalId":3710519250, - "Count":2 + "Count":4 }, { "MedalId":466059351, - "Count":4 + "Count":11 }, { "MedalId":2077162827, @@ -101,15 +101,47 @@ }, { "MedalId":3698887726, - "Count":1 + "Count":4 }, { "MedalId":3001183151, - "Count":1 + "Count":4 }, { "MedalId":250435527, "Count":1 + }, + { + "MedalId":3522125871, + "Count":2 + }, + { + "MedalId":3270120991, + "Count":2 + }, + { + "MedalId":2287626681, + "Count":5 + }, + { + "MedalId":492192256, + "Count":1 + }, + { + "MedalId":298813630, + "Count":2 + }, + { + "MedalId":317993761, + "Count":1 + }, + { + "MedalId":1423504140, + "Count":1 + }, + { + "MedalId":2494364276, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -126,12 +158,12 @@ ] }, - "TotalShotsFired":518, - "TotalShotsLanded":220, - "TotalHeadshots":108, - "TotalKills":112, - "TotalDamageDealt":5328.5230188369751, - "TotalPossessionTime":"PT27M14.1499S" + "TotalShotsFired":1614, + "TotalShotsLanded":696, + "TotalHeadshots":340, + "TotalKills":352, + "TotalDamageDealt":16740.288637161255, + "TotalPossessionTime":"PT1H32M8.9332S" }, { "WeaponId":{ @@ -140,12 +172,12 @@ ] }, - "TotalShotsFired":707, - "TotalShotsLanded":196, - "TotalHeadshots":75, - "TotalKills":76, - "TotalDamageDealt":3585.0104064941406, - "TotalPossessionTime":"PT21M13.9832S" + "TotalShotsFired":1527, + "TotalShotsLanded":444, + "TotalHeadshots":171, + "TotalKills":172, + "TotalDamageDealt":8060.737678527832, + "TotalPossessionTime":"PT44M29.7496S" }, { "WeaponId":{ @@ -157,18 +189,18 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":3, - "TotalDamageDealt":105.0044994354248, + "TotalKills":13, + "TotalDamageDealt":454.24738463573158, "TotalPossessionTime":"PT0S" } ], "Impulses":[ { "Id":1408036107, - "Count":2 + "Count":3 } ], - "TotalSpartanKills":190 + "TotalSpartanKills":536 }, { "PlaylistId":"5728f612-3f20-4459-98bd-3478c79c4861", @@ -177,21 +209,21 @@ "Tier":2, "DesignationId":4, "Csr":0, - "PercentToNextTier":8, + "PercentToNextTier":16, "Rank":null }, "Csr":{ - "Tier":1, + "Tier":2, "DesignationId":4, "Csr":0, - "PercentToNextTier":92, + "PercentToNextTier":16, "Rank":null }, - "TotalKills":159, - "TotalHeadshots":85, - "TotalWeaponDamage":24577.686990499496, - "TotalShotsFired":3258, - "TotalShotsLanded":1575, + "TotalKills":174, + "TotalHeadshots":89, + "TotalWeaponDamage":26170.826891183853, + "TotalShotsFired":3378, + "TotalShotsLanded":1645, "WeaponWithMostKills":{ "WeaponId":{ "StockId":424645655, @@ -199,12 +231,12 @@ ] }, - "TotalShotsFired":1577, - "TotalShotsLanded":803, - "TotalHeadshots":31, - "TotalKills":42, - "TotalDamageDealt":6597.4915809631348, - "TotalPossessionTime":"PT28M57.8333S" + "TotalShotsFired":1601, + "TotalShotsLanded":819, + "TotalHeadshots":33, + "TotalKills":44, + "TotalDamageDealt":6786.4528846740723, + "TotalPossessionTime":"PT29M29.7166S" }, "TotalMeleeKills":3, "TotalMeleeDamage":687.8268461227417, @@ -213,23 +245,23 @@ "TotalGroundPoundDamage":95.0, "TotalShoulderBashKills":1, "TotalShoulderBashDamage":173.24999237060547, - "TotalGrenadeDamage":2720.2961688041687, - "TotalPowerWeaponKills":46, - "TotalPowerWeaponDamage":6568.9909708499908, - "TotalPowerWeaponGrabs":10, - "TotalPowerWeaponPossessionTime":"PT33M5.7837S", - "TotalDeaths":87, + "TotalGrenadeDamage":2868.381679058075, + "TotalPowerWeaponKills":55, + "TotalPowerWeaponDamage":7362.5840270519257, + "TotalPowerWeaponGrabs":12, + "TotalPowerWeaponPossessionTime":"PT37M5.867S", + "TotalDeaths":95, "TotalAssists":36, - "TotalGamesCompleted":11, - "TotalGamesWon":7, + "TotalGamesCompleted":12, + "TotalGamesWon":8, "TotalGamesLost":4, "TotalGamesTied":0, - "TotalTimePlayed":"PT2H2M22.3358115S", + "TotalTimePlayed":"PT2H11M41.131387S", "TotalGrenadeKills":12, "MedalAwards":[ { "MedalId":1080468863, - "Count":7 + "Count":8 }, { "MedalId":3001183151, @@ -237,15 +269,15 @@ }, { "MedalId":3261908037, - "Count":58 + "Count":60 }, { "MedalId":2078758684, - "Count":14 + "Count":15 }, { "MedalId":466059351, - "Count":6 + "Count":7 }, { "MedalId":848240062, @@ -253,11 +285,11 @@ }, { "MedalId":3653057799, - "Count":8 + "Count":9 }, { "MedalId":2782465081, - "Count":8 + "Count":9 }, { "MedalId":3744028405, @@ -269,7 +301,7 @@ }, { "MedalId":2430242797, - "Count":9 + "Count":10 }, { "MedalId":370413844, @@ -277,7 +309,7 @@ }, { "MedalId":3400287617, - "Count":8 + "Count":9 }, { "MedalId":3522125871, @@ -354,12 +386,12 @@ ] }, - "TotalShotsFired":13, - "TotalShotsLanded":7, + "TotalShotsFired":51, + "TotalShotsLanded":28, "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":54.599998474121094, - "TotalPossessionTime":"PT5M19.2339S" + "TotalKills":2, + "TotalDamageDealt":217.10002899169922, + "TotalPossessionTime":"PT6M1.6505S" }, { "WeaponId":{ @@ -368,12 +400,12 @@ ] }, - "TotalShotsFired":1577, - "TotalShotsLanded":803, - "TotalHeadshots":31, - "TotalKills":42, - "TotalDamageDealt":6597.4915809631348, - "TotalPossessionTime":"PT28M57.8333S" + "TotalShotsFired":1601, + "TotalShotsLanded":819, + "TotalHeadshots":33, + "TotalKills":44, + "TotalDamageDealt":6786.4528846740723, + "TotalPossessionTime":"PT29M29.7166S" }, { "WeaponId":{ @@ -382,12 +414,12 @@ ] }, - "TotalShotsFired":651, - "TotalShotsLanded":329, - "TotalHeadshots":34, - "TotalKills":39, - "TotalDamageDealt":6100.7436008453369, - "TotalPossessionTime":"PT31M5.4666S" + "TotalShotsFired":679, + "TotalShotsLanded":344, + "TotalHeadshots":36, + "TotalKills":41, + "TotalDamageDealt":6400.7436008453369, + "TotalPossessionTime":"PT33M40.3334S" }, { "WeaponId":{ @@ -452,11 +484,11 @@ ] }, - "TotalShotsFired":206, - "TotalShotsLanded":130, + "TotalShotsFired":214, + "TotalShotsLanded":138, "TotalHeadshots":0, "TotalKills":8, - "TotalDamageDealt":2082.6051545143127, + "TotalDamageDealt":2230.690664768219, "TotalPossessionTime":"PT0S" }, { @@ -499,7 +531,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT15.9665S" + "TotalPossessionTime":"PT18.4664S" }, { "WeaponId":{ @@ -536,8 +568,8 @@ ] }, - "TotalShotsFired":28, - "TotalShotsLanded":16, + "TotalShotsFired":30, + "TotalShotsLanded":17, "TotalHeadshots":0, "TotalKills":1, "TotalDamageDealt":232.98824691772461, @@ -550,8 +582,8 @@ ] }, - "TotalShotsFired":312, - "TotalShotsLanded":34, + "TotalShotsFired":324, + "TotalShotsLanded":35, "TotalHeadshots":0, "TotalKills":3, "TotalDamageDealt":404.70276737213135, @@ -564,12 +596,12 @@ ] }, - "TotalShotsFired":7, - "TotalShotsLanded":4, + "TotalShotsFired":12, + "TotalShotsLanded":9, "TotalHeadshots":1, - "TotalKills":3, - "TotalDamageDealt":441.66665649414062, - "TotalPossessionTime":"PT2M46.9833S" + "TotalKills":8, + "TotalDamageDealt":810.25971269607544, + "TotalPossessionTime":"PT4M24.7166S" }, { "WeaponId":{ @@ -581,9 +613,9 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":12, - "TotalDamageDealt":1365.0225067138672, - "TotalPossessionTime":"PT5M24.3S" + "TotalKills":13, + "TotalDamageDealt":1480.0225067138672, + "TotalPossessionTime":"PT6M51.8166S" }, { "WeaponId":{ @@ -592,12 +624,12 @@ ] }, - "TotalShotsFired":1, - "TotalShotsLanded":1, + "TotalShotsFired":4, + "TotalShotsLanded":4, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":115.0, - "TotalPossessionTime":"PT36.9833S" + "TotalKills":4, + "TotalDamageDealt":425.0, + "TotalPossessionTime":"PT1M31.8167S" }, { "WeaponId":{ @@ -639,7 +671,7 @@ "TotalHeadshots":3, "TotalKills":4, "TotalDamageDealt":776.41665649414062, - "TotalPossessionTime":"PT1M55.0667S" + "TotalPossessionTime":"PT1M56.9S" }, { "WeaponId":{ @@ -659,37 +691,37 @@ "Impulses":[ { "Id":3174430457, - "Count":17 + "Count":19 }, { "Id":2556889090, "Count":5 } ], - "TotalSpartanKills":153 + "TotalSpartanKills":168 }, { "PlaylistId":"892189e9-d712-4bdb-afa7-1ccab43fbed4", "MeasurementMatchesLeft":0, "HighestCsr":{ - "Tier":1, + "Tier":3, "DesignationId":5, "Csr":0, "PercentToNextTier":94, "Rank":null }, "Csr":{ - "Tier":1, + "Tier":3, "DesignationId":5, "Csr":0, - "PercentToNextTier":76, + "PercentToNextTier":24, "Rank":null }, - "TotalKills":268, - "TotalHeadshots":138, - "TotalWeaponDamage":35296.359170913696, - "TotalShotsFired":3808, - "TotalShotsLanded":1841, + "TotalKills":509, + "TotalHeadshots":271, + "TotalWeaponDamage":68224.4743566513, + "TotalShotsFired":8638, + "TotalShotsLanded":3894, "WeaponWithMostKills":{ "WeaponId":{ "StockId":4096745987, @@ -697,85 +729,85 @@ ] }, - "TotalShotsFired":1087, - "TotalShotsLanded":572, - "TotalHeadshots":60, - "TotalKills":65, - "TotalDamageDealt":10610.278401374817, - "TotalPossessionTime":"PT45M33.2332S" + "TotalShotsFired":2354, + "TotalShotsLanded":1220, + "TotalHeadshots":125, + "TotalKills":147, + "TotalDamageDealt":22478.233668327332, + "TotalPossessionTime":"PT1H37M17.3833S" }, - "TotalMeleeKills":11, - "TotalMeleeDamage":1311.6359790563583, - "TotalAssassinations":2, - "TotalGroundPoundKills":3, - "TotalGroundPoundDamage":172.90538311004639, - "TotalShoulderBashKills":2, - "TotalShoulderBashDamage":429.62554168701172, - "TotalGrenadeDamage":3846.4408664703369, - "TotalPowerWeaponKills":82, - "TotalPowerWeaponDamage":9643.8088493347168, - "TotalPowerWeaponGrabs":17, - "TotalPowerWeaponPossessionTime":"PT25M59.3669S", - "TotalDeaths":127, - "TotalAssists":82, - "TotalGamesCompleted":16, - "TotalGamesWon":13, - "TotalGamesLost":3, + "TotalMeleeKills":22, + "TotalMeleeDamage":2562.2453292608261, + "TotalAssassinations":3, + "TotalGroundPoundKills":6, + "TotalGroundPoundDamage":700.40538311004639, + "TotalShoulderBashKills":3, + "TotalShoulderBashDamage":639.62554168701172, + "TotalGrenadeDamage":9270.2664699554443, + "TotalPowerWeaponKills":117, + "TotalPowerWeaponDamage":14076.936641693115, + "TotalPowerWeaponGrabs":34, + "TotalPowerWeaponPossessionTime":"PT41M46.5669S", + "TotalDeaths":281, + "TotalAssists":177, + "TotalGamesCompleted":32, + "TotalGamesWon":23, + "TotalGamesLost":9, "TotalGamesTied":0, - "TotalTimePlayed":"PT2H13M58.3018764S", - "TotalGrenadeKills":13, + "TotalTimePlayed":"PT4H33M57.4724064S", + "TotalGrenadeKills":38, "MedalAwards":[ { "MedalId":2838259753, - "Count":12 + "Count":22 }, { "MedalId":250435527, - "Count":5 + "Count":7 }, { "MedalId":3261908037, - "Count":108 + "Count":215 }, { "MedalId":2078758684, - "Count":30 + "Count":48 }, { "MedalId":2430242797, - "Count":18 + "Count":31 }, { "MedalId":3653057799, - "Count":9 + "Count":14 }, { "MedalId":2782465081, - "Count":10 + "Count":17 }, { "MedalId":466059351, - "Count":9 + "Count":13 }, { "MedalId":2287626681, - "Count":6 + "Count":15 }, { "MedalId":3001183151, - "Count":1 + "Count":4 }, { "MedalId":3400287617, - "Count":16 + "Count":28 }, { "MedalId":1080468863, - "Count":10 + "Count":19 }, { "MedalId":2966496172, - "Count":2 + "Count":3 }, { "MedalId":1259067733, @@ -783,11 +815,11 @@ }, { "MedalId":298813630, - "Count":2 + "Count":3 }, { "MedalId":1618319591, - "Count":2 + "Count":3 }, { "MedalId":3522125871, @@ -803,7 +835,7 @@ }, { "MedalId":2564994165, - "Count":2 + "Count":4 }, { "MedalId":876932011, @@ -811,11 +843,11 @@ }, { "MedalId":3491849182, - "Count":1 + "Count":4 }, { "MedalId":2763748638, - "Count":3 + "Count":4 }, { "MedalId":4252521258, @@ -827,15 +859,15 @@ }, { "MedalId":3098362934, - "Count":1 + "Count":2 }, { "MedalId":285057226, - "Count":1 + "Count":3 }, { "MedalId":2279899989, - "Count":1 + "Count":3 }, { "MedalId":3972445431, @@ -843,7 +875,7 @@ }, { "MedalId":824733727, - "Count":5 + "Count":21 }, { "MedalId":3925170236, @@ -855,23 +887,23 @@ }, { "MedalId":492192256, - "Count":3 + "Count":6 }, { "MedalId":2494364276, - "Count":1 + "Count":5 }, { "MedalId":3698887726, - "Count":1 + "Count":4 }, { "MedalId":352859864, - "Count":1 + "Count":4 }, { "MedalId":848240062, - "Count":1 + "Count":6 }, { "MedalId":1326375333, @@ -879,7 +911,23 @@ }, { "MedalId":370413844, - "Count":2 + "Count":3 + }, + { + "MedalId":1792284502, + "Count":1 + }, + { + "MedalId":2766284219, + "Count":1 + }, + { + "MedalId":3744028405, + "Count":1 + }, + { + "MedalId":2251767925, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -896,12 +944,12 @@ ] }, - "TotalShotsFired":1087, - "TotalShotsLanded":572, - "TotalHeadshots":60, - "TotalKills":65, - "TotalDamageDealt":10610.278401374817, - "TotalPossessionTime":"PT45M33.2332S" + "TotalShotsFired":2354, + "TotalShotsLanded":1220, + "TotalHeadshots":125, + "TotalKills":147, + "TotalDamageDealt":22478.233668327332, + "TotalPossessionTime":"PT1H37M17.3833S" }, { "WeaponId":{ @@ -915,7 +963,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT11.7833S" + "TotalPossessionTime":"PT28.8334S" }, { "WeaponId":{ @@ -927,8 +975,8 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":18, - "TotalDamageDealt":1914.1669038534164, + "TotalKills":34, + "TotalDamageDealt":3902.2762540578842, "TotalPossessionTime":"PT0S" }, { @@ -938,12 +986,12 @@ ] }, - "TotalShotsFired":79, - "TotalShotsLanded":30, + "TotalShotsFired":215, + "TotalShotsLanded":70, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":244.99999713897705, - "TotalPossessionTime":"PT5M38.2336S" + "TotalKills":3, + "TotalDamageDealt":557.07280445098877, + "TotalPossessionTime":"PT11M10.3503S" }, { "WeaponId":{ @@ -952,12 +1000,12 @@ ] }, - "TotalShotsFired":150, - "TotalShotsLanded":83, - "TotalHeadshots":10, - "TotalKills":12, - "TotalDamageDealt":2251.6995668411255, - "TotalPossessionTime":"PT9M25.1834S" + "TotalShotsFired":257, + "TotalShotsLanded":138, + "TotalHeadshots":13, + "TotalKills":17, + "TotalDamageDealt":3704.4372453689575, + "TotalPossessionTime":"PT14M36.3835S" }, { "WeaponId":{ @@ -966,12 +1014,12 @@ ] }, - "TotalShotsFired":1287, - "TotalShotsLanded":640, - "TotalHeadshots":48, - "TotalKills":55, - "TotalDamageDealt":5927.8343105316162, - "TotalPossessionTime":"PT16M54.2334S" + "TotalShotsFired":2703, + "TotalShotsLanded":1258, + "TotalHeadshots":87, + "TotalKills":100, + "TotalDamageDealt":11426.620082855225, + "TotalPossessionTime":"PT39M40.8999S" }, { "WeaponId":{ @@ -980,12 +1028,12 @@ ] }, - "TotalShotsFired":20, - "TotalShotsLanded":18, + "TotalShotsFired":25, + "TotalShotsLanded":22, "TotalHeadshots":0, - "TotalKills":13, - "TotalDamageDealt":1483.3597183227539, - "TotalPossessionTime":"PT2M56.0167S" + "TotalKills":16, + "TotalDamageDealt":1828.3597183227539, + "TotalPossessionTime":"PT3M44.7167S" }, { "WeaponId":{ @@ -994,12 +1042,12 @@ ] }, - "TotalShotsFired":56, - "TotalShotsLanded":43, - "TotalHeadshots":3, - "TotalKills":28, - "TotalDamageDealt":3452.0723438262939, - "TotalPossessionTime":"PT11M40.0501S" + "TotalShotsFired":67, + "TotalShotsLanded":54, + "TotalHeadshots":4, + "TotalKills":36, + "TotalDamageDealt":4410.3390140533447, + "TotalPossessionTime":"PT14M2.1334S" }, { "WeaponId":{ @@ -1008,11 +1056,11 @@ ] }, - "TotalShotsFired":212, - "TotalShotsLanded":150, + "TotalShotsFired":525, + "TotalShotsLanded":361, "TotalHeadshots":0, - "TotalKills":6, - "TotalDamageDealt":2831.7799224853516, + "TotalKills":23, + "TotalDamageDealt":6969.5428791046143, "TotalPossessionTime":"PT0S" }, { @@ -1022,12 +1070,12 @@ ] }, - "TotalShotsFired":117, - "TotalShotsLanded":66, - "TotalHeadshots":8, - "TotalKills":9, - "TotalDamageDealt":1399.5403900146484, - "TotalPossessionTime":"PT4M37.6333S" + "TotalShotsFired":228, + "TotalShotsLanded":125, + "TotalHeadshots":16, + "TotalKills":20, + "TotalDamageDealt":2681.818489074707, + "TotalPossessionTime":"PT8M41.1666S" }, { "WeaponId":{ @@ -1036,12 +1084,12 @@ ] }, - "TotalShotsFired":58, - "TotalShotsLanded":8, + "TotalShotsFired":285, + "TotalShotsLanded":81, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":57.332027435302734, - "TotalPossessionTime":"PT20.1167S" + "TotalKills":4, + "TotalDamageDealt":602.59704208374023, + "TotalPossessionTime":"PT2M42.2333S" }, { "WeaponId":{ @@ -1050,12 +1098,12 @@ ] }, - "TotalShotsFired":60, - "TotalShotsLanded":42, + "TotalShotsFired":176, + "TotalShotsLanded":91, "TotalHeadshots":0, - "TotalKills":7, - "TotalDamageDealt":1026.3073749542236, - "TotalPossessionTime":"PT1M52.7834S" + "TotalKills":9, + "TotalDamageDealt":1345.9536800384521, + "TotalPossessionTime":"PT3M39.9334S" }, { "WeaponId":{ @@ -1064,11 +1112,11 @@ ] }, - "TotalShotsFired":431, - "TotalShotsLanded":58, + "TotalShotsFired":1087, + "TotalShotsLanded":110, "TotalHeadshots":0, - "TotalKills":5, - "TotalDamageDealt":841.90210914611816, + "TotalKills":10, + "TotalDamageDealt":1777.9323921203613, "TotalPossessionTime":"PT0S" }, { @@ -1081,9 +1129,9 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":23, - "TotalDamageDealt":2514.8743438720703, - "TotalPossessionTime":"PT5M37.5333S" + "TotalKills":24, + "TotalDamageDealt":2629.8743438720703, + "TotalPossessionTime":"PT6M31.5499S" }, { "WeaponId":{ @@ -1106,11 +1154,11 @@ ] }, - "TotalShotsFired":11, - "TotalShotsLanded":9, + "TotalShotsFired":46, + "TotalShotsLanded":27, "TotalHeadshots":0, - "TotalKills":2, - "TotalDamageDealt":172.75883483886719, + "TotalKills":5, + "TotalDamageDealt":522.79119873046875, "TotalPossessionTime":"PT0S" }, { @@ -1123,7 +1171,7 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":2, + "TotalKills":3, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" }, @@ -1134,12 +1182,12 @@ ] }, - "TotalShotsFired":142, - "TotalShotsLanded":74, - "TotalHeadshots":8, - "TotalKills":8, - "TotalDamageDealt":1040.5018491744995, - "TotalPossessionTime":"PT2M13.3667S" + "TotalShotsFired":421, + "TotalShotsLanded":220, + "TotalHeadshots":20, + "TotalKills":24, + "TotalDamageDealt":3053.2356662750244, + "TotalPossessionTime":"PT8M8.1002S" }, { "WeaponId":{ @@ -1148,12 +1196,12 @@ ] }, - "TotalShotsFired":11, - "TotalShotsLanded":10, + "TotalShotsFired":28, + "TotalShotsLanded":25, "TotalHeadshots":0, - "TotalKills":5, - "TotalDamageDealt":452.5, - "TotalPossessionTime":"PT2M2.3167S" + "TotalKills":14, + "TotalDamageDealt":1420.7706451416016, + "TotalPossessionTime":"PT6M23.0167S" }, { "WeaponId":{ @@ -1162,12 +1210,12 @@ ] }, - "TotalShotsFired":60, - "TotalShotsLanded":22, + "TotalShotsFired":92, + "TotalShotsLanded":31, "TotalHeadshots":0, "TotalKills":2, - "TotalDamageDealt":207.92291259765625, - "TotalPossessionTime":"PT30.8167S" + "TotalDamageDealt":307.25624656677246, + "TotalPossessionTime":"PT55.15S" }, { "WeaponId":{ @@ -1176,12 +1224,12 @@ ] }, - "TotalShotsFired":2, - "TotalShotsLanded":2, + "TotalShotsFired":8, + "TotalShotsLanded":8, "TotalHeadshots":0, "TotalKills":2, - "TotalDamageDealt":155.79400634765625, - "TotalPossessionTime":"PT20.4667S" + "TotalDamageDealt":315.29903411865234, + "TotalPossessionTime":"PT52.95S" }, { "WeaponId":{ @@ -1190,134 +1238,180 @@ ] }, - "TotalShotsFired":13, + "TotalShotsFired":45, + "TotalShotsLanded":20, + "TotalHeadshots":6, + "TotalKills":12, + "TotalDamageDealt":1599.7753143310547, + "TotalPossessionTime":"PT4M37.6668S" + }, + { + "WeaponId":{ + "StockId":2681172411, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT5.4833S" + }, + { + "WeaponId":{ + "StockId":3808094875, + "Attachments":[ + + ] + }, + "TotalShotsFired":48, + "TotalShotsLanded":19, + "TotalHeadshots":0, + "TotalKills":3, + "TotalDamageDealt":260.37533378601074, + "TotalPossessionTime":"PT1M9.8S" + }, + { + "WeaponId":{ + "StockId":1579758889, + "Attachments":[ + + ] + }, + "TotalShotsFired":16, "TotalShotsLanded":8, - "TotalHeadshots":1, - "TotalKills":4, - "TotalDamageDealt":558.90106201171875, - "TotalPossessionTime":"PT1M30.2S" + "TotalHeadshots":0, + "TotalKills":1, + "TotalDamageDealt":266.1895580291748, + "TotalPossessionTime":"PT44.8S" } ], "Impulses":[ { "Id":2556889090, - "Count":13 + "Count":26 }, { "Id":3174430457, - "Count":23 + "Count":41 + }, + { + "Id":1408036107, + "Count":1 } ], - "TotalSpartanKills":266 + "TotalSpartanKills":503 }, { "PlaylistId":"c98949ae-60a8-43dc-85d7-0feb0b92e719", "MeasurementMatchesLeft":0, "HighestCsr":{ - "Tier":2, - "DesignationId":4, + "Tier":1, + "DesignationId":5, "Csr":0, - "PercentToNextTier":6, + "PercentToNextTier":74, "Rank":null }, "Csr":{ - "Tier":2, - "DesignationId":4, + "Tier":1, + "DesignationId":5, "Csr":0, - "PercentToNextTier":6, + "PercentToNextTier":22, "Rank":null }, - "TotalKills":119, - "TotalHeadshots":65, - "TotalWeaponDamage":15879.8730905056, - "TotalShotsFired":2249, - "TotalShotsLanded":1076, + "TotalKills":433, + "TotalHeadshots":253, + "TotalWeaponDamage":60331.363702744246, + "TotalShotsFired":7928, + "TotalShotsLanded":3777, "WeaponWithMostKills":{ "WeaponId":{ - "StockId":424645655, + "StockId":4096745987, "Attachments":[ ] }, - "TotalShotsFired":900, - "TotalShotsLanded":427, - "TotalHeadshots":30, - "TotalKills":35, - "TotalDamageDealt":3878.4461555480957, - "TotalPossessionTime":"PT12M4.1834S" + "TotalShotsFired":2667, + "TotalShotsLanded":1449, + "TotalHeadshots":158, + "TotalKills":185, + "TotalDamageDealt":27187.992275476456, + "TotalPossessionTime":"PT1H39M54.6507S" }, - "TotalMeleeKills":5, - "TotalMeleeDamage":819.35730171203613, - "TotalAssassinations":1, - "TotalGroundPoundKills":1, - "TotalGroundPoundDamage":115.0, - "TotalShoulderBashKills":0, - "TotalShoulderBashDamage":95.0, - "TotalGrenadeDamage":2089.9283599853516, - "TotalPowerWeaponKills":22, - "TotalPowerWeaponDamage":2788.6777019500732, - "TotalPowerWeaponGrabs":11, - "TotalPowerWeaponPossessionTime":"PT9M10.1334S", - "TotalDeaths":59, - "TotalAssists":39, - "TotalGamesCompleted":10, - "TotalGamesWon":6, - "TotalGamesLost":4, + "TotalMeleeKills":20, + "TotalMeleeDamage":3245.313796043396, + "TotalAssassinations":6, + "TotalGroundPoundKills":10, + "TotalGroundPoundDamage":1250.863151550293, + "TotalShoulderBashKills":1, + "TotalShoulderBashDamage":351.705322265625, + "TotalGrenadeDamage":9203.6585356891155, + "TotalPowerWeaponKills":59, + "TotalPowerWeaponDamage":8480.93762588501, + "TotalPowerWeaponGrabs":23, + "TotalPowerWeaponPossessionTime":"PT23M57.4001S", + "TotalDeaths":296, + "TotalAssists":145, + "TotalGamesCompleted":35, + "TotalGamesWon":25, + "TotalGamesLost":10, "TotalGamesTied":0, - "TotalTimePlayed":"PT1H3M30.563037S", - "TotalGrenadeKills":11, + "TotalTimePlayed":"PT4H6M23.3984954S", + "TotalGrenadeKills":35, "MedalAwards":[ { "MedalId":1080468863, - "Count":5 + "Count":9 }, { "MedalId":3653057799, - "Count":4 + "Count":23 }, { "MedalId":3400287617, - "Count":4 + "Count":25 }, { "MedalId":3261908037, - "Count":51 + "Count":208 }, { "MedalId":2430242797, - "Count":8 + "Count":21 }, { "MedalId":466059351, - "Count":2 + "Count":4 }, { "MedalId":285057226, - "Count":3 + "Count":7 }, { "MedalId":2564994165, - "Count":1 + "Count":2 }, { "MedalId":848240062, - "Count":3 + "Count":7 }, { "MedalId":3565443938, - "Count":9 + "Count":50 }, { "MedalId":2105198095, - "Count":10 + "Count":36 }, { "MedalId":2916014239, - "Count":4 + "Count":28 }, { "MedalId":3354395650, - "Count":1 + "Count":2 }, { "MedalId":3744028405, @@ -1325,23 +1419,23 @@ }, { "MedalId":824733727, - "Count":4 + "Count":15 }, { "MedalId":2838259753, - "Count":7 + "Count":18 }, { "MedalId":2078758684, - "Count":10 + "Count":34 }, { "MedalId":2763748638, - "Count":1 + "Count":4 }, { "MedalId":1351381581, - "Count":4 + "Count":27 }, { "MedalId":3522125871, @@ -1349,27 +1443,27 @@ }, { "MedalId":492192256, - "Count":1 + "Count":10 }, { "MedalId":2287626681, - "Count":5 + "Count":16 }, { "MedalId":3894006667, - "Count":4 + "Count":6 }, { "MedalId":2299864088, - "Count":3 + "Count":12 }, { "MedalId":3886151616, - "Count":1 + "Count":11 }, { "MedalId":2137994204, - "Count":1 + "Count":3 }, { "MedalId":194124164, @@ -1381,7 +1475,7 @@ }, { "MedalId":2782465081, - "Count":2 + "Count":11 }, { "MedalId":2896365521, @@ -1389,27 +1483,27 @@ }, { "MedalId":2380717523, - "Count":3 + "Count":4 }, { "MedalId":2028249938, - "Count":4 + "Count":12 }, { "MedalId":164204247, - "Count":1 + "Count":7 }, { "MedalId":3270120991, - "Count":1 + "Count":6 }, { "MedalId":3001183151, - "Count":3 + "Count":7 }, { "MedalId":3698887726, - "Count":2 + "Count":4 }, { "MedalId":1691836029, @@ -1417,10 +1511,62 @@ }, { "MedalId":1618319591, - "Count":1 + "Count":2 }, { "MedalId":1494478183, + "Count":3 + }, + { + "MedalId":298813630, + "Count":1 + }, + { + "MedalId":1637841390, + "Count":5 + }, + { + "MedalId":2155964350, + "Count":1 + }, + { + "MedalId":3925170236, + "Count":1 + }, + { + "MedalId":2494364276, + "Count":1 + }, + { + "MedalId":3710519250, + "Count":1 + }, + { + "MedalId":3491849182, + "Count":1 + }, + { + "MedalId":2251767925, + "Count":1 + }, + { + "MedalId":1986137636, + "Count":1 + }, + { + "MedalId":2279899989, + "Count":1 + }, + { + "MedalId":3148489433, + "Count":2 + }, + { + "MedalId":250435527, + "Count":4 + }, + { + "MedalId":1792284502, "Count":1 } ], @@ -1438,12 +1584,12 @@ ] }, - "TotalShotsFired":144, - "TotalShotsLanded":76, + "TotalShotsFired":247, + "TotalShotsLanded":136, "TotalHeadshots":0, - "TotalKills":2, - "TotalDamageDealt":568.48572254180908, - "TotalPossessionTime":"PT3M47.567S" + "TotalKills":3, + "TotalDamageDealt":972.42859077453613, + "TotalPossessionTime":"PT11M19.4499S" }, { "WeaponId":{ @@ -1452,12 +1598,12 @@ ] }, - "TotalShotsFired":589, - "TotalShotsLanded":316, - "TotalHeadshots":27, - "TotalKills":33, - "TotalDamageDealt":5664.0150325298309, - "TotalPossessionTime":"PT21M18.5668S" + "TotalShotsFired":2667, + "TotalShotsLanded":1449, + "TotalHeadshots":158, + "TotalKills":185, + "TotalDamageDealt":27187.992275476456, + "TotalPossessionTime":"PT1H39M54.6507S" }, { "WeaponId":{ @@ -1466,12 +1612,12 @@ ] }, - "TotalShotsFired":19, - "TotalShotsLanded":8, - "TotalHeadshots":3, - "TotalKills":3, - "TotalDamageDealt":629.5821361541748, - "TotalPossessionTime":"PT2M49.8667S" + "TotalShotsFired":38, + "TotalShotsLanded":17, + "TotalHeadshots":8, + "TotalKills":8, + "TotalDamageDealt":1442.9647350311279, + "TotalPossessionTime":"PT5M10.3834S" }, { "WeaponId":{ @@ -1483,8 +1629,8 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":7, - "TotalDamageDealt":1029.3573017120361, + "TotalKills":37, + "TotalDamageDealt":4847.882269859314, "TotalPossessionTime":"PT0S" }, { @@ -1494,12 +1640,12 @@ ] }, - "TotalShotsFired":900, - "TotalShotsLanded":427, - "TotalHeadshots":30, - "TotalKills":35, - "TotalDamageDealt":3878.4461555480957, - "TotalPossessionTime":"PT12M4.1834S" + "TotalShotsFired":2092, + "TotalShotsLanded":968, + "TotalHeadshots":59, + "TotalKills":71, + "TotalDamageDealt":8460.2488412857056, + "TotalPossessionTime":"PT29M52.6999S" }, { "WeaponId":{ @@ -1508,12 +1654,12 @@ ] }, - "TotalShotsFired":80, - "TotalShotsLanded":25, + "TotalShotsFired":336, + "TotalShotsLanded":141, "TotalHeadshots":0, - "TotalKills":3, - "TotalDamageDealt":345.00006103515625, - "TotalPossessionTime":"PT1M6.55S" + "TotalKills":15, + "TotalDamageDealt":1909.2255096435547, + "TotalPossessionTime":"PT3M34.7167S" }, { "WeaponId":{ @@ -1527,7 +1673,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT5.1167S" + "TotalPossessionTime":"PT16.9835S" }, { "WeaponId":{ @@ -1536,11 +1682,11 @@ ] }, - "TotalShotsFired":216, - "TotalShotsLanded":48, + "TotalShotsFired":960, + "TotalShotsLanded":157, "TotalHeadshots":0, - "TotalKills":4, - "TotalDamageDealt":658.79324722290039, + "TotalKills":9, + "TotalDamageDealt":2224.4884586334229, "TotalPossessionTime":"PT0S" }, { @@ -1550,12 +1696,12 @@ ] }, - "TotalShotsFired":60, - "TotalShotsLanded":21, - "TotalHeadshots":2, - "TotalKills":2, - "TotalDamageDealt":294.17547607421875, - "TotalPossessionTime":"PT54.65S" + "TotalShotsFired":225, + "TotalShotsLanded":109, + "TotalHeadshots":6, + "TotalKills":8, + "TotalDamageDealt":1386.2250061035156, + "TotalPossessionTime":"PT4M29.9167S" }, { "WeaponId":{ @@ -1567,178 +1713,644 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":2, + "TotalKills":3, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" }, { "WeaponId":{ - "StockId":4054937266, + "StockId":4054937266, + "Attachments":[ + + ] + }, + "TotalShotsFired":51, + "TotalShotsLanded":31, + "TotalHeadshots":0, + "TotalKills":3, + "TotalDamageDealt":394.67341613769531, + "TotalPossessionTime":"PT1M22.8S" + }, + { + "WeaponId":{ + "StockId":4106030681, + "Attachments":[ + + ] + }, + "TotalShotsFired":517, + "TotalShotsLanded":366, + "TotalHeadshots":0, + "TotalKills":25, + "TotalDamageDealt":6746.2662808597088, + "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":2460880172, + "Attachments":[ + + ] + }, + "TotalShotsFired":34, + "TotalShotsLanded":18, + "TotalHeadshots":0, + "TotalKills":1, + "TotalDamageDealt":232.90379619598389, + "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":3682788176, + "Attachments":[ + + ] + }, + "TotalShotsFired":31, + "TotalShotsLanded":25, + "TotalHeadshots":1, + "TotalKills":12, + "TotalDamageDealt":1950.0572357177734, + "TotalPossessionTime":"PT5M57.6668S" + }, + { + "WeaponId":{ + "StockId":2244200496, + "Attachments":[ + + ] + }, + "TotalShotsFired":115, + "TotalShotsLanded":63, + "TotalHeadshots":8, + "TotalKills":9, + "TotalDamageDealt":1155.1234645843506, + "TotalPossessionTime":"PT9M5.7167S" + }, + { + "WeaponId":{ + "StockId":723523180, + "Attachments":[ + + ] + }, + "TotalShotsFired":26, + "TotalShotsLanded":22, + "TotalHeadshots":0, + "TotalKills":19, + "TotalDamageDealt":2186.170654296875, + "TotalPossessionTime":"PT4M32.3833S" + }, + { + "WeaponId":{ + "StockId":523953283, + "Attachments":[ + + ] + }, + "TotalShotsFired":151, + "TotalShotsLanded":78, + "TotalHeadshots":8, + "TotalKills":10, + "TotalDamageDealt":1615.9450798034668, + "TotalPossessionTime":"PT4M46.1S" + }, + { + "WeaponId":{ + "StockId":642449794, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":2511447508, + "Attachments":[ + + ] + }, + "TotalShotsFired":46, + "TotalShotsLanded":23, + "TotalHeadshots":5, + "TotalKills":5, + "TotalDamageDealt":730.0, + "TotalPossessionTime":"PT1M31.35S" + }, + { + "WeaponId":{ + "StockId":723388907, + "Attachments":[ + + ] + }, + "TotalShotsFired":244, + "TotalShotsLanded":97, + "TotalHeadshots":0, + "TotalKills":5, + "TotalDamageDealt":762.98005676269531, + "TotalPossessionTime":"PT2M7.1835S" + }, + { + "WeaponId":{ + "StockId":2133511419, + "Attachments":[ + + ] + }, + "TotalShotsFired":53, + "TotalShotsLanded":31, + "TotalHeadshots":0, + "TotalKills":2, + "TotalDamageDealt":295.82423400878906, + "TotalPossessionTime":"PT21.4833S" + }, + { + "WeaponId":{ + "StockId":1579758889, + "Attachments":[ + + ] + }, + "TotalShotsFired":63, + "TotalShotsLanded":31, + "TotalHeadshots":0, + "TotalKills":2, + "TotalDamageDealt":597.8460750579834, + "TotalPossessionTime":"PT2M58.7832S" + }, + { + "WeaponId":{ + "StockId":2670072722, + "Attachments":[ + + ] + }, + "TotalShotsFired":2, + "TotalShotsLanded":2, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT4.7167S" + }, + { + "WeaponId":{ + "StockId":3484334713, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT15.95S" + }, + { + "WeaponId":{ + "StockId":2681172411, + "Attachments":[ + + ] + }, + "TotalShotsFired":30, + "TotalShotsLanded":13, + "TotalHeadshots":0, + "TotalKills":1, + "TotalDamageDealt":79.999992370605469, + "TotalPossessionTime":"PT10.2833S" + } + ], + "Impulses":[ + { + "Id":3174430457, + "Count":34 + }, + { + "Id":1408036107, + "Count":1 + }, + { + "Id":2556889090, + "Count":18 + }, + { + "Id":4191318012, + "Count":42 + }, + { + "Id":1039658009, + "Count":34 + }, + { + "Id":2944278681, + "Count":17 + }, + { + "Id":3514632335, + "Count":12 + }, + { + "Id":1063951891, + "Count":4 + }, + { + "Id":2299858338, + "Count":12 + }, + { + "Id":3435524855, + "Count":22 + }, + { + "Id":415845940, + "Count":8 + }, + { + "Id":3060032974, + "Count":20 + }, + { + "Id":540014008, + "Count":18 + }, + { + "Id":3930101026, + "Count":4 + }, + { + "Id":2512065773, + "Count":1 + }, + { + "Id":938151029, + "Count":2 + } + ], + "TotalSpartanKills":425 + }, + { + "PlaylistId":"f72e0ef0-7c4a-4307-af78-8e38dac3fdba", + "MeasurementMatchesLeft":0, + "HighestCsr":{ + "Tier":6, + "DesignationId":4, + "Csr":0, + "PercentToNextTier":72, + "Rank":null + }, + "Csr":{ + "Tier":6, + "DesignationId":4, + "Csr":0, + "PercentToNextTier":72, + "Rank":null + }, + "TotalKills":88, + "TotalHeadshots":65, + "TotalWeaponDamage":10223.308234095573, + "TotalShotsFired":2013, + "TotalShotsLanded":723, + "WeaponWithMostKills":{ + "WeaponId":{ + "StockId":424645655, + "Attachments":[ + + ] + }, + "TotalShotsFired":1166, + "TotalShotsLanded":404, + "TotalHeadshots":36, + "TotalKills":41, + "TotalDamageDealt":3912.9020371437073, + "TotalPossessionTime":"PT17M55.8002S" + }, + "TotalMeleeKills":1, + "TotalMeleeDamage":195.40449523925781, + "TotalAssassinations":1, + "TotalGroundPoundKills":0, + "TotalGroundPoundDamage":0.0, + "TotalShoulderBashKills":0, + "TotalShoulderBashDamage":0.0, + "TotalGrenadeDamage":1330.9987376928329, + "TotalPowerWeaponKills":2, + "TotalPowerWeaponDamage":200.06528472900391, + "TotalPowerWeaponGrabs":0, + "TotalPowerWeaponPossessionTime":"PT56.5668S", + "TotalDeaths":53, + "TotalAssists":25, + "TotalGamesCompleted":13, + "TotalGamesWon":11, + "TotalGamesLost":2, + "TotalGamesTied":0, + "TotalTimePlayed":"PT1H42M19.7525988S", + "TotalGrenadeKills":9, + "MedalAwards":[ + { + "MedalId":3261908037, + "Count":65 + }, + { + "MedalId":2299864088, + "Count":13 + }, + { + "MedalId":2078758684, + "Count":7 + }, + { + "MedalId":979431049, + "Count":1 + }, + { + "MedalId":3653057799, + "Count":2 + }, + { + "MedalId":824733727, + "Count":6 + }, + { + "MedalId":3400287617, + "Count":2 + }, + { + "MedalId":1573153198, + "Count":4 + }, + { + "MedalId":2838259753, + "Count":3 + }, + { + "MedalId":3001183151, + "Count":3 + }, + { + "MedalId":1423504140, + "Count":2 + }, + { + "MedalId":352859864, + "Count":3 + }, + { + "MedalId":2430242797, + "Count":3 + }, + { + "MedalId":1957561936, + "Count":1 + }, + { + "MedalId":3491849182, + "Count":4 + }, + { + "MedalId":2782465081, + "Count":1 + }, + { + "MedalId":3894006667, + "Count":1 + }, + { + "MedalId":2287626681, + "Count":1 + }, + { + "MedalId":2359847435, + "Count":1 + }, + { + "MedalId":151853593, + "Count":1 + } + ], + "DestroyedEnemyVehicles":[ + + ], + "EnemyKills":[ + + ], + "WeaponStats":[ + { + "WeaponId":{ + "StockId":723388907, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT15M50.9667S" + }, + { + "WeaponId":{ + "StockId":4096745987, + "Attachments":[ + + ] + }, + "TotalShotsFired":461, + "TotalShotsLanded":163, + "TotalHeadshots":16, + "TotalKills":20, + "TotalDamageDealt":3067.4772424697876, + "TotalPossessionTime":"PT24M18.4329S" + }, + { + "WeaponId":{ + "StockId":4106030681, + "Attachments":[ + + ] + }, + "TotalShotsFired":109, + "TotalShotsLanded":60, + "TotalHeadshots":0, + "TotalKills":9, + "TotalDamageDealt":1254.3257259130478, + "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":2244200496, "Attachments":[ ] }, - "TotalShotsFired":43, - "TotalShotsLanded":26, - "TotalHeadshots":0, - "TotalKills":2, - "TotalDamageDealt":314.67341613769531, - "TotalPossessionTime":"PT57.65S" + "TotalShotsFired":155, + "TotalShotsLanded":72, + "TotalHeadshots":12, + "TotalKills":13, + "TotalDamageDealt":1474.6149396896362, + "TotalPossessionTime":"PT5M19.5499S" }, { "WeaponId":{ - "StockId":4106030681, + "StockId":424645655, "Attachments":[ ] }, - "TotalShotsFired":117, - "TotalShotsLanded":83, - "TotalHeadshots":0, - "TotalKills":7, - "TotalDamageDealt":1414.5637035369873, - "TotalPossessionTime":"PT0S" + "TotalShotsFired":1166, + "TotalShotsLanded":404, + "TotalHeadshots":36, + "TotalKills":41, + "TotalDamageDealt":3912.9020371437073, + "TotalPossessionTime":"PT17M55.8002S" }, { "WeaponId":{ - "StockId":2460880172, + "StockId":523953283, "Attachments":[ ] }, - "TotalShotsFired":8, - "TotalShotsLanded":4, - "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":16.571409225463867, - "TotalPossessionTime":"PT0S" + "TotalShotsFired":36, + "TotalShotsLanded":12, + "TotalHeadshots":1, + "TotalKills":1, + "TotalDamageDealt":237.24999237060547, + "TotalPossessionTime":"PT1M22.3166S" }, { "WeaponId":{ - "StockId":3682788176, + "StockId":3190813201, "Attachments":[ ] }, - "TotalShotsFired":7, - "TotalShotsLanded":3, + "TotalShotsFired":72, + "TotalShotsLanded":4, "TotalHeadshots":0, - "TotalKills":2, - "TotalDamageDealt":150.10000610351562, - "TotalPossessionTime":"PT1M16.3334S" + "TotalKills":0, + "TotalDamageDealt":63.350601196289063, + "TotalPossessionTime":"PT0S" }, { "WeaponId":{ - "StockId":2244200496, + "StockId":3168248199, "Attachments":[ ] }, - "TotalShotsFired":10, - "TotalShotsLanded":6, - "TotalHeadshots":1, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, "TotalKills":2, - "TotalDamageDealt":129.45912170410156, - "TotalPossessionTime":"PT1M40.2333S" + "TotalDamageDealt":195.40449523925781, + "TotalPossessionTime":"PT0S" }, { "WeaponId":{ - "StockId":723523180, + "StockId":3484334713, "Attachments":[ ] }, - "TotalShotsFired":15, - "TotalShotsLanded":12, + "TotalShotsFired":2, + "TotalShotsLanded":2, "TotalHeadshots":0, - "TotalKills":12, - "TotalDamageDealt":1349.3220825195312, - "TotalPossessionTime":"PT2M59.7333S" + "TotalKills":1, + "TotalDamageDealt":56.449996948242187, + "TotalPossessionTime":"PT7.9334S" }, { "WeaponId":{ - "StockId":523953283, + "StockId":1579758889, "Attachments":[ ] }, - "TotalShotsFired":41, - "TotalShotsLanded":21, - "TotalHeadshots":2, - "TotalKills":3, - "TotalDamageDealt":466.68552017211914, - "TotalPossessionTime":"PT2M1.9168S" + "TotalShotsFired":11, + "TotalShotsLanded":5, + "TotalHeadshots":0, + "TotalKills":1, + "TotalDamageDealt":143.61528778076172, + "TotalPossessionTime":"PT48.6334S" }, { "WeaponId":{ - "StockId":642449794, + "StockId":2460880172, "Attachments":[ ] }, - "TotalShotsFired":0, - "TotalShotsLanded":0, + "TotalShotsFired":1, + "TotalShotsLanded":1, "TotalHeadshots":0, "TotalKills":0, - "TotalDamageDealt":0.0, + "TotalDamageDealt":13.322410583496094, "TotalPossessionTime":"PT0S" } ], "Impulses":[ { - "Id":3174430457, - "Count":10 + "Id":4191318012, + "Count":28 }, { - "Id":1408036107, - "Count":1 + "Id":1039658009, + "Count":24 }, { - "Id":2556889090, - "Count":7 + "Id":3514632335, + "Count":13 }, { - "Id":4191318012, - "Count":8 + "Id":2512065773, + "Count":6 }, { - "Id":1039658009, - "Count":7 + "Id":3930101026, + "Count":17 }, { - "Id":2944278681, - "Count":5 + "Id":540014008, + "Count":42 }, { - "Id":3514632335, - "Count":3 + "Id":3060032974, + "Count":56 }, { - "Id":1063951891, - "Count":3 + "Id":3174430457, + "Count":2 }, { - "Id":2299858338, - "Count":4 + "Id":2556889090, + "Count":7 }, { - "Id":3435524855, - "Count":3 + "Id":415845940, + "Count":20 }, { - "Id":415845940, - "Count":2 + "Id":3435524855, + "Count":13 }, { - "Id":3060032974, + "Id":938151029, "Count":2 }, { - "Id":540014008, - "Count":2 + "Id":2944278681, + "Count":1 } ], - "TotalSpartanKills":116 + "TotalSpartanKills":88 } ], "HighestCsrAttained":{ @@ -1754,33 +2366,33 @@ "MedalStatCounts":[ { "Id":"2b151d0f-cde6-4471-9f1d-d0f8e8644471", - "Count":67 + "Count":108 }, { "Id":"f0d50d01-6197-4d0d-a3a5-a86110997e40", - "Count":28 + "Count":52 }, { "Id":"dcd5ff64-4b49-4020-96d0-88ba3fb28a56", - "Count":48 + "Count":71 }, { "Id":"74365be9-d515-4229-9561-bfaac5bab089", - "Count":36 + "Count":62 } ], "ImpulseStatCounts":[ { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":182 + "Count":290 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":59 + "Count":98 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":116 + "Count":181 }, { "Id":"780104cb-5b86-4ed9-8fb1-40b919de0766", @@ -1793,16 +2405,16 @@ "ImpulseTimelapses":[ { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT1H35M49.9897001S" + "Timelapse":"PT2H29M51.4388525S" } ] }, "GameBaseVariantId":"1571fdac-e0b4-4ebc-a73a-6e13001b71d3", - "TotalKills":184, - "TotalHeadshots":113, - "TotalWeaponDamage":25220.187076330185, - "TotalShotsFired":3250, - "TotalShotsLanded":1661, + "TotalKills":294, + "TotalHeadshots":161, + "TotalWeaponDamage":39076.577860593796, + "TotalShotsFired":4978, + "TotalShotsLanded":2465, "WeaponWithMostKills":{ "WeaponId":{ "StockId":4096745987, @@ -1810,73 +2422,73 @@ ] }, - "TotalShotsFired":1064, - "TotalShotsLanded":553, - "TotalHeadshots":58, - "TotalKills":71, - "TotalDamageDealt":9859.8823182582855, - "TotalPossessionTime":"PT40M21.7498S" + "TotalShotsFired":1755, + "TotalShotsLanded":903, + "TotalHeadshots":94, + "TotalKills":116, + "TotalDamageDealt":16213.096713781357, + "TotalPossessionTime":"PT1H6M27.85S" }, - "TotalMeleeKills":7, - "TotalMeleeDamage":1308.1966705322266, - "TotalAssassinations":0, - "TotalGroundPoundKills":1, - "TotalGroundPoundDamage":97.5, - "TotalShoulderBashKills":0, - "TotalShoulderBashDamage":0.0, - "TotalGrenadeDamage":4269.73659324646, - "TotalPowerWeaponKills":25, - "TotalPowerWeaponDamage":2809.83394241333, - "TotalPowerWeaponGrabs":8, - "TotalPowerWeaponPossessionTime":"PT8M20.8332S", - "TotalDeaths":116, - "TotalAssists":59, - "TotalGamesCompleted":14, - "TotalGamesWon":6, + "TotalMeleeKills":17, + "TotalMeleeDamage":2851.2394866943359, + "TotalAssassinations":3, + "TotalGroundPoundKills":6, + "TotalGroundPoundDamage":513.81758117675781, + "TotalShoulderBashKills":1, + "TotalShoulderBashDamage":161.705322265625, + "TotalGrenadeDamage":6297.8420639038086, + "TotalPowerWeaponKills":47, + "TotalPowerWeaponDamage":6007.96089553833, + "TotalPowerWeaponGrabs":11, + "TotalPowerWeaponPossessionTime":"PT15M5.9333S", + "TotalDeaths":181, + "TotalAssists":98, + "TotalGamesCompleted":22, + "TotalGamesWon":14, "TotalGamesLost":8, "TotalGamesTied":0, - "TotalTimePlayed":"PT1H35M49.9897001S", - "TotalGrenadeKills":15, + "TotalTimePlayed":"PT2H29M51.4388525S", + "TotalGrenadeKills":22, "MedalAwards":[ { "MedalId":3565443938, - "Count":67 + "Count":108 }, { "MedalId":2105198095, - "Count":36 + "Count":62 }, { "MedalId":2916014239, - "Count":28 + "Count":52 }, { "MedalId":3261908037, - "Count":98 + "Count":146 }, { "MedalId":1351381581, - "Count":48 + "Count":71 }, { "MedalId":250435527, - "Count":2 + "Count":6 }, { "MedalId":2287626681, - "Count":5 + "Count":11 }, { "MedalId":2078758684, - "Count":21 + "Count":35 }, { "MedalId":824733727, - "Count":6 + "Count":11 }, { "MedalId":3001183151, - "Count":2 + "Count":4 }, { "MedalId":2531822079, @@ -1884,11 +2496,11 @@ }, { "MedalId":2430242797, - "Count":9 + "Count":14 }, { "MedalId":2838259753, - "Count":11 + "Count":13 }, { "MedalId":2896365521, @@ -1904,7 +2516,7 @@ }, { "MedalId":492192256, - "Count":1 + "Count":6 }, { "MedalId":2564994165, @@ -1916,15 +2528,15 @@ }, { "MedalId":3148489433, - "Count":1 + "Count":3 }, { "MedalId":1637841390, - "Count":7 + "Count":12 }, { "MedalId":2782465081, - "Count":4 + "Count":5 }, { "MedalId":1080468863, @@ -1932,11 +2544,11 @@ }, { "MedalId":3354395650, - "Count":2 + "Count":3 }, { "MedalId":3400287617, - "Count":3 + "Count":10 }, { "MedalId":2279899989, @@ -1944,7 +2556,7 @@ }, { "MedalId":285057226, - "Count":1 + "Count":2 }, { "MedalId":2494364276, @@ -1960,7 +2572,7 @@ }, { "MedalId":2763748638, - "Count":1 + "Count":2 }, { "MedalId":194124164, @@ -1969,6 +2581,18 @@ { "MedalId":370413844, "Count":1 + }, + { + "MedalId":298813630, + "Count":1 + }, + { + "MedalId":3270120991, + "Count":3 + }, + { + "MedalId":3698887726, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -1985,12 +2609,12 @@ ] }, - "TotalShotsFired":1064, - "TotalShotsLanded":553, - "TotalHeadshots":58, - "TotalKills":71, - "TotalDamageDealt":9859.8823182582855, - "TotalPossessionTime":"PT40M21.7498S" + "TotalShotsFired":1755, + "TotalShotsLanded":903, + "TotalHeadshots":94, + "TotalKills":116, + "TotalDamageDealt":16213.096713781357, + "TotalPossessionTime":"PT1H6M27.85S" }, { "WeaponId":{ @@ -1999,12 +2623,12 @@ ] }, - "TotalShotsFired":68, - "TotalShotsLanded":36, + "TotalShotsFired":143, + "TotalShotsLanded":76, "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":288.60000038146973, - "TotalPossessionTime":"PT5M1.4999S" + "TotalKills":1, + "TotalDamageDealt":536.54287052154541, + "TotalPossessionTime":"PT7M19.2499S" }, { "WeaponId":{ @@ -2013,12 +2637,12 @@ ] }, - "TotalShotsFired":1298, - "TotalShotsLanded":686, - "TotalHeadshots":42, - "TotalKills":49, - "TotalDamageDealt":5833.9064741134644, - "TotalPossessionTime":"PT16M58.6502S" + "TotalShotsFired":1481, + "TotalShotsLanded":761, + "TotalHeadshots":46, + "TotalKills":55, + "TotalDamageDealt":6389.8237829208374, + "TotalPossessionTime":"PT20M34.4835S" }, { "WeaponId":{ @@ -2032,7 +2656,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT3.4167S" + "TotalPossessionTime":"PT11.0001S" }, { "WeaponId":{ @@ -2044,8 +2668,8 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":8, - "TotalDamageDealt":1405.6966705322266, + "TotalKills":27, + "TotalDamageDealt":3526.7623901367187, "TotalPossessionTime":"PT0S" }, { @@ -2055,11 +2679,11 @@ ] }, - "TotalShotsFired":197, - "TotalShotsLanded":161, + "TotalShotsFired":304, + "TotalShotsLanded":248, "TotalHeadshots":0, - "TotalKills":13, - "TotalDamageDealt":3821.6461563110352, + "TotalKills":17, + "TotalDamageDealt":5442.2359161376953, "TotalPossessionTime":"PT0S" }, { @@ -2069,11 +2693,11 @@ ] }, - "TotalShotsFired":180, - "TotalShotsLanded":26, + "TotalShotsFired":420, + "TotalShotsLanded":61, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":258.93465232849121, + "TotalKills":4, + "TotalDamageDealt":666.45036315917969, "TotalPossessionTime":"PT0S" }, { @@ -2083,12 +2707,12 @@ ] }, - "TotalShotsFired":29, - "TotalShotsLanded":22, + "TotalShotsFired":43, + "TotalShotsLanded":36, "TotalHeadshots":2, - "TotalKills":16, - "TotalDamageDealt":1823.7548217773437, - "TotalPossessionTime":"PT5M2.3666S" + "TotalKills":23, + "TotalDamageDealt":3080.8077621459961, + "TotalPossessionTime":"PT8M43.75S" }, { "WeaponId":{ @@ -2097,8 +2721,8 @@ ] }, - "TotalShotsFired":10, - "TotalShotsLanded":8, + "TotalShotsFired":20, + "TotalShotsLanded":15, "TotalHeadshots":0, "TotalKills":1, "TotalDamageDealt":189.15578460693359, @@ -2111,12 +2735,12 @@ ] }, - "TotalShotsFired":67, - "TotalShotsLanded":36, - "TotalHeadshots":6, - "TotalKills":7, - "TotalDamageDealt":993.08461761474609, - "TotalPossessionTime":"PT1M58.2165S" + "TotalShotsFired":89, + "TotalShotsLanded":45, + "TotalHeadshots":8, + "TotalKills":9, + "TotalDamageDealt":1306.0846176147461, + "TotalPossessionTime":"PT2M42.7665S" }, { "WeaponId":{ @@ -2125,12 +2749,12 @@ ] }, - "TotalShotsFired":8, - "TotalShotsLanded":7, + "TotalShotsFired":15, + "TotalShotsLanded":14, "TotalHeadshots":0, - "TotalKills":2, - "TotalDamageDealt":312.8202018737793, - "TotalPossessionTime":"PT1M4.5S" + "TotalKills":6, + "TotalDamageDealt":804.668773651123, + "TotalPossessionTime":"PT1M58.2S" }, { "WeaponId":{ @@ -2153,12 +2777,12 @@ ] }, - "TotalShotsFired":136, - "TotalShotsLanded":52, + "TotalShotsFired":376, + "TotalShotsLanded":161, "TotalHeadshots":0, - "TotalKills":7, - "TotalDamageDealt":673.258918762207, - "TotalPossessionTime":"PT2M13.9666S" + "TotalKills":18, + "TotalDamageDealt":2122.4843597412109, + "TotalPossessionTime":"PT4M23.9833S" }, { "WeaponId":{ @@ -2167,12 +2791,12 @@ ] }, - "TotalShotsFired":75, - "TotalShotsLanded":22, + "TotalShotsFired":87, + "TotalShotsLanded":29, "TotalHeadshots":0, "TotalKills":2, - "TotalDamageDealt":214.16643905639648, - "TotalPossessionTime":"PT20.9167S" + "TotalDamageDealt":279.99067306518555, + "TotalPossessionTime":"PT24.6334S" }, { "WeaponId":{ @@ -2181,12 +2805,12 @@ ] }, - "TotalShotsFired":58, - "TotalShotsLanded":31, - "TotalHeadshots":3, - "TotalKills":4, - "TotalDamageDealt":656.801215171814, - "TotalPossessionTime":"PT1M50.3167S" + "TotalShotsFired":150, + "TotalShotsLanded":82, + "TotalHeadshots":9, + "TotalKills":11, + "TotalDamageDealt":1671.0607748031616, + "TotalPossessionTime":"PT4M21.6833S" }, { "WeaponId":{ @@ -2201,12 +2825,40 @@ "TotalKills":1, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":723388907, + "Attachments":[ + + ] + }, + "TotalShotsFired":5, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT11.1667S" + }, + { + "WeaponId":{ + "StockId":2681172411, + "Attachments":[ + + ] + }, + "TotalShotsFired":30, + "TotalShotsLanded":13, + "TotalHeadshots":0, + "TotalKills":1, + "TotalDamageDealt":79.999992370605469, + "TotalPossessionTime":"PT10.2833S" } ], "Impulses":[ { "Id":2556889090, - "Count":12 + "Count":14 }, { "Id":3174430457, @@ -2217,14 +2869,14 @@ "Count":1 } ], - "TotalSpartanKills":182 + "TotalSpartanKills":290 }, { "FlexibleStats":{ "MedalStatCounts":[ { "Id":"10d1690e-9820-4d98-a7a6-361173370f40", - "Count":1 + "Count":5 }, { "Id":"f2d6cbeb-fbf6-44d5-b321-9edb8cb2e3bc", @@ -2234,23 +2886,23 @@ "ImpulseStatCounts":[ { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":111 + "Count":221 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":53 + "Count":88 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":97 + "Count":167 }, { "Id":"3465eba1-608c-47d7-9cb6-ef4c7a55a2dd", - "Count":75 + "Count":156 }, { "Id":"7cda10c8-04c4-4916-8d6e-71a426a61de8", - "Count":8 + "Count":15 }, { "Id":"6e1e4e2c-1a57-4f64-a893-f594974b3f1f", @@ -2258,19 +2910,19 @@ }, { "Id":"5262f1d7-4273-48c3-8d2f-edfcb36a1617", - "Count":18 + "Count":39 }, { "Id":"53ea3e8c-ac2a-4644-b6e2-4ac45e721cca", - "Count":13 + "Count":20 }, { "Id":"ded6e97f-575a-4511-833b-62bf5489a2c1", - "Count":79 + "Count":153 }, { "Id":"f12a007b-3f27-45a1-87f5-816b6aca060d", - "Count":5 + "Count":21 } ], "MedalTimelapses":[ @@ -2279,20 +2931,20 @@ "ImpulseTimelapses":[ { "Id":"a3fd8c22-a921-4662-a92b-1f7e965df8fd", - "Timelapse":"PT3M6.8514582S" + "Timelapse":"PT10M36.1517816S" }, { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT2H17M27.8758695S" + "Timelapse":"PT4H23M24.388176S" } ] }, "GameBaseVariantId":"1e473914-46e4-408d-af26-178fb115de76", - "TotalKills":112, - "TotalHeadshots":75, - "TotalWeaponDamage":17302.095869541168, - "TotalShotsFired":2789, - "TotalShotsLanded":1129, + "TotalKills":222, + "TotalHeadshots":156, + "TotalWeaponDamage":30955.615365117788, + "TotalShotsFired":5216, + "TotalShotsLanded":2027, "WeaponWithMostKills":{ "WeaponId":{ "StockId":4096745987, @@ -2300,41 +2952,41 @@ ] }, - "TotalShotsFired":952, - "TotalShotsLanded":472, - "TotalHeadshots":39, - "TotalKills":49, - "TotalDamageDealt":8607.6064052581787, - "TotalPossessionTime":"PT44M56.3832S" - }, - "TotalMeleeKills":3, - "TotalMeleeDamage":396.45449447631836, - "TotalAssassinations":0, - "TotalGroundPoundKills":1, - "TotalGroundPoundDamage":195.0, + "TotalShotsFired":1661, + "TotalShotsLanded":762, + "TotalHeadshots":69, + "TotalKills":86, + "TotalDamageDealt":14039.512907981873, + "TotalPossessionTime":"PT1H19M51.8328S" + }, + "TotalMeleeKills":4, + "TotalMeleeDamage":634.75899124145508, + "TotalAssassinations":1, + "TotalGroundPoundKills":2, + "TotalGroundPoundDamage":251.79560089111328, "TotalShoulderBashKills":0, "TotalShoulderBashDamage":0.0, - "TotalGrenadeDamage":3267.2120518684387, - "TotalPowerWeaponKills":4, - "TotalPowerWeaponDamage":368.57354736328125, + "TotalGrenadeDamage":5421.4927888810635, + "TotalPowerWeaponKills":6, + "TotalPowerWeaponDamage":568.63883209228516, "TotalPowerWeaponGrabs":0, - "TotalPowerWeaponPossessionTime":"PT1M25.0167S", - "TotalDeaths":97, - "TotalAssists":53, - "TotalGamesCompleted":22, - "TotalGamesWon":16, - "TotalGamesLost":6, + "TotalPowerWeaponPossessionTime":"PT2M22.0335S", + "TotalDeaths":167, + "TotalAssists":88, + "TotalGamesCompleted":40, + "TotalGamesWon":31, + "TotalGamesLost":9, "TotalGamesTied":0, - "TotalTimePlayed":"PT2H17M27.8758695S", - "TotalGrenadeKills":11, + "TotalTimePlayed":"PT4H23M24.388176S", + "TotalGrenadeKills":22, "MedalAwards":[ { "MedalId":3261908037, - "Count":67 + "Count":147 }, { "MedalId":2838259753, - "Count":5 + "Count":9 }, { "MedalId":2028249938, @@ -2342,55 +2994,55 @@ }, { "MedalId":2299864088, - "Count":5 + "Count":21 }, { "MedalId":1573153198, - "Count":1 + "Count":5 }, { "MedalId":2782465081, - "Count":8 + "Count":10 }, { "MedalId":824733727, - "Count":2 + "Count":9 }, { "MedalId":3001183151, - "Count":6 + "Count":9 }, { "MedalId":2078758684, - "Count":4 + "Count":13 }, { "MedalId":979431049, - "Count":2 + "Count":3 }, { "MedalId":2287626681, - "Count":2 + "Count":3 }, { "MedalId":3653057799, - "Count":8 + "Count":11 }, { "MedalId":2430242797, - "Count":2 + "Count":8 }, { "MedalId":2359847435, - "Count":1 + "Count":2 }, { "MedalId":3894006667, - "Count":8 + "Count":9 }, { "MedalId":3400287617, - "Count":3 + "Count":5 }, { "MedalId":1494478183, @@ -2406,19 +3058,39 @@ }, { "MedalId":3491849182, - "Count":1 + "Count":5 }, { "MedalId":492192256, - "Count":1 + "Count":2 }, { "MedalId":2155964350, - "Count":2 + "Count":3 }, { "MedalId":1618319591, "Count":1 + }, + { + "MedalId":1423504140, + "Count":2 + }, + { + "MedalId":352859864, + "Count":3 + }, + { + "MedalId":1957561936, + "Count":1 + }, + { + "MedalId":3886151616, + "Count":6 + }, + { + "MedalId":151853593, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -2440,7 +3112,7 @@ "TotalHeadshots":0, "TotalKills":3, "TotalDamageDealt":290.37113380432129, - "TotalPossessionTime":"PT14M33.4332S" + "TotalPossessionTime":"PT30M24.3999S" }, { "WeaponId":{ @@ -2449,12 +3121,12 @@ ] }, - "TotalShotsFired":952, - "TotalShotsLanded":472, - "TotalHeadshots":39, - "TotalKills":49, - "TotalDamageDealt":8607.6064052581787, - "TotalPossessionTime":"PT44M56.3832S" + "TotalShotsFired":1661, + "TotalShotsLanded":762, + "TotalHeadshots":69, + "TotalKills":86, + "TotalDamageDealt":14039.512907981873, + "TotalPossessionTime":"PT1H19M51.8328S" }, { "WeaponId":{ @@ -2463,12 +3135,12 @@ ] }, - "TotalShotsFired":774, - "TotalShotsLanded":345, - "TotalHeadshots":25, - "TotalKills":28, - "TotalDamageDealt":3285.2994403839111, - "TotalPossessionTime":"PT12M44.6502S" + "TotalShotsFired":1940, + "TotalShotsLanded":749, + "TotalHeadshots":61, + "TotalKills":69, + "TotalDamageDealt":7198.2014775276184, + "TotalPossessionTime":"PT30M40.4504S" }, { "WeaponId":{ @@ -2477,11 +3149,11 @@ ] }, - "TotalShotsFired":163, - "TotalShotsLanded":103, + "TotalShotsFired":311, + "TotalShotsLanded":189, "TotalHeadshots":0, - "TotalKills":7, - "TotalDamageDealt":2338.4912943840027, + "TotalKills":17, + "TotalDamageDealt":4207.87102279067, "TotalPossessionTime":"PT0S" }, { @@ -2491,12 +3163,12 @@ ] }, - "TotalShotsFired":54, - "TotalShotsLanded":32, - "TotalHeadshots":5, - "TotalKills":5, - "TotalDamageDealt":657.28330993652344, - "TotalPossessionTime":"PT3M7.7666S" + "TotalShotsFired":228, + "TotalShotsLanded":117, + "TotalHeadshots":19, + "TotalKills":20, + "TotalDamageDealt":2374.3982515335083, + "TotalPossessionTime":"PT10M34.6831S" }, { "WeaponId":{ @@ -2505,12 +3177,12 @@ ] }, - "TotalShotsFired":57, - "TotalShotsLanded":26, - "TotalHeadshots":5, - "TotalKills":6, - "TotalDamageDealt":595.54998016357422, - "TotalPossessionTime":"PT2M29.45S" + "TotalShotsFired":93, + "TotalShotsLanded":38, + "TotalHeadshots":6, + "TotalKills":7, + "TotalDamageDealt":832.79997253417969, + "TotalPossessionTime":"PT3M51.7666S" }, { "WeaponId":{ @@ -2519,12 +3191,12 @@ ] }, - "TotalShotsFired":2, - "TotalShotsLanded":1, + "TotalShotsFired":4, + "TotalShotsLanded":3, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":105.67355346679687, - "TotalPossessionTime":"PT21.45S" + "TotalKills":2, + "TotalDamageDealt":162.12355041503906, + "TotalPossessionTime":"PT29.3834S" }, { "WeaponId":{ @@ -2552,7 +3224,7 @@ "TotalHeadshots":0, "TotalKills":2, "TotalDamageDealt":230.20000076293945, - "TotalPossessionTime":"PT5M57.8003S" + "TotalPossessionTime":"PT6M55.5503S" }, { "WeaponId":{ @@ -2561,11 +3233,11 @@ ] }, - "TotalShotsFired":3, - "TotalShotsLanded":2, + "TotalShotsFired":4, + "TotalShotsLanded":3, "TotalHeadshots":0, "TotalKills":0, - "TotalDamageDealt":18.937492370605469, + "TotalDamageDealt":32.259902954101562, "TotalPossessionTime":"PT0S" }, { @@ -2578,8 +3250,8 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":4, - "TotalDamageDealt":591.45449447631836, + "TotalKills":7, + "TotalDamageDealt":886.55459213256836, "TotalPossessionTime":"PT0S" }, { @@ -2589,12 +3261,12 @@ ] }, - "TotalShotsFired":18, - "TotalShotsLanded":11, + "TotalShotsFired":29, + "TotalShotsLanded":16, "TotalHeadshots":0, - "TotalKills":2, - "TotalDamageDealt":217.89999389648437, - "TotalPossessionTime":"PT57.8334S" + "TotalKills":3, + "TotalDamageDealt":361.51528167724609, + "TotalPossessionTime":"PT1M46.4668S" }, { "WeaponId":{ @@ -2603,11 +3275,11 @@ ] }, - "TotalShotsFired":539, - "TotalShotsLanded":68, + "TotalShotsFired":719, + "TotalShotsLanded":81, "TotalHeadshots":0, - "TotalKills":4, - "TotalDamageDealt":909.78326511383057, + "TotalKills":5, + "TotalDamageDealt":1181.3618631362915, "TotalPossessionTime":"PT0S" }, { @@ -2623,24 +3295,38 @@ "TotalKills":1, "TotalDamageDealt":45.0, "TotalPossessionTime":"PT5.7333S" + }, + { + "WeaponId":{ + "StockId":3808094875, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT0.45S" } ], "Impulses":[ { "Id":3060032974, - "Count":79 + "Count":153 }, { "Id":3930101026, - "Count":18 + "Count":39 }, { "Id":540014008, - "Count":55 + "Count":113 }, { "Id":2556889090, - "Count":5 + "Count":13 }, { "Id":2299858338, @@ -2652,42 +3338,42 @@ }, { "Id":415845940, - "Count":27 + "Count":53 }, { "Id":4191318012, - "Count":21 + "Count":62 }, { "Id":1039658009, - "Count":18 + "Count":53 }, { "Id":3514632335, - "Count":5 + "Count":21 }, { "Id":3435524855, - "Count":10 + "Count":27 }, { "Id":2512065773, - "Count":13 + "Count":20 }, { "Id":938151029, - "Count":3 + "Count":7 }, { "Id":3174430457, - "Count":8 + "Count":11 }, { "Id":2944278681, - "Count":8 + "Count":15 } ], - "TotalSpartanKills":111 + "TotalSpartanKills":221 }, { "FlexibleStats":{ @@ -2697,35 +3383,35 @@ "ImpulseStatCounts":[ { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":1796 + "Count":2530 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":357 + "Count":519 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":1106 + "Count":1603 }, { "Id":"a1d97ad4-c1d9-4807-b619-ca3710cc5a8d", - "Count":12 + "Count":14 }, { "Id":"3465eba1-608c-47d7-9cb6-ef4c7a55a2dd", - "Count":1061 + "Count":1616 }, { "Id":"780104cb-5b86-4ed9-8fb1-40b919de0766", - "Count":86 + "Count":116 }, { "Id":"a5a0d0d5-5c9f-4888-b42a-2c87f8e58336", - "Count":70 + "Count":88 }, { "Id":"71ce2293-23bb-492f-a8c0-46e095b55eb7", - "Count":62 + "Count":84 } ], "MedalTimelapses":[ @@ -2734,16 +3420,16 @@ "ImpulseTimelapses":[ { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT15H18M6.8212492S" + "Timelapse":"PT20H55M53.0735775S" } ] }, "GameBaseVariantId":"257a305e-4dd3-41f1-9824-dfe7e8bd59e1", - "TotalKills":1809, - "TotalHeadshots":1061, - "TotalWeaponDamage":210576.75675725937, - "TotalShotsFired":19763, - "TotalShotsLanded":9279, + "TotalKills":2550, + "TotalHeadshots":1616, + "TotalWeaponDamage":281897.48175859451, + "TotalShotsFired":29138, + "TotalShotsLanded":13350, "WeaponWithMostKills":{ "WeaponId":{ "StockId":4096745987, @@ -2751,109 +3437,109 @@ ] }, - "TotalShotsFired":5426, - "TotalShotsLanded":2751, - "TotalHeadshots":467, - "TotalKills":522, - "TotalDamageDealt":54058.7333612442, - "TotalPossessionTime":"PT3H58M32.6669S" + "TotalShotsFired":8492, + "TotalShotsLanded":4283, + "TotalHeadshots":811, + "TotalKills":898, + "TotalDamageDealt":85374.856627941132, + "TotalPossessionTime":"PT6H22M22.0008S" }, - "TotalMeleeKills":54, - "TotalMeleeDamage":8978.9492582082748, - "TotalAssassinations":14, - "TotalGroundPoundKills":6, - "TotalGroundPoundDamage":987.15537548065186, - "TotalShoulderBashKills":12, - "TotalShoulderBashDamage":1785.3567771911621, - "TotalGrenadeDamage":15591.353593349457, - "TotalPowerWeaponKills":703, - "TotalPowerWeaponDamage":92130.015623092651, - "TotalPowerWeaponGrabs":62, - "TotalPowerWeaponPossessionTime":"PT5H11M56.968S", - "TotalDeaths":1106, - "TotalAssists":357, - "TotalGamesCompleted":118, - "TotalGamesWon":71, - "TotalGamesLost":47, + "TotalMeleeKills":74, + "TotalMeleeDamage":11150.026822058484, + "TotalAssassinations":17, + "TotalGroundPoundKills":12, + "TotalGroundPoundDamage":1931.322039604187, + "TotalShoulderBashKills":15, + "TotalShoulderBashDamage":2082.9285049438477, + "TotalGrenadeDamage":24157.406641483307, + "TotalPowerWeaponKills":780, + "TotalPowerWeaponDamage":101870.70411348343, + "TotalPowerWeaponGrabs":84, + "TotalPowerWeaponPossessionTime":"PT5H49M40.968S", + "TotalDeaths":1603, + "TotalAssists":519, + "TotalGamesCompleted":167, + "TotalGamesWon":99, + "TotalGamesLost":68, "TotalGamesTied":0, - "TotalTimePlayed":"PT15H18M6.8212492S", - "TotalGrenadeKills":63, + "TotalTimePlayed":"PT20H55M53.0735775S", + "TotalGrenadeKills":98, "MedalAwards":[ { "MedalId":3001183151, - "Count":27 + "Count":34 }, { "MedalId":3261908037, - "Count":737 + "Count":1235 }, { "MedalId":2966496172, - "Count":5 + "Count":6 }, { "MedalId":3653057799, - "Count":43 + "Count":56 }, { "MedalId":352859864, - "Count":23 + "Count":27 }, { "MedalId":3400287617, - "Count":64 + "Count":85 }, { "MedalId":2287626681, - "Count":30 + "Count":48 }, { "MedalId":250435527, - "Count":20 + "Count":22 }, { "MedalId":848240062, - "Count":206 + "Count":228 }, { "MedalId":2430242797, - "Count":81 + "Count":111 }, { "MedalId":466059351, - "Count":44 + "Count":58 }, { "MedalId":824733727, - "Count":51 + "Count":91 }, { "MedalId":1986137636, - "Count":31 + "Count":33 }, { "MedalId":2782465081, - "Count":75 + "Count":129 }, { "MedalId":2078758684, - "Count":169 + "Count":258 }, { "MedalId":2838259753, - "Count":47 + "Count":61 }, { "MedalId":2494364276, - "Count":4 + "Count":10 }, { "MedalId":370413844, - "Count":9 + "Count":10 }, { "MedalId":3522125871, - "Count":9 + "Count":11 }, { "MedalId":1691836029, @@ -2861,35 +3547,35 @@ }, { "MedalId":2251767925, - "Count":3 + "Count":5 }, { "MedalId":3270120991, - "Count":9 + "Count":11 }, { "MedalId":285057226, - "Count":12 + "Count":16 }, { "MedalId":2763748638, - "Count":20 + "Count":27 }, { "MedalId":1423504140, - "Count":2 + "Count":3 }, { "MedalId":3698887726, - "Count":10 + "Count":16 }, { "MedalId":298813630, - "Count":12 + "Count":15 }, { "MedalId":3925170236, - "Count":87 + "Count":92 }, { "MedalId":3486286344, @@ -2897,7 +3583,7 @@ }, { "MedalId":876932011, - "Count":39 + "Count":41 }, { "MedalId":2108880282, @@ -2905,23 +3591,23 @@ }, { "MedalId":2977773352, - "Count":22 + "Count":23 }, { "MedalId":1618319591, - "Count":5 + "Count":7 }, { "MedalId":1080468863, - "Count":31 + "Count":43 }, { "MedalId":2564994165, - "Count":7 + "Count":9 }, { "MedalId":492192256, - "Count":6 + "Count":12 }, { "MedalId":1259067733, @@ -2929,15 +3615,15 @@ }, { "MedalId":3710519250, - "Count":7 + "Count":10 }, { "MedalId":317993761, - "Count":1 + "Count":2 }, { "MedalId":2279899989, - "Count":2 + "Count":5 }, { "MedalId":2707871298, @@ -2945,7 +3631,7 @@ }, { "MedalId":3491849182, - "Count":3 + "Count":7 }, { "MedalId":4252521258, @@ -2957,7 +3643,7 @@ }, { "MedalId":3098362934, - "Count":1 + "Count":2 }, { "MedalId":3972445431, @@ -2969,11 +3655,19 @@ }, { "MedalId":3744028405, - "Count":1 + "Count":2 }, { "MedalId":2077162827, "Count":2 + }, + { + "MedalId":1792284502, + "Count":1 + }, + { + "MedalId":2766284219, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -2990,12 +3684,12 @@ ] }, - "TotalShotsFired":443, - "TotalShotsLanded":193, + "TotalShotsFired":642, + "TotalShotsLanded":273, "TotalHeadshots":0, - "TotalKills":12, - "TotalDamageDealt":1506.2334184646606, - "TotalPossessionTime":"PT25M8.7845S" + "TotalKills":16, + "TotalDamageDealt":2129.006254196167, + "TotalPossessionTime":"PT34M11.3337S" }, { "WeaponId":{ @@ -3004,12 +3698,12 @@ ] }, - "TotalShotsFired":5426, - "TotalShotsLanded":2751, - "TotalHeadshots":467, - "TotalKills":522, - "TotalDamageDealt":54058.7333612442, - "TotalPossessionTime":"PT3H58M32.6669S" + "TotalShotsFired":8492, + "TotalShotsLanded":4283, + "TotalHeadshots":811, + "TotalKills":898, + "TotalDamageDealt":85374.856627941132, + "TotalPossessionTime":"PT6H22M22.0008S" }, { "WeaponId":{ @@ -3021,8 +3715,8 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":86, - "TotalDamageDealt":11751.461410880089, + "TotalKills":118, + "TotalDamageDealt":15164.277366606519, "TotalPossessionTime":"PT0S" }, { @@ -3032,12 +3726,12 @@ ] }, - "TotalShotsFired":1233, - "TotalShotsLanded":507, - "TotalHeadshots":227, - "TotalKills":292, - "TotalDamageDealt":43211.361808776855, - "TotalPossessionTime":"PT3H1M52.0839S" + "TotalShotsFired":1333, + "TotalShotsLanded":553, + "TotalHeadshots":250, + "TotalKills":322, + "TotalDamageDealt":47229.930435180664, + "TotalPossessionTime":"PT3H16M0.9676S" }, { "WeaponId":{ @@ -3046,12 +3740,12 @@ ] }, - "TotalShotsFired":7080, - "TotalShotsLanded":3165, - "TotalHeadshots":284, - "TotalKills":320, - "TotalDamageDealt":30650.973059654236, - "TotalPossessionTime":"PT2H3M27.1163S" + "TotalShotsFired":10229, + "TotalShotsLanded":4445, + "TotalHeadshots":441, + "TotalKills":486, + "TotalDamageDealt":44167.862958908081, + "TotalPossessionTime":"PT3H2M27.8491S" }, { "WeaponId":{ @@ -3060,11 +3754,11 @@ ] }, - "TotalShotsFired":926, - "TotalShotsLanded":646, + "TotalShotsFired":1415, + "TotalShotsLanded":974, "TotalHeadshots":0, - "TotalKills":40, - "TotalDamageDealt":12049.512343883514, + "TotalKills":66, + "TotalDamageDealt":18438.965638637543, "TotalPossessionTime":"PT0S" }, { @@ -3074,12 +3768,12 @@ ] }, - "TotalShotsFired":239, - "TotalShotsLanded":156, + "TotalShotsFired":318, + "TotalShotsLanded":195, "TotalHeadshots":0, - "TotalKills":21, - "TotalDamageDealt":3277.8773519992828, - "TotalPossessionTime":"PT10M22.817S" + "TotalKills":24, + "TotalDamageDealt":4141.912985086441, + "TotalPossessionTime":"PT14M6.4002S" }, { "WeaponId":{ @@ -3088,11 +3782,11 @@ ] }, - "TotalShotsFired":94, - "TotalShotsLanded":54, + "TotalShotsFired":146, + "TotalShotsLanded":80, "TotalHeadshots":0, - "TotalKills":6, - "TotalDamageDealt":927.80316925048828, + "TotalKills":10, + "TotalDamageDealt":1494.1679201126099, "TotalPossessionTime":"PT0S" }, { @@ -3102,12 +3796,12 @@ ] }, - "TotalShotsFired":519, - "TotalShotsLanded":301, - "TotalHeadshots":34, - "TotalKills":38, - "TotalDamageDealt":6365.8620147705078, - "TotalPossessionTime":"PT18M56.9834S" + "TotalShotsFired":646, + "TotalShotsLanded":370, + "TotalHeadshots":42, + "TotalKills":50, + "TotalDamageDealt":7853.1401138305664, + "TotalPossessionTime":"PT23M25.05S" }, { "WeaponId":{ @@ -3116,12 +3810,12 @@ ] }, - "TotalShotsFired":87, - "TotalShotsLanded":65, - "TotalHeadshots":5, - "TotalKills":41, - "TotalDamageDealt":5019.4914588928223, - "TotalPossessionTime":"PT19M1.7334S" + "TotalShotsFired":103, + "TotalShotsLanded":81, + "TotalHeadshots":6, + "TotalKills":54, + "TotalDamageDealt":6346.3511853218079, + "TotalPossessionTime":"PT23M1.55S" }, { "WeaponId":{ @@ -3130,12 +3824,12 @@ ] }, - "TotalShotsFired":376, - "TotalShotsLanded":196, - "TotalHeadshots":22, - "TotalKills":25, - "TotalDamageDealt":5399.8203716278076, - "TotalPossessionTime":"PT20M13.1502S" + "TotalShotsFired":501, + "TotalShotsLanded":261, + "TotalHeadshots":28, + "TotalKills":33, + "TotalDamageDealt":7175.55805015564, + "TotalPossessionTime":"PT25M58.7503S" }, { "WeaponId":{ @@ -3144,12 +3838,12 @@ ] }, - "TotalShotsFired":331, - "TotalShotsLanded":93, + "TotalShotsFired":648, + "TotalShotsLanded":207, "TotalHeadshots":0, - "TotalKills":4, - "TotalDamageDealt":731.13212203979492, - "TotalPossessionTime":"PT2M29.8667S" + "TotalKills":9, + "TotalDamageDealt":1592.1971244812012, + "TotalPossessionTime":"PT5M19.3333S" }, { "WeaponId":{ @@ -3158,11 +3852,11 @@ ] }, - "TotalShotsFired":1391, - "TotalShotsLanded":164, + "TotalShotsFired":2311, + "TotalShotsLanded":257, "TotalHeadshots":0, - "TotalKills":17, - "TotalDamageDealt":2614.0380802154541, + "TotalKills":22, + "TotalDamageDealt":4224.2730827331543, "TotalPossessionTime":"PT0S" }, { @@ -3172,12 +3866,12 @@ ] }, - "TotalShotsFired":132, - "TotalShotsLanded":96, + "TotalShotsFired":151, + "TotalShotsLanded":112, "TotalHeadshots":0, - "TotalKills":66, - "TotalDamageDealt":6683.0710105896, - "TotalPossessionTime":"PT13M42.0335S" + "TotalKills":78, + "TotalDamageDealt":7999.3345069885254, + "TotalPossessionTime":"PT17M58.5002S" }, { "WeaponId":{ @@ -3186,12 +3880,12 @@ ] }, - "TotalShotsFired":99, - "TotalShotsLanded":38, + "TotalShotsFired":172, + "TotalShotsLanded":71, "TotalHeadshots":0, - "TotalKills":3, - "TotalDamageDealt":376.28958129882812, - "TotalPossessionTime":"PT1M2.1834S" + "TotalKills":5, + "TotalDamageDealt":705.62291526794434, + "TotalPossessionTime":"PT1M44.2833S" }, { "WeaponId":{ @@ -3200,12 +3894,12 @@ ] }, - "TotalShotsFired":486, - "TotalShotsLanded":401, + "TotalShotsFired":507, + "TotalShotsLanded":420, "TotalHeadshots":0, - "TotalKills":228, - "TotalDamageDealt":27473.735061407089, - "TotalPossessionTime":"PT1H8M39.3002S" + "TotalKills":239, + "TotalDamageDealt":28639.169402837753, + "TotalPossessionTime":"PT1H14M7.1002S" }, { "WeaponId":{ @@ -3214,12 +3908,12 @@ ] }, - "TotalShotsFired":188, - "TotalShotsLanded":121, + "TotalShotsFired":311, + "TotalShotsLanded":175, "TotalHeadshots":0, - "TotalKills":14, - "TotalDamageDealt":1882.2032470703125, - "TotalPossessionTime":"PT4M25.7667S" + "TotalKills":17, + "TotalDamageDealt":2281.849552154541, + "TotalPossessionTime":"PT6M22.15S" }, { "WeaponId":{ @@ -3228,12 +3922,12 @@ ] }, - "TotalShotsFired":529, - "TotalShotsLanded":274, - "TotalHeadshots":22, - "TotalKills":25, - "TotalDamageDealt":3595.4962968826294, - "TotalPossessionTime":"PT10M43.1666S" + "TotalShotsFired":973, + "TotalShotsLanded":508, + "TotalHeadshots":38, + "TotalKills":47, + "TotalDamageDealt":6700.2796440124512, + "TotalPossessionTime":"PT20M13.1668S" }, { "WeaponId":{ @@ -3247,7 +3941,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT34.5164S" + "TotalPossessionTime":"PT57.4998S" }, { "WeaponId":{ @@ -3256,12 +3950,12 @@ ] }, - "TotalShotsFired":120, - "TotalShotsLanded":34, + "TotalShotsFired":168, + "TotalShotsLanded":53, "TotalHeadshots":0, - "TotalKills":3, - "TotalDamageDealt":431.5848274230957, - "TotalPossessionTime":"PT1M59.65S" + "TotalKills":6, + "TotalDamageDealt":691.96016120910645, + "TotalPossessionTime":"PT3M11.9833S" }, { "WeaponId":{ @@ -3287,7 +3981,7 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":6, + "TotalKills":8, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" }, @@ -3303,7 +3997,7 @@ "TotalHeadshots":0, "TotalKills":1, "TotalDamageDealt":27.500001907348633, - "TotalPossessionTime":"PT12.8667S" + "TotalPossessionTime":"PT18.35S" }, { "WeaponId":{ @@ -3315,9 +4009,9 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":35, - "TotalDamageDealt":3879.8968505859375, - "TotalPossessionTime":"PT11M1.8333S" + "TotalKills":37, + "TotalDamageDealt":4109.8968505859375, + "TotalPossessionTime":"PT13M23.3665S" }, { "WeaponId":{ @@ -3340,29 +4034,29 @@ ] }, - "TotalShotsFired":6, - "TotalShotsLanded":6, + "TotalShotsFired":14, + "TotalShotsLanded":14, "TotalHeadshots":0, "TotalKills":3, - "TotalDamageDealt":270.79400634765625, - "TotalPossessionTime":"PT51.75S" + "TotalDamageDealt":430.29903411865234, + "TotalPossessionTime":"PT1M28.95S" } ], "Impulses":[ { "Id":3174430457, - "Count":86 + "Count":116 }, { "Id":2556889090, - "Count":70 + "Count":88 }, { "Id":1408036107, - "Count":12 + "Count":14 } ], - "TotalSpartanKills":1796 + "TotalSpartanKills":2530 }, { "FlexibleStats":{ @@ -3372,15 +4066,15 @@ "ImpulseStatCounts":[ { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":206 + "Count":244 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":87 + "Count":106 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":121 + "Count":129 }, { "Id":"a1d97ad4-c1d9-4807-b619-ca3710cc5a8d", @@ -3388,11 +4082,11 @@ }, { "Id":"3465eba1-608c-47d7-9cb6-ef4c7a55a2dd", - "Count":149 + "Count":172 }, { "Id":"780104cb-5b86-4ed9-8fb1-40b919de0766", - "Count":17 + "Count":18 }, { "Id":"a5a0d0d5-5c9f-4888-b42a-2c87f8e58336", @@ -3400,7 +4094,7 @@ }, { "Id":"71ce2293-23bb-492f-a8c0-46e095b55eb7", - "Count":15 + "Count":17 } ], "MedalTimelapses":[ @@ -3409,16 +4103,16 @@ "ImpulseTimelapses":[ { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT2H38M12.2583534S" + "Timelapse":"PT2H56M16.8130866S" } ] }, "GameBaseVariantId":"65f033d2-1303-4748-bc26-ef62c38eced4", - "TotalKills":209, - "TotalHeadshots":149, - "TotalWeaponDamage":31308.989623904228, - "TotalShotsFired":6459, - "TotalShotsLanded":2718, + "TotalKills":248, + "TotalHeadshots":172, + "TotalWeaponDamage":36979.475432276726, + "TotalShotsFired":7950, + "TotalShotsLanded":3352, "WeaponWithMostKills":{ "WeaponId":{ "StockId":424645655, @@ -3426,37 +4120,37 @@ ] }, - "TotalShotsFired":4688, - "TotalShotsLanded":2094, - "TotalHeadshots":108, - "TotalKills":126, - "TotalDamageDealt":17711.912177085876, - "TotalPossessionTime":"PT1H26M37.9336S" + "TotalShotsFired":5443, + "TotalShotsLanded":2438, + "TotalHeadshots":127, + "TotalKills":149, + "TotalDamageDealt":20524.669104576111, + "TotalPossessionTime":"PT1H37M25.3002S" }, - "TotalMeleeKills":5, - "TotalMeleeDamage":1785.6806259155273, + "TotalMeleeKills":6, + "TotalMeleeDamage":1840.68062210083, "TotalAssassinations":6, "TotalGroundPoundKills":1, "TotalGroundPoundDamage":260.0, "TotalShoulderBashKills":0, "TotalShoulderBashDamage":190.0, - "TotalGrenadeDamage":2179.2090240716934, - "TotalPowerWeaponKills":37, - "TotalPowerWeaponDamage":5668.3109226226807, - "TotalPowerWeaponGrabs":15, - "TotalPowerWeaponPossessionTime":"PT16M56.1667S", - "TotalDeaths":121, - "TotalAssists":87, - "TotalGamesCompleted":13, - "TotalGamesWon":10, + "TotalGrenadeDamage":2760.2545858621597, + "TotalPowerWeaponKills":46, + "TotalPowerWeaponDamage":7415.64573097229, + "TotalPowerWeaponGrabs":17, + "TotalPowerWeaponPossessionTime":"PT19M55.0001S", + "TotalDeaths":129, + "TotalAssists":106, + "TotalGamesCompleted":15, + "TotalGamesWon":12, "TotalGamesLost":3, "TotalGamesTied":0, - "TotalTimePlayed":"PT2H38M12.2583534S", - "TotalGrenadeKills":3, + "TotalTimePlayed":"PT2H56M16.8130866S", + "TotalGrenadeKills":5, "MedalAwards":[ { "MedalId":3261908037, - "Count":109 + "Count":131 }, { "MedalId":3001183151, @@ -3476,23 +4170,23 @@ }, { "MedalId":2430242797, - "Count":12 + "Count":17 }, { "MedalId":2078758684, - "Count":17 + "Count":24 }, { "MedalId":824733727, - "Count":6 + "Count":9 }, { "MedalId":2782465081, - "Count":6 + "Count":7 }, { "MedalId":3400287617, - "Count":8 + "Count":10 }, { "MedalId":1618319591, @@ -3500,7 +4194,7 @@ }, { "MedalId":1080468863, - "Count":15 + "Count":16 }, { "MedalId":786413504, @@ -3532,7 +4226,7 @@ }, { "MedalId":3491849182, - "Count":1 + "Count":2 }, { "MedalId":3440416044, @@ -3556,7 +4250,7 @@ }, { "MedalId":2287626681, - "Count":4 + "Count":5 }, { "MedalId":2966496172, @@ -3576,7 +4270,7 @@ }, { "MedalId":92444561, - "Count":1 + "Count":2 }, { "MedalId":3522125871, @@ -3592,11 +4286,11 @@ }, { "MedalId":1691836029, - "Count":2 + "Count":3 }, { "MedalId":285057226, - "Count":2 + "Count":3 }, { "MedalId":2732907792, @@ -3609,6 +4303,18 @@ { "MedalId":2077162827, "Count":1 + }, + { + "MedalId":2763748638, + "Count":1 + }, + { + "MedalId":2237392606, + "Count":1 + }, + { + "MedalId":3744028405, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -3628,7 +4334,7 @@ ] }, - "TotalKills":1 + "TotalKills":2 } ], "EnemyKills":[ @@ -3642,12 +4348,12 @@ ] }, - "TotalShotsFired":4688, - "TotalShotsLanded":2094, - "TotalHeadshots":108, - "TotalKills":126, - "TotalDamageDealt":17711.912177085876, - "TotalPossessionTime":"PT1H26M37.9336S" + "TotalShotsFired":5443, + "TotalShotsLanded":2438, + "TotalHeadshots":127, + "TotalKills":149, + "TotalDamageDealt":20524.669104576111, + "TotalPossessionTime":"PT1H37M25.3002S" }, { "WeaponId":{ @@ -3657,10 +4363,10 @@ ] }, "TotalShotsFired":0, - "TotalShotsLanded":0, + "TotalShotsLanded":1, "TotalHeadshots":0, - "TotalKills":12, - "TotalDamageDealt":2235.6806259155273, + "TotalKills":13, + "TotalDamageDealt":2290.68062210083, "TotalPossessionTime":"PT0S" }, { @@ -3670,12 +4376,12 @@ ] }, - "TotalShotsFired":20, + "TotalShotsFired":25, "TotalShotsLanded":8, "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":60.840000152587891, - "TotalPossessionTime":"PT6M30.6167S" + "TotalPossessionTime":"PT7M8.6668S" }, { "WeaponId":{ @@ -3684,12 +4390,12 @@ ] }, - "TotalShotsFired":273, - "TotalShotsLanded":119, - "TotalHeadshots":11, - "TotalKills":13, - "TotalDamageDealt":2542.376163482666, - "TotalPossessionTime":"PT9M34.4165S" + "TotalShotsFired":317, + "TotalShotsLanded":145, + "TotalHeadshots":15, + "TotalKills":17, + "TotalDamageDealt":3071.7246742248535, + "TotalPossessionTime":"PT10M25.2332S" }, { "WeaponId":{ @@ -3712,11 +4418,11 @@ ] }, - "TotalShotsFired":146, - "TotalShotsLanded":103, + "TotalShotsFired":174, + "TotalShotsLanded":124, "TotalHeadshots":0, - "TotalKills":3, - "TotalDamageDealt":1994.4313522577286, + "TotalKills":4, + "TotalDamageDealt":2368.9144121408463, "TotalPossessionTime":"PT0S" }, { @@ -3726,12 +4432,12 @@ ] }, - "TotalShotsFired":301, - "TotalShotsLanded":23, + "TotalShotsFired":491, + "TotalShotsLanded":54, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":798.15317726135254, - "TotalPossessionTime":"PT2M46.3833S" + "TotalKills":5, + "TotalDamageDealt":1121.4942722320557, + "TotalPossessionTime":"PT3M48.8167S" }, { "WeaponId":{ @@ -3838,12 +4544,12 @@ ] }, - "TotalShotsFired":2, - "TotalShotsLanded":1, + "TotalShotsFired":6, + "TotalShotsLanded":5, "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":94.500007629394531, - "TotalPossessionTime":"PT1M18.6667S" + "TotalKills":3, + "TotalDamageDealt":534.00000762939453, + "TotalPossessionTime":"PT1M37.05S" }, { "WeaponId":{ @@ -3852,11 +4558,11 @@ ] }, - "TotalShotsFired":2, - "TotalShotsLanded":1, + "TotalShotsFired":6, + "TotalShotsLanded":6, "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":0.0, + "TotalKills":1, + "TotalDamageDealt":64.788642883300781, "TotalPossessionTime":"PT0S" }, { @@ -3866,11 +4572,11 @@ ] }, - "TotalShotsFired":108, - "TotalShotsLanded":18, + "TotalShotsFired":179, + "TotalShotsLanded":27, "TotalHeadshots":0, "TotalKills":0, - "TotalDamageDealt":184.77767181396484, + "TotalDamageDealt":326.5515308380127, "TotalPossessionTime":"PT0S" }, { @@ -3970,6 +4676,20 @@ "TotalKills":6, "TotalDamageDealt":1527.5000610351562, "TotalPossessionTime":"PT4M53.1834S" + }, + { + "WeaponId":{ + "StockId":2140505068, + "Attachments":[ + + ] + }, + "TotalShotsFired":390, + "TotalShotsLanded":193, + "TotalHeadshots":0, + "TotalKills":2, + "TotalDamageDealt":984.49371337890625, + "TotalPossessionTime":"PT1M38.0167S" } ], "Impulses":[ @@ -3979,10 +4699,10 @@ }, { "Id":3174430457, - "Count":17 + "Count":18 } ], - "TotalSpartanKills":206 + "TotalSpartanKills":244 }, { "FlexibleStats":{ @@ -3996,27 +4716,27 @@ }, { "Id":"fc7095af-dec5-419f-836d-fdd27836aa65", - "Count":10 + "Count":11 }, { "Id":"0a719185-4780-4706-b9e6-f679fcbc65d6", - "Count":8 + "Count":9 }, { "Id":"6e1e4e2c-1a57-4f64-a893-f594974b3f1f", - "Count":18 + "Count":20 }, { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":219 + "Count":228 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":86 + "Count":91 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":138 + "Count":145 }, { "Id":"780104cb-5b86-4ed9-8fb1-40b919de0766", @@ -4033,20 +4753,20 @@ "ImpulseTimelapses":[ { "Id":"a3fd8c22-a921-4662-a92b-1f7e965df8fd", - "Timelapse":"PT12M4.6424666S" + "Timelapse":"PT12M6.0694746S" }, { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT2H51M22.0376905S" + "Timelapse":"PT2H59M1.4487538S" } ] }, "GameBaseVariantId":"8d4a3dbc-ef7a-405e-862b-34093ff582fd", - "TotalKills":230, - "TotalHeadshots":152, - "TotalWeaponDamage":38571.243449211121, - "TotalShotsFired":7902, - "TotalShotsLanded":3515, + "TotalKills":239, + "TotalHeadshots":160, + "TotalWeaponDamage":39870.797343254089, + "TotalShotsFired":8230, + "TotalShotsLanded":3651, "WeaponWithMostKills":{ "WeaponId":{ "StockId":424645655, @@ -4054,37 +4774,37 @@ ] }, - "TotalShotsFired":6299, - "TotalShotsLanded":2974, - "TotalHeadshots":120, - "TotalKills":138, - "TotalDamageDealt":23585.377341270447, - "TotalPossessionTime":"PT1H32M13.6336S" + "TotalShotsFired":6618, + "TotalShotsLanded":3103, + "TotalHeadshots":128, + "TotalKills":147, + "TotalDamageDealt":24721.373618125916, + "TotalPossessionTime":"PT1H36M24.2669S" }, "TotalMeleeKills":2, - "TotalMeleeDamage":389.9999942779541, + "TotalMeleeDamage":534.9999942779541, "TotalAssassinations":2, "TotalGroundPoundKills":2, "TotalGroundPoundDamage":363.45865726470947, "TotalShoulderBashKills":0, "TotalShoulderBashDamage":0.0, - "TotalGrenadeDamage":1855.3329677581787, + "TotalGrenadeDamage":1904.8442516326904, "TotalPowerWeaponKills":57, "TotalPowerWeaponDamage":7945.6306705474854, "TotalPowerWeaponGrabs":8, - "TotalPowerWeaponPossessionTime":"PT18M54.4169S", - "TotalDeaths":138, - "TotalAssists":86, - "TotalGamesCompleted":15, + "TotalPowerWeaponPossessionTime":"PT19M3.7502S", + "TotalDeaths":145, + "TotalAssists":91, + "TotalGamesCompleted":16, "TotalGamesWon":9, - "TotalGamesLost":6, + "TotalGamesLost":7, "TotalGamesTied":0, - "TotalTimePlayed":"PT2H51M22.0376905S", + "TotalTimePlayed":"PT2H59M1.4487538S", "TotalGrenadeKills":5, "MedalAwards":[ { "MedalId":3261908037, - "Count":101 + "Count":109 }, { "MedalId":1080468863, @@ -4092,7 +4812,7 @@ }, { "MedalId":2430242797, - "Count":10 + "Count":11 }, { "MedalId":492192256, @@ -4108,7 +4828,7 @@ }, { "MedalId":3400287617, - "Count":4 + "Count":5 }, { "MedalId":4204396686, @@ -4120,7 +4840,7 @@ }, { "MedalId":2078758684, - "Count":19 + "Count":20 }, { "MedalId":3653057799, @@ -4132,7 +4852,7 @@ }, { "MedalId":1219497744, - "Count":1 + "Count":2 }, { "MedalId":92444561, @@ -4148,7 +4868,7 @@ }, { "MedalId":2380717523, - "Count":10 + "Count":11 }, { "MedalId":1326375333, @@ -4156,7 +4876,7 @@ }, { "MedalId":2028249938, - "Count":18 + "Count":20 }, { "MedalId":1792284502, @@ -4176,7 +4896,7 @@ }, { "MedalId":824733727, - "Count":5 + "Count":6 }, { "MedalId":2497544753, @@ -4253,6 +4973,10 @@ { "MedalId":194124164, "Count":1 + }, + { + "MedalId":125834251, + "Count":2 } ], "DestroyedEnemyVehicles":[ @@ -4300,7 +5024,7 @@ "TotalHeadshots":0, "TotalKills":1, "TotalDamageDealt":162.56781005859375, - "TotalPossessionTime":"PT7M4.6497S" + "TotalPossessionTime":"PT7M16.9164S" }, { "WeaponId":{ @@ -4309,12 +5033,12 @@ ] }, - "TotalShotsFired":6299, - "TotalShotsLanded":2974, - "TotalHeadshots":120, - "TotalKills":138, - "TotalDamageDealt":23585.377341270447, - "TotalPossessionTime":"PT1H32M13.6336S" + "TotalShotsFired":6618, + "TotalShotsLanded":3103, + "TotalHeadshots":128, + "TotalKills":147, + "TotalDamageDealt":24721.373618125916, + "TotalPossessionTime":"PT1H36M24.2669S" }, { "WeaponId":{ @@ -4341,7 +5065,7 @@ "TotalShotsLanded":0, "TotalHeadshots":0, "TotalKills":6, - "TotalDamageDealt":753.45865154266357, + "TotalDamageDealt":898.45865154266357, "TotalPossessionTime":"PT0S" }, { @@ -4365,11 +5089,11 @@ ] }, - "TotalShotsFired":132, - "TotalShotsLanded":87, + "TotalShotsFired":141, + "TotalShotsLanded":94, "TotalHeadshots":0, "TotalKills":5, - "TotalDamageDealt":1744.1069011688232, + "TotalDamageDealt":1793.618185043335, "TotalPossessionTime":"PT0S" }, { @@ -4398,7 +5122,7 @@ "TotalHeadshots":1, "TotalKills":3, "TotalDamageDealt":205.50002098083496, - "TotalPossessionTime":"PT7M27.6S" + "TotalPossessionTime":"PT7M29.5S" }, { "WeaponId":{ @@ -4412,7 +5136,7 @@ "TotalHeadshots":0, "TotalKills":3, "TotalDamageDealt":649.599853515625, - "TotalPossessionTime":"PT29.6833S" + "TotalPossessionTime":"PT30.6833S" }, { "WeaponId":{ @@ -4440,7 +5164,7 @@ "TotalHeadshots":0, "TotalKills":17, "TotalDamageDealt":2647.0387191772461, - "TotalPossessionTime":"PT2M59.8168S" + "TotalPossessionTime":"PT3M9.1501S" }, { "WeaponId":{ @@ -4482,7 +5206,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT19.3167S" + "TotalPossessionTime":"PT1M37.3834S" }, { "WeaponId":{ @@ -4637,6 +5361,20 @@ "TotalKills":3, "TotalDamageDealt":305.0, "TotalPossessionTime":"PT29.25S" + }, + { + "WeaponId":{ + "StockId":4028516791, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":114.04633331298828, + "TotalPossessionTime":"PT0S" } ], "Impulses":[ @@ -4646,11 +5384,11 @@ }, { "Id":4191318012, - "Count":11 + "Count":12 }, { "Id":1039658009, - "Count":8 + "Count":9 }, { "Id":3514632335, @@ -4658,7 +5396,7 @@ }, { "Id":3435524855, - "Count":7 + "Count":8 }, { "Id":2556889090, @@ -4666,18 +5404,18 @@ }, { "Id":1063951891, - "Count":10 + "Count":11 }, { "Id":2299858338, - "Count":18 + "Count":20 }, { "Id":2944278681, "Count":3 } ], - "TotalSpartanKills":219 + "TotalSpartanKills":228 }, { "FlexibleStats":{ @@ -4687,39 +5425,39 @@ "ImpulseStatCounts":[ { "Id":"7cda10c8-04c4-4916-8d6e-71a426a61de8", - "Count":11 + "Count":17 }, { "Id":"fc7095af-dec5-419f-836d-fdd27836aa65", - "Count":19 + "Count":20 }, { "Id":"0a719185-4780-4706-b9e6-f679fcbc65d6", - "Count":22 + "Count":38 }, { "Id":"6e1e4e2c-1a57-4f64-a893-f594974b3f1f", - "Count":21 + "Count":29 }, { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":166 + "Count":242 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":47 + "Count":76 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":100 + "Count":168 }, { "Id":"780104cb-5b86-4ed9-8fb1-40b919de0766", - "Count":18 + "Count":31 }, { "Id":"f12a007b-3f27-45a1-87f5-816b6aca060d", - "Count":13 + "Count":19 } ], "MedalTimelapses":[ @@ -4728,20 +5466,20 @@ "ImpulseTimelapses":[ { "Id":"a3fd8c22-a921-4662-a92b-1f7e965df8fd", - "Timelapse":"PT12M34.2998348S" + "Timelapse":"PT20M7.4584744S" }, { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT1H18M4.4685249S" + "Timelapse":"PT2H2M52.5258745S" } ] }, "GameBaseVariantId":"a2949322-dc84-45ab-8454-cf94fb28c189", - "TotalKills":166, - "TotalHeadshots":108, - "TotalWeaponDamage":22868.720367908478, - "TotalShotsFired":2415, - "TotalShotsLanded":1268, + "TotalKills":242, + "TotalHeadshots":158, + "TotalWeaponDamage":33919.241193294525, + "TotalShotsFired":3671, + "TotalShotsLanded":1875, "WeaponWithMostKills":{ "WeaponId":{ "StockId":4096745987, @@ -4749,33 +5487,33 @@ ] }, - "TotalShotsFired":1015, - "TotalShotsLanded":571, - "TotalHeadshots":70, - "TotalKills":78, - "TotalDamageDealt":10942.316074371338, - "TotalPossessionTime":"PT30M50.6671S" + "TotalShotsFired":1576, + "TotalShotsLanded":884, + "TotalHeadshots":108, + "TotalKills":120, + "TotalDamageDealt":16921.33060836792, + "TotalPossessionTime":"PT51M13.4337S" }, - "TotalMeleeKills":5, - "TotalMeleeDamage":857.0999927520752, - "TotalAssassinations":2, - "TotalGroundPoundKills":0, - "TotalGroundPoundDamage":0.0, + "TotalMeleeKills":7, + "TotalMeleeDamage":1145.1499528884888, + "TotalAssassinations":4, + "TotalGroundPoundKills":1, + "TotalGroundPoundDamage":267.74996948242187, "TotalShoulderBashKills":1, - "TotalShoulderBashDamage":400.0, - "TotalGrenadeDamage":3007.444571018219, - "TotalPowerWeaponKills":23, - "TotalPowerWeaponDamage":2564.2119884490967, - "TotalPowerWeaponGrabs":8, - "TotalPowerWeaponPossessionTime":"PT6M13.65S", - "TotalDeaths":100, - "TotalAssists":47, - "TotalGamesCompleted":13, - "TotalGamesWon":8, - "TotalGamesLost":5, + "TotalShoulderBashDamage":495.0, + "TotalGrenadeDamage":4728.9323296546936, + "TotalPowerWeaponKills":31, + "TotalPowerWeaponDamage":3842.1162853240967, + "TotalPowerWeaponGrabs":16, + "TotalPowerWeaponPossessionTime":"PT9M9.5001S", + "TotalDeaths":168, + "TotalAssists":76, + "TotalGamesCompleted":18, + "TotalGamesWon":12, + "TotalGamesLost":6, "TotalGamesTied":0, - "TotalTimePlayed":"PT1H18M4.4685249S", - "TotalGrenadeKills":10, + "TotalTimePlayed":"PT2H2M52.5258745S", + "TotalGrenadeKills":16, "MedalAwards":[ { "MedalId":2766284219, @@ -4783,67 +5521,67 @@ }, { "MedalId":3653057799, - "Count":13 + "Count":24 }, { "MedalId":2078758684, - "Count":11 + "Count":14 }, { "MedalId":2299864088, - "Count":12 + "Count":18 }, { "MedalId":3261908037, - "Count":88 + "Count":123 }, { "MedalId":2838259753, - "Count":9 + "Count":15 }, { "MedalId":164204247, - "Count":14 + "Count":20 }, { "MedalId":1080468863, - "Count":4 + "Count":6 }, { "MedalId":2028249938, - "Count":20 + "Count":28 }, { "MedalId":285057226, - "Count":2 + "Count":3 }, { "MedalId":3400287617, - "Count":9 + "Count":15 }, { "MedalId":3001183151, - "Count":3 + "Count":5 }, { "MedalId":3886151616, - "Count":7 + "Count":11 }, { "MedalId":2380717523, - "Count":17 + "Count":18 }, { "MedalId":2430242797, - "Count":7 + "Count":9 }, { "MedalId":2763748638, - "Count":1 + "Count":2 }, { "MedalId":2782465081, - "Count":7 + "Count":12 }, { "MedalId":2494364276, @@ -4851,11 +5589,11 @@ }, { "MedalId":824733727, - "Count":6 + "Count":8 }, { "MedalId":1792284502, - "Count":1 + "Count":2 }, { "MedalId":1957561936, @@ -4863,15 +5601,15 @@ }, { "MedalId":3894006667, - "Count":4 + "Count":6 }, { "MedalId":2137994204, - "Count":4 + "Count":6 }, { "MedalId":2287626681, - "Count":5 + "Count":7 }, { "MedalId":298813630, @@ -4895,11 +5633,11 @@ }, { "MedalId":3698887726, - "Count":1 + "Count":2 }, { "MedalId":3270120991, - "Count":2 + "Count":4 }, { "MedalId":1669270602, @@ -4907,10 +5645,18 @@ }, { "MedalId":1494478183, - "Count":2 + "Count":4 }, { "MedalId":848240062, + "Count":2 + }, + { + "MedalId":2564994165, + "Count":1 + }, + { + "MedalId":492192256, "Count":1 } ], @@ -4928,12 +5674,12 @@ ] }, - "TotalShotsFired":188, - "TotalShotsLanded":75, + "TotalShotsFired":191, + "TotalShotsLanded":76, "TotalHeadshots":0, "TotalKills":4, - "TotalDamageDealt":582.68570423126221, - "TotalPossessionTime":"PT5M33.2669S" + "TotalDamageDealt":590.48570442199707, + "TotalPossessionTime":"PT7M17.1671S" }, { "WeaponId":{ @@ -4942,12 +5688,12 @@ ] }, - "TotalShotsFired":1015, - "TotalShotsLanded":571, - "TotalHeadshots":70, - "TotalKills":78, - "TotalDamageDealt":10942.316074371338, - "TotalPossessionTime":"PT30M50.6671S" + "TotalShotsFired":1576, + "TotalShotsLanded":884, + "TotalHeadshots":108, + "TotalKills":120, + "TotalDamageDealt":16921.33060836792, + "TotalPossessionTime":"PT51M13.4337S" }, { "WeaponId":{ @@ -4956,12 +5702,12 @@ ] }, - "TotalShotsFired":132, - "TotalShotsLanded":75, - "TotalHeadshots":10, - "TotalKills":12, - "TotalDamageDealt":1521.5070953369141, - "TotalPossessionTime":"PT7M20.0665S" + "TotalShotsFired":218, + "TotalShotsLanded":119, + "TotalHeadshots":15, + "TotalKills":17, + "TotalDamageDealt":2304.6714363098145, + "TotalPossessionTime":"PT12M38.1833S" }, { "WeaponId":{ @@ -4970,12 +5716,12 @@ ] }, - "TotalShotsFired":494, - "TotalShotsLanded":267, - "TotalHeadshots":19, - "TotalKills":20, - "TotalDamageDealt":2482.3344650268555, - "TotalPossessionTime":"PT6M4.4831S" + "TotalShotsFired":614, + "TotalShotsLanded":335, + "TotalHeadshots":24, + "TotalKills":27, + "TotalDamageDealt":3154.8042907714844, + "TotalPossessionTime":"PT7M50.7497S" }, { "WeaponId":{ @@ -4984,11 +5730,11 @@ ] }, - "TotalShotsFired":180, - "TotalShotsLanded":37, + "TotalShotsFired":360, + "TotalShotsLanded":63, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":512.59063768386841, + "TotalKills":2, + "TotalDamageDealt":853.33742189407349, "TotalPossessionTime":"PT0S" }, { @@ -5026,12 +5772,12 @@ ] }, - "TotalShotsFired":12, + "TotalShotsFired":13, "TotalShotsLanded":11, "TotalHeadshots":0, "TotalKills":2, "TotalDamageDealt":132.92022705078125, - "TotalPossessionTime":"PT17.7S" + "TotalPossessionTime":"PT33.6167S" }, { "WeaponId":{ @@ -5040,11 +5786,11 @@ ] }, - "TotalShotsFired":129, - "TotalShotsLanded":105, + "TotalShotsFired":230, + "TotalShotsLanded":176, "TotalHeadshots":0, - "TotalKills":8, - "TotalDamageDealt":2415.7825241088867, + "TotalKills":13, + "TotalDamageDealt":3796.5234985351562, "TotalPossessionTime":"PT0S" }, { @@ -5054,7 +5800,7 @@ ] }, - "TotalShotsFired":5, + "TotalShotsFired":7, "TotalShotsLanded":3, "TotalHeadshots":0, "TotalKills":1, @@ -5071,8 +5817,8 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":8, - "TotalDamageDealt":1257.0999927520752, + "TotalKills":13, + "TotalDamageDealt":1907.8999223709106, "TotalPossessionTime":"PT0S" }, { @@ -5087,7 +5833,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT4.0499S" + "TotalPossessionTime":"PT4.8999S" }, { "WeaponId":{ @@ -5110,12 +5856,12 @@ ] }, - "TotalShotsFired":71, - "TotalShotsLanded":43, + "TotalShotsFired":80, + "TotalShotsLanded":46, "TotalHeadshots":5, "TotalKills":5, - "TotalDamageDealt":966.51762390136719, - "TotalPossessionTime":"PT2M3.4501S" + "TotalDamageDealt":1034.0176239013672, + "TotalPossessionTime":"PT2M9.4834S" }, { "WeaponId":{ @@ -5124,12 +5870,12 @@ ] }, - "TotalShotsFired":13, - "TotalShotsLanded":11, + "TotalShotsFired":17, + "TotalShotsLanded":14, "TotalHeadshots":0, - "TotalKills":9, - "TotalDamageDealt":1195.4215221405029, - "TotalPossessionTime":"PT1M53.6334S" + "TotalKills":12, + "TotalDamageDealt":1540.4215221405029, + "TotalPossessionTime":"PT2M31.1501S" }, { "WeaponId":{ @@ -5138,12 +5884,12 @@ ] }, - "TotalShotsFired":9, - "TotalShotsLanded":7, - "TotalHeadshots":0, - "TotalKills":6, - "TotalDamageDealt":592.60000610351562, - "TotalPossessionTime":"PT1M41.0666S" + "TotalShotsFired":19, + "TotalShotsLanded":15, + "TotalHeadshots":1, + "TotalKills":9, + "TotalDamageDealt":1135.5042953491211, + "TotalPossessionTime":"PT2M41.0166S" }, { "WeaponId":{ @@ -5166,12 +5912,12 @@ ] }, - "TotalShotsFired":52, - "TotalShotsLanded":17, + "TotalShotsFired":201, + "TotalShotsLanded":73, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":140.20001220703125, - "TotalPossessionTime":"PT24.3333S" + "TotalKills":4, + "TotalDamageDealt":587.38008117675781, + "TotalPossessionTime":"PT1M53.0001S" }, { "WeaponId":{ @@ -5180,12 +5926,12 @@ ] }, - "TotalShotsFired":10, - "TotalShotsLanded":6, + "TotalShotsFired":16, + "TotalShotsLanded":10, "TotalHeadshots":1, "TotalKills":1, - "TotalDamageDealt":163.0, - "TotalPossessionTime":"PT33.3166S" + "TotalDamageDealt":257.0, + "TotalPossessionTime":"PT47.5499S" }, { "WeaponId":{ @@ -5194,12 +5940,12 @@ ] }, - "TotalShotsFired":8, - "TotalShotsLanded":2, - "TotalHeadshots":1, - "TotalKills":1, - "TotalDamageDealt":172.5, - "TotalPossessionTime":"PT1M23.2333S" + "TotalShotsFired":16, + "TotalShotsLanded":5, + "TotalHeadshots":2, + "TotalKills":2, + "TotalDamageDealt":447.5, + "TotalPossessionTime":"PT2M10.5333S" }, { "WeaponId":{ @@ -5214,88 +5960,102 @@ "TotalKills":0, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":3808094875, + "Attachments":[ + + ] + }, + "TotalShotsFired":16, + "TotalShotsLanded":7, + "TotalHeadshots":0, + "TotalKills":1, + "TotalDamageDealt":115.00000762939453, + "TotalPossessionTime":"PT15.1667S" } ], "Impulses":[ { "Id":4191318012, - "Count":26 + "Count":47 }, { "Id":3174430457, - "Count":18 + "Count":31 }, { "Id":3514632335, - "Count":13 + "Count":19 }, { "Id":2556889090, - "Count":10 + "Count":16 }, { "Id":3435524855, - "Count":15 + "Count":30 }, { "Id":1039658009, - "Count":22 + "Count":38 }, { "Id":2299858338, - "Count":21 + "Count":29 }, { "Id":2944278681, - "Count":11 + "Count":17 }, { "Id":1063951891, - "Count":19 + "Count":20 }, { "Id":1408036107, "Count":1 } ], - "TotalSpartanKills":166 + "TotalSpartanKills":242 }, { "FlexibleStats":{ "MedalStatCounts":[ { "Id":"2b151d0f-cde6-4471-9f1d-d0f8e8644471", - "Count":27 + "Count":32 }, { "Id":"f0d50d01-6197-4d0d-a3a5-a86110997e40", - "Count":4 + "Count":9 }, { "Id":"dcd5ff64-4b49-4020-96d0-88ba3fb28a56", - "Count":12 + "Count":18 }, { "Id":"74365be9-d515-4229-9561-bfaac5bab089", - "Count":18 + "Count":24 } ], "ImpulseStatCounts":[ { "Id":"ba327946-418c-495d-90c0-89f084bf7447", - "Count":130 + "Count":167 }, { "Id":"7dcd7306-f905-401a-97f2-345d4b25170a", - "Count":70 + "Count":82 }, { "Id":"ea38d25f-d887-4bdf-b17b-8e8e649b9a87", - "Count":98 + "Count":108 }, { "Id":"780104cb-5b86-4ed9-8fb1-40b919de0766", - "Count":12 + "Count":17 } ], "MedalTimelapses":[ @@ -5304,16 +6064,16 @@ "ImpulseTimelapses":[ { "Id":"f1c317ee-1ac4-4089-85e8-a9c536c6cf18", - "Timelapse":"PT1H42M22.5882002S" + "Timelapse":"PT2H2M40.19065S" } ] }, "GameBaseVariantId":"b45854a7-e6e1-4a9c-9104-139934511779", - "TotalKills":132, - "TotalHeadshots":93, - "TotalWeaponDamage":22133.35178565979, - "TotalShotsFired":4596, - "TotalShotsLanded":1988, + "TotalKills":169, + "TotalHeadshots":115, + "TotalWeaponDamage":27509.237062454224, + "TotalShotsFired":5584, + "TotalShotsLanded":2461, "WeaponWithMostKills":{ "WeaponId":{ "StockId":424645655, @@ -5321,12 +6081,12 @@ ] }, - "TotalShotsFired":3786, - "TotalShotsLanded":1646, - "TotalHeadshots":73, - "TotalKills":82, - "TotalDamageDealt":13566.993070602417, - "TotalPossessionTime":"PT1H1M14.3167S" + "TotalShotsFired":4496, + "TotalShotsLanded":2008, + "TotalHeadshots":94, + "TotalKills":106, + "TotalDamageDealt":16623.944166183472, + "TotalPossessionTime":"PT1H13M13.0667S" }, "TotalMeleeKills":4, "TotalMeleeDamage":802.61614036560059, @@ -5335,23 +6095,23 @@ "TotalGroundPoundDamage":393.0, "TotalShoulderBashKills":1, "TotalShoulderBashDamage":70.0, - "TotalGrenadeDamage":2342.849723815918, - "TotalPowerWeaponKills":18, - "TotalPowerWeaponDamage":3250.2677421569824, - "TotalPowerWeaponGrabs":8, - "TotalPowerWeaponPossessionTime":"PT7M30.6001S", - "TotalDeaths":98, - "TotalAssists":70, - "TotalGamesCompleted":8, - "TotalGamesWon":6, + "TotalGrenadeDamage":2978.2108612060547, + "TotalPowerWeaponKills":24, + "TotalPowerWeaponDamage":4200.3677520751953, + "TotalPowerWeaponGrabs":9, + "TotalPowerWeaponPossessionTime":"PT10M4.7168S", + "TotalDeaths":108, + "TotalAssists":82, + "TotalGamesCompleted":10, + "TotalGamesWon":8, "TotalGamesLost":2, "TotalGamesTied":0, - "TotalTimePlayed":"PT1H42M22.5882002S", + "TotalTimePlayed":"PT2H2M40.19065S", "TotalGrenadeKills":11, "MedalAwards":[ { "MedalId":1080468863, - "Count":12 + "Count":17 }, { "MedalId":2497544753, @@ -5359,15 +6119,15 @@ }, { "MedalId":3261908037, - "Count":68 + "Count":84 }, { "MedalId":3565443938, - "Count":27 + "Count":32 }, { "MedalId":2105198095, - "Count":18 + "Count":24 }, { "MedalId":2782465081, @@ -5375,7 +6135,7 @@ }, { "MedalId":3400287617, - "Count":5 + "Count":7 }, { "MedalId":298813630, @@ -5383,7 +6143,7 @@ }, { "MedalId":1637841390, - "Count":8 + "Count":10 }, { "MedalId":762229696, @@ -5395,11 +6155,11 @@ }, { "MedalId":2838259753, - "Count":2 + "Count":3 }, { "MedalId":1351381581, - "Count":12 + "Count":18 }, { "MedalId":824733727, @@ -5407,11 +6167,11 @@ }, { "MedalId":848240062, - "Count":11 + "Count":12 }, { "MedalId":2430242797, - "Count":5 + "Count":8 }, { "MedalId":3698887726, @@ -5419,11 +6179,11 @@ }, { "MedalId":2078758684, - "Count":3 + "Count":5 }, { "MedalId":2916014239, - "Count":4 + "Count":9 }, { "MedalId":4048801324, @@ -5435,7 +6195,7 @@ }, { "MedalId":285057226, - "Count":1 + "Count":2 }, { "MedalId":3491849182, @@ -5487,11 +6247,15 @@ }, { "MedalId":1423504140, - "Count":2 + "Count":3 }, { "MedalId":352859864, "Count":1 + }, + { + "MedalId":3824002610, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -5525,12 +6289,12 @@ ] }, - "TotalShotsFired":3786, - "TotalShotsLanded":1646, - "TotalHeadshots":73, - "TotalKills":82, - "TotalDamageDealt":13566.993070602417, - "TotalPossessionTime":"PT1H1M14.3167S" + "TotalShotsFired":4496, + "TotalShotsLanded":2008, + "TotalHeadshots":94, + "TotalKills":106, + "TotalDamageDealt":16623.944166183472, + "TotalPossessionTime":"PT1H13M13.0667S" }, { "WeaponId":{ @@ -5544,7 +6308,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":70.799995422363281, - "TotalPossessionTime":"PT4M54.0835S" + "TotalPossessionTime":"PT5M42.5668S" }, { "WeaponId":{ @@ -5581,12 +6345,12 @@ ] }, - "TotalShotsFired":43, - "TotalShotsLanded":12, + "TotalShotsFired":97, + "TotalShotsLanded":39, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":297.05776977539062, - "TotalPossessionTime":"PT38.8667S" + "TotalKills":5, + "TotalDamageDealt":674.95090866088867, + "TotalPossessionTime":"PT1M26.4334S" }, { "WeaponId":{ @@ -5595,12 +6359,12 @@ ] }, - "TotalShotsFired":1, - "TotalShotsLanded":0, + "TotalShotsFired":7, + "TotalShotsLanded":4, "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT37.3334S" + "TotalKills":3, + "TotalDamageDealt":355.5, + "TotalPossessionTime":"PT1M51.3001S" }, { "WeaponId":{ @@ -5623,11 +6387,11 @@ ] }, - "TotalShotsFired":145, - "TotalShotsLanded":109, + "TotalShotsFired":170, + "TotalShotsLanded":121, "TotalHeadshots":0, "TotalKills":11, - "TotalDamageDealt":2269.3632202148437, + "TotalDamageDealt":2904.7243576049805, "TotalPossessionTime":"PT0S" }, { @@ -5665,12 +6429,12 @@ ] }, - "TotalShotsFired":34, - "TotalShotsLanded":22, - "TotalHeadshots":11, - "TotalKills":12, - "TotalDamageDealt":2106.8000030517578, - "TotalPossessionTime":"PT4M22.1499S" + "TotalShotsFired":42, + "TotalShotsLanded":26, + "TotalHeadshots":12, + "TotalKills":13, + "TotalDamageDealt":2541.8000030517578, + "TotalPossessionTime":"PT4M56.0666S" }, { "WeaponId":{ @@ -5707,8 +6471,8 @@ ] }, - "TotalShotsFired":6, - "TotalShotsLanded":5, + "TotalShotsFired":9, + "TotalShotsLanded":6, "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":73.486503601074219, @@ -5791,12 +6555,12 @@ ] }, - "TotalShotsFired":11, - "TotalShotsLanded":11, + "TotalShotsFired":139, + "TotalShotsLanded":58, "TotalHeadshots":0, - "TotalKills":0, - "TotalDamageDealt":90.200004577636719, - "TotalPossessionTime":"PT25.5334S" + "TotalKills":3, + "TotalDamageDealt":445.77989959716797, + "TotalPossessionTime":"PT1M16.2334S" }, { "WeaponId":{ @@ -5839,193 +6603,223 @@ "TotalKills":0, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":1259783693, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":0.0, + "TotalPossessionTime":"PT8.3167S" + }, + { + "WeaponId":{ + "StockId":4086418184, + "Attachments":[ + + ] + }, + "TotalShotsFired":54, + "TotalShotsLanded":16, + "TotalHeadshots":0, + "TotalKills":2, + "TotalDamageDealt":159.60000991821289, + "TotalPossessionTime":"PT46.2333S" } ], "Impulses":[ { "Id":3174430457, - "Count":12 + "Count":17 }, { "Id":2556889090, - "Count":3 + "Count":4 } ], - "TotalSpartanKills":130 + "TotalSpartanKills":167 } ], "TopGameBaseVariants":[ { "GameBaseVariantRank":1, - "NumberOfMatchesCompleted":13, + "NumberOfMatchesCompleted":15, "GameBaseVariantId":"65f033d2-1303-4748-bc26-ef62c38eced4", - "NumberOfMatchesWon":10 + "NumberOfMatchesWon":12 }, { "GameBaseVariantRank":2, - "NumberOfMatchesCompleted":8, + "NumberOfMatchesCompleted":10, "GameBaseVariantId":"b45854a7-e6e1-4a9c-9104-139934511779", - "NumberOfMatchesWon":6 + "NumberOfMatchesWon":8 }, { "GameBaseVariantRank":3, - "NumberOfMatchesCompleted":22, + "NumberOfMatchesCompleted":40, "GameBaseVariantId":"1e473914-46e4-408d-af26-178fb115de76", - "NumberOfMatchesWon":16 + "NumberOfMatchesWon":31 } ], "HighestCsrPlaylistId":"f27a65eb-2d11-4965-aa9c-daa088fa5c9c", - "TotalKills":2842, - "TotalHeadshots":1751, - "TotalWeaponDamage":367981.34492981434, - "TotalShotsFired":47174, - "TotalShotsLanded":21558, + "HighestCsrSeasonId":"2041d318-dd22-47c2-a487-2818ecf14e41", + "ArenaPlaylistStatsSeasonId":"2fcc20a0-53ff-4ffb-8f72-eebb2e419273", + "TotalKills":3964, + "TotalHeadshots":2538, + "TotalWeaponDamage":490208.42601558566, + "TotalShotsFired":64767, + "TotalShotsLanded":29181, "WeaponWithMostKills":{ "WeaponId":{ - "StockId":424645655, + "StockId":4096745987, "Attachments":[ ] }, - "TotalShotsFired":24419, - "TotalShotsLanded":11177, - "TotalHeadshots":671, - "TotalKills":763, - "TotalDamageDealt":97116.7960281372, - "TotalPossessionTime":"PT6H39M20.7837S" + "TotalShotsFired":13484, + "TotalShotsLanded":6832, + "TotalHeadshots":1082, + "TotalKills":1220, + "TotalDamageDealt":132548.79685807228, + "TotalPossessionTime":"PT9H39M55.1173S" }, - "TotalMeleeKills":80, - "TotalMeleeDamage":14518.997176527977, - "TotalAssassinations":25, - "TotalGroundPoundKills":11, - "TotalGroundPoundDamage":2296.1140327453613, - "TotalShoulderBashKills":14, - "TotalShoulderBashDamage":2445.3567771911621, - "TotalGrenadeDamage":32513.138525128365, - "TotalPowerWeaponKills":867, - "TotalPowerWeaponDamage":114736.84443664551, - "TotalPowerWeaponGrabs":109, - "TotalPowerWeaponPossessionTime":"PT6H11M17.6516S", - "TotalDeaths":1776, - "TotalAssists":759, - "TotalGamesCompleted":203, - "TotalGamesWon":126, - "TotalGamesLost":77, + "TotalMeleeKills":114, + "TotalMeleeDamage":18959.472009627149, + "TotalAssassinations":34, + "TotalGroundPoundKills":24, + "TotalGroundPoundDamage":3981.1438484191895, + "TotalShoulderBashKills":18, + "TotalShoulderBashDamage":2999.6338272094727, + "TotalGrenadeDamage":48248.983522623777, + "TotalPowerWeaponKills":991, + "TotalPowerWeaponDamage":131851.06428003311, + "TotalPowerWeaponGrabs":145, + "TotalPowerWeaponPossessionTime":"PT7H5M21.902S", + "TotalDeaths":2501, + "TotalAssists":1060, + "TotalGamesCompleted":288, + "TotalGamesWon":185, + "TotalGamesLost":103, "TotalGamesTied":0, - "TotalTimePlayed":"P1DT3H41M26.0395878S", - "TotalGrenadeKills":118, + "TotalTimePlayed":"P1DT13H49M59.8789709S", + "TotalGrenadeKills":179, "MedalAwards":[ { "MedalId":3001183151, - "Count":42 + "Count":56 }, { "MedalId":3261908037, - "Count":1268 + "Count":1975 }, { "MedalId":2966496172, - "Count":9 + "Count":10 }, { "MedalId":3653057799, - "Count":71 + "Count":98 }, { "MedalId":352859864, - "Count":31 + "Count":38 }, { "MedalId":3400287617, - "Count":96 + "Count":137 }, { "MedalId":2287626681, - "Count":51 + "Count":79 }, { "MedalId":250435527, - "Count":23 + "Count":29 }, { "MedalId":848240062, - "Count":265 + "Count":289 }, { "MedalId":2430242797, - "Count":126 + "Count":178 }, { "MedalId":466059351, - "Count":45 + "Count":59 }, { "MedalId":824733727, - "Count":79 + "Count":137 }, { "MedalId":1986137636, - "Count":32 + "Count":34 }, { "MedalId":2782465081, - "Count":110 + "Count":173 }, { "MedalId":2078758684, - "Count":244 + "Count":369 }, { "MedalId":2838259753, - "Count":87 + "Count":114 }, { "MedalId":2494364276, - "Count":12 + "Count":18 }, { "MedalId":370413844, - "Count":14 + "Count":15 }, { "MedalId":3522125871, - "Count":16 + "Count":18 }, { "MedalId":1691836029, - "Count":7 + "Count":8 }, { "MedalId":2251767925, - "Count":3 + "Count":5 }, { "MedalId":3270120991, - "Count":16 + "Count":23 }, { "MedalId":285057226, - "Count":22 + "Count":30 }, { "MedalId":2763748638, - "Count":23 + "Count":33 }, { "MedalId":1423504140, - "Count":16 + "Count":20 }, { "MedalId":3698887726, - "Count":13 + "Count":21 }, { "MedalId":298813630, - "Count":14 + "Count":18 }, { "MedalId":3925170236, - "Count":87 + "Count":92 }, { "MedalId":3486286344, @@ -6033,7 +6827,7 @@ }, { "MedalId":876932011, - "Count":39 + "Count":41 }, { "MedalId":2108880282, @@ -6041,15 +6835,15 @@ }, { "MedalId":2977773352, - "Count":28 + "Count":29 }, { "MedalId":1618319591, - "Count":10 + "Count":12 }, { "MedalId":1080468863, - "Count":88 + "Count":108 }, { "MedalId":2497544753, @@ -6057,15 +6851,15 @@ }, { "MedalId":3565443938, - "Count":94 + "Count":140 }, { "MedalId":2105198095, - "Count":54 + "Count":86 }, { "MedalId":1637841390, - "Count":15 + "Count":22 }, { "MedalId":786413504, @@ -6073,15 +6867,15 @@ }, { "MedalId":2564994165, - "Count":11 + "Count":14 }, { "MedalId":3824002610, - "Count":5 + "Count":6 }, { "MedalId":3491849182, - "Count":7 + "Count":16 }, { "MedalId":3440416044, @@ -6089,11 +6883,11 @@ }, { "MedalId":3148489433, - "Count":4 + "Count":6 }, { "MedalId":492192256, - "Count":11 + "Count":24 }, { "MedalId":4204396686, @@ -6101,23 +6895,23 @@ }, { "MedalId":2299864088, - "Count":19 + "Count":41 }, { "MedalId":1219497744, - "Count":5 + "Count":6 }, { "MedalId":92444561, - "Count":5 + "Count":6 }, { "MedalId":164204247, - "Count":16 + "Count":22 }, { "MedalId":2380717523, - "Count":27 + "Count":29 }, { "MedalId":1326375333, @@ -6125,11 +6919,11 @@ }, { "MedalId":2028249938, - "Count":43 + "Count":53 }, { "MedalId":1792284502, - "Count":3 + "Count":5 }, { "MedalId":762229696, @@ -6137,11 +6931,11 @@ }, { "MedalId":1351381581, - "Count":60 + "Count":89 }, { "MedalId":2916014239, - "Count":32 + "Count":61 }, { "MedalId":4048801324, @@ -6149,7 +6943,7 @@ }, { "MedalId":3744028405, - "Count":7 + "Count":9 }, { "MedalId":2322887852, @@ -6157,27 +6951,27 @@ }, { "MedalId":1573153198, - "Count":1 + "Count":5 }, { "MedalId":979431049, - "Count":2 + "Count":3 }, { "MedalId":2359847435, - "Count":1 + "Count":2 }, { "MedalId":3894006667, - "Count":13 + "Count":16 }, { "MedalId":1494478183, - "Count":3 + "Count":5 }, { "MedalId":2766284219, - "Count":1 + "Count":2 }, { "MedalId":2531822079, @@ -6193,7 +6987,7 @@ }, { "MedalId":3886151616, - "Count":9 + "Count":19 }, { "MedalId":1259067733, @@ -6201,11 +6995,11 @@ }, { "MedalId":1957561936, - "Count":1 + "Count":2 }, { "MedalId":2137994204, - "Count":4 + "Count":6 }, { "MedalId":1838382875, @@ -6213,11 +7007,11 @@ }, { "MedalId":3710519250, - "Count":8 + "Count":11 }, { "MedalId":317993761, - "Count":1 + "Count":2 }, { "MedalId":651116095, @@ -6225,7 +7019,7 @@ }, { "MedalId":3354395650, - "Count":2 + "Count":3 }, { "MedalId":1427531503, @@ -6249,7 +7043,7 @@ }, { "MedalId":3098362934, - "Count":2 + "Count":3 }, { "MedalId":3392925967, @@ -6257,7 +7051,7 @@ }, { "MedalId":2155964350, - "Count":2 + "Count":3 }, { "MedalId":1669270602, @@ -6265,7 +7059,7 @@ }, { "MedalId":2279899989, - "Count":3 + "Count":6 }, { "MedalId":4252521258, @@ -6278,6 +7072,18 @@ { "MedalId":3972445431, "Count":1 + }, + { + "MedalId":151853593, + "Count":1 + }, + { + "MedalId":125834251, + "Count":2 + }, + { + "MedalId":2237392606, + "Count":1 } ], "DestroyedEnemyVehicles":[ @@ -6297,7 +7103,7 @@ ] }, - "TotalKills":5 + "TotalKills":6 }, { "Enemy":{ @@ -6329,12 +7135,12 @@ ] }, - "TotalShotsFired":911, - "TotalShotsLanded":375, + "TotalShotsFired":1193, + "TotalShotsLanded":496, "TotalHeadshots":0, - "TotalKills":19, - "TotalDamageDealt":2901.926929473877, - "TotalPossessionTime":"PT1H10.7015S" + "TotalKills":24, + "TotalDamageDealt":3780.4426355361938, + "TotalPossessionTime":"PT1H15M51.451S" }, { "WeaponId":{ @@ -6343,12 +7149,12 @@ ] }, - "TotalShotsFired":8457, - "TotalShotsLanded":4347, - "TotalHeadshots":634, - "TotalKills":720, - "TotalDamageDealt":83468.538159132, - "TotalPossessionTime":"PT5H54M41.467S" + "TotalShotsFired":13484, + "TotalShotsLanded":6832, + "TotalHeadshots":1082, + "TotalKills":1220, + "TotalDamageDealt":132548.79685807228, + "TotalPossessionTime":"PT9H39M55.1173S" }, { "WeaponId":{ @@ -6358,10 +7164,10 @@ ] }, "TotalShotsFired":0, - "TotalShotsLanded":0, + "TotalShotsLanded":1, "TotalHeadshots":0, - "TotalKills":130, - "TotalDamageDealt":19260.4679864645, + "TotalKills":190, + "TotalDamageDealt":25940.249685255811, "TotalPossessionTime":"PT0S" }, { @@ -6371,12 +7177,12 @@ ] }, - "TotalShotsFired":1400, - "TotalShotsLanded":606, - "TotalHeadshots":287, - "TotalKills":357, - "TotalDamageDealt":52700.1097946167, - "TotalPossessionTime":"PT3H26M41.5839S" + "TotalShotsFired":1516, + "TotalShotsLanded":659, + "TotalHeadshots":312, + "TotalKills":389, + "TotalDamageDealt":57428.678421020508, + "TotalPossessionTime":"PT3H42M11.6843S" }, { "WeaponId":{ @@ -6385,12 +7191,12 @@ ] }, - "TotalShotsFired":24419, - "TotalShotsLanded":11177, - "TotalHeadshots":671, - "TotalKills":763, - "TotalDamageDealt":97116.7960281372, - "TotalPossessionTime":"PT6H39M20.7837S" + "TotalShotsFired":30821, + "TotalShotsLanded":13839, + "TotalHeadshots":921, + "TotalKills":1039, + "TotalDamageDealt":122780.67939901352, + "TotalPossessionTime":"PT8H28M36.1665S" }, { "WeaponId":{ @@ -6399,11 +7205,11 @@ ] }, - "TotalShotsFired":1838, - "TotalShotsLanded":1314, + "TotalShotsFired":2745, + "TotalShotsLanded":1926, "TotalHeadshots":0, - "TotalKills":87, - "TotalDamageDealt":26633.333792328835, + "TotalKills":133, + "TotalDamageDealt":38952.853030890226, "TotalPossessionTime":"PT0S" }, { @@ -6413,12 +7219,12 @@ ] }, - "TotalShotsFired":320, - "TotalShotsLanded":208, + "TotalShotsFired":410, + "TotalShotsLanded":252, "TotalHeadshots":0, - "TotalKills":33, - "TotalDamageDealt":4758.9956829547882, - "TotalPossessionTime":"PT14M53.4504S" + "TotalKills":37, + "TotalDamageDealt":5766.6466038227081, + "TotalPossessionTime":"PT19M25.667S" }, { "WeaponId":{ @@ -6427,11 +7233,11 @@ ] }, - "TotalShotsFired":126, - "TotalShotsLanded":74, + "TotalShotsFired":198, + "TotalShotsLanded":114, "TotalHeadshots":0, - "TotalKills":8, - "TotalDamageDealt":1288.4543590545654, + "TotalKills":13, + "TotalDamageDealt":1932.9301633834839, "TotalPossessionTime":"PT0S" }, { @@ -6441,12 +7247,12 @@ ] }, - "TotalShotsFired":1498, - "TotalShotsLanded":737, - "TotalHeadshots":70, - "TotalKills":85, - "TotalDamageDealt":15560.57342338562, - "TotalPossessionTime":"PT50M36.2834S" + "TotalShotsFired":1806, + "TotalShotsLanded":898, + "TotalHeadshots":89, + "TotalKills":109, + "TotalDamageDealt":18896.209585189819, + "TotalPossessionTime":"PT59M54.8832S" }, { "WeaponId":{ @@ -6455,12 +7261,12 @@ ] }, - "TotalShotsFired":128, - "TotalShotsLanded":96, - "TotalHeadshots":8, - "TotalKills":65, - "TotalDamageDealt":7494.4462881088257, - "TotalPossessionTime":"PT26M37.5999S" + "TotalShotsFired":168, + "TotalShotsLanded":134, + "TotalHeadshots":10, + "TotalKills":88, + "TotalDamageDealt":10621.263244152069, + "TotalPossessionTime":"PT35M18.7499S" }, { "WeaponId":{ @@ -6469,12 +7275,12 @@ ] }, - "TotalShotsFired":518, - "TotalShotsLanded":267, - "TotalHeadshots":32, - "TotalKills":37, - "TotalDamageDealt":7369.2180156707764, - "TotalPossessionTime":"PT26M33.3166S" + "TotalShotsFired":671, + "TotalShotsLanded":345, + "TotalHeadshots":40, + "TotalKills":47, + "TotalDamageDealt":9551.9556941986084, + "TotalPossessionTime":"PT33M17.7S" }, { "WeaponId":{ @@ -6483,12 +7289,12 @@ ] }, - "TotalShotsFired":574, - "TotalShotsLanded":175, + "TotalShotsFired":1173, + "TotalShotsLanded":392, "TotalHeadshots":0, - "TotalKills":9, - "TotalDamageDealt":1367.6211071014404, - "TotalPossessionTime":"PT18M15.45S" + "TotalKills":20, + "TotalDamageDealt":3031.4460735321045, + "TotalPossessionTime":"PT39M26.4168S" }, { "WeaponId":{ @@ -6497,11 +7303,11 @@ ] }, - "TotalShotsFired":2482, - "TotalShotsLanded":322, + "TotalShotsFired":4073, + "TotalShotsLanded":498, "TotalHeadshots":0, - "TotalKills":23, - "TotalDamageDealt":4591.3503737449646, + "TotalKills":33, + "TotalDamageDealt":7363.2003283500671, "TotalPossessionTime":"PT0S" }, { @@ -6511,12 +7317,12 @@ ] }, - "TotalShotsFired":144, - "TotalShotsLanded":104, + "TotalShotsFired":175, + "TotalShotsLanded":130, "TotalHeadshots":0, - "TotalKills":73, - "TotalDamageDealt":7440.5479469299316, - "TotalPossessionTime":"PT17M20.017S" + "TotalKills":92, + "TotalDamageDealt":9608.2614402771, + "TotalPossessionTime":"PT23M16.7671S" }, { "WeaponId":{ @@ -6539,12 +7345,12 @@ ] }, - "TotalShotsFired":136, - "TotalShotsLanded":50, + "TotalShotsFired":190, + "TotalShotsLanded":77, "TotalHeadshots":0, - "TotalKills":3, - "TotalDamageDealt":1122.5873692035675, - "TotalPossessionTime":"PT1M53.7333S" + "TotalKills":7, + "TotalDamageDealt":1500.4805080890656, + "TotalPossessionTime":"PT2M41.3S" }, { "WeaponId":{ @@ -6553,12 +7359,12 @@ ] }, - "TotalShotsFired":783, - "TotalShotsLanded":398, - "TotalHeadshots":33, - "TotalKills":38, - "TotalDamageDealt":5335.14132976532, - "TotalPossessionTime":"PT17M0.5667S" + "TotalShotsFired":1227, + "TotalShotsLanded":632, + "TotalHeadshots":49, + "TotalKills":60, + "TotalDamageDealt":8439.9246768951416, + "TotalPossessionTime":"PT26M30.5669S" }, { "WeaponId":{ @@ -6595,12 +7401,12 @@ ] }, - "TotalShotsFired":1001, - "TotalShotsLanded":102, + "TotalShotsFired":1191, + "TotalShotsLanded":133, "TotalHeadshots":0, - "TotalKills":20, - "TotalDamageDealt":3744.3737201690674, - "TotalPossessionTime":"PT6M34.5001S" + "TotalKills":24, + "TotalDamageDealt":4067.7148151397705, + "TotalPossessionTime":"PT7M46.2668S" }, { "WeaponId":{ @@ -6614,7 +7420,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT52.366S" + "TotalPossessionTime":"PT1M23.7828S" }, { "WeaponId":{ @@ -6623,12 +7429,12 @@ ] }, - "TotalShotsFired":522, - "TotalShotsLanded":432, + "TotalShotsFired":554, + "TotalShotsLanded":461, "TotalHeadshots":0, - "TotalKills":244, - "TotalDamageDealt":29949.171396017075, - "TotalPossessionTime":"PT1H13M51.2337S" + "TotalKills":262, + "TotalDamageDealt":31951.454309225082, + "TotalPossessionTime":"PT1H20M50.2504S" }, { "WeaponId":{ @@ -6651,12 +7457,12 @@ ] }, - "TotalShotsFired":206, - "TotalShotsLanded":119, - "TotalHeadshots":16, - "TotalKills":20, - "TotalDamageDealt":2384.2904262542725, - "TotalPossessionTime":"PT17M55.4331S" + "TotalShotsFired":466, + "TotalShotsLanded":248, + "TotalHeadshots":35, + "TotalKills":40, + "TotalDamageDealt":4884.5697088241577, + "TotalPossessionTime":"PT30M42.3664S" }, { "WeaponId":{ @@ -6670,7 +7476,7 @@ "TotalHeadshots":0, "TotalKills":5, "TotalDamageDealt":702.99985504150391, - "TotalPossessionTime":"PT37.1666S" + "TotalPossessionTime":"PT38.1666S" }, { "WeaponId":{ @@ -6698,7 +7504,7 @@ "TotalHeadshots":0, "TotalKills":0, "TotalDamageDealt":0.0, - "TotalPossessionTime":"PT19.3167S" + "TotalPossessionTime":"PT1M45.7001S" }, { "WeaponId":{ @@ -6707,12 +7513,12 @@ ] }, - "TotalShotsFired":214, - "TotalShotsLanded":69, + "TotalShotsFired":299, + "TotalShotsLanded":109, "TotalHeadshots":0, - "TotalKills":5, - "TotalDamageDealt":689.78935623168945, - "TotalPossessionTime":"PT1M42.4834S" + "TotalKills":7, + "TotalDamageDealt":1084.9469242095947, + "TotalPossessionTime":"PT2M28.3S" }, { "WeaponId":{ @@ -6721,12 +7527,12 @@ ] }, - "TotalShotsFired":200, - "TotalShotsLanded":132, + "TotalShotsFired":324, + "TotalShotsLanded":186, "TotalHeadshots":0, - "TotalKills":16, - "TotalDamageDealt":2015.1234741210937, - "TotalPossessionTime":"PT4M43.4667S" + "TotalKills":19, + "TotalDamageDealt":2414.7697792053223, + "TotalPossessionTime":"PT6M55.7667S" }, { "WeaponId":{ @@ -6735,12 +7541,12 @@ ] }, - "TotalShotsFired":256, - "TotalShotsLanded":86, + "TotalShotsFired":560, + "TotalShotsLanded":221, "TotalHeadshots":0, - "TotalKills":10, - "TotalDamageDealt":1104.8437461853027, - "TotalPossessionTime":"PT4M13.6166S" + "TotalKills":25, + "TotalDamageDealt":2929.4445285797119, + "TotalPossessionTime":"PT7M51.5833S" }, { "WeaponId":{ @@ -6766,9 +7572,9 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":40, - "TotalDamageDealt":4350.6670837402344, - "TotalPossessionTime":"PT11M59.85S" + "TotalKills":42, + "TotalDamageDealt":4580.6670837402344, + "TotalPossessionTime":"PT14M21.3832S" }, { "WeaponId":{ @@ -6780,7 +7586,7 @@ "TotalShotsFired":0, "TotalShotsLanded":0, "TotalHeadshots":0, - "TotalKills":8, + "TotalKills":10, "TotalDamageDealt":0.0, "TotalPossessionTime":"PT0S" }, @@ -6791,12 +7597,12 @@ ] }, - "TotalShotsFired":12, - "TotalShotsLanded":9, + "TotalShotsFired":66, + "TotalShotsLanded":25, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":275.0, - "TotalPossessionTime":"PT36.3666S" + "TotalKills":3, + "TotalDamageDealt":434.60000991821289, + "TotalPossessionTime":"PT1M22.5999S" }, { "WeaponId":{ @@ -6833,12 +7639,12 @@ ] }, - "TotalShotsFired":19, - "TotalShotsLanded":5, + "TotalShotsFired":49, + "TotalShotsLanded":18, "TotalHeadshots":0, - "TotalKills":1, - "TotalDamageDealt":27.500001907348633, - "TotalPossessionTime":"PT12.8667S" + "TotalKills":2, + "TotalDamageDealt":107.4999942779541, + "TotalPossessionTime":"PT28.6333S" }, { "WeaponId":{ @@ -6847,62 +7653,90 @@ ] }, - "TotalShotsFired":6, - "TotalShotsLanded":6, + "TotalShotsFired":14, + "TotalShotsLanded":14, "TotalHeadshots":0, "TotalKills":3, - "TotalDamageDealt":270.79400634765625, - "TotalPossessionTime":"PT51.75S" + "TotalDamageDealt":430.29903411865234, + "TotalPossessionTime":"PT1M28.95S" + }, + { + "WeaponId":{ + "StockId":4028516791, + "Attachments":[ + + ] + }, + "TotalShotsFired":0, + "TotalShotsLanded":0, + "TotalHeadshots":0, + "TotalKills":0, + "TotalDamageDealt":114.04633331298828, + "TotalPossessionTime":"PT0S" + }, + { + "WeaponId":{ + "StockId":2140505068, + "Attachments":[ + + ] + }, + "TotalShotsFired":390, + "TotalShotsLanded":193, + "TotalHeadshots":0, + "TotalKills":2, + "TotalDamageDealt":984.49371337890625, + "TotalPossessionTime":"PT1M38.0167S" } ], "Impulses":[ { "Id":3174430457, - "Count":178 + "Count":230 }, { "Id":2556889090, - "Count":119 + "Count":154 }, { "Id":1408036107, - "Count":14 + "Count":16 }, { "Id":4191318012, - "Count":58 + "Count":121 }, { "Id":1039658009, - "Count":48 + "Count":100 }, { "Id":3514632335, - "Count":20 + "Count":42 }, { "Id":3435524855, - "Count":32 + "Count":65 }, { "Id":1063951891, - "Count":29 + "Count":31 }, { "Id":2299858338, - "Count":44 + "Count":54 }, { "Id":3060032974, - "Count":79 + "Count":153 }, { "Id":3930101026, - "Count":18 + "Count":39 }, { "Id":540014008, - "Count":55 + "Count":113 }, { "Id":4040349679, @@ -6910,29 +7744,29 @@ }, { "Id":415845940, - "Count":27 + "Count":53 }, { "Id":2512065773, - "Count":13 + "Count":20 }, { "Id":938151029, - "Count":3 + "Count":7 }, { "Id":2944278681, - "Count":22 + "Count":35 } ], - "TotalSpartanKills":2810 + "TotalSpartanKills":3922 }, "PlayerId":{ "Gamertag":"Furiousn00b", "Xuid":null }, - "SpartanRank":38, - "Xp":524903 + "SpartanRank":49, + "Xp":814348 } } ], diff --git a/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.schema.json b/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.schema.json index d8fe7ee..d85c2d5 100644 --- a/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.schema.json +++ b/Source/HaloSharp.Test/JSON/Stats/Lifetime/arena-service-record.schema.json @@ -170,6 +170,9 @@ "$ref": "#/definitions/ArenaPlaylistStat" } }, + "ArenaPlaylistStatsSeasonId": { + "type": ["null", "string"] + }, "HighestCsrAttained": { "$ref": "../common/competitive-skill-ranking.schema.json" }, @@ -187,6 +190,9 @@ }, "HighestCsrPlaylistId": { "type": "string" + }, + "HighestCsrSeasonId": { + "type": ["null", "string"] } }, "required": [ @@ -224,10 +230,12 @@ "TotalSpartanKills", "ArenaPlaylistStats", + "ArenaPlaylistStatsSeasonId", "HighestCsrAttained", "ArenaGameBaseVariantStats", "TopGameBaseVariants", - "HighestCsrPlaylistId" + "HighestCsrPlaylistId", + "HighestCsrSeasonId" ] }, "ArenaPlaylistStat": { diff --git a/Source/HaloSharp.Test/Properties/AssemblyInfo.cs b/Source/HaloSharp.Test/Properties/AssemblyInfo.cs index f5718c6..cd16098 100644 --- a/Source/HaloSharp.Test/Properties/AssemblyInfo.cs +++ b/Source/HaloSharp.Test/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/Source/HaloSharp.Test/Query/Metadata/GetGameVariantTests.cs b/Source/HaloSharp.Test/Query/Metadata/GetGameVariantTests.cs index 21da2d0..63a4e66 100644 --- a/Source/HaloSharp.Test/Query/Metadata/GetGameVariantTests.cs +++ b/Source/HaloSharp.Test/Query/Metadata/GetGameVariantTests.cs @@ -58,7 +58,8 @@ public void GetConstructedUri_ForGameVariantId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetGameVariant(); + var query = new GetGameVariant() + .ForGameVariantId(Guid.Empty); var result = await _mockSession.Query(query); @@ -157,24 +158,14 @@ public async Task GetGameVariant_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetGameVariant_MissingGuid() { var query = new GetGameVariant() .SkipCache(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int) Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Metadata/GetMapVariantTests.cs b/Source/HaloSharp.Test/Query/Metadata/GetMapVariantTests.cs index bc7c77e..61c37c4 100644 --- a/Source/HaloSharp.Test/Query/Metadata/GetMapVariantTests.cs +++ b/Source/HaloSharp.Test/Query/Metadata/GetMapVariantTests.cs @@ -58,7 +58,8 @@ public void GetConstructedUri_ForMapVariantId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetMapVariant(); + var query = new GetMapVariant() + .ForMapVariantId(Guid.Empty); var result = await _mockSession.Query(query); @@ -157,24 +158,15 @@ public async Task GetMapVariant_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetMapVariant_MissingGuid() { var query = new GetMapVariant() .SkipCache(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int) Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Metadata/GetRequisitionPackTests.cs b/Source/HaloSharp.Test/Query/Metadata/GetRequisitionPackTests.cs index 8d69289..228629f 100644 --- a/Source/HaloSharp.Test/Query/Metadata/GetRequisitionPackTests.cs +++ b/Source/HaloSharp.Test/Query/Metadata/GetRequisitionPackTests.cs @@ -61,7 +61,8 @@ public void GetConstructedUri_ForRequisitionPackId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetRequisitionPack(); + var query = new GetRequisitionPack() + .ForRequisitionPackId(Guid.Empty); var result = await _mockSession.Query(query); @@ -172,24 +173,14 @@ public async Task GetRequisitionPack_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetRequisitionPack_MissingGuid() { var query = new GetRequisitionPack() .SkipCache(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Metadata/GetRequisitionTests.cs b/Source/HaloSharp.Test/Query/Metadata/GetRequisitionTests.cs index 0c660ba..0bf9e44 100644 --- a/Source/HaloSharp.Test/Query/Metadata/GetRequisitionTests.cs +++ b/Source/HaloSharp.Test/Query/Metadata/GetRequisitionTests.cs @@ -56,12 +56,10 @@ public void GetConstructedUri_ForRequisitionId_MatchesExpected(string guid) } [Test] - [TestCase("a23a896d-57e6-45c3-970b-27550f0e7184")] - public async Task Query_DoesNotThrow(string guid) + public async Task Query_DoesNotThrow() { var query = new GetRequisition() - .ForRequisitionId(new Guid(guid)) - .SkipCache(); + .ForRequisitionId(Guid.Empty); var result = await _mockSession.Query(query); @@ -160,24 +158,14 @@ public async Task GetRequisition_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetRequisition_MissingGuid() { var query = new GetRequisition() .SkipCache(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int) Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Profile/GetEmblemImageTests.cs b/Source/HaloSharp.Test/Query/Profile/GetEmblemImageTests.cs index 270595d..5ffced9 100644 --- a/Source/HaloSharp.Test/Query/Profile/GetEmblemImageTests.cs +++ b/Source/HaloSharp.Test/Query/Profile/GetEmblemImageTests.cs @@ -111,68 +111,38 @@ public async Task GetEmblemImage_IsSerializable(string gamertag) [TestCase(189)] [TestCase(255)] [TestCase(511)] + [ExpectedException(typeof(ValidationException))] public async Task GetEmblemImage_InvalidSize(int size) { var query = new GetEmblemImage() .ForPlayer("Furiousn00b") .Size(size); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetEmblemImage_InvalidGamertag(string gamertag) { var query = new GetEmblemImage() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetEmblemImage_MissingGamertag() { var query = new GetEmblemImage(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Profile/GetSpartanImageTests.cs b/Source/HaloSharp.Test/Query/Profile/GetSpartanImageTests.cs index 39a33b5..8fe4d0f 100644 --- a/Source/HaloSharp.Test/Query/Profile/GetSpartanImageTests.cs +++ b/Source/HaloSharp.Test/Query/Profile/GetSpartanImageTests.cs @@ -137,48 +137,38 @@ public async Task GetSpartanImage_IsSerializable(string gamertag) [TestCase(189)] [TestCase(255)] [TestCase(511)] + [ExpectedException(typeof(ValidationException))] public async Task GetSpartanImage_InvalidSize(int size) { var query = new GetSpartanImage() .ForPlayer("Furiousn00b") .Size(size); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetSpartanImage_InvalidGamertag(string gamertag) { var query = new GetSpartanImage() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); + } + + [Test] + [ExpectedException(typeof(ValidationException))] + public async Task GetSpartanImage_MissingGamertag() + { + var query = new GetSpartanImage(); + + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetArenaMatchDetailsTests.cs b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetArenaMatchDetailsTests.cs index 51dea35..e3a6357 100644 --- a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetArenaMatchDetailsTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetArenaMatchDetailsTests.cs @@ -58,7 +58,8 @@ public void GetConstructedUri_ForMatchId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetArenaMatchDetails(); + var query = new GetArenaMatchDetails() + .ForMatchId(Guid.Empty); var result = await _mockSession.Query(query); @@ -152,23 +153,13 @@ public async Task GetArenaMatchDetails_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetArenaMatchDetails_MissingGuid() { var query = new GetArenaMatchDetails(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCampaignMatchDetailsTests.cs b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCampaignMatchDetailsTests.cs index 349b6eb..4481a54 100644 --- a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCampaignMatchDetailsTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCampaignMatchDetailsTests.cs @@ -58,7 +58,8 @@ public void GetConstructedUri_ForMatchId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetCampaignMatchDetails(); + var query = new GetCampaignMatchDetails() + .ForMatchId(Guid.Empty); var result = await _mockSession.Query(query); @@ -152,23 +153,13 @@ public async Task GetCampaignMatchDetails_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetCampaignMatchDetails_MissingGuid() { var query = new GetCampaignMatchDetails(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCustomMatchDetailsTests.cs b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCustomMatchDetailsTests.cs index 5b0ac07..19e0cd3 100644 --- a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCustomMatchDetailsTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetCustomMatchDetailsTests.cs @@ -58,7 +58,8 @@ public void GetConstructedUri_ForMatchId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetCustomMatchDetails(); + var query = new GetCustomMatchDetails() + .ForMatchId(Guid.Empty); var result = await _mockSession.Query(query); @@ -152,23 +153,13 @@ public async Task GetCustomMatchDetails_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetCustomMatchDetails_MissingGuid() { var query = new GetCustomMatchDetails(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetWarzoneMatchDetailsTests.cs b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetWarzoneMatchDetailsTests.cs index 5e1742a..cef9ba2 100644 --- a/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetWarzoneMatchDetailsTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/CarnageReport/GetWarzoneMatchDetailsTests.cs @@ -58,7 +58,8 @@ public void GetConstructedUri_ForMatchId_MatchesExpected(string guid) [Test] public async Task Query_DoesNotThrow() { - var query = new GetWarzoneMatchDetails(); + var query = new GetWarzoneMatchDetails() + .ForMatchId(Guid.Empty); var result = await _mockSession.Query(query); @@ -152,23 +153,13 @@ public async Task GetWarzoneMatchDetails_InvalidGuid(string guid) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetWarzoneMatchDetails_MissingGuid() { var query = new GetWarzoneMatchDetails(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/GetMatchesTests.cs b/Source/HaloSharp.Test/Query/Stats/GetMatchesTests.cs index c0e117f..c63d612 100644 --- a/Source/HaloSharp.Test/Query/Stats/GetMatchesTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/GetMatchesTests.cs @@ -128,7 +128,8 @@ public void GetConstructedUri_Complex_MatchesExpected(string gamertag, Enumerati [Test] public async Task Query_DoesNotThrow() { - var query = new GetMatches(); + var query = new GetMatches() + .ForPlayer("Player"); var result = await _mockSession.Query(query); @@ -204,46 +205,26 @@ public async Task GetMatches_IsSerializable(string gamertag) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetMatches_MissingPlayer() { var query = new GetMatches(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetMatches_InvalidGamertag(string gamertag) { var query = new GetMatches() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetArenaServiceRecordTests.cs b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetArenaServiceRecordTests.cs index 221f866..95a47ed 100644 --- a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetArenaServiceRecordTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetArenaServiceRecordTests.cs @@ -69,6 +69,33 @@ public void GetConstructedUri_ForPlayers_MatchesExpected(string gamertag, string Assert.AreEqual($"stats/h5/servicerecords/arena?players={gamertag},{gamertag2}", uri); } + [Test] + [TestCase("2041d318-dd22-47c2-a487-2818ecf14e41")] + [TestCase("2fcc20a0-53ff-4ffb-8f72-eebb2e419273")] + public void GetConstructedUri_ForSeasonId_MatchesExpected(string guid) + { + var query = new GetArenaServiceRecord() + .ForSeasonId(new Guid(guid)); + + var uri = query.GetConstructedUri(); + + Assert.AreEqual($"stats/h5/servicerecords/arena?seasonId={guid}", uri); + } + + [Test] + [TestCase("Furiousn00b", "2041d318-dd22-47c2-a487-2818ecf14e41")] + [TestCase("Greenskull", "2fcc20a0-53ff-4ffb-8f72-eebb2e419273")] + public void GetConstructedUri_Complex_MatchesExpected(string gamertag, string guid) + { + var query = new GetArenaServiceRecord() + .ForPlayer(gamertag) + .ForSeasonId(new Guid(guid)); + + var uri = query.GetConstructedUri(); + + Assert.AreEqual($"stats/h5/servicerecords/arena?players={gamertag}&seasonId={guid}", uri); + } + [Test] [TestCase("Greenskull")] [TestCase("Furiousn00b")] @@ -85,7 +112,8 @@ public async Task GetArenaServiceRecord(string gamertag) [Test] public async Task Query_DoesNotThrow() { - var query = new GetArenaServiceRecord(); + var query = new GetArenaServiceRecord() + .ForPlayer("Player"); var result = await _mockSession.Query(query); @@ -161,46 +189,27 @@ public async Task GetArenaServiceRecord_IsSerializable(string gamertag) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetArenaServiceRecord_MissingPlayer() { var query = new GetArenaServiceRecord(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetArenaServiceRecord_InvalidGamertag(string gamertag) { var query = new GetArenaServiceRecord() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCampaignServiceRecordTests.cs b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCampaignServiceRecordTests.cs index 6fa657f..65ba5ba 100644 --- a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCampaignServiceRecordTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCampaignServiceRecordTests.cs @@ -85,7 +85,8 @@ public async Task GetCampaignServiceRecord(string gamertag) [Test] public async Task Query_DoesNotThrow() { - var query = new GetCampaignServiceRecord(); + var query = new GetCampaignServiceRecord() + .ForPlayer("Player"); var result = await _mockSession.Query(query); @@ -161,46 +162,26 @@ public async Task GetCampaignServiceRecord_IsSerializable(string gamertag) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetCampaignServiceRecord_MissingPlayer() { var query = new GetCampaignServiceRecord(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetCampaignServiceRecord_InvalidGamertag(string gamertag) { var query = new GetCampaignServiceRecord() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCustomServiceRecordTests.cs b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCustomServiceRecordTests.cs index f2d461c..fa72138 100644 --- a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCustomServiceRecordTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetCustomServiceRecordTests.cs @@ -85,7 +85,8 @@ public async Task GetCustomServiceRecord(string gamertag) [Test] public async Task Query_DoesNotThrow() { - var query = new GetCustomServiceRecord(); + var query = new GetCustomServiceRecord() + .ForPlayer("Player"); var result = await _mockSession.Query(query); @@ -161,46 +162,26 @@ public async Task GetCustomServiceRecord_IsSerializable(string gamertag) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetCustomServiceRecord_MissingPlayer() { var query = new GetCustomServiceRecord(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetCustomServiceRecord_InvalidGamertag(string gamertag) { var query = new GetCustomServiceRecord() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetWarzoneServiceRecordTests.cs b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetWarzoneServiceRecordTests.cs index 2fdf54d..479446c 100644 --- a/Source/HaloSharp.Test/Query/Stats/Lifetime/GetWarzoneServiceRecordTests.cs +++ b/Source/HaloSharp.Test/Query/Stats/Lifetime/GetWarzoneServiceRecordTests.cs @@ -85,7 +85,8 @@ public async Task GetWarzoneServiceRecord(string gamertag) [Test] public async Task Query_DoesNotThrow() { - var query = new GetWarzoneServiceRecord(); + var query = new GetWarzoneServiceRecord() + .ForPlayer("Player"); var result = await _mockSession.Query(query); @@ -161,46 +162,26 @@ public async Task GetWarzoneServiceRecord_IsSerializable(string gamertag) } [Test] + [ExpectedException(typeof(ValidationException))] public async Task GetWarzoneServiceRecord_MissingPlayer() { var query = new GetWarzoneServiceRecord(); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.NotFound, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } [Test] [TestCase("00000000000000017")] [TestCase("!$%")] + [ExpectedException(typeof(ValidationException))] public async Task GetWarzoneServiceRecord_InvalidGamertag(string gamertag) { var query = new GetWarzoneServiceRecord() .ForPlayer(gamertag); - try - { - await Global.Session.Query(query); - Assert.Fail("An exception should have been thrown"); - } - catch (HaloApiException e) - { - Assert.AreEqual((int)Enumeration.StatusCode.BadRequest, e.HaloApiError.StatusCode); - } - catch (System.Exception e) - { - Assert.Fail("Unexpected exception of type {0} caught: {1}", e.GetType(), e.Message); - } + await Global.Session.Query(query); + Assert.Fail("An exception should have been thrown"); } } } \ No newline at end of file diff --git a/Source/HaloSharp/Exception/HaloApiException.cs b/Source/HaloSharp/Exception/HaloApiException.cs index 8a88ce6..1612228 100644 --- a/Source/HaloSharp/Exception/HaloApiException.cs +++ b/Source/HaloSharp/Exception/HaloApiException.cs @@ -4,7 +4,7 @@ namespace HaloSharp.Exception { public class HaloApiException : System.Exception { - public HaloApiError HaloApiError { get; set; } + public HaloApiError HaloApiError { get; private set; } public HaloApiException(HaloApiError haloApiError) { diff --git a/Source/HaloSharp/Exception/ValidationException.cs b/Source/HaloSharp/Exception/ValidationException.cs new file mode 100644 index 0000000..f17deb2 --- /dev/null +++ b/Source/HaloSharp/Exception/ValidationException.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using HaloSharp.Model.Error; + +namespace HaloSharp.Exception +{ + public class ValidationException : System.Exception + { + public ValidationError ValidationError { get; private set; } + + public ValidationException(ValidationError validationError) + { + ValidationError = validationError; + } + + public ValidationException(List messages) + { + ValidationError = new ValidationError + { + Messages = messages + }; + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/HaloSession.cs b/Source/HaloSharp/HaloSession.cs index 4f32e1e..367f919 100644 --- a/Source/HaloSharp/HaloSession.cs +++ b/Source/HaloSharp/HaloSession.cs @@ -115,7 +115,7 @@ public void Dispose() GC.SuppressFinalize(this); } - protected virtual void Dispose(bool isDisposing) + private void Dispose(bool isDisposing) { if (!_isDisposed) { diff --git a/Source/HaloSharp/HaloSharp.csproj b/Source/HaloSharp/HaloSharp.csproj index 2c1c8d6..80010bb 100644 --- a/Source/HaloSharp/HaloSharp.csproj +++ b/Source/HaloSharp/HaloSharp.csproj @@ -49,6 +49,7 @@ + @@ -57,6 +58,7 @@ + @@ -109,6 +111,7 @@ + @@ -142,6 +145,22 @@ + + + + + + + + + + + + + + + + diff --git a/Source/HaloSharp/Model/Enumeration.cs b/Source/HaloSharp/Model/Enumeration.cs index a3e0fe7..812f0fd 100644 --- a/Source/HaloSharp/Model/Enumeration.cs +++ b/Source/HaloSharp/Model/Enumeration.cs @@ -22,12 +22,12 @@ public enum CommendationType public enum CompetitiveSkillRankingDesignation { Bronze = 1, - Silver = 1, - Gold = 1, - Platinum = 1, - Diamond = 1, - Onyx = 1, - Champion = 1 + Silver = 2, + Gold = 3, + Platinum = 4, + Diamond = 5, + Onyx = 6, + Champion = 7 } public enum CreditsEarnedResultType diff --git a/Source/HaloSharp/Model/Error/ValidationError.cs b/Source/HaloSharp/Model/Error/ValidationError.cs new file mode 100644 index 0000000..84cab51 --- /dev/null +++ b/Source/HaloSharp/Model/Error/ValidationError.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace HaloSharp.Model.Error +{ + public class ValidationError + { + public List Messages { get; set; } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Model/Metadata/CampaignMission.cs b/Source/HaloSharp/Model/Metadata/CampaignMission.cs index f245fb2..684c19c 100644 --- a/Source/HaloSharp/Model/Metadata/CampaignMission.cs +++ b/Source/HaloSharp/Model/Metadata/CampaignMission.cs @@ -7,24 +7,53 @@ namespace HaloSharp.Model.Metadata [Serializable] public class CampaignMission : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies this campaign mission. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// An image that is used as the background art for this mission. + /// [JsonProperty(PropertyName = "imageUrl")] public string ImageUrl { get; set; } + /// + /// The order of the mission in the story. The first mission is #1. + /// [JsonProperty(PropertyName = "missionNumber")] public int MissionNumber { get; set; } + /// + /// A localized name suitable for display. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// The team for the mission. One of the following values: + /// + /// + /// BlueTeam + /// + /// + /// OsirisTeam + /// + /// + /// [JsonProperty(PropertyName = "type")] [JsonConverter(typeof(StringEnumConverter))] public Enumeration.CampaignMissionType Type { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Commendation.cs b/Source/HaloSharp/Model/Metadata/Commendation.cs index d30cf58..313ed67 100644 --- a/Source/HaloSharp/Model/Metadata/Commendation.cs +++ b/Source/HaloSharp/Model/Metadata/Commendation.cs @@ -10,33 +10,80 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Commendation : IEquatable { + /// + /// Information about how this commendation should be categorized when shown to users. + /// [JsonProperty(PropertyName = "category")] public Category Category { get; set; } + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// An image that is used as the icon for this commendation. + /// [JsonProperty(PropertyName = "iconImageUrl")] public string IconImageUrl { get; set; } + /// + /// The ID that uniquely identifies this commendation. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// One or more levels that model what a player must do to earn rewards and complete the commendation. + /// [JsonProperty(PropertyName = "levels")] public List Levels { get; set; } + /// + /// A localized name for the commendation, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// For meta commendations, the commendation is considered "completed" when all required levels have been + /// "completed". This list contains one or more Level Ids from other commendations.For progressive + /// commendations, this list is empty. + /// [JsonProperty(PropertyName = "requiredLevels")] public List RequiredLevels { get; set; } + /// + /// The reward the player will receive for earning this commendation. + /// [JsonProperty(PropertyName = "reward")] public Reward Reward { get; set; } + /// + /// Indicates the type of commendation. This is one of the two following options: + /// + /// + /// Progressive + /// + /// + /// Meta + /// + /// + /// Daily + /// + /// + /// Progressive commendations have a series of increasingly difficult thresholds(levels) a player must cross to + /// receive increasingly greater rewards.Meta commendations are unlocked when a player has completed one or + /// more other commendation levels.We model this by giving meta commendations one level with dependencies + /// rather than a threshold. + /// [JsonProperty(PropertyName = "type")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.CommendationType Type { get; set; } @@ -117,15 +164,27 @@ public override int GetHashCode() [Serializable] public class Level : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The ID that uniquely identifies this commendation level. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// The reward the player will receive for earning this level. + /// [JsonProperty(PropertyName = "reward")] public Reward Reward { get; set; } + /// + /// For progressive commendations this indicates the threshold that the player must meet or exceed to consider the commendation level "completed". For meta commendations, this value is always zero. + /// [JsonProperty(PropertyName = "threshold")] public int Threshold { get; set; } @@ -193,12 +252,21 @@ public override int GetHashCode() [Serializable] public class RequiredLevel : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The ID of the commendation level that must be met in order to consider the level requirement met. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// The threshold that the player must meet or exceed in order to consider the level requirement met. + /// [JsonProperty(PropertyName = "threshold")] public int Threshold { get; set; } @@ -264,18 +332,35 @@ public override int GetHashCode() [Serializable] public class Category : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// An image that is used as the icon for this category. + /// [JsonProperty(PropertyName = "iconImageUrl")] public string IconImageUrl { get; set; } + /// + /// The ID that uniquely identifies this category. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// A localized name for the category, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// Internal use. The order in which the category should be displayed relative to other categories. The lower + /// the value, the more important the category - more important categories should be shownbefore or ahead of + /// less important categories. + /// [JsonProperty(PropertyName = "order")] public int Order { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Common/RequisitionPack.cs b/Source/HaloSharp/Model/Metadata/Common/RequisitionPack.cs index 6a323eb..9768b2e 100644 --- a/Source/HaloSharp/Model/Metadata/Common/RequisitionPack.cs +++ b/Source/HaloSharp/Model/Metadata/Common/RequisitionPack.cs @@ -9,58 +9,145 @@ namespace HaloSharp.Model.Metadata.Common [Serializable] public class RequisitionPack : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// If the pack is purchasable via credits, this value contains the number of credits a player must spend to + /// acquire one pack.This value is zero when isPurchasableWithCredits is false. + /// [JsonProperty(PropertyName = "creditPrice")] public int CreditPrice { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// Internal use. Indicates the visual treatment of the pack. This is one of the following options: + /// + /// + /// None + /// + /// + /// New + /// + /// + /// Hot + /// + /// + /// LeavingSoon + /// + /// + /// MaximumValue + /// + /// + /// Limitedtime + /// + /// + /// Featured + /// + /// + /// BestSeller + /// + /// + /// Popular + /// + /// + /// [JsonProperty(PropertyName = "flair")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.RequisitionPackType? Flair { get; set; } + /// + /// The ID that uniquely identifies this pack. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// Internal use. Whether the item should be featured ahead of others. + /// [JsonProperty(PropertyName = "isFeatured")] public bool IsFeatured { get; set; } + /// + /// Internal use. Whether the item should be labeled as "new!" + /// [JsonProperty(PropertyName = "isNew")] public bool IsNew { get; set; } + /// + /// If the pack might be obtainable through the Xbox Live Marketplace, then this value is true. + /// [JsonProperty(PropertyName = "isPurchasableFromMarketplace")] public bool IsPurchasableFromMarketplace { get; set; } + /// + /// If the pack is currently available for purchase by spending credits, then this value is true. + /// [JsonProperty(PropertyName = "isPurchasableWithCredits")] public bool IsPurchasableWithCredits { get; set; } + /// + /// //TODO + /// [JsonProperty(PropertyName = "isStack")] public bool IsStack { get; set; } + /// + /// //TODO + /// [JsonProperty(PropertyName = "stackedRequisitionPacks")] public List StackedRequisitionPacks { get; set; } + /// + /// A large image for the pack. + /// [JsonProperty(PropertyName = "largeImageUrl")] public string LargeImageUrl { get; set; } + /// + /// A medium image for the pack. + /// [JsonProperty(PropertyName = "mediumImageUrl", NullValueHandling = NullValueHandling.Ignore)] public string MediumImageUrl { get; set; } + /// + /// Internal use. The order in which packs are shown for merchandising purposes. + /// [JsonProperty(PropertyName = "merchandisingOrder")] public int MerchandisingOrder { get; set; } + /// + /// A localized name for the pack, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// A small image for the pack. + /// [JsonProperty(PropertyName = "smallImageUrl", NullValueHandling = NullValueHandling.Ignore)] public string SmallImageUrl { get; set; } + /// + /// If this pack might be obtainable through the Xbox Live Marketplace, this is the product ID. Note: Pricing + /// and availability within the Xbox Live marketplace is controlled independently of this value.The presence of + /// an Id in this field is not a guarantee the product is purchasable. There may be geographic restrictions + /// restricting purchase in certain regions, or the item may not be currently purchasable at all. + /// [JsonProperty(PropertyName = "xboxMarketplaceProductId")] public Guid? XboxMarketplaceProductId { get; set; } + /// + /// If this pack might be obtainable through the Xbox Live Marketplace, this is the URL to the product. + /// [JsonProperty(PropertyName = "xboxMarketplaceProductUrl")] public string XboxMarketplaceProductUrl { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Common/Reward.cs b/Source/HaloSharp/Model/Metadata/Common/Reward.cs index 07ed7b9..6d01796 100644 --- a/Source/HaloSharp/Model/Metadata/Common/Reward.cs +++ b/Source/HaloSharp/Model/Metadata/Common/Reward.cs @@ -8,15 +8,27 @@ namespace HaloSharp.Model.Metadata.Common [Serializable] public class Reward : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The ID that uniquely identifies this reward. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// The set of requisition packs (if any) that will be awarded. + /// [JsonProperty(PropertyName = "requisitionPacks")] public List RequisitionPacks { get; set; } + /// + /// The amount of XP that will be awarded. + /// [JsonProperty(PropertyName = "xp")] public int Xp { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/CompetitiveSkillRankDesignation.cs b/Source/HaloSharp/Model/Metadata/CompetitiveSkillRankDesignation.cs index 861fff3..8cfb831 100644 --- a/Source/HaloSharp/Model/Metadata/CompetitiveSkillRankDesignation.cs +++ b/Source/HaloSharp/Model/Metadata/CompetitiveSkillRankDesignation.cs @@ -8,18 +8,36 @@ namespace HaloSharp.Model.Metadata [Serializable] public class CompetitiveSkillRankDesignation : IEquatable { + /// + /// An image to use as the background for the designation. + /// [JsonProperty(PropertyName = "bannerImageUrl")] public string BannerImageUrl { get; set; } + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// An ID that identifies the designation. It happens to be the same as the designation ordering. This value is + /// the same across all languages. Note that Id = 0 indicates the player has an "Unranked" designation. The + /// player must complete additional matches before being assigned an official CSR designation. + /// [JsonProperty(PropertyName = "id")] public int Id { get; set; } + /// + /// A localized name for the designation, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// An array of "CSR Tier" entries, one for each tier this designation supports. Semi-Pro and Pro will not have + /// tiers defined, and this list will be empty. + /// [JsonProperty(PropertyName = "tiers")] public List Tiers { get; set; } @@ -89,12 +107,21 @@ public override int GetHashCode() [Serializable] public class Tier : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// An image to use as the icon for th tier. + /// [JsonProperty(PropertyName = "iconImageUrl")] public string IconImageUrl { get; set; } + /// + /// An ID that identifies the tier. + /// [JsonProperty(PropertyName = "id")] public int Id { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Enemy.cs b/Source/HaloSharp/Model/Metadata/Enemy.cs index d306a25..bc8db4b 100644 --- a/Source/HaloSharp/Model/Metadata/Enemy.cs +++ b/Source/HaloSharp/Model/Metadata/Enemy.cs @@ -7,25 +7,57 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Enemy : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. Note: This may be null. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The faction that this enemy is affiliated with. One of the following options: + /// + /// + /// UNSC + /// + /// + /// Covenant + /// + /// + /// Promethean + /// + /// + /// [JsonProperty(PropertyName = "faction")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.Faction Faction { get; set; } + /// + /// The ID that uniquely identifies this enemy. + /// [JsonProperty(PropertyName = "id")] public uint Id { get; set; } + /// + /// A reference to a large image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "largeIconImageUrl")] public string LargeIconImageUrl { get; set; } + /// + /// A localized name for the object, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// A reference to a small image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "smallIconImageUrl")] public string SmallIconImageUrl { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/FlexibleStat.cs b/Source/HaloSharp/Model/Metadata/FlexibleStat.cs index 2f2418d..23cd828 100644 --- a/Source/HaloSharp/Model/Metadata/FlexibleStat.cs +++ b/Source/HaloSharp/Model/Metadata/FlexibleStat.cs @@ -7,15 +7,35 @@ namespace HaloSharp.Model.Metadata [Serializable] public class FlexibleStat : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The ID that uniquely identifies this stat. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// A localized name for the data point, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// The type of stat this represents, it is one of the following options: + /// + /// + /// Count + /// + /// + /// Duration + /// + /// + /// [JsonProperty(PropertyName = "type")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.FlexibleStatType Type { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/GameBaseVariant.cs b/Source/HaloSharp/Model/Metadata/GameBaseVariant.cs index 6cac246..dcce567 100644 --- a/Source/HaloSharp/Model/Metadata/GameBaseVariant.cs +++ b/Source/HaloSharp/Model/Metadata/GameBaseVariant.cs @@ -9,21 +9,53 @@ namespace HaloSharp.Model.Metadata [Serializable] public class GameBaseVariant : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// An image to use as the game base variant for the designation. + /// [JsonProperty(PropertyName = "iconUrl")] public string IconUrl { get; set; } + /// + /// The ID that uniquely identifies this game base variant. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// Internal use. The internal non-localized name for the the game base variant. + /// [JsonProperty(PropertyName = "internalName")] public string InternalName { get; set; } + /// + /// A localized name for the game base variant, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// A list that indicates what game modes this base variant is available within. Options are: + /// + /// + /// Arena + /// + /// + /// Campaign + /// + /// + /// Custom + /// + /// + /// Warzone + /// + /// + /// [JsonProperty(PropertyName = "supportedGameModes", ItemConverterType = typeof(StringEnumConverter))] public List SupportedGameModes { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/GameVariant.cs b/Source/HaloSharp/Model/Metadata/GameVariant.cs index f3e0d7c..d523ab6 100644 --- a/Source/HaloSharp/Model/Metadata/GameVariant.cs +++ b/Source/HaloSharp/Model/Metadata/GameVariant.cs @@ -6,21 +6,40 @@ namespace HaloSharp.Model.Metadata [Serializable] public class GameVariant : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID of the game base variant this is a variant for. Game Base Variants are available via the Metadata + /// API. + /// [JsonProperty(PropertyName = "gameBaseVariantId")] public Guid? GameBaseVariantId { get; set; } + /// + /// An icon image for the game variant. + /// [JsonProperty(PropertyName = "iconUrl")] public string IconUrl { get; set; } + /// + /// The ID that uniquely identifies this game variant. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// A localized name, suitable for display to users. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Impulse.cs b/Source/HaloSharp/Model/Metadata/Impulse.cs index 81a7b31..52042b3 100644 --- a/Source/HaloSharp/Model/Metadata/Impulse.cs +++ b/Source/HaloSharp/Model/Metadata/Impulse.cs @@ -6,12 +6,21 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Impulse : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The ID that uniquely identifies this impulse. + /// [JsonProperty(PropertyName = "id")] public uint Id { get; set; } + /// + /// Internal use. The non-localized name of the impulse. + /// [JsonProperty(PropertyName = "internalName")] public string InternalName { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Map.cs b/Source/HaloSharp/Model/Metadata/Map.cs index ea2b4bc..8b8d976 100644 --- a/Source/HaloSharp/Model/Metadata/Map.cs +++ b/Source/HaloSharp/Model/Metadata/Map.cs @@ -9,22 +9,54 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Map : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies this map. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// A reference to an image. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "imageUrl")] public string ImageUrl { get; set; } + /// + /// A localized name, suitable for display to users. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } - [JsonProperty(PropertyName = "supportedGameModes", ItemConverterType = typeof (StringEnumConverter))] + /// + /// A list that indicates what game modes this base variant is available within. Options are: + /// + /// + /// Arena + /// + /// + /// Campaign + /// + /// + /// Custom + /// + /// + /// Warzone + /// + /// + /// + [JsonProperty(PropertyName = "supportedGameModes", ItemConverterType = typeof(StringEnumConverter))] public List SupportedGameModes { get; set; } public bool Equals(Map other) diff --git a/Source/HaloSharp/Model/Metadata/MapVariant.cs b/Source/HaloSharp/Model/Metadata/MapVariant.cs index 85b05da..bf34ba4 100644 --- a/Source/HaloSharp/Model/Metadata/MapVariant.cs +++ b/Source/HaloSharp/Model/Metadata/MapVariant.cs @@ -6,21 +6,39 @@ namespace HaloSharp.Model.Metadata [Serializable] public class MapVariant : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies this map variant. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// The ID of the map this is a variant for. Maps are available via the Metadata API. + /// [JsonProperty(PropertyName = "mapId")] public Guid? MapId { get; set; } + /// + /// A reference to an image. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "mapImageUrl")] public string MapImageUrl { get; set; } + /// + /// A localized name, suitable for display to users. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Medal.cs b/Source/HaloSharp/Model/Metadata/Medal.cs index 38080e5..0fa4120 100644 --- a/Source/HaloSharp/Model/Metadata/Medal.cs +++ b/Source/HaloSharp/Model/Metadata/Medal.cs @@ -7,25 +7,76 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Medal : IEquatable { + /// + /// The type of this medal. It will be one of the following options: + /// + /// + /// Breakout + /// + /// + /// CaptureTheFlag + /// + /// + /// KillingSpree + /// + /// + /// Multi-kill + /// + /// + /// Strongholds + /// + /// + /// Style + /// + /// + /// Vehicles + /// + /// + /// Warzone + /// + /// + /// WeaponProficiency + /// + /// + /// [JsonProperty(PropertyName = "classification")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.MedalType Classification { get; set; } + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The anticipated difficulty, relative to all other medals of this classification. The difficulty is ordered + /// from easiest to most difficult. + /// [JsonProperty(PropertyName = "difficulty")] public int Difficulty { get; set; } + /// + /// The ID that uniquely identifies this map medal. + /// [JsonProperty(PropertyName = "id")] public uint Id { get; set; } + /// + /// A localized name for the medal, suitable for display to users. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// The location on the sprite sheet for the medal. + /// [JsonProperty(PropertyName = "spriteLocation")] public SpriteLocation SpriteLocation { get; set; } @@ -97,24 +148,47 @@ public override int GetHashCode() [Serializable] public class SpriteLocation : IEquatable { + /// + /// The height of the full sprite sheet (in pixels). The dimensions of the full sheet are included so that the + /// sheet can be resized. + /// [JsonProperty(PropertyName = "height")] public int Height { get; set; } + /// + /// The X coordinate where the top-left corner of the sprite is located. + /// [JsonProperty(PropertyName = "left")] public int Left { get; set; } + /// + /// The height of this sprite (in pixels). + /// [JsonProperty(PropertyName = "spriteHeight")] public int SpriteHeight { get; set; } + /// + /// A reference to an image that contains all the sprites. + /// [JsonProperty(PropertyName = "spriteSheetUri")] public string SpriteSheetUri { get; set; } + /// + /// The width of this sprite (in pixels). + /// [JsonProperty(PropertyName = "spriteWidth")] public int SpriteWidth { get; set; } + /// + /// The Y coordinate where the top-left corner of the sprite is located. + /// [JsonProperty(PropertyName = "top")] public int Top { get; set; } + /// + /// The width of the full sprite sheet (in pixels). The dimensions of the full sheet are included so that the + /// sheet can be resized. + /// [JsonProperty(PropertyName = "width")] public int Width { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Playlist.cs b/Source/HaloSharp/Model/Metadata/Playlist.cs index 61bbeb9..d33bc45 100644 --- a/Source/HaloSharp/Model/Metadata/Playlist.cs +++ b/Source/HaloSharp/Model/Metadata/Playlist.cs @@ -7,28 +7,66 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Playlist : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description for the playlist, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// A list that indicates what game modes this base variant is available within. Options are: + /// + /// + /// Arena + /// + /// + /// Campaign + /// + /// + /// Custom + /// + /// + /// Warzone + /// + /// + /// [JsonProperty(PropertyName = "gameMode")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.GameMode GameMode { get; set; } + /// + /// The ID that uniquely identifies this playlist. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// An image used to illustrate this playlist. + /// [JsonProperty(PropertyName = "imageUrl")] public string ImageUrl { get; set; } + /// + /// Indicates if this playlist is currently available for play. + /// [JsonProperty(PropertyName = "isActive")] public bool IsActive { get; set; } + /// + /// Indicates if a CSR (competitive skill rank) is shown for players who participate in this playlist. + /// [JsonProperty(PropertyName = "isRanked")] public bool IsRanked { get; set; } + /// + /// A localized name for the playlist, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Requisition.cs b/Source/HaloSharp/Model/Metadata/Requisition.cs index f3807e0..2dac453 100644 --- a/Source/HaloSharp/Model/Metadata/Requisition.cs +++ b/Source/HaloSharp/Model/Metadata/Requisition.cs @@ -9,61 +9,185 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Requisition : IEquatable { + /// + /// A localized name for the category of the requisition, suitable for display to users. The text is title + /// cased. + /// [JsonProperty(PropertyName = "categoryName")] public string CategoryName { get; set; } + /// + /// If this is set, this is the ID of the Certification Requisition that is required to earn this requisition. + /// [JsonProperty(PropertyName = "certificationRequisitionId")] public Guid? CertificationRequisitionId { get; set; } + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies this requisition. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// Internal use. A non-localized name for the category of the requisition. + /// [JsonProperty(PropertyName = "internalCategoryName")] public string InternalCategoryName { get; set; } + /// + /// //TODO: + /// [JsonProperty(PropertyName = "internalSubcategoryName")] public string InternalSubcategoryName { get; set; } + /// + /// Indicates if this item is a Certification. Certifications will always be durable and are required to earn + /// certain other requisitions. + /// [JsonProperty(PropertyName = "isCertification")] public bool IsCertification { get; set; } + /// + /// Indicates if this requisition has been flagged as having 'mythic status'. + /// [JsonProperty(PropertyName = "isMythic")] public bool IsMythic { get; set; } + /// + /// Indicates whether the requisition is wearable. + /// [JsonProperty(PropertyName = "isWearable")] public bool IsWearable { get; set; } + /// + /// A reference to a large image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "largeImageUrl")] public string LargeImageUrl { get; set; } + /// + /// The Spartan Rank required in order to use the requisition. + /// + [JsonProperty(PropertyName = "levelRequirement")] + public int LevelRequirement { get; set; } + + /// + /// A localized name, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// The localized rarity suitable for display to users. Indicates the scarcity and thus rarity of the + /// requisition + /// [JsonProperty(PropertyName = "rarity")] public string Rarity { get; set; } + /// + /// The non-localized rarity. Indicates the scarcity and thus rarity of the requisition. The options are (in + /// increasing order of rarity): + /// + /// + /// Common + /// + /// + /// Uncommon + /// + /// + /// Rare + /// + /// + /// UltraRare + /// + /// + /// Legendary + /// + /// + /// [JsonProperty(PropertyName = "rarityType")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.RequisitionRarityType RarityType { get; set; } + /// + /// This field indicates how many credits the player will receive if they wish to discard this requisition. + /// When SellPrice is zero, the card cannot be sold back for credits. + /// [JsonProperty(PropertyName = "sellPrice")] public int SellPrice { get; set; } + /// + /// A localized name for the sub-category of the requisition, suitable for display to users. The text is title + /// cased. + /// [JsonProperty(PropertyName = "subcategoryName")] public string SubcategoryName { get; set; } + /// + /// The order of the subcategory in the category. + /// [JsonProperty(PropertyName = "subcategoryOrder")] public int SubcategoryOrder { get; set; } - [JsonProperty(PropertyName = "supportedGameModes", ItemConverterType = typeof (StringEnumConverter))] + /// + /// A list that indicates what game modes this base variant is available within. Options are: + /// + /// + /// Arena + /// + /// + /// Campaign + /// + /// + /// Custom + /// + /// + /// Warzone + /// + /// + /// + [JsonProperty(PropertyName = "supportedGameModes", ItemConverterType = typeof(StringEnumConverter))] public List SupportedGameModes { get; set; } + /// + /// Indicates how the requisition card may be used. Options are: + /// + /// + /// Consumable + /// + /// + /// Durable + /// + /// + /// Boost + /// + /// + /// CreditGranting + /// + /// + /// Consumable: The requisition can be called in and used while in-game. When players call in a + /// consumable requisition it is removed from the players inventory. + /// Durable: The requisition is not usable in-game.Players can only earn one of each durable requisition + /// and it is used to model awards such as armor suits, helmets, emblems or other items such as stickers. + /// Durables are never removed from the player inventory. + /// Boost: The requisition is used prior to a match beginning and will modify how many XP or Credits the + /// player will earn at the end of the match. When put into effect, it is removed from the player + /// inventory. + /// Credit Granting: When obtained, the requisition will grant the player some amount of credits. Once + /// the credits are granted the requisition is immediately removed from the player inventory. + /// [JsonProperty(PropertyName = "useType")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.RequisitionUseType UseType { get; set; } @@ -74,22 +198,23 @@ public bool Equals(Requisition other) { return false; } - if (ReferenceEquals(this, other)) { return true; } - return string.Equals(CategoryName, other.CategoryName) + return string.Equals(CategoryName, other.CategoryName) && CertificationRequisitionId.Equals(other.CertificationRequisitionId) && ContentId.Equals(other.ContentId) && string.Equals(Description, other.Description) && Id.Equals(other.Id) && string.Equals(InternalCategoryName, other.InternalCategoryName) + && string.Equals(InternalSubcategoryName, other.InternalSubcategoryName) && IsCertification == other.IsCertification && IsMythic == other.IsMythic && IsWearable == other.IsWearable && string.Equals(LargeImageUrl, other.LargeImageUrl) + && LevelRequirement == other.LevelRequirement && string.Equals(Name, other.Name) && string.Equals(Rarity, other.Rarity) && RarityType == other.RarityType @@ -130,10 +255,12 @@ public override int GetHashCode() hashCode = (hashCode*397) ^ (Description?.GetHashCode() ?? 0); hashCode = (hashCode*397) ^ Id.GetHashCode(); hashCode = (hashCode*397) ^ (InternalCategoryName?.GetHashCode() ?? 0); + hashCode = (hashCode*397) ^ (InternalSubcategoryName?.GetHashCode() ?? 0); hashCode = (hashCode*397) ^ IsCertification.GetHashCode(); hashCode = (hashCode*397) ^ IsMythic.GetHashCode(); hashCode = (hashCode*397) ^ IsWearable.GetHashCode(); hashCode = (hashCode*397) ^ (LargeImageUrl?.GetHashCode() ?? 0); + hashCode = (hashCode*397) ^ LevelRequirement; hashCode = (hashCode*397) ^ (Name?.GetHashCode() ?? 0); hashCode = (hashCode*397) ^ (Rarity?.GetHashCode() ?? 0); hashCode = (hashCode*397) ^ (int) RarityType; diff --git a/Source/HaloSharp/Model/Metadata/Season.cs b/Source/HaloSharp/Model/Metadata/Season.cs index bb377b2..f037183 100644 --- a/Source/HaloSharp/Model/Metadata/Season.cs +++ b/Source/HaloSharp/Model/Metadata/Season.cs @@ -8,27 +8,51 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Season : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The end date and time of this season. + /// [JsonProperty(PropertyName = "endDate")] public DateTime? EndDate { get; set; } + /// + /// An icon used to represent this season. + /// [JsonProperty(PropertyName = "iconUrl")] public string IconUrl { get; set; } + /// + /// The ID that uniquely identifies this season. + /// [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } + /// + /// Indicates if this season is currently active. + /// [JsonProperty(PropertyName = "isActive")] public bool IsActive { get; set; } + /// + /// A localized name for the season, suitable for display to users. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// One or more playlists that are available in this season. + /// [JsonProperty(PropertyName = "playlists")] public List Playlists { get; set; } + /// + /// The start date and time of this season. + /// [JsonProperty(PropertyName = "startDate")] public DateTime? StartDate { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Skull.cs b/Source/HaloSharp/Model/Metadata/Skull.cs index 86fa5ff..4289fa8 100644 --- a/Source/HaloSharp/Model/Metadata/Skull.cs +++ b/Source/HaloSharp/Model/Metadata/Skull.cs @@ -6,21 +6,40 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Skull : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies this skull. + /// [JsonProperty(PropertyName = "id")] public int Id { get; set; } + /// + /// //TODO + /// [JsonProperty(PropertyName = "imageUrl")] public string ImageUrl { get; set; } + /// + /// Indicates what mission this skull can be located within. Null when the skull is not found in a mission. + /// Missions are available via the Metadata API. + /// [JsonProperty(PropertyName = "missionId")] public Guid? MissionId { get; set; } + /// + /// A localized name, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/SpartanRank.cs b/Source/HaloSharp/Model/Metadata/SpartanRank.cs index 6147c54..f1d18e7 100644 --- a/Source/HaloSharp/Model/Metadata/SpartanRank.cs +++ b/Source/HaloSharp/Model/Metadata/SpartanRank.cs @@ -7,15 +7,27 @@ namespace HaloSharp.Model.Metadata [Serializable] public class SpartanRank : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// The ID that uniquely identifies this Spartan Rank. + /// [JsonProperty(PropertyName = "id")] public int Id { get; set; } + /// + /// The reward the player will receive for earning this Spartan Rank. + /// [JsonProperty(PropertyName = "reward")] public Reward Reward { get; set; } + /// + /// The amount of XP required to enter this rank. + /// [JsonProperty(PropertyName = "startXp")] public int StartXp { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/TeamColor.cs b/Source/HaloSharp/Model/Metadata/TeamColor.cs index 3143145..6e2e1bb 100644 --- a/Source/HaloSharp/Model/Metadata/TeamColor.cs +++ b/Source/HaloSharp/Model/Metadata/TeamColor.cs @@ -6,21 +6,41 @@ namespace HaloSharp.Model.Metadata [Serializable] public class TeamColor : IEquatable { + /// + /// A seven-character string representing the team color in "RGB Hex" notation. This notation uses a "#" + /// followed by a hex triplet. + /// [JsonProperty(PropertyName = "color")] public string Color { get; set; } + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// A reference to an image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "iconUrl")] public string IconUrl { get; set; } + /// + /// The ID that uniquely identifies this color. This will be the same as the team's ID in responses from the + /// Stats API. + /// [JsonProperty(PropertyName = "id")] public int Id { get; set; } + /// + /// A localized name, suitable for display to users. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Vehicle.cs b/Source/HaloSharp/Model/Metadata/Vehicle.cs index 378d846..31b126e 100644 --- a/Source/HaloSharp/Model/Metadata/Vehicle.cs +++ b/Source/HaloSharp/Model/Metadata/Vehicle.cs @@ -6,24 +6,45 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Vehicle : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies this vehicle. + /// [JsonProperty(PropertyName = "id")] public uint Id { get; set; } + /// + /// Indicates whether the vehicle is usable by a player. + /// [JsonProperty(PropertyName = "isUsableByPlayer")] public bool IsUsableByPlayer { get; set; } + /// + /// A reference to a large image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "largeIconImageUrl")] public string LargeIconImageUrl { get; set; } + /// + /// A localized name for the object, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// A reference to a small image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "smallIconImageUrl")] public string SmallIconImageUrl { get; set; } diff --git a/Source/HaloSharp/Model/Metadata/Weapon.cs b/Source/HaloSharp/Model/Metadata/Weapon.cs index eb744d6..17925ea 100644 --- a/Source/HaloSharp/Model/Metadata/Weapon.cs +++ b/Source/HaloSharp/Model/Metadata/Weapon.cs @@ -7,27 +7,71 @@ namespace HaloSharp.Model.Metadata [Serializable] public class Weapon : IEquatable { + /// + /// Internal use only. Do not use. + /// [JsonProperty(PropertyName = "contentId")] public Guid ContentId { get; set; } + /// + /// A localized description, suitable for display to users. + /// [JsonProperty(PropertyName = "description")] public string Description { get; set; } + /// + /// The ID that uniquely identifies the weapon. + /// [JsonProperty(PropertyName = "id")] public uint Id { get; set; } + /// + /// Indicates whether the weapon is usable by a player. + /// [JsonProperty(PropertyName = "isUsableByPlayer")] public bool IsUsableByPlayer { get; set; } + /// + /// A reference to a large image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "largeIconImageUrl")] public string LargeIconImageUrl { get; set; } + /// + /// A localized name for the object, suitable for display to users. The text is title cased. + /// [JsonProperty(PropertyName = "name")] public string Name { get; set; } + /// + /// A reference to a small image for icon use. This may be null if there is no image defined. + /// [JsonProperty(PropertyName = "smallIconImageUrl")] public string SmallIconImageUrl { get; set; } + /// + /// The type of the vehicle. Options are: + /// + /// + /// Grenade + /// + /// + /// Turret + /// + /// + /// Vehicle + /// + /// + /// Standard + /// + /// + /// Power + /// + /// + /// Unknown + /// + /// + /// [JsonProperty(PropertyName = "type")] [JsonConverter(typeof (StringEnumConverter))] public Enumeration.WeaponType Type { get; set; } diff --git a/Source/HaloSharp/Model/Profile/GetImage.cs b/Source/HaloSharp/Model/Profile/GetImage.cs index 6eafd0e..f9a64fd 100644 --- a/Source/HaloSharp/Model/Profile/GetImage.cs +++ b/Source/HaloSharp/Model/Profile/GetImage.cs @@ -7,7 +7,14 @@ namespace HaloSharp.Model.Profile [Serializable] public class GetImage : IEquatable { + /// + /// The URI the Image was retrieved from. + /// public string Uri { get; set; } + + /// + /// The Image. + /// public Image Image { get; set; } public bool Equals(GetImage other) diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/ArenaMatch.cs b/Source/HaloSharp/Model/Stats/CarnageReport/ArenaMatch.cs index d236324..44f9224 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/ArenaMatch.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/ArenaMatch.cs @@ -10,9 +10,16 @@ namespace HaloSharp.Model.Stats.CarnageReport [Serializable] public class ArenaMatch : BaseMatch, IEquatable { + /// + /// A list of stats for each player who was present in the match. + /// [JsonProperty(PropertyName = "PlayerStats")] public List PlayerStats { get; set; } + /// + /// A list of stats for each team who in the match. Note that in Free For All modes, there is an entry for + /// every player. + /// [JsonProperty(PropertyName = "TeamStats")] public List TeamStats { get; set; } @@ -78,33 +85,71 @@ public override int GetHashCode() [Serializable] public class ArenaMatchPlayerStat : BasePlayerStat, IEquatable { + /// + /// Details on any credits the player may have earned from playing this match. + /// [JsonProperty(PropertyName = "CreditsEarned")] public CreditsEarned CreditsEarned { get; set; } + /// + /// The Competitive Skill Ranking (CSR) of the player after the match ended. If the player is still in + /// measurement matches, this field is null. + /// [JsonProperty(PropertyName = "CurrentCsr")] public CompetitiveSkillRanking CurrentCsr { get; set; } + /// + /// The number of times the player was killed by each opponent. If the player was not killed by an opponent, + /// there will be no entry for that opponent. + /// [JsonProperty(PropertyName = "KilledByOpponentDetails")] public List KilledByOpponentDetails { get; set; } + /// + /// The number of times the player killed each opponent. If the player did not kill an opponent, there will be + /// no entry for that opponent. + /// [JsonProperty(PropertyName = "KilledOpponentDetails")] public List KilledOpponentDetails { get; set; } + /// + /// The player's measurement matches left. If this field is greater than zero, then the player will not have a + /// CSR yet. If the player finished the match, this match is included in this count. + /// [JsonProperty(PropertyName = "MeasurementMatchesLeft")] public int MeasurementMatchesLeft { get; set; } + /// + /// The player's progress towards meta commendations. Commendations that had no progress earned this match will + /// not be returned. + /// [JsonProperty(PropertyName = "MetaCommendationDeltas")] public List MetaCommendationDeltas { get; set; } + /// + /// The Competitive Skill Ranking (CSR) of the player before the match started. If the player is still in + /// measurement matches, this field is null. If the player finished the last measurement match this match, this + /// field is still null. + /// [JsonProperty(PropertyName = "PreviousCsr")] public CompetitiveSkillRanking PreviousCsr { get; set; } + /// + /// The player's progress towards progressive commendations. Commendations that had no progress earned this + /// match will not be returned. + /// [JsonProperty(PropertyName = "ProgressiveCommendationDeltas")] public List ProgressiveCommendationDeltas { get; set; } + /// + /// The set of rewards that the player got in this match. + /// [JsonProperty(PropertyName = "RewardSets")] public List RewardSets { get; set; } + /// + /// The experience information for the player in this match. + /// [JsonProperty(PropertyName = "XpInfo")] public XpInfo XpInfo { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/CampaignMatch.cs b/Source/HaloSharp/Model/Stats/CarnageReport/CampaignMatch.cs index 0275c61..e9737a0 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/CampaignMatch.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/CampaignMatch.cs @@ -10,18 +10,47 @@ namespace HaloSharp.Model.Stats.CarnageReport [Serializable] public class CampaignMatch : BaseMatch, IEquatable { + /// + /// The difficulty the mission was played at. Options are: + /// + /// + /// Easy = 0 + /// + /// + /// Normal = 1 + /// + /// + /// Heroic = 2 + /// + /// + /// Legendary = 3 + /// + /// + /// [JsonProperty(PropertyName = "Difficulty")] public Enumeration.Difficulty Difficulty { get; set; } + /// + /// Indicates whether the mission was completed when the match ended. + /// [JsonProperty(PropertyName = "MissionCompleted")] public bool MissionCompleted { get; set; } + /// + /// A list of stats for each player who was present in the match. + /// [JsonProperty(PropertyName = "PlayerStats")] public List PlayerStats { get; set; } + /// + /// The list of skulls used for the mission. Skulls are available via the Metadata API. + /// [JsonProperty(PropertyName = "Skulls")] public List Skulls { get; set; } + /// + /// The total playthrough time of the mission as calculated by the game. This value is persisted in save files. + /// [JsonProperty(PropertyName = "TotalMissionPlaythroughTime")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan TotalMissionPlaythroughTime { get; set; } @@ -94,9 +123,15 @@ public override int GetHashCode() [Serializable] public class CampaignMatchPlayerStat : BasePlayerStat, IEquatable { + /// + /// The player's biggest score due to a kill. + /// [JsonProperty(PropertyName = "BiggestKillScore")] public int BiggestKillScore { get; set; } + /// + /// The player's score. + /// [JsonProperty(PropertyName = "Score")] public int Score { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/BaseMatch.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/BaseMatch.cs index dd8f6a7..8452611 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/BaseMatch.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/BaseMatch.cs @@ -7,30 +7,58 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class BaseMatch : IEquatable { + /// + /// The ID of the game base variant for this match. Game base variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "GameBaseVariantId")] public Guid GameBaseVariantId { get; set; } + /// + /// The variant of the game for this match. Game variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "GameVariantId")] public Guid GameVariantId { get; set; } + /// + /// Indicates if the match is completed or not. Some match details are available while the match is + /// in-progress, but the behavior for incomplete matches in undefined. + /// [JsonProperty(PropertyName = "IsMatchOver")] public bool IsMatchOver { get; set; } + /// + /// Whether this was a team-based game or not. + /// [JsonProperty(PropertyName = "IsTeamGame")] public bool IsTeamGame { get; set; } + /// + /// The ID of the base map for this match. Maps are available via the Metadata API. + /// [JsonProperty(PropertyName = "MapId")] public Guid MapId { get; set; } + /// + /// The variant of the map for this match. Map variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "MapVariantId")] public Guid MapVariantId { get; set; } + /// + /// The playlist ID of the match. Playlists are available via the Metadata API. + /// [JsonProperty(PropertyName = "PlaylistId")] public Guid PlaylistId { get; set; } + /// + /// ID for the season the match was played in if it was played in a seasonal playlist and null otherwise. + /// [JsonProperty(PropertyName = "SeasonId")] public Guid? SeasonId { get; set; } + /// + /// The length of the match. + /// [JsonProperty(PropertyName = "TotalDuration")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan TotalDuration { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/BasePlayerStat.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/BasePlayerStat.cs index 0b72956..e6956a8 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/BasePlayerStat.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/BasePlayerStat.cs @@ -8,29 +8,53 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class BasePlayerStat : BaseStat, IEquatable { + /// + /// The player's average lifetime. + /// [JsonProperty(PropertyName = "AvgLifeTimeOfPlayer")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan AvgLifeTimeOfPlayer { get; set; } - // ReSharper disable once InconsistentNaming + /// + /// Indicates whether the player was present in the match when it ended. + /// [JsonProperty(PropertyName = "DNF")] + // ReSharper disable once InconsistentNaming public bool DNF { get; set; } + /// + /// The game base variant specific stats for this match. Flexible stats are available via the Metadata API. + /// [JsonProperty(PropertyName = "FlexibleStats")] public FlexibleStats FlexibleStats { get; set; } + /// + /// //TODO + /// [JsonProperty(PropertyName = "Player")] public Identity Player { get; set; } + /// + /// Internal use only. This will always be null. + /// [JsonProperty(PropertyName = "PostMatchRatings")] public object PostMatchRatings { get; set; } + /// + /// Internal use only. This will always be null. + /// [JsonProperty(PropertyName = "PreMatchRatings")] public object PreMatchRatings { get; set; } + /// + /// The player's team-agnostic ranking. + /// [JsonProperty(PropertyName = "Rank")] public int Rank { get; set; } + /// + /// The ID of the team that the player was on when the match ended. + /// [JsonProperty(PropertyName = "TeamId")] public int TeamId { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/CreditsEarned.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/CreditsEarned.cs index c482de1..dcaf79c 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/CreditsEarned.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/CreditsEarned.cs @@ -6,21 +6,58 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class CreditsEarned : IEquatable { + /// + /// The portion of credits earned due to the boost card the user applied. + /// [JsonProperty(PropertyName = "BoostAmount")] public int BoostAmount { get; set; } + /// + /// The portion of credits earned due to the player's team-agnostic rank in the match. + /// [JsonProperty(PropertyName = "PlayerRankAmount")] public int PlayerRankAmount { get; set; } + /// + /// Indicates how the credits result was arrived at. Options are: + /// + /// + /// Credits Disabled In Playlist = 0 + /// + /// + /// Player Did Not Finish = 1 + /// + /// + /// Credits Earned = 2 + /// + /// + /// Credits Disabled In Playlist: TotalCreditsEarned is zero because this playlist has credits + /// disabled. + /// Player Did Not Finish: Credits are enabled in this playlist, but TotalCreditsEarned is zero because + /// the player did not finish the match. + /// Credits Earned: Credits are enabled in this playlist and the player completed the match, so the + /// credits formula was successfully evaluated. The fields below provide the client with the values used in + /// the formula. Note: That if we used one or more default values, we still return "NormalResult". The fields + /// below will confirm the actual values used. + /// [JsonProperty(PropertyName = "Result")] public Enumeration.CreditsEarnedResultType Result { get; set; } + /// + /// The scalar applied to the credits earned based on the player's Spartan Rank. + /// [JsonProperty(PropertyName = "SpartanRankModifier")] public double SpartanRankModifier { get; set; } + /// + /// The portion of credits earned due to the time the player played in the match. + /// [JsonProperty(PropertyName = "TimePlayedAmount")] public double TimePlayedAmount { get; set; } + /// + /// The total number of credits the player earned from playing this match. + /// [JsonProperty(PropertyName = "TotalCreditsEarned")] public int TotalCreditsEarned { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/MetaCommendationDelta.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/MetaCommendationDelta.cs index 71e7b2f..d5e9f62 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/MetaCommendationDelta.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/MetaCommendationDelta.cs @@ -8,12 +8,21 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class MetaCommendationDelta : IEquatable { + /// + /// The commendation ID. Commendations are available via the Metadata API. + /// [JsonProperty(PropertyName = "Id")] public Guid Id { get; set; } + /// + /// The progress the player had made towards the commendation level before the match. + /// [JsonProperty(PropertyName = "PreviousMetRequirements")] public List PreviousMetRequirements { get; set; } + /// + /// The progress the player had made towards the commendation level after the match. + /// [JsonProperty(PropertyName = "MetRequirements")] public List MetRequirements { get; set; } @@ -89,18 +98,33 @@ public Requirement(uint data1, ushort data2, ushort data3, ulong data4) Guid = new Guid((int)data1, (short)data2, (short)data3, BitConverter.GetBytes((long)data4)); } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "Data1")] public uint Data1 { get; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "Data2")] public ushort Data2 { get; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "Data3")] public ushort Data3 { get; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "Data4")] public ulong Data4 { get; } + /// + /// Unknown. + /// [JsonIgnore] public Guid Guid { get; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/OpponentDetails.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/OpponentDetails.cs index 8328af8..c22e085 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/OpponentDetails.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/OpponentDetails.cs @@ -6,9 +6,15 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class OpponentDetails : IEquatable { + /// + /// The gamertag of the opponent that was killed/killed the player. + /// [JsonProperty(PropertyName = "GamerTag")] public string GamerTag { get; set; } + /// + /// The number of times that opponent was killed/killed the player. + /// [JsonProperty(PropertyName = "TotalKills")] public int TotalKills { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/ProgressiveCommendationDelta.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/ProgressiveCommendationDelta.cs index 00936ec..57d4759 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/ProgressiveCommendationDelta.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/ProgressiveCommendationDelta.cs @@ -6,12 +6,21 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class ProgressiveCommendationDelta : IEquatable { + /// + /// The commendation ID. Commendations are available via the Metadata API. + /// [JsonProperty(PropertyName = "Id")] public Guid Id { get; set; } + /// + /// The progress the player had made towards the commendation level before the match. + /// [JsonProperty(PropertyName = "PreviousProgress")] public int PreviousProgress { get; set; } + /// + /// The progress the player had made towards the commendation level after the match. + /// [JsonProperty(PropertyName = "Progress")] public int Progress { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/RewardSet.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/RewardSet.cs index ecc463e..2e81c8d 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/RewardSet.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/RewardSet.cs @@ -6,18 +6,54 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class RewardSet : IEquatable { + /// + /// If the Reward Source is a Commendation, this is the ID of the level of the commendation that earned the + /// reward. + /// [JsonProperty(PropertyName = "CommendationLevelId")] public Guid? CommendationLevelId { get; set; } + /// + /// If the Reward Source is a Meta Commendation or Progress Commendation, this is the ID of the Meta + /// Commendation or Progress Commendation, respectively, that earned the reward. Commendations are available + /// via the Metadata API. + /// [JsonProperty(PropertyName = "CommendationSource")] public Guid? CommendationSource { get; set; } + /// + /// The ID of the reward. + /// [JsonProperty(PropertyName = "RewardSet")] public Guid Id { get; set; } + /// + /// The source of the reward. Options are: + /// + /// + /// None = 0 + /// + /// + /// Meta Commendation = 1 + /// + /// + /// Progress Commendation = 2 + /// + /// + /// Spartan Rank = 3 + /// + /// + /// [JsonProperty(PropertyName = "RewardSourceType")] public Enumeration.RewardSourceType RewardSourceType { get; set; } + /// + /// If the Reward Source is Spartan Rank, this value is set to the Spartan Rank the player acquired that led to + /// this reward being granted. Note: Unlike the commendations fields in this structure, this is not the GUID to + /// a Spartan Rank content item. That's because the Spartan Rank content item itself does not detail what + /// specific Spartan Rank it pertains to - this information is derived from the list of Spartan Ranks as a + /// whole. Spartan Ranks are available via the Metadata API. + /// [JsonProperty(PropertyName = "SpartanRankSource")] public int? SpartanRankSource { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/TeamStat.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/TeamStat.cs index d150cd7..f10efd5 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/TeamStat.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/TeamStat.cs @@ -8,15 +8,45 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class TeamStat : IEquatable { + /// + /// The team's rank at the end of the match. + /// [JsonProperty(PropertyName = "Rank")] public int Rank { get; set; } + /// + /// The set of round stats for the team. + /// [JsonProperty(PropertyName = "RoundStats")] public List RoundStats { get; set; } + /// + /// The team's score at the end of the match. The way the score is determined is based off the game base + /// variant being played: + /// + /// + /// Breakout = number of rounds won + /// + /// + /// CTF = number of flag captures + /// + /// + /// Slayer = number of kills + /// + /// + /// Strongholds = number of points + /// + /// + /// Warzone = number of points + /// + /// + /// [JsonProperty(PropertyName = "Score")] public uint Score { get; set; } + /// + /// The ID for the team. + /// [JsonProperty(PropertyName = "TeamId")] public int TeamId { get; set; } @@ -84,12 +114,21 @@ public override int GetHashCode() [Serializable] public class RoundStat : IEquatable { + /// + /// The end rank for the team this round. + /// [JsonProperty(PropertyName = "Rank")] public int Rank { get; set; } + /// + /// The round number this entry pertains to. + /// [JsonProperty(PropertyName = "RoundNumber")] public int RoundNumber { get; set; } + /// + /// The end score for the team this round. + /// [JsonProperty(PropertyName = "Score")] public uint Score { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/Common/XpInfo.cs b/Source/HaloSharp/Model/Stats/CarnageReport/Common/XpInfo.cs index 13d4f9f..745bbc6 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/Common/XpInfo.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/Common/XpInfo.cs @@ -6,30 +6,58 @@ namespace HaloSharp.Model.Stats.CarnageReport.Common [Serializable] public class XpInfo : IEquatable { + /// + /// The amount of XP the player earned if they played a boost card for this match, and the boost card criteria + /// was met. This is a fixed amount of XP, not a multiplier. + /// [JsonProperty(PropertyName = "BoostAmount")] public int BoostAmount { get; set; } + /// + /// The XP awarded to the player based on how their team ranked when the match concluded. + /// [JsonProperty(PropertyName = "PerformanceXP")] public int PerformanceXp { get; set; } + /// + /// The XP awarded to the player for their team-agnostic rank. + /// [JsonProperty(PropertyName = "PlayerRankXPAward")] public int PlayerRankXpAward { get; set; } + /// + /// The portion of the XP the player earned this match that was based on how much time was spent in-match. + /// [JsonProperty(PropertyName = "PlayerTimePerformanceXPAward")] public int PlayerTimePerformanceXpAward { get; set; } + /// + /// The player's Spartan Rank before the match started. + /// [JsonProperty(PropertyName = "PrevSpartanRank")] public int PrevSpartanRank { get; set; } + /// + /// The player's XP before the match started. + /// [JsonProperty(PropertyName = "PrevTotalXP")] public int PrevTotalXp { get; set; } + /// + /// The player's Spartan Rank after the match ended. + /// [JsonProperty(PropertyName = "SpartanRank")] public int SpartanRank { get; set; } + /// + /// The multiplier on the XP earned this match based on their Spartan Rank when the match ended. + /// [JsonProperty(PropertyName = "SpartanRankMatchXPScalar")] public double SpartanRankMatchXpScalar { get; set; } + /// + /// The player's XP after the match ended. + /// [JsonProperty(PropertyName = "TotalXP")] public int TotalXp { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/CustomMatch.cs b/Source/HaloSharp/Model/Stats/CarnageReport/CustomMatch.cs index dcee3fa..2491490 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/CustomMatch.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/CustomMatch.cs @@ -9,9 +9,16 @@ namespace HaloSharp.Model.Stats.CarnageReport [Serializable] public class CustomMatch : BaseMatch, IEquatable { + /// + /// A list of stats for each player who was present in the match. + /// [JsonProperty(PropertyName = "PlayerStats")] public List PlayerStats { get; set; } + /// + /// A list of stats for each team who in the match. Note that in Free For All modes, there is an entry for + /// every player. + /// [JsonProperty(PropertyName = "TeamStats")] public List TeamStats { get; set; } @@ -77,9 +84,17 @@ public override int GetHashCode() [Serializable] public class CustomMatchPlayerStat : BasePlayerStat, IEquatable { + /// + /// The number of times the player was killed by each opponent. If the player was not killed by an opponent, + /// there will be no entry for that opponent. + /// [JsonProperty(PropertyName = "KilledByOpponentDetails")] public List KilledByOpponentDetails { get; set; } + /// + /// The number of times the player killed each opponent. If the player did not kill an opponent, there will be + /// no entry for that opponent. + /// [JsonProperty(PropertyName = "KilledOpponentDetails")] public List KilledOpponentDetails { get; set; } diff --git a/Source/HaloSharp/Model/Stats/CarnageReport/WarzoneMatch.cs b/Source/HaloSharp/Model/Stats/CarnageReport/WarzoneMatch.cs index 362c6b3..4300fe7 100644 --- a/Source/HaloSharp/Model/Stats/CarnageReport/WarzoneMatch.cs +++ b/Source/HaloSharp/Model/Stats/CarnageReport/WarzoneMatch.cs @@ -9,9 +9,16 @@ namespace HaloSharp.Model.Stats.CarnageReport [Serializable] public class WarzoneMatch : BaseMatch, IEquatable { + /// + /// A list of stats for each player who was present in the match. + /// [JsonProperty(PropertyName = "PlayerStats")] public List PlayerStats { get; set; } + /// + /// A list of stats for each team who in the match. Note that in Free For All modes, there is an entry for + /// every player. + /// [JsonProperty(PropertyName = "TeamStats")] public List TeamStats { get; set; } @@ -77,30 +84,61 @@ public override int GetHashCode() [Serializable] public class WarzonePlayerStat : BasePlayerStat, IEquatable { + /// + /// Details on any credits the player may have earned from playing this match. + /// [JsonProperty(PropertyName = "CreditsEarned")] public CreditsEarned CreditsEarned { get; set; } + /// + /// The number of times the player was killed by each opponent. If the player was not killed by an opponent, + /// there will be no entry for that opponent. + /// [JsonProperty(PropertyName = "KilledByOpponentDetails")] public List KilledByOpponentDetails { get; set; } + /// + /// The number of times the player killed each opponent. If the player did not kill an opponent, there will be + /// no entry for that opponent. + /// [JsonProperty(PropertyName = "KilledOpponentDetails")] public List KilledOpponentDetails { get; set; } + /// + /// The player's progress towards meta commendations. Commendations that had no progress earned this match will + /// not be returned. + /// [JsonProperty(PropertyName = "MetaCommendationDeltas")] public List MetaCommendationDeltas { get; set; } + /// + /// The player's progress towards progressive commendations. Commendations that had no progress earned this + /// match will not be returned. + /// [JsonProperty(PropertyName = "ProgressiveCommendationDeltas")] public List ProgressiveCommendationDeltas { get; set; } + /// + /// The set of rewards that the player got in this match. Rewards are available via the Metadata API. + /// [JsonProperty(PropertyName = "RewardSets")] public List RewardSets { get; set; } + /// + /// The total number of "pies" (in-game currency) the player earned in the match. + /// [JsonProperty(PropertyName = "TotalPiesEarned")] public int TotalPiesEarned { get; set; } + /// + /// The maximum level the player achieved in the match. + /// [JsonProperty(PropertyName = "WarzoneLevel")] public int WarzoneLevel { get; set; } + /// + /// The experience information for the player in this match. + /// [JsonProperty(PropertyName = "XpInfo")] public XpInfo XpInfo { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Common/BaseStat.cs b/Source/HaloSharp/Model/Stats/Common/BaseStat.cs index f6e2dbf..91c198a 100644 --- a/Source/HaloSharp/Model/Stats/Common/BaseStat.cs +++ b/Source/HaloSharp/Model/Stats/Common/BaseStat.cs @@ -9,101 +9,197 @@ namespace HaloSharp.Model.Stats.Common [Serializable] public class BaseStat : IEquatable { + /// + /// List of enemy vehicles destroyed. Vehicles are available via the Metadata API. Note: this stat measures enemy vehicles, not any vehicle destruction. + /// [JsonProperty(PropertyName = "DestroyedEnemyVehicles")] public List DestroyedEnemyVehicles { get; set; } + /// + /// List of enemies killed, per enemy type. Enemies are available via the Metadata API. + /// /// [JsonProperty(PropertyName = "EnemyKills")] public List EnemyKills { get; set; } + /// + /// The set of Impulses (invisible Medals) earned by the player. + /// [JsonProperty(PropertyName = "Impulses")] public List Impulses { get; set; } + /// + /// The set of Medals earned by the player. + /// [JsonProperty(PropertyName = "MedalAwards")] public List MedalAwards { get; set; } + /// + /// Total number of assassinations by the player. + /// [JsonProperty(PropertyName = "TotalAssassinations")] public int TotalAssassinations { get; set; } + /// + /// Total number of assists by the player. + /// [JsonProperty(PropertyName = "TotalAssists")] public int TotalAssists { get; set; } + /// + /// Total number of deaths by the player. + /// [JsonProperty(PropertyName = "TotalDeaths")] public int TotalDeaths { get; set; } + /// + /// Not used. + /// [JsonProperty(PropertyName = "TotalGamesCompleted")] public int TotalGamesCompleted { get; set; } + /// + /// Not used. + /// [JsonProperty(PropertyName = "TotalGamesLost")] public int TotalGamesLost { get; set; } + /// + /// Not used. + /// [JsonProperty(PropertyName = "TotalGamesTied")] public int TotalGamesTied { get; set; } + /// + /// Not used. + /// [JsonProperty(PropertyName = "TotalGamesWon")] public int TotalGamesWon { get; set; } + /// + /// Total grenade damage dealt by the player. + /// [JsonProperty(PropertyName = "TotalGrenadeDamage")] public double TotalGrenadeDamage { get; set; } + /// + /// Total number of grenade kills by the player. + /// [JsonProperty(PropertyName = "TotalGrenadeKills")] public int TotalGrenadeKills { get; set; } + /// + /// Total ground pound damage dealt by the player. + /// [JsonProperty(PropertyName = "TotalGroundPoundDamage")] public double TotalGroundPoundDamage { get; set; } + /// + /// Total number of ground pound kills by the player. + /// [JsonProperty(PropertyName = "TotalGroundPoundKills")] public int TotalGroundPoundKills { get; set; } + /// + /// Total number of headshots done by the player. + /// [JsonProperty(PropertyName = "TotalHeadshots")] public int TotalHeadshots { get; set; } + /// + /// Total number of kills done by the player. This includes melee kills, shoulder bash kills and Spartan charge kills, all power weapons, AI kills and vehicle destructions. + /// [JsonProperty(PropertyName = "TotalKills")] public int TotalKills { get; set; } + /// + /// Total melee damage dealt by the player. + /// [JsonProperty(PropertyName = "TotalMeleeDamage")] public double TotalMeleeDamage { get; set; } + /// + /// Total number of melee kills by the player. + /// [JsonProperty(PropertyName = "TotalMeleeKills")] public int TotalMeleeKills { get; set; } + /// + /// Total power weapon damage dealt by the player. + /// [JsonProperty(PropertyName = "TotalPowerWeaponDamage")] public double TotalPowerWeaponDamage { get; set; } + /// + /// Total number of power weapon grabs by the player. + /// [JsonProperty(PropertyName = "TotalPowerWeaponGrabs")] public int TotalPowerWeaponGrabs { get; set; } + /// + /// Total number of power weapon kills by the player. + /// [JsonProperty(PropertyName = "TotalPowerWeaponKills")] public int TotalPowerWeaponKills { get; set; } + /// + /// Total power weapon possession by the player. + /// [JsonProperty(PropertyName = "TotalPowerWeaponPossessionTime")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan TotalPowerWeaponPossessionTime { get; set; } + /// + /// Total number of shots fired by the player. + /// [JsonProperty(PropertyName = "TotalShotsFired")] public int TotalShotsFired { get; set; } + /// + /// Total number of shots landed by the player. + /// [JsonProperty(PropertyName = "TotalShotsLanded")] public int TotalShotsLanded { get; set; } + /// + /// Total shoulder bash damage dealt by the player. + /// [JsonProperty(PropertyName = "TotalShoulderBashDamage")] public double TotalShoulderBashDamage { get; set; } + /// + /// Total number of shoulder bash kills by the player. + /// [JsonProperty(PropertyName = "TotalShoulderBashKills")] public int TotalShoulderBashKills { get; set; } + /// + /// Total number of Spartan kills by the player. + /// [JsonProperty(PropertyName = "TotalSpartanKills")] public int TotalSpartanKills { get; set; } + /// + /// Total timed played in this match by the player. + /// [JsonProperty(PropertyName = "TotalTimePlayed")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan TotalTimePlayed { get; set; } + /// + /// Total weapon damage dealt by the player. + /// [JsonProperty(PropertyName = "TotalWeaponDamage")] public double TotalWeaponDamage { get; set; } + /// + /// The set of weapons (weapons and vehicles included) used by the player. + /// [JsonProperty(PropertyName = "WeaponStats")] public List WeaponStats { get; set; } + /// + /// The weapon the player used to get the most kills this match. + /// [JsonProperty(PropertyName = "WeaponWithMostKills")] public WeaponStat WeaponWithMostKills { get; set; } @@ -227,25 +323,46 @@ public override int GetHashCode() [Serializable] public class WeaponStat : IEquatable { + /// + /// The total damage dealt for this weapon. + /// [JsonProperty(PropertyName = "TotalDamageDealt")] public double TotalDamageDealt { get; set; } + /// + /// The number of headshots for this weapon. + /// [JsonProperty(PropertyName = "TotalHeadshots")] public int TotalHeadshots { get; set; } + /// + /// The number of kills for this weapon. + /// [JsonProperty(PropertyName = "TotalKills")] public int TotalKills { get; set; } + /// + /// The total possession time for this weapon. + /// [JsonProperty(PropertyName = "TotalPossessionTime")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan TotalPossessionTime { get; set; } + /// + /// The number of shots fired for this weapon. + /// [JsonProperty(PropertyName = "TotalShotsFired")] public int TotalShotsFired { get; set; } + /// + /// The number of shots landed for this weapon. + /// [JsonProperty(PropertyName = "TotalShotsLanded")] public int TotalShotsLanded { get; set; } + /// + /// //TODO + /// [JsonProperty(PropertyName = "WeaponId")] public WeaponId WeaponId { get; set; } @@ -319,9 +436,15 @@ public override int GetHashCode() [Serializable] public class WeaponId : IEquatable { + /// + /// Any attachments the weapon had. + /// [JsonProperty(PropertyName = "Attachments")] public List Attachments { get; set; } + /// + /// The ID of the weapon. Weapons are available via the Metadata API. + /// [JsonProperty(PropertyName = "StockId")] public uint StockId { get; set; } @@ -383,9 +506,15 @@ public override int GetHashCode() [Serializable] public class MedalAward : IEquatable { + /// + /// The number of times the Medal was earned. + /// [JsonProperty(PropertyName = "Count")] public int Count { get; set; } + /// + /// The ID of the Medal. Medals are available via the Metadata API. + /// [JsonProperty(PropertyName = "MedalId")] public uint MedalId { get; set; } @@ -447,9 +576,15 @@ public override int GetHashCode() [Serializable] public class Impulse : IEquatable { + /// + /// The number of times the Impuse was earned. + /// [JsonProperty(PropertyName = "Count")] public int Count { get; set; } + /// + /// The ID of the Impulse. Impulses are available via the Metadata API. + /// [JsonProperty(PropertyName = "Id")] public uint Id { get; set; } @@ -511,9 +646,15 @@ public override int GetHashCode() [Serializable] public class EnemySet : IEquatable { + /// + /// The enemy this entry references. + /// [JsonProperty(PropertyName = "Enemy")] public Enemy Enemy { get; set; } + /// + /// Total number of kills on the enemy by the player. + /// [JsonProperty(PropertyName = "TotalKills")] public int TotalKills { get; set; } @@ -575,9 +716,15 @@ public override int GetHashCode() [Serializable] public class Enemy : IEquatable { + /// + /// The attachments (variants) for the enemy. + /// [JsonProperty(PropertyName = "Attachments")] public List Attachments { get; set; } + /// + /// The Base ID for the enemy. + /// [JsonProperty(PropertyName = "BaseId")] public uint BaseId { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Common/CompetitiveSkillRanking.cs b/Source/HaloSharp/Model/Stats/Common/CompetitiveSkillRanking.cs index 50941bb..2419f14 100644 --- a/Source/HaloSharp/Model/Stats/Common/CompetitiveSkillRanking.cs +++ b/Source/HaloSharp/Model/Stats/Common/CompetitiveSkillRanking.cs @@ -6,18 +6,56 @@ namespace HaloSharp.Model.Stats.Common [Serializable] public class CompetitiveSkillRanking : IEquatable { + /// + /// The CSR value. Zero for normal designations. + /// [JsonProperty(PropertyName = "Csr")] public int Csr { get; set; } + /// + /// The Designation of the CSR. Options are: + /// + /// + /// Bronze = 1 + /// + /// + /// Silver = 2 + /// + /// + /// Gold = 3 + /// + /// + /// Platinum = 4 + /// + /// + /// Diamond = 5 + /// + /// + /// Onyx = 6 + /// + /// + /// Champion = 7 + /// + /// + /// [JsonProperty(PropertyName = "DesignationId")] public Enumeration.CompetitiveSkillRankingDesignation DesignationId { get; set; } + /// + /// The percentage of progress towards the next CSR tier. + /// [JsonProperty(PropertyName = "PercentToNextTier")] public int PercentToNextTier { get; set; } + /// + /// If the CSR is Semi-pro or Pro, the player's leaderboard ranking. + /// [JsonProperty(PropertyName = "Rank")] public int? Rank { get; set; } + /// + /// The CSR tier. + /// [JsonProperty(PropertyName = "Tier")] public int Tier { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Common/FlexibleStats.cs b/Source/HaloSharp/Model/Stats/Common/FlexibleStats.cs index fb2ff2a..c82b753 100644 --- a/Source/HaloSharp/Model/Stats/Common/FlexibleStats.cs +++ b/Source/HaloSharp/Model/Stats/Common/FlexibleStats.cs @@ -9,15 +9,27 @@ namespace HaloSharp.Model.Stats.Common [Serializable] public class FlexibleStats : IEquatable { + /// + /// The set of flexible stats that are derived from impulse events. + /// [JsonProperty(PropertyName = "ImpulseStatCounts")] public List ImpulseStatCounts { get; set; } + /// + /// The set of flexible stats that are derived from impulse time lapses. + /// [JsonProperty(PropertyName = "ImpulseTimelapses")] public List ImpulseTimelapses { get; set; } + /// + /// The set of flexible stats that are derived from medal events. + /// [JsonProperty(PropertyName = "MedalStatCounts")] public List MedalStatCounts { get; set; } + /// + /// The set of flexible stats that are derived from medal time lapses. + /// [JsonProperty(PropertyName = "MedalTimelapses")] public List MedalTimelapses { get; set; } @@ -85,9 +97,15 @@ public override int GetHashCode() [Serializable] public class StatTimelapse : IEquatable { + /// + /// The ID of the flexible stat. + /// [JsonProperty(PropertyName = "Id")] public Guid Id { get; set; } + /// + /// The amount of time the flexible stat was earned for. + /// [JsonProperty(PropertyName = "Timelapse")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan Timelapse { get; set; } @@ -150,9 +168,15 @@ public override int GetHashCode() [Serializable] public class StatCount : IEquatable { + /// + /// The number of times this flexible stat was earned. + /// [JsonProperty(PropertyName = "Count")] public int Count { get; set; } + /// + /// The ID of the flexible stat. + /// [JsonProperty(PropertyName = "Id")] public Guid Id { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Common/Identity.cs b/Source/HaloSharp/Model/Stats/Common/Identity.cs index 3125b8f..9d60d01 100644 --- a/Source/HaloSharp/Model/Stats/Common/Identity.cs +++ b/Source/HaloSharp/Model/Stats/Common/Identity.cs @@ -6,9 +6,15 @@ namespace HaloSharp.Model.Stats.Common [Serializable] public class Identity : IEquatable { + /// + /// The player's gamertag. + /// [JsonProperty(PropertyName = "Gamertag")] public string Gamertag { get; set; } + /// + /// Internal use only. This will always be null. + /// [JsonProperty(PropertyName = "Xuid")] public object Xuid { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Common/Link.cs b/Source/HaloSharp/Model/Stats/Common/Link.cs index dca0c91..b413199 100644 --- a/Source/HaloSharp/Model/Stats/Common/Link.cs +++ b/Source/HaloSharp/Model/Stats/Common/Link.cs @@ -6,24 +6,45 @@ namespace HaloSharp.Model.Stats.Common [Serializable] public class Link : IEquatable { + /// + /// Unknown. + /// [JsonProperty(PropertyName = "AcknowledgementTypeId")] public int AcknowledgementTypeId { get; set; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "AuthenticationLifetimeExtensionSupported")] public bool AuthenticationLifetimeExtensionSupported { get; set; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "AuthorityId")] public string AuthorityId { get; set; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "Path")] public string Path { get; set; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "QueryString")] public object QueryString { get; set; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "RetryPolicyId")] public string RetryPolicyId { get; set; } + /// + /// Unknown. + /// [JsonProperty(PropertyName = "TopicName")] public string TopicName { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/ArenaServiceRecord.cs b/Source/HaloSharp/Model/Stats/Lifetime/ArenaServiceRecord.cs index 3afd121..b77aadb 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/ArenaServiceRecord.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/ArenaServiceRecord.cs @@ -10,6 +10,9 @@ namespace HaloSharp.Model.Stats.Lifetime [Serializable] public class ArenaServiceRecord : BaseServiceRecord, IEquatable { + /// + /// Set of responses. One per user queried. + /// [JsonProperty(PropertyName = "Results")] public List Results { get; set; } @@ -71,6 +74,9 @@ public override int GetHashCode() [Serializable] public class ArenaServiceRecordResult : BaseServiceRecordResult, IEquatable { + /// + /// The Service Record result for the player. Only set if ResultCode is Success. + /// [JsonProperty(PropertyName = "Result")] public ArenaResult Result { get; set; } @@ -132,6 +138,9 @@ public override int GetHashCode() [Serializable] public class ArenaResult : BaseResult, IEquatable { + /// + /// Arena stats data. + /// [JsonProperty(PropertyName = "ArenaStats")] public ArenaStat ArenaStats { get; set; } @@ -193,18 +202,52 @@ public override int GetHashCode() [Serializable] public class ArenaStat : BaseStat, IEquatable { + /// + /// List of arena stats by GameBaseVariant across all seasons. + /// [JsonProperty(PropertyName = "ArenaGameBaseVariantStats")] public List ArenaGameBaseVariantStats { get; set; } + /// + /// List of arena stats by playlist. This is the ONLY set of stats in the response that respects the Season ID + /// request parameter. If no Season ID was specified, these will be the stats for the current season. If an + /// invalid Season ID was specified, this will be empty. + /// [JsonProperty(PropertyName = "ArenaPlaylistStats")] public List ArenaPlaylistStats { get; set; } + /// + /// //TODO + /// + [JsonProperty(PropertyName = "ArenaPlaylistStatsSeasonId")] + public Guid ArenaPlaylistStatsSeasonId { get; set; } + + /// + /// The highest obtained CSR by the player in arena across all seasons. If the player hasn't finished + /// measurement matches yet for any playlist, this value is null. + /// [JsonProperty(PropertyName = "HighestCsrAttained")] public CompetitiveSkillRanking HighestCsrAttained { get; set; } + /// + /// The ID for the playlist that pertains to the highest obtained CSR field across all seasons. If the CSR is + /// null, so is this field. + /// [JsonProperty(PropertyName = "HighestCsrPlaylistId")] public Guid? HighestCsrPlaylistId { get; set; } + /// + /// The ID for the season that pertains to the highest obtained CSR field across all seasons. If the CSR is + /// null, so is this field. + /// + [JsonProperty(PropertyName = "HighestCsrSeasonId")] + public Guid? HighestCsrSeasonId { get; set; } + + /// + /// A list of up to 3 game base variants with the highest win rate across all seasons by the user. If there is + /// a tie, the game base variant with more completed games is higher. If there's still a tie, game base variant + /// IDs are sorted and selected. + /// [JsonProperty(PropertyName = "TopGameBaseVariants")] public List TopGameBaseVariants { get; set; } @@ -223,8 +266,10 @@ public bool Equals(ArenaStat other) return base.Equals(other) && ArenaGameBaseVariantStats.OrderBy(agbvs => agbvs.GameBaseVariantId).SequenceEqual(other.ArenaGameBaseVariantStats.OrderBy(agbvs => agbvs.GameBaseVariantId)) && ArenaPlaylistStats.OrderBy(aps => aps.PlaylistId).SequenceEqual(other.ArenaPlaylistStats.OrderBy(aps => aps.PlaylistId)) + && ArenaPlaylistStatsSeasonId.Equals(other.ArenaPlaylistStatsSeasonId) && Equals(HighestCsrAttained, other.HighestCsrAttained) && HighestCsrPlaylistId.Equals(other.HighestCsrPlaylistId) + && HighestCsrSeasonId.Equals(other.HighestCsrSeasonId) && TopGameBaseVariants.OrderBy(aps => aps.GameBaseVariantId).SequenceEqual(other.TopGameBaseVariants.OrderBy(aps => aps.GameBaseVariantId)); } @@ -255,8 +300,10 @@ public override int GetHashCode() int hashCode = base.GetHashCode(); hashCode = (hashCode*397) ^ (ArenaGameBaseVariantStats?.GetHashCode() ?? 0); hashCode = (hashCode*397) ^ (ArenaPlaylistStats?.GetHashCode() ?? 0); + hashCode = (hashCode*397) ^ ArenaPlaylistStatsSeasonId.GetHashCode(); hashCode = (hashCode*397) ^ (HighestCsrAttained?.GetHashCode() ?? 0); hashCode = (hashCode*397) ^ HighestCsrPlaylistId.GetHashCode(); + hashCode = (hashCode*397) ^ HighestCsrSeasonId.GetHashCode(); hashCode = (hashCode*397) ^ (TopGameBaseVariants?.GetHashCode() ?? 0); return hashCode; } @@ -276,15 +323,29 @@ public override int GetHashCode() [Serializable] public class ArenaPlaylistStat : BaseStat, IEquatable { + /// + /// The current Competitive Skill Ranking (CSR) of the player. + /// [JsonProperty(PropertyName = "Csr")] public CompetitiveSkillRanking Csr { get; set; } + /// + /// The highest Competitive Skill Ranking (CSR) achieved by the player. This is included because a player's CSR + /// can drop based on performance. + /// [JsonProperty(PropertyName = "HighestCsr")] public CompetitiveSkillRanking HighestCsr { get; set; } + /// + /// The player's measurement matches left. If this field is greater than zero, then the player will not have a + /// CSR yet. + /// [JsonProperty(PropertyName = "MeasurementMatchesLeft")] public int MeasurementMatchesLeft { get; set; } + /// + /// The playlist ID. Playlists are available via the Metadata API. + /// [JsonProperty(PropertyName = "PlaylistId")] public Guid PlaylistId { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/CampaignServiceRecord.cs b/Source/HaloSharp/Model/Stats/Lifetime/CampaignServiceRecord.cs index 57e340d..83c7839 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/CampaignServiceRecord.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/CampaignServiceRecord.cs @@ -11,6 +11,9 @@ namespace HaloSharp.Model.Stats.Lifetime [Serializable] public class CampaignServiceRecord : BaseServiceRecord, IEquatable { + /// + /// Set of responses. One per user queried. + /// [JsonProperty(PropertyName = "Results")] public List Results { get; set; } @@ -72,6 +75,9 @@ public override int GetHashCode() [Serializable] public class CampaignServiceRecordResult : BaseServiceRecordResult, IEquatable { + /// + /// The Service Record result for the player. Only set if ResultCode is Success. + /// [JsonProperty(PropertyName = "Result")] public CampaignResult Result { get; set; } @@ -133,6 +139,9 @@ public override int GetHashCode() [Serializable] public class CampaignResult : BaseResult, IEquatable { + /// + /// Campaign stats data. + /// [JsonProperty(PropertyName = "CampaignStat")] public CampaignStat CampaignStat { get; set; } @@ -194,6 +203,9 @@ public override int GetHashCode() [Serializable] public class CampaignStat : BaseStat, IEquatable { + /// + /// List of campaign stats by mission ID. + /// [JsonProperty(PropertyName = "CampaignMissionStats")] public List CampaignMissionStats { get; set; } @@ -255,15 +267,29 @@ public override int GetHashCode() [Serializable] public class CampaignMissionStat : BaseStat, IEquatable { + /// + /// The set of stats from missions completed while playing co-op. The key is the difficulty and the value is + /// the playthrough stats for that difficulty. Empty if there are no finished playthroughs. + /// [JsonProperty(PropertyName = "CoopStats")] public Dictionary CoopStats { get; set; } + /// + /// Flexible stats are available via the Metadata API. + /// [JsonProperty(PropertyName = "FlexibleStats")] public FlexibleStats FlexibleStats { get; set; } + /// + /// The mission ID that pertains to this mission. Can be found in metadata. + /// [JsonProperty(PropertyName = "MissionId")] public Guid MissionId { get; set; } + /// + /// The set of stats from missions completed while playing solo. The key is the difficulty and the value is the + /// playthrough stats for that difficulty. Empty if there are no finished playthroughs. + /// [JsonProperty(PropertyName = "SoloStats")] public Dictionary SoloStats { get; set; } @@ -333,19 +359,38 @@ public override int GetHashCode() [Serializable] public class DifficultyStat : IEquatable { + /// + /// True if the mission was completed with all of the skulls on in one playthrough for this difficulty. False + /// otherwise. This field is provided to disambiguate the case where the Skulls set contains all the Skulls but + /// the player played through the mission multiple times, each with a different Skull (as opposed to playing + /// through the mission with ALL the skulls enabled). + /// [JsonProperty(PropertyName = "AllSkullsOn")] public bool AllSkullsOn { get; set; } + /// + /// The fastest completion time by the player on this difficulty. + /// [JsonProperty(PropertyName = "FastestCompletionTime")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan FastestCompletionTime { get; set; } + /// + /// The highest score achieved by the player on this difficulty. + /// [JsonProperty(PropertyName = "HighestScore")] public int HighestScore { get; set; } + /// + /// The aggregate set of skulls the player managed to finish this mission on this difficulty. Not most in a + /// single run, but which have been completed overall. + /// [JsonProperty(PropertyName = "Skulls")] public List Skulls { get; set; } + /// + /// The number of times this mission was completed by the player on this difficulty. + /// [JsonProperty(PropertyName = "TotalTimesCompleted")] public int TotalTimesCompleted { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseResult.cs b/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseResult.cs index ba716aa..ccb4133 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseResult.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseResult.cs @@ -7,12 +7,21 @@ namespace HaloSharp.Model.Stats.Lifetime.Common [Serializable] public class BaseResult : IEquatable { + /// + /// Information about the player for whom this data was returned. + /// [JsonProperty(PropertyName = "PlayerId")] public Identity PlayerId { get; set; } + /// + /// The player's Spartan Rank. + /// [JsonProperty(PropertyName = "SpartanRank")] public int SpartanRank { get; set; } + /// + /// The player's XP. + /// [JsonProperty(PropertyName = "Xp")] public int Xp { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecord.cs b/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecord.cs index 6b07d86..70f08dd 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecord.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecord.cs @@ -9,6 +9,9 @@ namespace HaloSharp.Model.Stats.Lifetime.Common [Serializable] public class BaseServiceRecord : IEquatable { + /// + /// Internal use only. A set of related resource links. + /// [JsonProperty(PropertyName = "Links")] public Dictionary Links { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecordResult.cs b/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecordResult.cs index d1dd404..26c6f6e 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecordResult.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/Common/BaseServiceRecordResult.cs @@ -6,9 +6,30 @@ namespace HaloSharp.Model.Stats.Lifetime.Common [Serializable] public class BaseServiceRecordResult : IEquatable { + /// + /// The player's gamertag. + /// [JsonProperty(PropertyName = "Id")] public string Id { get; set; } + /// + /// The result of the query for the player. One of the following: + /// + /// + /// Success = 0 + /// + /// + /// NotFound = 1 + /// + /// + /// ServiceFailure = 2 + /// + /// + /// ServiceUnavailable = 3 + /// + /// + /// It is possible for different requests from the batch to succeed and fail independently. + /// [JsonProperty(PropertyName = "ResultCode")] public Enumeration.QueryResult ResultCode { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/Common/GameBaseVariantStat.cs b/Source/HaloSharp/Model/Stats/Lifetime/Common/GameBaseVariantStat.cs index d63ae97..1f972a5 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/Common/GameBaseVariantStat.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/Common/GameBaseVariantStat.cs @@ -7,9 +7,15 @@ namespace HaloSharp.Model.Stats.Lifetime.Common [Serializable] public class GameBaseVariantStat : BaseStat, IEquatable { + /// + /// The game base variant specific stats. Flexible stats are available via the Metadata API. + /// [JsonProperty(PropertyName = "FlexibleStats")] public FlexibleStats FlexibleStats { get; set; } + /// + /// The ID of the game base variant. Game base variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "GameBaseVariantId")] public Guid GameBaseVariantId { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/Common/TopGameBaseVariant.cs b/Source/HaloSharp/Model/Stats/Lifetime/Common/TopGameBaseVariant.cs index 9044c4e..4a22e04 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/Common/TopGameBaseVariant.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/Common/TopGameBaseVariant.cs @@ -6,15 +6,27 @@ namespace HaloSharp.Model.Stats.Lifetime.Common [Serializable] public class TopGameBaseVariant : IEquatable { + /// + /// Id of the game base variant. + /// [JsonProperty(PropertyName = "GameBaseVariantId")] public Guid GameBaseVariantId { get; set; } + /// + /// Rank between 1-3. + /// [JsonProperty(PropertyName = "GameBaseVariantRank")] public int GameBaseVariantRank { get; set; } + /// + /// Number of games played in game base variant. + /// [JsonProperty(PropertyName = "NumberOfMatchesCompleted")] public int NumberOfMatchesCompleted { get; set; } + /// + /// Number of matches won on game base variant. + /// [JsonProperty(PropertyName = "NumberOfMatchesWon")] public int NumberOfMatchesWon { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/CustomServiceRecord.cs b/Source/HaloSharp/Model/Stats/Lifetime/CustomServiceRecord.cs index 5aacbb6..c944d01 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/CustomServiceRecord.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/CustomServiceRecord.cs @@ -10,6 +10,9 @@ namespace HaloSharp.Model.Stats.Lifetime [Serializable] public class CustomServiceRecord : BaseServiceRecord, IEquatable { + /// + /// Set of responses. One per user queried. + /// [JsonProperty(PropertyName = "Results")] public List Results { get; set; } @@ -71,6 +74,9 @@ public override int GetHashCode() [Serializable] public class CustomServiceRecordResult : BaseServiceRecordResult, IEquatable { + /// + /// The Service Record result for the player. Only set if ResultCode is Success. + /// [JsonProperty(PropertyName = "Result")] public CustomResult Result { get; set; } @@ -132,6 +138,9 @@ public override int GetHashCode() [Serializable] public class CustomResult : BaseResult, IEquatable { + /// + /// Custom stats data. + /// [JsonProperty(PropertyName = "CustomStats")] public CustomStats CustomStats { get; set; } @@ -193,9 +202,16 @@ public override int GetHashCode() [Serializable] public class CustomStats : BaseStat, IEquatable { + /// + /// List of custom stats by CustomGameBaseVariant. + /// [JsonProperty(PropertyName = "CustomGameBaseVariantStats")] public List CustomGameBaseVariantStats { get; set; } + /// + /// A list of up to 3 top game base variants played by the user Top means Wins/Completed matches. If there is a + /// tie, the one with more completions is higher. If there's still a tie, the GUIDs are sorted and selected. + /// [JsonProperty(PropertyName = "TopGameBaseVariants")] public List TopGameBaseVariants { get; set; } diff --git a/Source/HaloSharp/Model/Stats/Lifetime/WarzoneServiceRecord.cs b/Source/HaloSharp/Model/Stats/Lifetime/WarzoneServiceRecord.cs index 6f604bd..0327e59 100644 --- a/Source/HaloSharp/Model/Stats/Lifetime/WarzoneServiceRecord.cs +++ b/Source/HaloSharp/Model/Stats/Lifetime/WarzoneServiceRecord.cs @@ -10,6 +10,9 @@ namespace HaloSharp.Model.Stats.Lifetime [Serializable] public class WarzoneServiceRecord : BaseServiceRecord, IEquatable { + /// + /// Set of responses. One per user queried. + /// [JsonProperty(PropertyName = "Results")] public List Results { get; set; } @@ -71,6 +74,9 @@ public override int GetHashCode() [Serializable] public class WarzoneServiceRecordResult : BaseServiceRecordResult, IEquatable { + /// + /// The Service Record result for the player. Only set if ResultCode is Success. + /// [JsonProperty(PropertyName = "Result")] public WarzoneResult Result { get; set; } @@ -132,6 +138,9 @@ public override int GetHashCode() [Serializable] public class WarzoneResult : BaseResult, IEquatable { + /// + /// Warzone stats data. + /// [JsonProperty(PropertyName = "WarzoneStat")] public WarzoneStat WarzoneStat { get; set; } @@ -193,9 +202,15 @@ public override int GetHashCode() [Serializable] public class WarzoneStat : BaseStat, IEquatable { + /// + /// List of scenario stats by map and game base variant id. + /// [JsonProperty(PropertyName = "ScenarioStats")] public List ScenarioStats { get; set; } + /// + /// The total number of "pies" (in-game currency) the player has earned. + /// [JsonProperty(PropertyName = "TotalPiesEarned")] public int TotalPiesEarned { get; set; } @@ -261,15 +276,27 @@ public override int GetHashCode() [Serializable] public class ScenarioStat : BaseStat, IEquatable { + /// + /// The game base variant specific stats. Flexible stats are available via the Metadata API. + /// [JsonProperty(PropertyName = "FlexibleStats")] public FlexibleStats FlexibleStats { get; set; } + /// + /// The ID of the game base variant. Game base variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "GameBaseVariantId")] public Guid GameBaseVariantId { get; set; } + /// + /// The map global ID that this warzone scenario pertains to. Found in metadata. + /// [JsonProperty(PropertyName = "MapId")] public Guid MapId { get; set; } + /// + /// The total number of "pies" (in-game currency) the player has earned in the scenario. + /// [JsonProperty(PropertyName = "TotalPiesEarned")] public int TotalPiesEarned { get; set; } diff --git a/Source/HaloSharp/Model/Stats/MatchSet.cs b/Source/HaloSharp/Model/Stats/MatchSet.cs index 0bd9b7b..45becfc 100644 --- a/Source/HaloSharp/Model/Stats/MatchSet.cs +++ b/Source/HaloSharp/Model/Stats/MatchSet.cs @@ -10,18 +10,38 @@ namespace HaloSharp.Model.Stats [Serializable] public class MatchSet : IEquatable { + /// + /// The number of results that the service attempted to retrieve to satisfy this request. Normally this value + /// is equal to the "count" parameter. If the client specified a count parameter greater than the maximum + /// allowed, this value contains the maximum allowed amount. + /// [JsonProperty(PropertyName = "Count")] public int Count { get; set; } + /// + /// Internal use only. A set of related resource links. + /// [JsonProperty(PropertyName = "Links")] public Dictionary Links { get; set; } + /// + /// The number of results that are actually being returned in this response. This field is named "ResultCount" + /// to avoid confusion with "Count". + /// [JsonProperty(PropertyName = "ResultCount")] public int ResultCount { get; set; } + /// + /// A list of recent matches. Matches are listed in chronological order with the most recently started match + /// first. + /// [JsonProperty(PropertyName = "Results")] public List Results { get; set; } + /// + /// The starting point that was used. When the "start" query string parameter is specified, this value is + /// identical. When "start" is omitted, the default value is returned. + /// [JsonProperty(PropertyName = "Start")] public int Start { get; set; } @@ -91,43 +111,97 @@ public override int GetHashCode() [Serializable] public class Result : IEquatable { + /// + /// The ID of the game base variant for this match. Game base variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "GameBaseVariantId")] public Guid GameBaseVariantId { get; set; } + /// + /// The variant of the game for this match. There are two sources of game variants: official game variants + /// available via the Metadata API and user-generated game variants which are not available via the APIs + /// currently. If the game variant for this match was an official game variant, then the structure will be as + /// documented here. This will be null for campaign games. + /// [JsonProperty(PropertyName = "GameVariant")] public Variant GameVariant { get; set; } + /// + /// The ID of the playlist (aka "Hopper") for the match. + /// Hoppers are used in Arena and Warzone. In Arena, they function just as you would expect, similar to + /// previous Halo titles. Warzone uses hoppers as well. There will be multiple Warzone hoppers which contain a + /// rotating playlist of scenarios to play. + /// Null for campaign & custom games. + /// Playlists are available via the Metadata API. + /// [JsonProperty(PropertyName = "HopperId")] public Guid? HopperId { get; set; } + /// + /// //TODO + /// [JsonProperty(PropertyName = "Id")] public Id Id { get; set; } + /// + /// Whether this was a team-based game or not (e.g. free-for-all). + /// [JsonProperty(PropertyName = "IsTeamGame")] public bool IsTeamGame { get; set; } + /// + /// Internal use only. A set of related resource links. + /// [JsonProperty(PropertyName = "Links")] public Dictionary Links { get; set; } + /// + /// The ID of the base map for this match. Maps are available via the Metadata API. + /// [JsonProperty(PropertyName = "MapId")] public Guid MapId { get; set; } + /// + /// The variant of the map for this match. There are two sources of map variants: official map variants + /// available via the Metadata API and user-generated map variants which are not available via the APIs + /// currently. If the map variant for this match was an official map variant, then the structure will be as + /// documented here. This will be null for campaign games. + /// [JsonProperty(PropertyName = "MapVariant")] public Variant MapVariant { get; set; } + /// + /// The date and time when match ended. Note that this is different than the processing date, once matches end + /// they typically take a small amount of time to process. The processing date is not available through this + /// API. The time component of this date is always set to "00:00:00". + /// [JsonProperty(PropertyName = "MatchCompletedDate")] public MatchCompletedDate MatchCompletedDate { get; set; } + /// + /// The length of the match. + /// [JsonProperty(PropertyName = "MatchDuration")] [JsonConverter(typeof (TimeSpanConverter))] public TimeSpan MatchDuration { get; set; } + /// + /// This field contains the player's data. This will only contain data for the player specified in the request. + /// [JsonProperty(PropertyName = "Players")] public List Players { get; set; } + /// + /// ID for the season the match was played in if it was played in a seasonal playlist and null otherwise. This + /// will only be set for Arena matches and will be null for all other game modes. + /// [JsonProperty(PropertyName = "SeasonId")] public Guid? SeasonId { get; set; } + /// + /// Provides team data. This list contains all team that Won or Tied. Losing teams are not included. This list + /// is empty for campaign games. + /// [JsonProperty(PropertyName = "Teams")] public List Teams { get; set; } @@ -213,9 +287,33 @@ public override int GetHashCode() [Serializable] public class Id : IEquatable { + /// + /// A list that indicates what game modes this base variant is available within. Options are: + /// + /// + /// Error = 0 + /// + /// + /// Arena = 1 + /// + /// + /// Campaign = 2 + /// + /// + /// Custom = 3 + /// + /// + /// Warzone = 4 + /// + /// + /// [JsonProperty(PropertyName = "GameMode")] public Enumeration.GameMode GameMode { get; set; } + /// + /// The ID for this match. More match details are available via the applicable Post Game Carnage Report + /// endpoint. + /// [JsonProperty(PropertyName = "MatchId")] public Guid MatchId { get; set; } @@ -277,15 +375,49 @@ public override int GetHashCode() [Serializable] public class Variant : IEquatable { + /// + /// The owner. Usually set to null. + /// [JsonProperty(PropertyName = "Owner")] public string Owner { get; set; } + /// + /// The source of the map variant. Options are: + /// + /// + /// Unknown = 0 + /// + /// + /// User Generated = 1 + /// + /// + /// User Generated = 2 + /// + /// + /// Official = 3 + /// + /// + /// [JsonProperty(PropertyName = "OwnerType")] public Enumeration.OwnerType OwnerType { get; set; } + /// + /// The ID of the map variant. Map variants are available via the Metadata API. + /// [JsonProperty(PropertyName = "ResourceId")] public Guid ResourceId { get; set; } + /// + /// The resource type. + /// /// + /// + /// GameVariant = 2 + /// + /// + /// MapVariant = 3 + /// + /// + /// [JsonProperty(PropertyName = "ResourceType")] public Enumeration.ResourceType ResourceType { get; set; } @@ -353,6 +485,9 @@ public override int GetHashCode() [Serializable] public class MatchCompletedDate : IEquatable { + /// + /// //TODO + /// // ReSharper disable once InconsistentNaming public DateTime ISO8601Date { get; set; } @@ -410,30 +545,82 @@ public override int GetHashCode() [Serializable] public class Player : IEquatable { + /// + /// //TODO + /// [JsonProperty(PropertyName = "Player")] public Identity Identity { get; set; } + /// + /// Internal use only. This will always be null. + /// [JsonProperty(PropertyName = "PostMatchRatings")] public object PostMatchRatings { get; set; } + /// + /// Internal use only. This will always be null. + /// [JsonProperty(PropertyName = "PreMatchRatings")] public object PreMatchRatings { get; set; } + /// + /// The player's team-agnostic ranking in this match. + /// [JsonProperty(PropertyName = "Rank")] public int Rank { get; set; } + /// + /// Indicates what result the player received at the conclusion of the match. + /// + /// + /// Did Not Finish = 0 + /// + /// + /// Lost = 1 + /// + /// + /// Tied = 2 + /// + /// + /// Won = 3 + /// + /// + /// Did Not Finish: The player was not present when the match ended. + /// Lost: The player was on a team that was assigned a loss, typically this is when a team does not have + /// rank = 1. + /// Won: The player was on the team that was assigned the win, typically this is the team that has + /// rank = 1. + /// Tied: The player was on the team that was awarded a tie. Typically this is when the player is on the + /// team with rank = 1, and there is at least one other team with rank = 1. Ties are only for rank = 1 teams. + /// Consider the scenario when exactly one team is rank = 1, and two teams are rank = 2. Players on the + /// rank = 1 team will have "Won", players on the rank = 2 teams will have "Lost". For ties, this documentation + /// states 'typically' because the game may have unique rules for multi-team and FFA scenarios, in which + /// multiple teams are awarded a win. + /// [JsonProperty(PropertyName = "Result")] public Enumeration.ResultType Result { get; set; } + /// + /// The ID of the team that the player was on when the match ended. Zero for campaign games. + /// [JsonProperty(PropertyName = "TeamId")] public int TeamId { get; set; } + /// + /// The number of assists credited to the player during the match. This includes other Spartans and Enemy AI. + /// [JsonProperty(PropertyName = "TotalAssists")] public int TotalAssists { get; set; } + /// + /// The number of times this player died during the match. + /// [JsonProperty(PropertyName = "TotalDeaths")] public int TotalDeaths { get; set; } + /// + /// The number of enemy kills the player had during this match. This includes other Spartans and Enemy AI. + /// [JsonProperty(PropertyName = "TotalKills")] public int TotalKills { get; set; } @@ -511,12 +698,40 @@ public override int GetHashCode() [Serializable] public class Team : IEquatable { + /// + /// The ID for the team. The team's ID dictates the team's color. Team colors are available via the Metadata + /// API. + /// [JsonProperty(PropertyName = "Id")] public int Id { get; set; } + /// + /// The team's rank at the end of the match. + /// [JsonProperty(PropertyName = "Rank")] public int Rank { get; set; } + /// + /// The team's score at the end of the match. The way the score is determined is based off the game base + /// variant being played: + /// + /// + /// Breakout = number of rounds won + /// + /// + /// CTF = number of flag captures + /// + /// + /// Slayer = number of kills + /// + /// + /// Strongholds = number of points + /// + /// + /// Warzone = number of points + /// + /// + /// [JsonProperty(PropertyName = "Score")] public uint Score { get; set; } diff --git a/Source/HaloSharp/Model/ValidationResult.cs b/Source/HaloSharp/Model/ValidationResult.cs new file mode 100644 index 0000000..106c403 --- /dev/null +++ b/Source/HaloSharp/Model/ValidationResult.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Linq; + +namespace HaloSharp.Model +{ + public class ValidationResult + { + public ValidationResult() + { + Messages = new List(); + } + + public List Messages { get; } + public bool Success => !Messages.Any(); + } +} diff --git a/Source/HaloSharp/Properties/AssemblyInfo.cs b/Source/HaloSharp/Properties/AssemblyInfo.cs index 5fb75ca..6c780ac 100644 --- a/Source/HaloSharp/Properties/AssemblyInfo.cs +++ b/Source/HaloSharp/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/Source/HaloSharp/Query/Metadata/GetCampaignMissions.cs b/Source/HaloSharp/Query/Metadata/GetCampaignMissions.cs index d36bb9a..53a3890 100644 --- a/Source/HaloSharp/Query/Metadata/GetCampaignMissions.cs +++ b/Source/HaloSharp/Query/Metadata/GetCampaignMissions.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Campaign Mission Metadata. Use them to translate IDs from other APIs. + /// public class GetCampaignMissions : IQuery> { private const string CacheKey = "CampaignMissions"; @@ -14,13 +17,14 @@ public class GetCampaignMissions : IQuery> public GetCampaignMissions SkipCache() { _useCache = false; + return this; } public async Task> ApplyTo(IHaloSession session) { - var campaignMissions = _useCache - ? Cache.Get>(CacheKey) + var campaignMissions = _useCache + ? Cache.Get>(CacheKey) : null; if (campaignMissions != null) @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetCommendations.cs b/Source/HaloSharp/Query/Metadata/GetCommendations.cs index 4023398..63c3c4a 100644 --- a/Source/HaloSharp/Query/Metadata/GetCommendations.cs +++ b/Source/HaloSharp/Query/Metadata/GetCommendations.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Commendation Metadata. Use them to translate IDs from other APIs. + /// public class GetCommendations : IQuery> { private const string CacheKey = "Commendations"; @@ -14,6 +17,7 @@ public class GetCommendations : IQuery> public GetCommendations SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetCompetitiveSkillRankDesignations.cs b/Source/HaloSharp/Query/Metadata/GetCompetitiveSkillRankDesignations.cs index 42f2e49..7d9d297 100644 --- a/Source/HaloSharp/Query/Metadata/GetCompetitiveSkillRankDesignations.cs +++ b/Source/HaloSharp/Query/Metadata/GetCompetitiveSkillRankDesignations.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed CSR Designation Metadata. Use them to translate IDs from other APIs. + /// public class GetCompetitiveSkillRankDesignations : IQuery> { private const string CacheKey = "CompetitiveSkillRankDesignations"; @@ -14,6 +17,7 @@ public class GetCompetitiveSkillRankDesignations : IQuery> ApplyTo(IHaloSession se return competitiveSkillRankDesignations; } - competitiveSkillRankDesignations = await session.Get>(GetConstructedUri()); + competitiveSkillRankDesignations = + await session.Get>(GetConstructedUri()); Cache.Add(CacheKey, competitiveSkillRankDesignations); @@ -42,4 +47,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetEnemies.cs b/Source/HaloSharp/Query/Metadata/GetEnemies.cs index 8d85460..df44cb1 100644 --- a/Source/HaloSharp/Query/Metadata/GetEnemies.cs +++ b/Source/HaloSharp/Query/Metadata/GetEnemies.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Enemy Metadata. Use them to translate IDs from other APIs. + /// public class GetEnemies : IQuery> { private const string CacheKey = "Enemies"; @@ -14,6 +17,7 @@ public class GetEnemies : IQuery> public GetEnemies SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetFlexibleStats.cs b/Source/HaloSharp/Query/Metadata/GetFlexibleStats.cs index 90e2cb8..9266f80 100644 --- a/Source/HaloSharp/Query/Metadata/GetFlexibleStats.cs +++ b/Source/HaloSharp/Query/Metadata/GetFlexibleStats.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Flexible Stat Metadata. Use them to translate IDs from other APIs. + /// public class GetFlexibleStats : IQuery> { private const string CacheKey = "FlexibleStats"; @@ -14,6 +17,7 @@ public class GetFlexibleStats : IQuery> public GetFlexibleStats SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetGameBaseVariants.cs b/Source/HaloSharp/Query/Metadata/GetGameBaseVariants.cs index 8d7c839..9bbcda0 100644 --- a/Source/HaloSharp/Query/Metadata/GetGameBaseVariants.cs +++ b/Source/HaloSharp/Query/Metadata/GetGameBaseVariants.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Game Base Variant Metadata. Use them to translate IDs from other APIs. + /// public class GetGameBaseVariants : IQuery> { private const string CacheKey = "GameBaseVariants"; @@ -14,6 +17,7 @@ public class GetGameBaseVariants : IQuery> public GetGameBaseVariants SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetGameVariant.cs b/Source/HaloSharp/Query/Metadata/GetGameVariant.cs index 0555a87..9e345a5 100644 --- a/Source/HaloSharp/Query/Metadata/GetGameVariant.cs +++ b/Source/HaloSharp/Query/Metadata/GetGameVariant.cs @@ -2,32 +2,44 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Metadata; +using HaloSharp.Validation.Metadata; namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Game Variant Metadata. Use them to translate IDs from other APIs. + /// public class GetGameVariant : IQuery { private const string CacheKey = "GameVariant"; private bool _useCache = true; - private string _id; + internal string Id; - public GetGameVariant ForGameVariantId(Guid gameVariantId) + public GetGameVariant SkipCache() { - _id = gameVariantId.ToString(); + _useCache = false; + return this; } - public GetGameVariant SkipCache() + /// + /// An ID that uniquely identifies a Game Variant. + /// + /// An ID that uniquely identifies a Game Variant. + public GetGameVariant ForGameVariantId(Guid gameVariantId) { - _useCache = false; + Id = gameVariantId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var gameVariant = _useCache - ? Cache.Get($"{CacheKey}-{_id}") + ? Cache.Get($"{CacheKey}-{Id}") : null; if (gameVariant != null) @@ -37,16 +49,16 @@ public async Task ApplyTo(IHaloSession session) gameVariant = await session.Get(GetConstructedUri()); - Cache.Add($"{CacheKey}-{_id}", gameVariant); + Cache.Add($"{CacheKey}-{Id}", gameVariant); return gameVariant; } public string GetConstructedUri() { - var builder = new StringBuilder($"metadata/h5/metadata/game-variants/{_id}"); + var builder = new StringBuilder($"metadata/h5/metadata/game-variants/{Id}"); return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetImpulses.cs b/Source/HaloSharp/Query/Metadata/GetImpulses.cs index b95b66a..0845d6f 100644 --- a/Source/HaloSharp/Query/Metadata/GetImpulses.cs +++ b/Source/HaloSharp/Query/Metadata/GetImpulses.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Impulse Metadata. Use them to translate IDs from other APIs. + /// public class GetImpulses : IQuery> { private const string CacheKey = "Impulses"; @@ -14,6 +17,7 @@ public class GetImpulses : IQuery> public GetImpulses SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetMapVariant.cs b/Source/HaloSharp/Query/Metadata/GetMapVariant.cs index e83fcd5..9dc27a4 100644 --- a/Source/HaloSharp/Query/Metadata/GetMapVariant.cs +++ b/Source/HaloSharp/Query/Metadata/GetMapVariant.cs @@ -1,33 +1,45 @@ -using System; +using HaloSharp.Model.Metadata; +using HaloSharp.Validation.Metadata; +using System; using System.Text; using System.Threading.Tasks; -using HaloSharp.Model.Metadata; namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Map Variant Metadata. Use them to translate IDs from other APIs. + /// public class GetMapVariant : IQuery { private const string CacheKey = "MapVariant"; private bool _useCache = true; - private string _id; + internal string Id; - public GetMapVariant ForMapVariantId(Guid mapVariantId) + public GetMapVariant SkipCache() { - _id = mapVariantId.ToString(); + _useCache = false; + return this; } - public GetMapVariant SkipCache() + /// + /// An ID that uniquely identifies a Map Variant.. + /// + /// An ID that uniquely identifies a Map Variant. + public GetMapVariant ForMapVariantId(Guid mapVariantId) { - _useCache = false; + Id = mapVariantId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var mapVariant = _useCache - ? Cache.Get($"{CacheKey}-{_id}") + ? Cache.Get($"{CacheKey}-{Id}") : null; if (mapVariant != null) @@ -37,16 +49,16 @@ public async Task ApplyTo(IHaloSession session) mapVariant = await session.Get(GetConstructedUri()); - Cache.Add($"{CacheKey}-{_id}", mapVariant); + Cache.Add($"{CacheKey}-{Id}", mapVariant); return mapVariant; } public string GetConstructedUri() { - var builder = new StringBuilder($"metadata/h5/metadata/map-variants/{_id}"); + var builder = new StringBuilder($"metadata/h5/metadata/map-variants/{Id}"); return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetMaps.cs b/Source/HaloSharp/Query/Metadata/GetMaps.cs index bfb5df9..7ec1a34 100644 --- a/Source/HaloSharp/Query/Metadata/GetMaps.cs +++ b/Source/HaloSharp/Query/Metadata/GetMaps.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Map Metadata. Use them to translate IDs from other APIs. + /// public class GetMaps : IQuery> { private const string CacheKey = "Maps"; @@ -14,6 +17,7 @@ public class GetMaps : IQuery> public GetMaps SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetMedals.cs b/Source/HaloSharp/Query/Metadata/GetMedals.cs index 954d0bf..d0990e2 100644 --- a/Source/HaloSharp/Query/Metadata/GetMedals.cs +++ b/Source/HaloSharp/Query/Metadata/GetMedals.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Medal Metadata. Use them to translate IDs from other APIs. + /// public class GetMedals : IQuery> { private const string CacheKey = "Medals"; @@ -14,6 +17,7 @@ public class GetMedals : IQuery> public GetMedals SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetPlaylists.cs b/Source/HaloSharp/Query/Metadata/GetPlaylists.cs index d601876..3bc3523 100644 --- a/Source/HaloSharp/Query/Metadata/GetPlaylists.cs +++ b/Source/HaloSharp/Query/Metadata/GetPlaylists.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Playlist Metadata. Use them to translate IDs from other APIs. + /// public class GetPlaylists : IQuery> { private const string CacheKey = "Playlists"; @@ -14,6 +17,7 @@ public class GetPlaylists : IQuery> public GetPlaylists SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetRequisition.cs b/Source/HaloSharp/Query/Metadata/GetRequisition.cs index 1b10430..31a958d 100644 --- a/Source/HaloSharp/Query/Metadata/GetRequisition.cs +++ b/Source/HaloSharp/Query/Metadata/GetRequisition.cs @@ -1,33 +1,47 @@ using System; using System.Text; using System.Threading.Tasks; +using HaloSharp.Exception; +using HaloSharp.Model; using HaloSharp.Model.Metadata; +using HaloSharp.Validation.Metadata; namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Requisition Metadata. Use them to translate IDs from other APIs. + /// public class GetRequisition : IQuery { private const string CacheKey = "Requisition"; - + private bool _useCache = true; - private string _id; + internal string Id; - public GetRequisition ForRequisitionId(Guid requisitionId) + public GetRequisition SkipCache() { - _id = requisitionId.ToString(); + _useCache = false; + return this; } - public GetRequisition SkipCache() + /// + /// An ID that uniquely identifies a Requisition. + /// + /// An ID that uniquely identifies a Requisition. + public GetRequisition ForRequisitionId(Guid requisitionId) { - _useCache = false; + Id = requisitionId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var requisition = _useCache - ? Cache.Get($"{CacheKey}-{_id}") + ? Cache.Get($"{CacheKey}-{Id}") : null; if (requisition != null) @@ -37,16 +51,16 @@ public async Task ApplyTo(IHaloSession session) requisition = await session.Get(GetConstructedUri()); - Cache.Add($"{CacheKey}-{_id}", requisition); + Cache.Add($"{CacheKey}-{Id}", requisition); return requisition; } public string GetConstructedUri() { - var builder = new StringBuilder($"metadata/h5/metadata/requisitions/{_id}"); + var builder = new StringBuilder($"metadata/h5/metadata/requisitions/{Id}"); return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetRequisitionPack.cs b/Source/HaloSharp/Query/Metadata/GetRequisitionPack.cs index 8eee675..a9b7aa3 100644 --- a/Source/HaloSharp/Query/Metadata/GetRequisitionPack.cs +++ b/Source/HaloSharp/Query/Metadata/GetRequisitionPack.cs @@ -2,32 +2,44 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Metadata.Common; +using HaloSharp.Validation.Metadata; namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Requisition Pack Metadata. Use them to translate IDs from other APIs. + /// public class GetRequisitionPack : IQuery { private const string CacheKey = "RequisitionPack"; private bool _useCache = true; - private string _id; + internal string Id; - public GetRequisitionPack ForRequisitionPackId(Guid requisitionPackId) + public GetRequisitionPack SkipCache() { - _id = requisitionPackId.ToString(); + _useCache = false; + return this; } - public GetRequisitionPack SkipCache() + /// + /// An ID that uniquely identifies a requisition pack. + /// + /// An ID that uniquely identifies a requisition pack. + public GetRequisitionPack ForRequisitionPackId(Guid requisitionPackId) { - _useCache = false; + Id = requisitionPackId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var requisitionPack = _useCache - ? Cache.Get($"{CacheKey}-{_id}") + ? Cache.Get($"{CacheKey}-{Id}") : null; if (requisitionPack != null) @@ -44,9 +56,9 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"metadata/h5/metadata/requisition-packs/{_id}"); + var builder = new StringBuilder($"metadata/h5/metadata/requisition-packs/{Id}"); return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetSeasons.cs b/Source/HaloSharp/Query/Metadata/GetSeasons.cs index 2f46310..df88d6d 100644 --- a/Source/HaloSharp/Query/Metadata/GetSeasons.cs +++ b/Source/HaloSharp/Query/Metadata/GetSeasons.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Season Metadata. Use them to translate IDs from other APIs. + /// public class GetSeasons : IQuery> { private const string CacheKey = "Seasons"; @@ -14,13 +17,14 @@ public class GetSeasons : IQuery> public GetSeasons SkipCache() { _useCache = false; + return this; } public async Task> ApplyTo(IHaloSession session) { - var seasons = _useCache - ? Cache.Get>(CacheKey) + var seasons = _useCache + ? Cache.Get>(CacheKey) : null; if (seasons != null) @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetSkulls.cs b/Source/HaloSharp/Query/Metadata/GetSkulls.cs index 698a002..44f413a 100644 --- a/Source/HaloSharp/Query/Metadata/GetSkulls.cs +++ b/Source/HaloSharp/Query/Metadata/GetSkulls.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Skull Metadata. Use them to translate IDs from other APIs. + /// public class GetSkulls : IQuery> { private const string CacheKey = "Skulls"; @@ -14,6 +17,7 @@ public class GetSkulls : IQuery> public GetSkulls SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetSpartanRanks.cs b/Source/HaloSharp/Query/Metadata/GetSpartanRanks.cs index 217165d..eba54ef 100644 --- a/Source/HaloSharp/Query/Metadata/GetSpartanRanks.cs +++ b/Source/HaloSharp/Query/Metadata/GetSpartanRanks.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Spartan Rank Metadata. Use them to translate IDs from other APIs. + /// public class GetSpartanRanks : IQuery> { private const string CacheKey = "SpartanRanks"; @@ -14,6 +17,7 @@ public class GetSpartanRanks : IQuery> public GetSpartanRanks SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetTeamColors.cs b/Source/HaloSharp/Query/Metadata/GetTeamColors.cs index 19c0da9..c2b5a39 100644 --- a/Source/HaloSharp/Query/Metadata/GetTeamColors.cs +++ b/Source/HaloSharp/Query/Metadata/GetTeamColors.cs @@ -1,19 +1,32 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using HaloSharp.Exception; +using HaloSharp.Model; using HaloSharp.Model.Metadata; namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Team Color Metadata. Use them to translate IDs from other APIs. + /// public class GetTeamColors : IQuery> { private const string CacheKey = "TeamColors"; private bool _useCache = true; + public string GetConstructedUri() + { + var builder = new StringBuilder("metadata/h5/metadata/team-colors"); + + return builder.ToString(); + } + public GetTeamColors SkipCache() { _useCache = false; + return this; } @@ -34,12 +47,5 @@ public async Task> ApplyTo(IHaloSession session) return teamColors; } - - public string GetConstructedUri() - { - var builder = new StringBuilder("metadata/h5/metadata/team-colors"); - - return builder.ToString(); - } } } diff --git a/Source/HaloSharp/Query/Metadata/GetVehicles.cs b/Source/HaloSharp/Query/Metadata/GetVehicles.cs index a15e249..76379c0 100644 --- a/Source/HaloSharp/Query/Metadata/GetVehicles.cs +++ b/Source/HaloSharp/Query/Metadata/GetVehicles.cs @@ -1,10 +1,15 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using HaloSharp.Exception; +using HaloSharp.Model; using HaloSharp.Model.Metadata; namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Vehicle Metadata. Use them to translate IDs from other APIs. + /// public class GetVehicles : IQuery> { private const string CacheKey = "Vehicles"; @@ -14,6 +19,7 @@ public class GetVehicles : IQuery> public GetVehicles SkipCache() { _useCache = false; + return this; } @@ -42,4 +48,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Metadata/GetWeapons.cs b/Source/HaloSharp/Query/Metadata/GetWeapons.cs index 62f1f9e..3bcd60e 100644 --- a/Source/HaloSharp/Query/Metadata/GetWeapons.cs +++ b/Source/HaloSharp/Query/Metadata/GetWeapons.cs @@ -5,6 +5,9 @@ namespace HaloSharp.Query.Metadata { + /// + /// Construct a query to retrieve detailed Weapon Metadata. Use them to translate IDs from other APIs. + /// public class GetWeapons : IQuery> { private const string CacheKey = "Weapons"; @@ -14,6 +17,7 @@ public class GetWeapons : IQuery> public GetWeapons SkipCache() { _useCache = false; + return this; } @@ -42,4 +46,4 @@ public string GetConstructedUri() return builder.ToString(); } } -} +} \ No newline at end of file diff --git a/Source/HaloSharp/Query/Profile/GetEmblemImage.cs b/Source/HaloSharp/Query/Profile/GetEmblemImage.cs index 17d479c..03f2410 100644 --- a/Source/HaloSharp/Query/Profile/GetEmblemImage.cs +++ b/Source/HaloSharp/Query/Profile/GetEmblemImage.cs @@ -3,29 +3,45 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Profile; +using HaloSharp.Validation.Profile; namespace HaloSharp.Query.Profile { + /// + /// Construct a query to retrieve a player's Emblem Metadata. Use them to translate IDs from other APIs. + /// public class GetEmblemImage : IQuery { - private readonly IDictionary _parameters = new Dictionary(); - - private string _player; + internal readonly IDictionary Parameters = new Dictionary(); + internal string Player; + /// + /// The Player's gamertag. + /// + /// The Player's gamertag. public GetEmblemImage ForPlayer(string gamertag) { - _player = gamertag; + Player = gamertag; + return this; } + /// + /// An optional size (specified in pixels) of the image requested. When specified, this value must be one of the + /// following values: 95, 128, 190, 256, 512. + /// + /// An optional size (specified in pixels) of the image requested. public GetEmblemImage Size(int size) { - _parameters["size"] = size.ToString(); + Parameters["size"] = size.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var tuple = await session.GetImage(GetConstructedUri()); return new GetImage @@ -37,12 +53,12 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"profile/h5/profiles/{_player}/emblem"); + var builder = new StringBuilder($"profile/h5/profiles/{Player}/emblem"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Query/Profile/GetSpartanImage.cs b/Source/HaloSharp/Query/Profile/GetSpartanImage.cs index f70c1b7..cc1417c 100644 --- a/Source/HaloSharp/Query/Profile/GetSpartanImage.cs +++ b/Source/HaloSharp/Query/Profile/GetSpartanImage.cs @@ -2,37 +2,59 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using HaloSharp.Exception; using HaloSharp.Model; using HaloSharp.Model.Profile; +using HaloSharp.Validation.Profile; namespace HaloSharp.Query.Profile { + /// + /// Construct a query to retrieve a player's Spartan Image Metadata. Use them to translate IDs from other APIs. + /// public class GetSpartanImage : IQuery { - private readonly IDictionary _parameters = new Dictionary(); - - private string _player; + internal readonly IDictionary Parameters = new Dictionary(); + internal string Player; + /// + /// The Player's gamertag. + /// + /// The Player's gamertag. public GetSpartanImage ForPlayer(string gamertag) { - _player = gamertag; + Player = gamertag; + return this; } + /// + /// An optional size (specified in pixels) of the image requested. When specified, this value must be one of the + /// following values: 95, 128, 190, 256, 512. + /// + /// An optional size (specified in pixels) of the image requested. public GetSpartanImage Size(int size) { - _parameters["size"] = size.ToString(); + Parameters["size"] = size.ToString(); + return this; } + /// + /// An optional crop that will be used to determine what portion of the Spartan is returned in the image. + /// + /// Crop that will be used to determine what portion of the Spartan is returned. public GetSpartanImage Crop(Enumeration.CropType cropType) { - _parameters["crop"] = cropType.ToString(); + Parameters["crop"] = cropType.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var tuple = await session.GetImage(GetConstructedUri()); return new GetImage @@ -44,12 +66,12 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"profile/h5/profiles/{_player}/spartan"); + var builder = new StringBuilder($"profile/h5/profiles/{Player}/spartan"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Query/Stats/CarnageReport/GetArenaMatchDetails.cs b/Source/HaloSharp/Query/Stats/CarnageReport/GetArenaMatchDetails.cs index 4f6e89a..5204915 100644 --- a/Source/HaloSharp/Query/Stats/CarnageReport/GetArenaMatchDetails.cs +++ b/Source/HaloSharp/Query/Stats/CarnageReport/GetArenaMatchDetails.cs @@ -2,21 +2,33 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.CarnageReport; +using HaloSharp.Validation.Stats.CarnageReport; namespace HaloSharp.Query.Stats.CarnageReport { + /// + /// Construct a query to retrieve detailed statistics for a match. Some match details are available while the match is + /// in-progress, but the behavior for incomplete matches in undefined. + /// public class GetArenaMatchDetails : IQuery { - private string _matchId; + internal string MatchId; + /// + /// An ID that uniquely identifies a match. Match IDs can be retrieved from the "GET Matches for Player" API. + /// + /// The ID that uniquely identifies a match. public GetArenaMatchDetails ForMatchId(Guid matchId) { - _matchId = matchId.ToString(); + MatchId = matchId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -24,7 +36,7 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"stats/h5/arena/matches/{_matchId}"); + var builder = new StringBuilder($"stats/h5/arena/matches/{MatchId}"); return builder.ToString(); } diff --git a/Source/HaloSharp/Query/Stats/CarnageReport/GetCampaignMatchDetails.cs b/Source/HaloSharp/Query/Stats/CarnageReport/GetCampaignMatchDetails.cs index 4ddbdca..0f85fab 100644 --- a/Source/HaloSharp/Query/Stats/CarnageReport/GetCampaignMatchDetails.cs +++ b/Source/HaloSharp/Query/Stats/CarnageReport/GetCampaignMatchDetails.cs @@ -2,21 +2,35 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.CarnageReport; +using HaloSharp.Validation.Stats.CarnageReport; namespace HaloSharp.Query.Stats.CarnageReport { + /// + /// Construct a query to retrieve detailed statistics for a match. Some match details are available while the match + /// is in-progress, but the behavior for incomplete matches in undefined. Every time a player plays a portion of a + /// Campaign mission, a match will be generated whether the player finishes the mission or not. If the "match" ends + /// because the mission was completed, this will be indicated in the response. + /// public class GetCampaignMatchDetails : IQuery { - private string _matchId; + internal string MatchId; + /// + /// An ID that uniquely identifies a match. Match IDs can be retrieved from the "GET Matches for Player" API. + /// + /// The ID that uniquely identifies a match. public GetCampaignMatchDetails ForMatchId(Guid matchId) { - _matchId = matchId.ToString(); + MatchId = matchId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -24,7 +38,7 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"stats/h5/campaign/matches/{_matchId}"); + var builder = new StringBuilder($"stats/h5/campaign/matches/{MatchId}"); return builder.ToString(); } diff --git a/Source/HaloSharp/Query/Stats/CarnageReport/GetCustomMatchDetails.cs b/Source/HaloSharp/Query/Stats/CarnageReport/GetCustomMatchDetails.cs index 469c216..63937b8 100644 --- a/Source/HaloSharp/Query/Stats/CarnageReport/GetCustomMatchDetails.cs +++ b/Source/HaloSharp/Query/Stats/CarnageReport/GetCustomMatchDetails.cs @@ -2,21 +2,33 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.CarnageReport; +using HaloSharp.Validation.Stats.CarnageReport; namespace HaloSharp.Query.Stats.CarnageReport { + /// + /// Construct a query to retrieve detailed statistics for a match. Some match details are available while the match + /// is in-progress, but the behavior for incomplete matches in undefined. + /// public class GetCustomMatchDetails : IQuery { - private string _matchId; + internal string MatchId; + /// + /// An ID that uniquely identifies a match. Match IDs can be retrieved from the "GET Matches for Player" API. + /// + /// The ID that uniquely identifies a match. public GetCustomMatchDetails ForMatchId(Guid matchId) { - _matchId = matchId.ToString(); + MatchId = matchId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -24,7 +36,7 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"stats/h5/custom/matches/{_matchId}"); + var builder = new StringBuilder($"stats/h5/custom/matches/{MatchId}"); return builder.ToString(); } diff --git a/Source/HaloSharp/Query/Stats/CarnageReport/GetWarzoneMatchDetails.cs b/Source/HaloSharp/Query/Stats/CarnageReport/GetWarzoneMatchDetails.cs index e368e1b..da76b2f 100644 --- a/Source/HaloSharp/Query/Stats/CarnageReport/GetWarzoneMatchDetails.cs +++ b/Source/HaloSharp/Query/Stats/CarnageReport/GetWarzoneMatchDetails.cs @@ -2,21 +2,33 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.CarnageReport; +using HaloSharp.Validation.Stats.CarnageReport; namespace HaloSharp.Query.Stats.CarnageReport { + /// + /// Construct a query to retrieve detailed statistics for a match. Some match details are available while the match + /// is in-progress, but the behavior for incomplete matches in undefined. + /// public class GetWarzoneMatchDetails : IQuery { - private string _matchId; + internal string MatchId; + /// + /// An ID that uniquely identifies a match. Match IDs can be retrieved from the "GET Matches for Player" API. + /// + /// The ID that uniquely identifies a match. public GetWarzoneMatchDetails ForMatchId(Guid matchId) { - _matchId = matchId.ToString(); + MatchId = matchId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -24,7 +36,7 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"stats/h5/warzone/matches/{_matchId}"); + var builder = new StringBuilder($"stats/h5/warzone/matches/{MatchId}"); return builder.ToString(); } diff --git a/Source/HaloSharp/Query/Stats/GetMatches.cs b/Source/HaloSharp/Query/Stats/GetMatches.cs index 2470535..8040500 100644 --- a/Source/HaloSharp/Query/Stats/GetMatches.cs +++ b/Source/HaloSharp/Query/Stats/GetMatches.cs @@ -2,49 +2,86 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using HaloSharp.Exception; using HaloSharp.Model; using HaloSharp.Model.Stats; +using HaloSharp.Validation.Stats; namespace HaloSharp.Query.Stats { + /// + /// Construct a query to retrieve a list of matches that the player has participated in and which have completed + /// processing. If the player is currently in a match, it is not returned in this API. Matches will usually appear + /// in this list within a minute of the match ending. + /// public class GetMatches : IQuery { - private readonly IDictionary _parameters = new Dictionary(); - - private string _player; + internal readonly IDictionary Parameters = new Dictionary(); + internal string Player; + /// + /// The Player's gamertag. + /// + /// The Player's gamertag. public GetMatches ForPlayer(string gamertag) { - _player = gamertag; + Player = gamertag; + return this; } + /// + /// Indicates what game mode the client is interested in getting matches for (arena, campaign, custom, or + /// warzone). + /// + /// The Game Mode the client is interested in. public GetMatches InGameMode(Enumeration.GameMode gameMode) { - _parameters["modes"] = gameMode.ToString(); + Parameters["modes"] = gameMode.ToString(); + return this; } + /// + /// Indicates what game modes the client is interested in getting matches for (arena, campaign, custom, or + /// warzone). + /// + /// The Game Mode(s) the client is interested in. public GetMatches InGameModes(List gameModes) { - _parameters["modes"] = string.Join(",", gameModes.Select(g => g.ToString())); + Parameters["modes"] = string.Join(",", gameModes.Select(g => g.ToString())); + return this; } + /// + /// When specified, this indicates the starting index (0-based) for which the batch of results will begin at. + /// + /// The starting index (0-based) for which the batch of results will begin at. public GetMatches Skip(int count) { - _parameters["start"] = count.ToString(); + Parameters["start"] = count.ToString(); + return this; } + /// + /// When specified, this indicates the maximum quantity of items the client would like returned in the + /// response. When the value is greater than the allowed range [1,25], the maximum allowed value is used + /// instead. The "Count" field in the response will confirm the actual value that was used. + /// + /// The maximum quantity of items the client would like returned. public GetMatches Take(int count) { - _parameters["count"] = count.ToString(); + Parameters["count"] = count.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var matchSet = await session.Get(GetConstructedUri()); return matchSet; @@ -52,12 +89,12 @@ public async Task ApplyTo(IHaloSession session) public string GetConstructedUri() { - var builder = new StringBuilder($"stats/h5/players/{_player}/matches"); + var builder = new StringBuilder($"stats/h5/players/{Player}/matches"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Query/Stats/Lifetime/GetArenaServiceRecord.cs b/Source/HaloSharp/Query/Stats/Lifetime/GetArenaServiceRecord.cs index 25b6804..9d482bd 100644 --- a/Source/HaloSharp/Query/Stats/Lifetime/GetArenaServiceRecord.cs +++ b/Source/HaloSharp/Query/Stats/Lifetime/GetArenaServiceRecord.cs @@ -1,29 +1,58 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.Lifetime; +using HaloSharp.Validation.Stats.Lifetime; namespace HaloSharp.Query.Stats.Lifetime { + /// + /// Construct a query to retrieve players' Service Records. A Service Record contains a player's lifetime + /// statistics in the game mode. + /// public class GetArenaServiceRecord : IQuery { - private readonly IDictionary _parameters = new Dictionary(); + internal readonly IDictionary Parameters = new Dictionary(); + /// + /// A player's gamertag. + /// + /// Player's gamertag. public GetArenaServiceRecord ForPlayer(string gamertag) { - _parameters["players"] = gamertag; + Parameters["players"] = gamertag; + return this; } + /// + /// A list of player gamertags. The number of concurrent supported player identifiers for this API is 1-32. + /// + /// Player's gamertag(s). public GetArenaServiceRecord ForPlayers(List gamertags) { - _parameters["players"] = string.Join(",", gamertags); + Parameters["players"] = string.Join(",", gamertags); + + return this; + } + + /// + /// When specified, this indicates the Guid of the season to request the Arena Playlist Stats for. + /// + /// The ID that uniquely identifies a season. + public GetArenaServiceRecord ForSeasonId(Guid seasonId) + { + Parameters["seasonId"] = seasonId.ToString(); + return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -33,10 +62,10 @@ public string GetConstructedUri() { var builder = new StringBuilder("stats/h5/servicerecords/arena"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Query/Stats/Lifetime/GetCampaignServiceRecord.cs b/Source/HaloSharp/Query/Stats/Lifetime/GetCampaignServiceRecord.cs index 3789162..9d40984 100644 --- a/Source/HaloSharp/Query/Stats/Lifetime/GetCampaignServiceRecord.cs +++ b/Source/HaloSharp/Query/Stats/Lifetime/GetCampaignServiceRecord.cs @@ -3,27 +3,42 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.Lifetime; +using HaloSharp.Validation.Stats.Lifetime; namespace HaloSharp.Query.Stats.Lifetime { + /// + /// Construct a query to retrieve players' Service Records. A Service Record contains a player's lifetime + /// statistics in the game mode. + /// public class GetCampaignServiceRecord : IQuery { - private readonly IDictionary _parameters = new Dictionary(); + internal readonly IDictionary Parameters = new Dictionary(); + /// + /// A player's gamertag. + /// + /// Player's gamertag. public GetCampaignServiceRecord ForPlayer(string gamertag) { - _parameters["players"] = gamertag; + Parameters["players"] = gamertag; return this; } + /// + /// A list of player gamertags. The number of concurrent supported player identifiers for this API is 1-32. + /// + /// Player's gamertag(s). public GetCampaignServiceRecord ForPlayers(List gamertags) { - _parameters["players"] = string.Join(",", gamertags); + Parameters["players"] = string.Join(",", gamertags); return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -33,10 +48,10 @@ public string GetConstructedUri() { var builder = new StringBuilder("stats/h5/servicerecords/campaign"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Query/Stats/Lifetime/GetCustomServiceRecord.cs b/Source/HaloSharp/Query/Stats/Lifetime/GetCustomServiceRecord.cs index becec3c..a129113 100644 --- a/Source/HaloSharp/Query/Stats/Lifetime/GetCustomServiceRecord.cs +++ b/Source/HaloSharp/Query/Stats/Lifetime/GetCustomServiceRecord.cs @@ -3,27 +3,42 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.Lifetime; +using HaloSharp.Validation.Stats.Lifetime; namespace HaloSharp.Query.Stats.Lifetime { + /// + /// Construct a query to retrieve players' Service Records. A Service Record contains a player's lifetime + /// statistics in the game mode. + /// public class GetCustomServiceRecord : IQuery { - private readonly IDictionary _parameters = new Dictionary(); + internal readonly IDictionary Parameters = new Dictionary(); + /// + /// A player's gamertag. + /// + /// Player's gamertag. public GetCustomServiceRecord ForPlayer(string gamertag) { - _parameters["players"] = gamertag; + Parameters["players"] = gamertag; return this; } + /// + /// A list of player gamertags. The number of concurrent supported player identifiers for this API is 1-32. + /// + /// Player's gamertag(s). public GetCustomServiceRecord ForPlayers(List gamertags) { - _parameters["players"] = string.Join(",", gamertags); + Parameters["players"] = string.Join(",", gamertags); return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -33,10 +48,10 @@ public string GetConstructedUri() { var builder = new StringBuilder("stats/h5/servicerecords/custom"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Query/Stats/Lifetime/GetWarzoneServiceRecord.cs b/Source/HaloSharp/Query/Stats/Lifetime/GetWarzoneServiceRecord.cs index 0f76910..61e1b9e 100644 --- a/Source/HaloSharp/Query/Stats/Lifetime/GetWarzoneServiceRecord.cs +++ b/Source/HaloSharp/Query/Stats/Lifetime/GetWarzoneServiceRecord.cs @@ -3,27 +3,42 @@ using System.Text; using System.Threading.Tasks; using HaloSharp.Model.Stats.Lifetime; +using HaloSharp.Validation.Stats.Lifetime; namespace HaloSharp.Query.Stats.Lifetime { + /// + /// Construct a query to retrieve players' Service Records. A Service Record contains a player's lifetime + /// statistics in the game mode. + /// public class GetWarzoneServiceRecord : IQuery { - private readonly IDictionary _parameters = new Dictionary(); + internal readonly IDictionary Parameters = new Dictionary(); + /// + /// A player's gamertag. + /// + /// Player's gamertag. public GetWarzoneServiceRecord ForPlayer(string gamertag) { - _parameters["players"] = gamertag; + Parameters["players"] = gamertag; return this; } + /// + /// A list of player gamertags. The number of concurrent supported player identifiers for this API is 1-32. + /// + /// Player's gamertag(s). public GetWarzoneServiceRecord ForPlayers(List gamertags) { - _parameters["players"] = string.Join(",", gamertags); + Parameters["players"] = string.Join(",", gamertags); return this; } public async Task ApplyTo(IHaloSession session) { + this.Validate(); + var match = await session.Get(GetConstructedUri()); return match; @@ -33,10 +48,10 @@ public string GetConstructedUri() { var builder = new StringBuilder("stats/h5/servicerecords/warzone"); - if (_parameters.Any()) + if (Parameters.Any()) { builder.Append("?"); - builder.Append(string.Join("&", _parameters.Select(p => $"{p.Key}={p.Value}"))); + builder.Append(string.Join("&", Parameters.Select(p => $"{p.Key}={p.Value}"))); } return builder.ToString(); diff --git a/Source/HaloSharp/Validation/Common/GamertagValidator.cs b/Source/HaloSharp/Validation/Common/GamertagValidator.cs new file mode 100644 index 0000000..51dbbbb --- /dev/null +++ b/Source/HaloSharp/Validation/Common/GamertagValidator.cs @@ -0,0 +1,14 @@ +using System.Text.RegularExpressions; + +namespace HaloSharp.Validation.Common +{ + public static class GamertagValidator + { + public static bool IsValidGamertag(this string gamertag) + { + var regex = new Regex(@"^[a-zA-Z0-9 ]{1,16}$"); + + return !string.IsNullOrWhiteSpace(gamertag) && regex.IsMatch(gamertag); + } + } +} diff --git a/Source/HaloSharp/Validation/Metadata/GetGameVariantValidator.cs b/Source/HaloSharp/Validation/Metadata/GetGameVariantValidator.cs new file mode 100644 index 0000000..4353a20 --- /dev/null +++ b/Source/HaloSharp/Validation/Metadata/GetGameVariantValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Metadata; + +namespace HaloSharp.Validation.Metadata +{ + public static class GetGameVariantValidator + { + public static void Validate(this GetGameVariant getGameVariant) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getGameVariant.Id)) + { + validationResult.Messages.Add("GetGameVariant query requires a GameVariantId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Metadata/GetMapVariantValidator.cs b/Source/HaloSharp/Validation/Metadata/GetMapVariantValidator.cs new file mode 100644 index 0000000..72ee0cf --- /dev/null +++ b/Source/HaloSharp/Validation/Metadata/GetMapVariantValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Metadata; + +namespace HaloSharp.Validation.Metadata +{ + public static class GetMapVariantValidator + { + public static void Validate(this GetMapVariant getMapVariant) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getMapVariant.Id)) + { + validationResult.Messages.Add("GetMapVariant query requires a MapVariantId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Metadata/GetRequisitionPackValidator.cs b/Source/HaloSharp/Validation/Metadata/GetRequisitionPackValidator.cs new file mode 100644 index 0000000..4ddd56e --- /dev/null +++ b/Source/HaloSharp/Validation/Metadata/GetRequisitionPackValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Metadata; + +namespace HaloSharp.Validation.Metadata +{ + public static class GetRequisitionPackValidator + { + public static void Validate(this GetRequisitionPack getRequisitionPack) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getRequisitionPack.Id)) + { + validationResult.Messages.Add("GetRequisitionPack query requires a RequisitionPackId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Metadata/GetRequisitionValidator.cs b/Source/HaloSharp/Validation/Metadata/GetRequisitionValidator.cs new file mode 100644 index 0000000..33123b8 --- /dev/null +++ b/Source/HaloSharp/Validation/Metadata/GetRequisitionValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Metadata; + +namespace HaloSharp.Validation.Metadata +{ + public static class GetRequisitionValidator + { + public static void Validate(this GetRequisition getRequisition) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getRequisition.Id)) + { + validationResult.Messages.Add("GetRequisition query requires a RequisitionId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Profile/GetEmblemImageValidator.cs b/Source/HaloSharp/Validation/Profile/GetEmblemImageValidator.cs new file mode 100644 index 0000000..248a423 --- /dev/null +++ b/Source/HaloSharp/Validation/Profile/GetEmblemImageValidator.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Profile; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Profile +{ + public static class GetEmblemImageValidator + { + public static void Validate(this GetEmblemImage getEmblemImage) + { + var validationResult = new ValidationResult(); + + if (!getEmblemImage.Player.IsValidGamertag()) + { + validationResult.Messages.Add("GetEmblemImage query requires a valid Gamertag (Player) to be set."); + } + + if (getEmblemImage.Parameters.ContainsKey("size")) + { + var validSizes = new List { 95, 128, 190, 256, 512 }; + + int size; + var parsed = int.TryParse(getEmblemImage.Parameters["size"], out size); + + if (!parsed || !validSizes.Contains(size)) + { + validationResult.Messages.Add($"GetEmblemImage optional paramater 'size' is invalid: {size}."); + } + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Profile/GetSpartanImageValidator.cs b/Source/HaloSharp/Validation/Profile/GetSpartanImageValidator.cs new file mode 100644 index 0000000..1f00f9f --- /dev/null +++ b/Source/HaloSharp/Validation/Profile/GetSpartanImageValidator.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Profile; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Profile +{ + public static class GetSpartanImageValidator + { + public static void Validate(this GetSpartanImage getSpartanImage) + { + var validationResult = new ValidationResult(); + + if (!getSpartanImage.Player.IsValidGamertag()) + { + validationResult.Messages.Add("GetSpartanImage query requires a valid Gamertag (Player) to be set."); + } + + if (getSpartanImage.Parameters.ContainsKey("size")) + { + var validSizes = new List { 95, 128, 190, 256, 512 }; + + int size; + var parsed = int.TryParse(getSpartanImage.Parameters["size"], out size); + + if (!parsed || !validSizes.Contains(size)) + { + validationResult.Messages.Add($"GetSpartanImage optional paramater 'Size' is invalid: {size}."); + } + } + + if (getSpartanImage.Parameters.ContainsKey("crop")) + { + var crop = getSpartanImage.Parameters["crop"]; + + var defined = Enum.IsDefined(typeof(Enumeration.CropType), crop); + + if (!defined) + { + validationResult.Messages.Add($"GetSpartanImage optional paramater 'Crop' is invalid: {crop}."); + } + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Stats/CarnageReport/GetArenaMatchDetailsValidator.cs b/Source/HaloSharp/Validation/Stats/CarnageReport/GetArenaMatchDetailsValidator.cs new file mode 100644 index 0000000..30d2d5f --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/CarnageReport/GetArenaMatchDetailsValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.CarnageReport; + +namespace HaloSharp.Validation.Stats.CarnageReport +{ + public static class GetArenaMatchDetailsValidator + { + public static void Validate(this GetArenaMatchDetails getArenaMatchDetails) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getArenaMatchDetails.MatchId)) + { + validationResult.Messages.Add("GetArenaMatchDetails query requires a MatchId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/CarnageReport/GetCampaignMatchDetailsValidator.cs b/Source/HaloSharp/Validation/Stats/CarnageReport/GetCampaignMatchDetailsValidator.cs new file mode 100644 index 0000000..6d4b00d --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/CarnageReport/GetCampaignMatchDetailsValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.CarnageReport; + +namespace HaloSharp.Validation.Stats.CarnageReport +{ + public static class GetCampaignMatchDetailsValidator + { + public static void Validate(this GetCampaignMatchDetails getCampaignMatchDetails) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getCampaignMatchDetails.MatchId)) + { + validationResult.Messages.Add("GetCampaignMatchDetails query requires a MatchId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/CarnageReport/GetCustomMatchDetailsValidator.cs b/Source/HaloSharp/Validation/Stats/CarnageReport/GetCustomMatchDetailsValidator.cs new file mode 100644 index 0000000..b8a68e7 --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/CarnageReport/GetCustomMatchDetailsValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.CarnageReport; + +namespace HaloSharp.Validation.Stats.CarnageReport +{ + public static class GetCustomMatchDetailsValidator + { + public static void Validate(this GetCustomMatchDetails getCustomMatchDetails) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getCustomMatchDetails.MatchId)) + { + validationResult.Messages.Add("GetCustomMatchDetails query requires a MatchId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/CarnageReport/GetWarzoneMatchDetailsValidator.cs b/Source/HaloSharp/Validation/Stats/CarnageReport/GetWarzoneMatchDetailsValidator.cs new file mode 100644 index 0000000..1e7950f --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/CarnageReport/GetWarzoneMatchDetailsValidator.cs @@ -0,0 +1,24 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.CarnageReport; + +namespace HaloSharp.Validation.Stats.CarnageReport +{ + public static class GetWarzoneMatchDetailsValidator + { + public static void Validate(this GetWarzoneMatchDetails getWarzoneMatchDetails) + { + var validationResult = new ValidationResult(); + + if (string.IsNullOrWhiteSpace(getWarzoneMatchDetails.MatchId)) + { + validationResult.Messages.Add("GetWarzoneMatchDetails query requires a MatchId to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/GetMatchesValidator.cs b/Source/HaloSharp/Validation/Stats/GetMatchesValidator.cs new file mode 100644 index 0000000..821a2b4 --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/GetMatchesValidator.cs @@ -0,0 +1,63 @@ +using System; +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Stats +{ + public static class GetMatchesValidator + { + public static void Validate(this GetMatches getMatches) + { + var validationResult = new ValidationResult(); + + if (!getMatches.Player.IsValidGamertag()) + { + validationResult.Messages.Add("GetMatches query requires a valid Gamertag (Player) to be set."); + } + + if (getMatches.Parameters.ContainsKey("modes")) + { + var modes = getMatches.Parameters["modes"].Split(','); + + foreach (var mode in modes) + { + var defined = Enum.IsDefined(typeof (Enumeration.GameMode), mode); + + if (!defined) + { + validationResult.Messages.Add($"GetMatches optional paramater 'Game Mode' is invalid: {mode}."); + } + } + } + + if (getMatches.Parameters.ContainsKey("start")) + { + int start; + var parsed = int.TryParse(getMatches.Parameters["start"], out start); + + if (!parsed || start < 0) + { + validationResult.Messages.Add($"GetMatches optional paramater 'Take' is invalid: {start}."); + } + } + + if (getMatches.Parameters.ContainsKey("count")) + { + int count; + var parsed = int.TryParse(getMatches.Parameters["count"], out count); + + if (!parsed || count < 1 || count > 25) + { + validationResult.Messages.Add($"GetMatches optional paramater 'Take' is invalid: {count}."); + } + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/Lifetime/GetArenaServiceRecordValidator.cs b/Source/HaloSharp/Validation/Stats/Lifetime/GetArenaServiceRecordValidator.cs new file mode 100644 index 0000000..08afb87 --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/Lifetime/GetArenaServiceRecordValidator.cs @@ -0,0 +1,39 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.Lifetime; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Stats.Lifetime +{ + public static class GetArenaServiceRecordValidator + { + public static void Validate(this GetArenaServiceRecord getArenaServiceRecord) + { + var validationResult = new ValidationResult(); + + if (getArenaServiceRecord.Parameters.ContainsKey("players")) + { + var players = getArenaServiceRecord.Parameters["players"].Split(','); + + foreach (var player in players) + { + if (!player.IsValidGamertag()) + { + validationResult.Messages.Add("GetArenaServiceRecord query requires valid Gamertags (Players) to be set."); + } + } + } + else + { + validationResult.Messages.Add("GetArenaServiceRecord query requires a Player to be set."); + } + + + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/Lifetime/GetCampaignServiceRecordValidator.cs b/Source/HaloSharp/Validation/Stats/Lifetime/GetCampaignServiceRecordValidator.cs new file mode 100644 index 0000000..2b2f63c --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/Lifetime/GetCampaignServiceRecordValidator.cs @@ -0,0 +1,37 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.Lifetime; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Stats.Lifetime +{ + public static class GetCampaignServiceRecordValidator + { + public static void Validate(this GetCampaignServiceRecord getCampaignServiceRecord) + { + var validationResult = new ValidationResult(); + + if (getCampaignServiceRecord.Parameters.ContainsKey("players")) + { + var players = getCampaignServiceRecord.Parameters["players"].Split(','); + + foreach (var player in players) + { + if (!player.IsValidGamertag()) + { + validationResult.Messages.Add("GetCampaignServiceRecord query requires valid Gamertags (Players) to be set."); + } + } + } + else + { + validationResult.Messages.Add("GetCampaignServiceRecord query requires a Player to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file diff --git a/Source/HaloSharp/Validation/Stats/Lifetime/GetCustomServiceRecordValidator.cs b/Source/HaloSharp/Validation/Stats/Lifetime/GetCustomServiceRecordValidator.cs new file mode 100644 index 0000000..97709d8 --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/Lifetime/GetCustomServiceRecordValidator.cs @@ -0,0 +1,37 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.Lifetime; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Stats.Lifetime +{ + public static class GetCustomServiceRecordValidator + { + public static void Validate(this GetCustomServiceRecord getCustomServiceRecord) + { + var validationResult = new ValidationResult(); + + if (getCustomServiceRecord.Parameters.ContainsKey("players")) + { + var players = getCustomServiceRecord.Parameters["players"].Split(','); + + foreach (var player in players) + { + if (!player.IsValidGamertag()) + { + validationResult.Messages.Add("GetCustomServiceRecord query requires valid Gamertags (Players) to be set."); + } + } + } + else + { + validationResult.Messages.Add("GetCustomServiceRecord query requires a Player to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} diff --git a/Source/HaloSharp/Validation/Stats/Lifetime/GetWarzoneServiceRecordValidator.cs b/Source/HaloSharp/Validation/Stats/Lifetime/GetWarzoneServiceRecordValidator.cs new file mode 100644 index 0000000..b416384 --- /dev/null +++ b/Source/HaloSharp/Validation/Stats/Lifetime/GetWarzoneServiceRecordValidator.cs @@ -0,0 +1,37 @@ +using HaloSharp.Exception; +using HaloSharp.Model; +using HaloSharp.Query.Stats.Lifetime; +using HaloSharp.Validation.Common; + +namespace HaloSharp.Validation.Stats.Lifetime +{ + public static class GetWarzoneServiceRecordValidator + { + public static void Validate(this GetWarzoneServiceRecord getWarzoneServiceRecord) + { + var validationResult = new ValidationResult(); + + if (getWarzoneServiceRecord.Parameters.ContainsKey("players")) + { + var players = getWarzoneServiceRecord.Parameters["players"].Split(','); + + foreach (var player in players) + { + if (!player.IsValidGamertag()) + { + validationResult.Messages.Add("GetWarzoneServiceRecord query requires valid Gamertags (Players) to be set."); + } + } + } + else + { + validationResult.Messages.Add("GetWarzoneServiceRecord query requires a Player to be set."); + } + + if (!validationResult.Success) + { + throw new ValidationException(validationResult.Messages); + } + } + } +} \ No newline at end of file