From 00fc3fa5ce0d58b8b61d9858b9dfa02f7d6475f5 Mon Sep 17 00:00:00 2001 From: Brett Cleary <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 28 Sep 2023 21:47:37 -0700 Subject: [PATCH 001/106] add getAchievements with mock json --- .gitmodules | 3 + package.json | 2 +- public/achievements_mock.json | 6603 ++++++++++++++++++++++++++++ src/backend/api/index.ts | 4 +- src/backend/hyperplay-achievements | 1 + src/backend/main.ts | 1 + src/common/typedefs/ipcBridge.d.ts | 8 +- src/common/types.ts | 19 + yarn.lock | 8 +- 9 files changed, 6642 insertions(+), 7 deletions(-) create mode 100644 public/achievements_mock.json create mode 160000 src/backend/hyperplay-achievements diff --git a/.gitmodules b/.gitmodules index 5f63fec51..05fcb7284 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "src/backend/hyperplay-overlay"] path = src/backend/hyperplay-overlay url = https://github.com/HyperPlay-Gaming/hyperplay-overlay.git +[submodule "src/backend/hyperplay-achievements"] + path = src/backend/hyperplay-achievements + url = git@github.com:HyperPlay-Gaming/hyperplay-achievements.git diff --git a/package.json b/package.json index 2f47e5bf3..37f411c2d 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.14", + "@hyperplay/ui": "^0.1.19-auth-0.5", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", diff --git a/public/achievements_mock.json b/public/achievements_mock.json new file mode 100644 index 000000000..7c9b296cf --- /dev/null +++ b/public/achievements_mock.json @@ -0,0 +1,6603 @@ +{ + "status": 1, + "message": "processed successfully", + "data": [ + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c" + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A002_", + "achieved": 1, + "unlocktime": 1642288866, + "name": "A002_", + "defaultvalue": 0, + "displayName": "Kingdoms Will Fall", + "hidden": 0, + "description": "Defeat 20 enemy units.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/2341aa974fb9d279d361477db4c360ca16b11f02.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/17ed6021db943ae012d579c9edeefe7c9fcd7a58.jpg", + "iconName": "Kingdoms Will Fall", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A003_", + "achieved": 1, + "unlocktime": 1642289389, + "name": "A003_", + "defaultvalue": 0, + "displayName": "A New Age Is Upon Us", + "hidden": 0, + "description": "Complete the Introductory Tutorial.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/658480662c2b1a1cabbe56131317021751365e03.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9a200b8f62d7f1fca02340178e04853807ec057d.jpg", + "iconName": "A New Age Is Upon Us", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A026_", + "achieved": 1, + "unlocktime": 1642352859, + "name": "A026_", + "defaultvalue": 0, + "displayName": "Quick Study", + "hidden": 0, + "description": "Complete your first Civilization Mastery task.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/3c96a502dae11a84e18b82b4325297fc8b957a53.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/0a1c1e654dab3e006e094d2e37f9b77626ab020c.jpg", + "iconName": "Quick Study", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A065_", + "achieved": 1, + "unlocktime": 1642356477, + "name": "A065_", + "defaultvalue": 0, + "displayName": "Deforestation", + "hidden": 0, + "description": "Gather Wood 1,000 times as the Rus.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/02487cf9561c4e039935ecdf5a3b2783107a47eb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/98b1ea2d23e4a05349c940a838e5a2cdd33df387.jpg", + "iconName": "Deforestation", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A066_", + "achieved": 1, + "unlocktime": 1642355022, + "name": "A066_", + "defaultvalue": 0, + "displayName": "In Memory of Kulikovo", + "hidden": 0, + "description": "Enhance 10 units with a single Saint's Blessing strike as the Rus.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/2b945c31fa04e8aa0a77131271b57158ef230302.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/654abda980ee8c2983ddfceb647012f7ebd3df28.jpg", + "iconName": "In Memory of Kulikovo", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A070_", + "achieved": 1, + "unlocktime": 1642824762, + "name": "A070_", + "defaultvalue": 0, + "displayName": "Explore, Expand, Exploit", + "hidden": 0, + "description": "Accrue 10,000 Stone in a single match as the Mongols.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/bfcaef0842bbfe610362a937fee3ec426da3fe47.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/6c857f101fa02c06384c5ff1d2636fba2c38c17e.jpg", + "iconName": "Explore, Expand, Exploit", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "A092_", + "achieved": 1, + "unlocktime": 1643169840, + "name": "A092_", + "defaultvalue": 0, + "displayName": "We Charge Extra for That", + "hidden": 0, + "description": "Shutdown a Cavalry Charge with Palings as the English.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/fb1ffdecfe0324ef50308b4e507d6c71e8205b0d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/c2871c3b53b088b9f696b43d231aba51ea784604.jpg", + "iconName": "We Charge Extra for That", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e" + }, + { + "apiname": "ACH_EAT_SLEEP_PLAY_REPEAT", + "achieved": 1, + "unlocktime": 1655763083, + "name": "ACH_EAT_SLEEP_PLAY_REPEAT", + "defaultvalue": 0, + "displayName": "Eat, Sleep, Play, Repeat", + "hidden": 0, + "description": "Play a routine for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/e0672a0dddd92ece36408b5f23c44c50bacdfb61.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/f5e1b5e2441a7308d2a44044dbbcb32173a4ab5e.jpg", + "iconName": "Eat, Sleep, Play, Repeat", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e" + }, + { + "apiname": "ACH_GLOBAL_RANK", + "achieved": 1, + "unlocktime": 1655763083, + "name": "ACH_GLOBAL_RANK", + "defaultvalue": 0, + "displayName": "Ready to climb?", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/eb27c8f7fe83a960c51be972ba40eb643b5c4c8b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/08e7d0592400d334bbcbc403f566b96715b66c38.jpg", + "iconName": "Ready to climb?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e" + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "ea_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "ea_achievement", + "defaultvalue": 0, + "displayName": "Early Access User", + "hidden": 0, + "description": "Aim Lab Early Access User", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/0ec4cea50cc6770963477d82c56449e75f92ed59.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/751cd1fb3068438111eccd21b7a4cdbf42802e79.jpg", + "iconName": "Early Access User", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_NOOB", + "achieved": 1, + "unlocktime": 1595005531, + "name": "SPIDERSHOT_NOOB", + "defaultvalue": 0, + "displayName": "Spidershot Noob", + "hidden": 0, + "description": "Played Spidershot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/db72557053d344775c8679a5b617ea77d5960b1d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/98d66b8ca30c8fe46a5d201863ca24910017b702.jpg", + "iconName": "Spidershot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_ROOKIE", + "achieved": 1, + "unlocktime": 1595005532, + "name": "SPIDERSHOT_ROOKIE", + "defaultvalue": 0, + "displayName": "Spidershot Rookie", + "hidden": 0, + "description": "Played Spidershot 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f6791fee6c78c387e898a1e77d6e42bb6322bc51.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b99b8befad76146b063bd81ea5555f27ec633a46.jpg", + "iconName": "Spidershot Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_COMPETENT", + "achieved": 1, + "unlocktime": 1596412603, + "name": "SPIDERSHOT_COMPETENT", + "defaultvalue": 0, + "displayName": "Spidershot Competent", + "hidden": 0, + "description": "Played Spidershot 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8e23097ced0d6be68744cf195cbfe09d0d4a50b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c33b3490dadada9df764558154e9f8ebbcff4fd8.jpg", + "iconName": "Spidershot Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_PRO", + "achieved": 1, + "unlocktime": 1596412603, + "name": "SPIDERSHOT_PRO", + "defaultvalue": 0, + "displayName": "Spidershot Pro", + "hidden": 0, + "description": "Played Spidershot 30 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/966cc31062242595f187c75ccdd7b955429676b8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/32ab82f0481fdde29c71cd234eb6180f13dbe679.jpg", + "iconName": "Spidershot Pro", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_EXPERT", + "achieved": 1, + "unlocktime": 1597252119, + "name": "SPIDERSHOT_EXPERT", + "defaultvalue": 0, + "displayName": "Spidershot Expert", + "hidden": 0, + "description": "Played Spidershot 50 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/516778d7feee38249819e419e6648bf565324039.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/844efa9c0e2a1723bb37d03765e9da978e79cec3.jpg", + "iconName": "Spidershot Expert", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_MASTER", + "achieved": 1, + "unlocktime": 1598201098, + "name": "SPIDERSHOT_MASTER", + "defaultvalue": 0, + "displayName": "Spidershot Master", + "hidden": 0, + "description": "Played Spidershot 75 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2a1d6f3aeb1ee481c8f2cc7f603605a212197364.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/614aec113318b2b713c03c97b929c845a7d81548.jpg", + "iconName": "Spidershot Master", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "SPIDERSHOT_LEGEND", + "achieved": 1, + "unlocktime": 1601063117, + "name": "SPIDERSHOT_LEGEND", + "defaultvalue": 0, + "displayName": "Spidershot Legend", + "hidden": 0, + "description": "Played Spidershot 100 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c6a090d2803546e10a964a0a96152202ad5e6367.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9c8584942b1222c41223dde3a6503c01f2b1a9d9.jpg", + "iconName": "Spidershot Legend", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "REFLEXSHOT_NOOB", + "achieved": 1, + "unlocktime": 1595005532, + "name": "REFLEXSHOT_NOOB", + "defaultvalue": 0, + "displayName": "Reflexshot Noob", + "hidden": 0, + "description": "Played Reflexshot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/823201f3cef165035a93b6531bc7dd3fdc50a7d6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d9a32a4e78b3bdd26b7385315866259604cbf3dc.jpg", + "iconName": "Reflexshot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "REFLEXSHOT_ROOKIE", + "achieved": 1, + "unlocktime": 1596550770, + "name": "REFLEXSHOT_ROOKIE", + "defaultvalue": 0, + "displayName": "Reflexshot Rookie", + "hidden": 0, + "description": "Played Reflexshot 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2dab8c099ce612ffa4454b8016fdea6f4874a11e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8491a0e6fc00b213e0af277d48a8b9c3220a22f4.jpg", + "iconName": "Reflexshot Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "REFLEXSHOT_COMPETENT", + "achieved": 1, + "unlocktime": 1597368249, + "name": "REFLEXSHOT_COMPETENT", + "defaultvalue": 0, + "displayName": "Reflexshot Competent", + "hidden": 0, + "description": "Played Reflexshot 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/01fb3b214a2747769ac3e605ed74c7494b272367.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/30f0c2fa33e34c4ba253547816f4773b59bb4e65.jpg", + "iconName": "Reflexshot Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "REFLEXSHOT_PRO", + "achieved": 1, + "unlocktime": 1599103980, + "name": "REFLEXSHOT_PRO", + "defaultvalue": 0, + "displayName": "Reflexshot Pro", + "hidden": 0, + "description": "Played Reflexshot 30 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d66850d48f591ce582c7cef0ad158e4b64283b43.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/a1d63fa242d10e360d6f341c021bb0353739eec9.jpg", + "iconName": "Reflexshot Pro", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "REFLEXSHOT_EXPERT", + "achieved": 1, + "unlocktime": 1628707394, + "name": "REFLEXSHOT_EXPERT", + "defaultvalue": 0, + "displayName": "Reflexshot Expert", + "hidden": 0, + "description": "Played Reflexshot 50 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/acfbe4ceacab2b2553538ba54f9feb42770c2c31.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c1a97b8279d3c46301bf2b09a4f3430b764d539f.jpg", + "iconName": "Reflexshot Expert", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "REFLEXSHOT_MASTER", + "achieved": 1, + "unlocktime": 1645552997, + "name": "REFLEXSHOT_MASTER", + "defaultvalue": 0, + "displayName": "Reflexshot Master", + "hidden": 0, + "description": "Played Reflexshot 75 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2d35c1e2afd3ae3450df9d2f3e8b1882a4442297.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/e5392aeb3d3c8a15f4eb4e8ec75b27f1e0888010.jpg", + "iconName": "Reflexshot Master", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFESHOT_NOOB", + "achieved": 1, + "unlocktime": 1596468751, + "name": "STRAFESHOT_NOOB", + "defaultvalue": 0, + "displayName": "Strafeshot Noob", + "hidden": 0, + "description": "Played Strafeshot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2e19e113caa16ac1030b42fce9379579ed9ff043.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/3795e8a66ecf98931bf80e2f68e8e3afdd2ce10b.jpg", + "iconName": "Strafeshot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFESHOT_ROOKIE", + "achieved": 1, + "unlocktime": 1596904047, + "name": "STRAFESHOT_ROOKIE", + "defaultvalue": 0, + "displayName": "Strafeshot Rookie", + "hidden": 0, + "description": "Played Strafeshot 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9fe6956682039b3555a2049e46823545cd57efb1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/dad3c9bb4736f699e190e1a5a45888bcc09bb115.jpg", + "iconName": "Strafeshot Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFESHOT_COMPETENT", + "achieved": 1, + "unlocktime": 1597368250, + "name": "STRAFESHOT_COMPETENT", + "defaultvalue": 0, + "displayName": "Strafeshot Competent", + "hidden": 0, + "description": "Played Strafeshot 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/bad615cfc2622e603ec9b8108dbd385f1f03d91d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/dea675763e478b97c689fce061fcab7d1d8591ed.jpg", + "iconName": "Strafeshot Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFESHOT_PRO", + "achieved": 1, + "unlocktime": 1599661231, + "name": "STRAFESHOT_PRO", + "defaultvalue": 0, + "displayName": "Strafeshot Pro", + "hidden": 0, + "description": "Played Strafeshot 30 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/0043e84013bd8305880cb96dc7e69c593b6141ca.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/bbaeb7ec1179135db4f6cd38a3d0056ecf24622c.jpg", + "iconName": "Strafeshot Pro", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "PENTAKILL_NOOB", + "achieved": 1, + "unlocktime": 1598386192, + "name": "PENTAKILL_NOOB", + "defaultvalue": 0, + "displayName": "Pentakill Noob", + "hidden": 0, + "description": "Played Pentakill 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/4aed36ce731a7751aa98ec9efec99b5e7b3335f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9b257a6411677267826020744a383df522f72506.jpg", + "iconName": "Pentakill Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFETRACK_NOOB", + "achieved": 1, + "unlocktime": 1596412603, + "name": "STRAFETRACK_NOOB", + "defaultvalue": 0, + "displayName": "Strafetrack Noob", + "hidden": 0, + "description": "Played Strafetrack 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2de9c9e258cd1c9b5c3c2bcab57b00690d5b2dca.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/425d96fb0bb9fb9a5e3f61a160e9750947e0a855.jpg", + "iconName": "Strafetrack Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFETRACK_ROOKIE", + "achieved": 1, + "unlocktime": 1596559996, + "name": "STRAFETRACK_ROOKIE", + "defaultvalue": 0, + "displayName": "Strafetrack Rookie", + "hidden": 0, + "description": "Played Strafetrack 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/81dba386f9fab7b94190b356add970a9206477bb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b2f085ddd9038eb3dde53a535321f206cf78de35.jpg", + "iconName": "Strafetrack Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFETRACK_COMPETENT", + "achieved": 1, + "unlocktime": 1597368250, + "name": "STRAFETRACK_COMPETENT", + "defaultvalue": 0, + "displayName": "Strafetrack Competent", + "hidden": 0, + "description": "Played Strafetrack 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/51c26801e6c8f14c704eb87f912944772d912a49.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/21f7f5863d32b828b9346a0c09332cc0b6f91cbb.jpg", + "iconName": "Strafetrack Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFETRACK_PRO", + "achieved": 1, + "unlocktime": 1599144640, + "name": "STRAFETRACK_PRO", + "defaultvalue": 0, + "displayName": "Strafetrack Pro", + "hidden": 0, + "description": "Played Strafetrack 30 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/87ecf726cff8e509f270e6ecba564a51e2c18d38.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/66396ea3e5ab9df4666f1bc4a05468d10bdfa5a3.jpg", + "iconName": "Strafetrack Pro", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFETRACK_EXPERT", + "achieved": 1, + "unlocktime": 1606232164, + "name": "STRAFETRACK_EXPERT", + "defaultvalue": 0, + "displayName": "Strafetrack Expert", + "hidden": 0, + "description": "Played Strafetrack 50 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/bd8c085d76ea95e16cdfb0d726d466a5e52e0436.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/da9387e2f5cf785a026e46aa2c9e4010182da40a.jpg", + "iconName": "Strafetrack Expert", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "STRAFETRACK_MASTER", + "achieved": 1, + "unlocktime": 1649276374, + "name": "STRAFETRACK_MASTER", + "defaultvalue": 0, + "displayName": "Strafetrack Master", + "hidden": 0, + "description": "Played Strafetrack 75 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/6d30554a465d2314fe57f1b5fee1c501986fccc8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/134e204eadd39f4fa2d40f5cf0401caf1a6580d3.jpg", + "iconName": "Strafetrack Master", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "CIRCLETRACK_NOOB", + "achieved": 1, + "unlocktime": 1596561174, + "name": "CIRCLETRACK_NOOB", + "defaultvalue": 0, + "displayName": "Circletrack Noob", + "hidden": 0, + "description": "Played Circletrack 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d8296837063e534fbe42b6948b8c159a73c762c9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/4c6339765df833784cd1b10355cec56435c306f7.jpg", + "iconName": "Circletrack Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "CIRCLETRACK_ROOKIE", + "achieved": 1, + "unlocktime": 1601658875, + "name": "CIRCLETRACK_ROOKIE", + "defaultvalue": 0, + "displayName": "Circletrack Rookie", + "hidden": 0, + "description": "Played Circletrack 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f76dd43dfe2a23c93a5dbcac6f17f596defce1df.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/44a44fa50ae74400ebdec3f59d7e391138f9e5fd.jpg", + "iconName": "Circletrack Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "CIRCLETRACK_COMPETENT", + "achieved": 1, + "unlocktime": 1615591501, + "name": "CIRCLETRACK_COMPETENT", + "defaultvalue": 0, + "displayName": "Circletrack Competent", + "hidden": 0, + "description": "Played Circletrack 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/999e415a3eed1de6551c8289dea4196e7528342b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/7ece6c889e65819d648455f9c53f3579521d1b54.jpg", + "iconName": "Circletrack Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "BLINKSHOT_NOOB", + "achieved": 1, + "unlocktime": 1601658875, + "name": "BLINKSHOT_NOOB", + "defaultvalue": 0, + "displayName": "Blinkshot Noob", + "hidden": 0, + "description": "Played Blinkshot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/67687507b62cac0151f144e7510d9ad00df069cd.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8a9cdd8f222434818f28c43157f39bd81e5cc6de.jpg", + "iconName": "Blinkshot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "NINJASHOT_NOOB", + "achieved": 1, + "unlocktime": 1598721618, + "name": "NINJASHOT_NOOB", + "defaultvalue": 0, + "displayName": "Ninjashot Noob", + "hidden": 0, + "description": "Played Ninjashot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/3d03bc69280aab1d2517cb6b1f1e6d1bde9f996b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c8098440b532c1efdbc444f1d087cdddd4276b54.jpg", + "iconName": "Ninjashot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "NINJASHOT_ROOKIE", + "achieved": 1, + "unlocktime": 1602176603, + "name": "NINJASHOT_ROOKIE", + "defaultvalue": 0, + "displayName": "Ninjashot Rookie", + "hidden": 0, + "description": "Played Ninjashot 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/e18e5464065261db97f70cd0a1b091f802c9d63d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/5962c01ee6424ff57a5a757b3da5bf6c55f85621.jpg", + "iconName": "Ninjashot Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DETECTION_NOOB", + "achieved": 1, + "unlocktime": 1596412603, + "name": "DETECTION_NOOB", + "defaultvalue": 0, + "displayName": "Detection Noob", + "hidden": 0, + "description": "Played Detection 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/1a60e34a94578adf75df4294dcc8c4346b2a34f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9e799d33261655375678f5346df2785ca543f262.jpg", + "iconName": "Detection Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DETECTION_ROOKIE", + "achieved": 1, + "unlocktime": 1599103980, + "name": "DETECTION_ROOKIE", + "defaultvalue": 0, + "displayName": "Detection Rookie", + "hidden": 0, + "description": "Played Detection 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/1775697a0d09bde54673bd3863b3d2f22b7fd753.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9571c6a3824e8a3331daf78a307ec1b7cec47bb5.jpg", + "iconName": "Detection Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DETECTION_COMPETENT", + "achieved": 1, + "unlocktime": 1615591501, + "name": "DETECTION_COMPETENT", + "defaultvalue": 0, + "displayName": "Detection Competent", + "hidden": 0, + "description": "Played Detection 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/de91d4143bc7ced14ffbfb612559ebd7e1f7b60a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/02e0367d860151aeccf69d58dc44834a0b80470e.jpg", + "iconName": "Detection Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_NOOB", + "achieved": 1, + "unlocktime": 1596412603, + "name": "MICROSHOT_NOOB", + "defaultvalue": 0, + "displayName": "Microshot Noob", + "hidden": 0, + "description": "Played Microshot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/6e0fff090d86ee05122a1fff6df0a739a57feba8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f4d6b66b284cdd71a520ce75866ded1e0198d923.jpg", + "iconName": "Microshot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_ROOKIE", + "achieved": 1, + "unlocktime": 1596735749, + "name": "MICROSHOT_ROOKIE", + "defaultvalue": 0, + "displayName": "Microshot Rookie", + "hidden": 0, + "description": "Played Microshot 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f2090ce65f7cdcfa4230d076683e33365151b53e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/fe57d42907c7d27b836ad8b1d085519dfde03fb1.jpg", + "iconName": "Microshot Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_COMPETENT", + "achieved": 1, + "unlocktime": 1597414100, + "name": "MICROSHOT_COMPETENT", + "defaultvalue": 0, + "displayName": "Microshot Competent", + "hidden": 0, + "description": "Played Microshot 15 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b2a8c1c8f72d414a724247d9176b7ff0f4901dbf.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c25fe16cc0a622995005207ec642336192119ed7.jpg", + "iconName": "Microshot Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_PRO", + "achieved": 1, + "unlocktime": 1598755816, + "name": "MICROSHOT_PRO", + "defaultvalue": 0, + "displayName": "Microshot Pro", + "hidden": 0, + "description": "Played Microshot 30 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/858692df5080c4fee768242699a91f80b4008354.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/48348ca233f4bfb7b74d50ba93a167e221f6b121.jpg", + "iconName": "Microshot Pro", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_EXPERT", + "achieved": 1, + "unlocktime": 1606335543, + "name": "MICROSHOT_EXPERT", + "defaultvalue": 0, + "displayName": "Microshot Expert", + "hidden": 0, + "description": "Played Microshot 50 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d29c4a0f9dce3c412409c71124f7b3c83784331b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/5261150655778ce8a53eac9be466c68af203f662.jpg", + "iconName": "Microshot Expert", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_MASTER", + "achieved": 1, + "unlocktime": 1615920915, + "name": "MICROSHOT_MASTER", + "defaultvalue": 0, + "displayName": "Microshot Master", + "hidden": 0, + "description": "Played Microshot 75 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/0312cd7bcb35b67a8385c04ac484ca1173cbbd8b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/ec2e11c1db77a6163c4b97a9fd19791dea544112.jpg", + "iconName": "Microshot Master", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "MICROSHOT_LEGEND", + "achieved": 1, + "unlocktime": 1625590672, + "name": "MICROSHOT_LEGEND", + "defaultvalue": 0, + "displayName": "Microshot Legend", + "hidden": 0, + "description": "Played Microshot 100 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2c252e531c01175194c57ef1fb34f8cd9c7fbde0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9c2b3405a4f973e7c0b63d99f8604c61fa5a93dc.jpg", + "iconName": "Microshot Legend", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "FREETRACK_NOOB", + "achieved": 1, + "unlocktime": 1596468752, + "name": "FREETRACK_NOOB", + "defaultvalue": 0, + "displayName": "Freetrack Noob", + "hidden": 0, + "description": "Played Freetrack 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2cea4e6a7654acd4bd692de2b7a0dead486a128d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8721085efe1151a8150a039677ef696e9a08b57c.jpg", + "iconName": "Freetrack Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "FREETRACK_ROOKIE", + "achieved": 1, + "unlocktime": 1596559998, + "name": "FREETRACK_ROOKIE", + "defaultvalue": 0, + "displayName": "Freetrack Rookie", + "hidden": 0, + "description": "Played Freetrack 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/17c0247327c5fb501359e7833ef20c6e89735207.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/abf402a4e0cdf30ee7039a176ca49cef932134a4.jpg", + "iconName": "Freetrack Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "FREETRACK_COMPETENT", + "achieved": 1, + "unlocktime": 1597792959, + "name": "FREETRACK_COMPETENT", + "defaultvalue": 0, + "displayName": "Freetrack Competent", + "hidden": 0, + "description": "Played Freetrack 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/94f98ef52ad9555fb75edda1be3a7bf919863f8c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/4ee46ea4132750370fa60cfee3b38df12e089885.jpg", + "iconName": "Freetrack Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "AUDIOSPATIAL_NOOB", + "achieved": 1, + "unlocktime": 1596412603, + "name": "AUDIOSPATIAL_NOOB", + "defaultvalue": 0, + "displayName": "Audiospatial Noob", + "hidden": 0, + "description": "Played Audiospatial 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/882f690f675de002a6ae20dfaa400c272de6f785.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c94de7ee3a58ea829a13f5b25ba855707b203473.jpg", + "iconName": "Audiospatial Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_NOOB", + "achieved": 1, + "unlocktime": 1597368250, + "name": "DECISIONSHOT_NOOB", + "defaultvalue": 0, + "displayName": "Decisionshot Noob", + "hidden": 0, + "description": "Played Decisionshot 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f84eb2b0a7ce24d3009ad184ecbd57e28e9c53cf.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/45fff81c85232d6bce2b45aa5a4ebbf4ac520217.jpg", + "iconName": "Decisionshot Noob", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_ROOKIE", + "achieved": 1, + "unlocktime": 1606423392, + "name": "DECISIONSHOT_ROOKIE", + "defaultvalue": 0, + "displayName": "Decisionshot Rookie", + "hidden": 0, + "description": "Played Decisionshot 5 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/a7b4eb210aa094745a256a24e1002b01fab06586.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/e4bfea58a1522a6f8ab027766a64e5ab85d8295a.jpg", + "iconName": "Decisionshot Rookie", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_COMPETENT", + "achieved": 1, + "unlocktime": 1606677058, + "name": "DECISIONSHOT_COMPETENT", + "defaultvalue": 0, + "displayName": "Decisionshot Competent", + "hidden": 0, + "description": "Played Decisionshot 15 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/367a483c0484b748de16241f977a5e0c589d7750.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/eb2f0e9363581e988446317327c9085611f8dbff.jpg", + "iconName": "Decisionshot Competent", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_PRO", + "achieved": 1, + "unlocktime": 1607040260, + "name": "DECISIONSHOT_PRO", + "defaultvalue": 0, + "displayName": "Decisionshot Pro", + "hidden": 0, + "description": "Played Decisionshot 30 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d7c3c1e290f473f91ad9bcf07795b5e2474ecc79.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/a2ce45f0bbac76a548654c812220249d6677032f.jpg", + "iconName": "Decisionshot Pro", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_EXPERT", + "achieved": 1, + "unlocktime": 1612022685, + "name": "DECISIONSHOT_EXPERT", + "defaultvalue": 0, + "displayName": "Decisionshot Expert", + "hidden": 0, + "description": "Played Decisionshot 50 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b3bcb95cff5b11d6e8e167e24cdb5fd14f47b951.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/de4bc0c87151ca47bd40984a1476f4eed9469170.jpg", + "iconName": "Decisionshot Expert", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_MASTER", + "achieved": 1, + "unlocktime": 1615411978, + "name": "DECISIONSHOT_MASTER", + "defaultvalue": 0, + "displayName": "Decisionshot Master", + "hidden": 0, + "description": "Played Decisionshot 75 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9462a441e5003b3d07c9c05e9e9bde2427f4ea80.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/473d3739a4fcac0205af1dd2a212bb95bd378db3.jpg", + "iconName": "Decisionshot Master", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "DECISIONSHOT_LEGEND", + "achieved": 1, + "unlocktime": 1630179729, + "name": "DECISIONSHOT_LEGEND", + "defaultvalue": 0, + "displayName": "Decisionshot Legend", + "hidden": 0, + "description": "Played Decisionshot 100 Times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/61f9d389273f5f2cb71bd5472840edeba050426e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/7a86cbdafad8e86c1b0b2ecc3bb398ed3a4a46b0.jpg", + "iconName": "Decisionshot Legend", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808" + }, + { + "apiname": "ACH27", + "achieved": 1, + "unlocktime": 1692933591, + "name": "ACH27", + "defaultvalue": 0, + "displayName": "Hardware Engineer", + "hidden": 0, + "description": "Assembled an AC.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/2f02f63e0a349136407c7b681f5543fad4ee43f2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Hardware Engineer", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808" + }, + { + "apiname": "ACH29", + "achieved": 1, + "unlocktime": 1692933669, + "name": "ACH29", + "defaultvalue": 0, + "displayName": "Graphic Designer", + "hidden": 0, + "description": "Changed the coloration of your AC.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0309a1922cf8a8111f6b4af58a2a0e475e78ec78.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Graphic Designer", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808" + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e" + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "A022_FirstBlood", + "achieved": 1, + "unlocktime": 1661915651, + "name": "A022_FirstBlood", + "defaultvalue": 0, + "displayName": "First Blood", + "hidden": 0, + "description": "Achieve first kill", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/62faf347fa98fc3552bc5862b3ae56cc15995412.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/07460d385ef8239ae0dac9f63cc16e269818e971.jpg", + "iconName": "First Blood", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "A024_LastMan", + "achieved": 1, + "unlocktime": 1661916339, + "name": "A024_LastMan", + "defaultvalue": 0, + "displayName": "Last Man Standing", + "hidden": 0, + "description": "Be the last survivor and win in Demolition mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/2bf4019c3041ec0fbd3eda89a8bfbc1d2c4b08cb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/4bf9727cb3f53a86649713043c002dd8050929d2.jpg", + "iconName": "Last Man Standing", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "A032_LuckyDay", + "achieved": 1, + "unlocktime": 1661914667, + "name": "A032_LuckyDay", + "defaultvalue": 0, + "displayName": "Lucky Day", + "hidden": 0, + "description": "Open any Random Box ", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/b315101f5235e2fbee45159faf057d8d5e6f337c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/7da4a12bd40f735c6b006c13ea7847c2f83ab347.jpg", + "iconName": "Lucky Day", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "A033_ItemDelivery", + "achieved": 1, + "unlocktime": 1661914664, + "name": "A033_ItemDelivery", + "defaultvalue": 0, + "displayName": "Yeah! It's like a christmas", + "hidden": 0, + "description": "Receive first item", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/b0a1efeb97358eaee6c8193975dc3b6ed137fa70.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/8f29551e1e6fec8cbdc08a9a1d14333d4998034a.jpg", + "iconName": "Yeah! It's like a christmas", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "A034_GoodFriends", + "achieved": 1, + "unlocktime": 1661914845, + "name": "A034_GoodFriends", + "defaultvalue": 0, + "displayName": "Good Friends", + "hidden": 0, + "description": "Add friends", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/8b8558619f59a0b1ba3c7551b2094c5ab68476ca.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/15279f60ba5397e4098033e2ef05027e782aea66.jpg", + "iconName": "Good Friends", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "A035_PartyTime", + "achieved": 1, + "unlocktime": 1661915890, + "name": "A035_PartyTime", + "defaultvalue": 0, + "displayName": "Party Time", + "hidden": 0, + "description": "Play 1 Quick match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/02e1e732d358f80b5ed90fce68f26cb929b07d9e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/929a8459bc12db1ebfd2d75cb86486a9d8beb90e.jpg", + "iconName": "Party Time", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7" + }, + { + "apiname": "LIFE_TRAVEL_2_1", + "achieved": 1, + "unlocktime": 1527898896, + "name": "LIFE_TRAVEL_2_1", + "defaultvalue": 0, + "displayName": "Watch Your Back", + "hidden": 0, + "description": "Entered disputed territory", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/2b8c4ac4e5e11886258d2f50f5d09d197afccc73.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/0f4976c5badffc9020d897b7794d7a36e53b3ec3.jpg", + "iconName": "Watch Your Back", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7" + }, + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "BOMB_PLANT_LOW", + "achieved": 1, + "unlocktime": 1627172140, + "name": "BOMB_PLANT_LOW", + "defaultvalue": 0, + "displayName": "Boomala Boomala", + "hidden": 0, + "description": "Plant 100 bombs", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/325ccbd68e599083c1597fd90dc6d4265d1ca3b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a4f62b47ba5a852c71af6fe35411addbc0d1d193.jpg", + "iconName": "Boomala Boomala", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_LOW", + "achieved": 1, + "unlocktime": 1490379415, + "name": "KILL_ENEMY_LOW", + "defaultvalue": 0, + "displayName": "Body Bagger", + "hidden": 0, + "description": "Kill 25 enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b11ef0453168cd3d10684e184004f71dcc0faa82.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c2fc81593400110271e1f968f0e704a19ee83011.jpg", + "iconName": "Body Bagger", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_MED", + "achieved": 1, + "unlocktime": 1492041834, + "name": "KILL_ENEMY_MED", + "defaultvalue": 0, + "displayName": "Corpseman", + "hidden": 0, + "description": "Kill 500 enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/60d83a42df84fa5d84910af681370579e3bb16bf.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4ddb4bf34e96d538b6c9aab1ff1796f51d218e5d.jpg", + "iconName": "Corpseman", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_HIGH", + "achieved": 1, + "unlocktime": 1665097091, + "name": "KILL_ENEMY_HIGH", + "defaultvalue": 0, + "displayName": "God of War", + "hidden": 0, + "description": "Kill 10,000 enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2c2bb56a4f7376b53eeaf8e6d84044460b0d1cf2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/55fbfbb54876d0e777f430062201b9ea616face5.jpg", + "iconName": "God of War", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "BOMB_DEFUSE_CLOSE_CALL", + "achieved": 1, + "unlocktime": 1626295113, + "name": "BOMB_DEFUSE_CLOSE_CALL", + "defaultvalue": 0, + "displayName": "Second to None", + "hidden": 0, + "description": "Successfully defuse a bomb with less than one second remaining", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/986a53e24114699cb1f230f52b55b27e0de28ecf.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eb4763f562c2ea763afab225e410e74245893e43.jpg", + "iconName": "Second to None", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_BOMB_DEFUSER", + "achieved": 1, + "unlocktime": 1627420151, + "name": "KILL_BOMB_DEFUSER", + "defaultvalue": 0, + "displayName": "Counter-Counter-Terrorist", + "hidden": 0, + "description": "Kill a Counter-Terrorist while he is defusing the bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c09cb3fe34841fd1000a48c3b7825c4fde026188.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/010dc024d20bb7471a6ada87ba3d92c840228cbe.jpg", + "iconName": "Counter-Counter-Terrorist", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_BOMB_DEFUSE", + "achieved": 1, + "unlocktime": 1491005231, + "name": "WIN_BOMB_DEFUSE", + "defaultvalue": 0, + "displayName": "Rite of First Defusal", + "hidden": 0, + "description": "Win a round by defusing a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b2027dac5a9883f0f145e78a33e531a58944f3ec.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3c3e898c96d92e3f77624bbcf7b02c38d6cc3506.jpg", + "iconName": "Rite of First Defusal", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "BOMB_PLANT_IN_25_SECONDS", + "achieved": 1, + "unlocktime": 1518136122, + "name": "BOMB_PLANT_IN_25_SECONDS", + "defaultvalue": 0, + "displayName": "Short Fuse", + "hidden": 0, + "description": "Plant a bomb within 25 seconds (excluding Demolition mode)", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/648550738f4845f12aa686a1b4ee8c4a51ec2348.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3c8e0316829a1c3db72668b239ce2ea8669cb781.jpg", + "iconName": "Short Fuse", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_ROUNDS_LOW", + "achieved": 1, + "unlocktime": 1490390933, + "name": "WIN_ROUNDS_LOW", + "defaultvalue": 0, + "displayName": "Newb World Order", + "hidden": 0, + "description": "Win ten rounds", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9c759a9201a6fd54539f639e3815aa09a7c92d59.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a8fd9e9be81d3fe455b412ef9d99209e9f2cada7.jpg", + "iconName": "Newb World Order", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_ROUNDS_MED", + "achieved": 1, + "unlocktime": 1492032023, + "name": "WIN_ROUNDS_MED", + "defaultvalue": 0, + "displayName": "Pro-moted", + "hidden": 0, + "description": "Win 200 rounds", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2cd1d88ac944725d8782a55194a2d69b9b66104d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6b1fa9ba30d05ebf806d23a2375a781d99b5fbe3.jpg", + "iconName": "Pro-moted", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GIVE_DAMAGE_LOW", + "achieved": 1, + "unlocktime": 1490286109, + "name": "GIVE_DAMAGE_LOW", + "defaultvalue": 0, + "displayName": "Points in Your Favor", + "hidden": 0, + "description": "Inflict 2,500 total points of damage to enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/55650ec8f0cec4ea9b80d10e5ff420904b2a52a9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7c8f03d055680ddca6b70a3418d55971bfadceec.jpg", + "iconName": "Points in Your Favor", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GIVE_DAMAGE_MED", + "achieved": 1, + "unlocktime": 1491439901, + "name": "GIVE_DAMAGE_MED", + "defaultvalue": 0, + "displayName": "You've Made Your Points", + "hidden": 0, + "description": "Inflict 50,000 total points of damage to enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d676e407e16a75e5c9309779f436c1a3f1432442.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/64cf7c3474a9d1f755fb9d5977a913829f6b9f22.jpg", + "iconName": "You've Made Your Points", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GIVE_DAMAGE_HIGH", + "achieved": 1, + "unlocktime": 1640924231, + "name": "GIVE_DAMAGE_HIGH", + "defaultvalue": 0, + "displayName": "A Million Points of Blight", + "hidden": 0, + "description": "Inflict 1,000,000 total points of damage to enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/46d932bd2bc68f28e0fa8a03e92e5180fc5735dc.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3be2d4f83efcced660843484f3e042439ac9a517.jpg", + "iconName": "A Million Points of Blight", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILLING_SPREE", + "achieved": 1, + "unlocktime": 1491096895, + "name": "KILLING_SPREE", + "defaultvalue": 0, + "displayName": "Ballistic", + "hidden": 0, + "description": "In Classic mode, kill four enemy players within fifteen seconds", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/bfedf671220f823ddbeec18a16dc14d2ae32bcde.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/638d69d2fc898d91d7380ad7a29f328f760266e8.jpg", + "iconName": "Ballistic", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_WITH_OWN_GUN", + "achieved": 1, + "unlocktime": 1492543232, + "name": "KILL_WITH_OWN_GUN", + "defaultvalue": 0, + "displayName": "Lost and F0wnd", + "hidden": 0, + "description": "Kill an enemy with a gun they dropped during the current round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/66538681d639abe28a849f1c75e0862ac10fc687.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/21b522d0e28f5ca7c741687f7fe9d262fa96dbfc.jpg", + "iconName": "Lost and F0wnd", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_TWO_WITH_ONE_SHOT", + "achieved": 1, + "unlocktime": 1509422015, + "name": "KILL_TWO_WITH_ONE_SHOT", + "defaultvalue": 0, + "displayName": "Ammo Conservation", + "hidden": 0, + "description": "Kill two enemy players with a single bullet", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0d608d5c66449213da0efa3269081381929c1f6a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cdd82951e4ef1e95a310e6a09c122fca110eb665.jpg", + "iconName": "Ammo Conservation", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "EARN_MONEY_LOW", + "achieved": 1, + "unlocktime": 1490285370, + "name": "EARN_MONEY_LOW", + "defaultvalue": 0, + "displayName": "War Bonds", + "hidden": 0, + "description": "Earn $50,000 total cash", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2157e303dc3add51087496ef3a0a21a8c95e3d6f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b444bce6ad70aa28a40486c720438ef8995aed8a.jpg", + "iconName": "War Bonds", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "EARN_MONEY_MED", + "achieved": 1, + "unlocktime": 1624852690, + "name": "EARN_MONEY_MED", + "defaultvalue": 0, + "displayName": "Spoils of War", + "hidden": 0, + "description": "Earn $2,500,000 total cash", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2062cb82b9b58bcbdac27c827b42f57e1a57f83e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f133ba71921296999d89531dec05447235869fa2.jpg", + "iconName": "Spoils of War", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DEAD_GRENADE_KILL", + "achieved": 1, + "unlocktime": 1491172054, + "name": "DEAD_GRENADE_KILL", + "defaultvalue": 0, + "displayName": "Premature Burial", + "hidden": 0, + "description": "Kill an enemy with a grenade after dying", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7097e88eb11ea78696befe3827f4ed279f8c72e2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/18f9b47fb628c194e48d91f91b5253d7ab40dc4d.jpg", + "iconName": "Premature Burial", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_DEAGLE", + "achieved": 1, + "unlocktime": 1627073842, + "name": "KILL_ENEMY_DEAGLE", + "defaultvalue": 0, + "displayName": "Desert Eagle Expert", + "hidden": 0, + "description": "Kill 200 enemies with the Desert Eagle", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/16a8d6f8f89f9d960516a9e3bf265e48c8f233f8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b85c72c79dde29ccd221ef5affa0e5545e61736d.jpg", + "iconName": "Desert Eagle Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_GLOCK", + "achieved": 1, + "unlocktime": 1627442076, + "name": "KILL_ENEMY_GLOCK", + "defaultvalue": 0, + "displayName": "Glock-18 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the Glock-18", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/dfd91ef491bd48ee68c55ad9e26f75ca78391ac9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cec717d6be33402b011fb9a3869d01d305a16154.jpg", + "iconName": "Glock-18 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_ELITE", + "achieved": 1, + "unlocktime": 1626467911, + "name": "KILL_ENEMY_ELITE", + "defaultvalue": 0, + "displayName": "Dual Berettas Expert", + "hidden": 0, + "description": "Kill 25 enemies with the Dual Berettas", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1f058def617b3054389ec65ae25de22af8824628.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/713f3faeda54a19e8f02ffcd0fa87e28d686c891.jpg", + "iconName": "Dual Berettas Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_FIVESEVEN", + "achieved": 1, + "unlocktime": 1627071988, + "name": "KILL_ENEMY_FIVESEVEN", + "defaultvalue": 0, + "displayName": "Five-SeveN Expert", + "hidden": 0, + "description": "Kill 25 enemies with the Five-SeveN", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/05ce551a5f4e8c2395ed4c20ce80e6b380f201de.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/e7cfae0401070da6a748976f96c701fe26ed5b15.jpg", + "iconName": "Five-SeveN Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_AWP", + "achieved": 1, + "unlocktime": 1626395718, + "name": "KILL_ENEMY_AWP", + "defaultvalue": 0, + "displayName": "AWP Expert", + "hidden": 0, + "description": "Kill 500 enemies with the AWP", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2e9c84d626c81874d0ac4634d2a28024d8f8f6dc.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ce5a1333c6797e58c24cbe121fe0ecaa6c3a7510.jpg", + "iconName": "AWP Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_AK47", + "achieved": 1, + "unlocktime": 1627235731, + "name": "KILL_ENEMY_AK47", + "defaultvalue": 0, + "displayName": "AK-47 Expert", + "hidden": 0, + "description": "Kill 1,000 enemies with the AK-47", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/e61e83d7ccd73f122d98368190eff560f3a968ae.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b64ebdd96b843723ae699a091577310ffef67acd.jpg", + "iconName": "AK-47 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_M4A1", + "achieved": 1, + "unlocktime": 1627234998, + "name": "KILL_ENEMY_M4A1", + "defaultvalue": 0, + "displayName": "M4 AR Expert", + "hidden": 0, + "description": "Kill 1,000 enemies with an M4 Assault Rifle", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cd2c685b7e02156e6423602868d1ef91515a8f07.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b07067309a39c94df6f71d13020e7443bc709d9a.jpg", + "iconName": "M4 AR Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_FAMAS", + "achieved": 1, + "unlocktime": 1626652955, + "name": "KILL_ENEMY_FAMAS", + "defaultvalue": 0, + "displayName": "FAMAS Expert", + "hidden": 0, + "description": "Kill 100 enemies with the FAMAS", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0e2e2fd07d06b03bd61ea1d7a08d03cb76e06684.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/17ad7e0641476abda9c75d35f8076840b0234f20.jpg", + "iconName": "FAMAS Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_MAC10", + "achieved": 1, + "unlocktime": 1695662416, + "name": "KILL_ENEMY_MAC10", + "defaultvalue": 0, + "displayName": "MAC-10 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the MAC-10", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d32269eeec2a5605c8e658dd6d3c2cfc2c12018d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1681d7c3ef5c830c2ca1cad2b8a8df906e71b79a.jpg", + "iconName": "MAC-10 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_KNIFE", + "achieved": 1, + "unlocktime": 1664558087, + "name": "KILL_ENEMY_KNIFE", + "defaultvalue": 0, + "displayName": "Knife Expert", + "hidden": 0, + "description": "Kill 100 enemies with the knife", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f299cfa70e7b6b09a54834967eb9d2ba3d9f0631.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ca24c796cba96e5a3a3f79ae86621877a4615a49.jpg", + "iconName": "Knife Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_TEAM", + "achieved": 1, + "unlocktime": 1491096902, + "name": "KILL_ENEMY_TEAM", + "defaultvalue": 0, + "displayName": "The Cleaner", + "hidden": 0, + "description": "In Classic mode, kill five enemies in a single round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1e363fcb0d6f929079bf5cd5712801492231a436.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eeae6a08e52f3cb51c50cb82b089440c2fe735e3.jpg", + "iconName": "The Cleaner", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILLS_WITH_MULTIPLE_GUNS", + "achieved": 1, + "unlocktime": 1490379850, + "name": "KILLS_WITH_MULTIPLE_GUNS", + "defaultvalue": 0, + "displayName": "Variety Hour", + "hidden": 0, + "description": "Get kills with five different guns in a single round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/75030fe4dead2cf4ff26aa22373ff1e97319f127.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/212be5810ad72d9c10df2e3da4b4fcbef831f62c.jpg", + "iconName": "Variety Hour", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "LAST_PLAYER_ALIVE", + "achieved": 1, + "unlocktime": 1490989354, + "name": "LAST_PLAYER_ALIVE", + "defaultvalue": 0, + "displayName": "War of Attrition", + "hidden": 0, + "description": "Be the last player alive in a round with five players on your team", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c078614a0d546908b67740b113a65831c33e39a8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7f370bafba7252d904a3cb9926f054b076e0e9ce.jpg", + "iconName": "War of Attrition", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_LAST_BULLET", + "achieved": 1, + "unlocktime": 1491142154, + "name": "KILL_ENEMY_LAST_BULLET", + "defaultvalue": 0, + "displayName": "Magic Bullet", + "hidden": 0, + "description": "Kill an enemy with the last bullet in your magazine (excluding sniper rifles and Zeus x27)", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/20547dff510be3d7df94dc2c82ca7326eaf24641.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/387a9b977433aeb7df56556a51853a5577b2093d.jpg", + "iconName": "Magic Bullet", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILLING_SPREE_ENDER", + "achieved": 1, + "unlocktime": 1490988538, + "name": "KILLING_SPREE_ENDER", + "defaultvalue": 0, + "displayName": "Kill One, Get One Spree", + "hidden": 0, + "description": "Kill an enemy player who has just killed four of your teammates within 15 seconds", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b46735e642fe0146eaaf8da87bd9d426ad5510ac.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7bafc7e7f62f5fb6bf7dc6fc294d2efb651b57e3.jpg", + "iconName": "Kill One, Get One Spree", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "HEADSHOTS", + "achieved": 1, + "unlocktime": 1493012737, + "name": "HEADSHOTS", + "defaultvalue": 0, + "displayName": "Battle Sight Zero", + "hidden": 0, + "description": "Kill 250 enemies with headshots", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/72e142a6cbef679ffda7245b1074d1d52700ea98.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b36533f8ede908216ba43fbd50cfab87ce3a5c2a.jpg", + "iconName": "Battle Sight Zero", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DAMAGE_NO_KILL", + "achieved": 1, + "unlocktime": 1490968498, + "name": "DAMAGE_NO_KILL", + "defaultvalue": 0, + "displayName": "Primer", + "hidden": 0, + "description": "Do at least 95% damage to an enemy who is then killed by a another player", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6f731c184c8b54ef26f142d644cfe3a8082c4484.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/263f1b85e0c0584f6c64dd1eced477d5ee8d83ec.jpg", + "iconName": "Primer", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_LOW_DAMAGE", + "achieved": 1, + "unlocktime": 1490284929, + "name": "KILL_LOW_DAMAGE", + "defaultvalue": 0, + "displayName": "Finishing Schooled", + "hidden": 0, + "description": "Kill an enemy who has been reduced to less than 5% health by other players", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/81e3fcdf714a1b6124ac80918dff5b45ec1cdb79.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/aa274283103024a097145ff572d07033da426347.jpg", + "iconName": "Finishing Schooled", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_RELOADING", + "achieved": 1, + "unlocktime": 1490274200, + "name": "KILL_ENEMY_RELOADING", + "defaultvalue": 0, + "displayName": "Shot With Their Pants Down", + "hidden": 0, + "description": "Kill an enemy while they are reloading", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8348876e42a26000ec596a690ee962ff441f3d1f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/fc524700dc21b054f7d7223b0107991fff89e2f9.jpg", + "iconName": "Shot With Their Pants Down", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_BLINDED", + "achieved": 1, + "unlocktime": 1626141039, + "name": "KILL_ENEMY_BLINDED", + "defaultvalue": 0, + "displayName": "Blind Ambition", + "hidden": 0, + "description": "Kill 25 enemies blinded by flashbangs", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6439356b22bfb76c8b2693a25b5291e1ec4b6f0d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3bd6bbc5a689edb6cc2339261576c7b81ae95fca.jpg", + "iconName": "Blind Ambition", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMIES_WHILE_BLIND", + "achieved": 1, + "unlocktime": 1490986709, + "name": "KILL_ENEMIES_WHILE_BLIND", + "defaultvalue": 0, + "displayName": "Blind Fury", + "hidden": 0, + "description": "Kill an enemy while you are blinded from a flashbang", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5ee37dd9a04c583317d32af15f0a65b902ea7279.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eecfd460660516c8e15db282d1e97e3b352c0b12.jpg", + "iconName": "Blind Fury", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILLS_ENEMY_WEAPON", + "achieved": 1, + "unlocktime": 1626296766, + "name": "KILLS_ENEMY_WEAPON", + "defaultvalue": 0, + "displayName": "Friendly Firearms", + "hidden": 0, + "description": "Kill 100 enemies with enemy weapons", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/83325a3c5d679bd363102cd9abd3c9cac649497c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cb46c843305953d379ddc84e49c2ae5eb6493e44.jpg", + "iconName": "Friendly Firearms", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_KNIFE_FIGHTS_LOW", + "achieved": 1, + "unlocktime": 1493184194, + "name": "WIN_KNIFE_FIGHTS_LOW", + "defaultvalue": 0, + "displayName": "Make the Cut", + "hidden": 0, + "description": "Win a knife fight", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/99285573701d0823655458f538edc8c143397d83.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/90cd8554100f7f1c93de9c9b92ab989295331614.jpg", + "iconName": "Make the Cut", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "HIP_SHOT", + "achieved": 1, + "unlocktime": 1490380108, + "name": "HIP_SHOT", + "defaultvalue": 0, + "displayName": "Hip Shot", + "hidden": 0, + "description": "Kill an enemy with an un-zoomed sniper rifle", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3f4eadad4eddba8bc1f93e26ad8fd8f58bfcc204.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/dc4eb62a721ad0d1cb5a4483f42759ffd77b0b17.jpg", + "iconName": "Hip Shot", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_SNIPER_WITH_SNIPER", + "achieved": 1, + "unlocktime": 1491092271, + "name": "KILL_SNIPER_WITH_SNIPER", + "defaultvalue": 0, + "displayName": "Eye to Eye", + "hidden": 0, + "description": "Kill a zoomed-in enemy sniper with a sniper rifle of your own", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/60eee51a175e9de8486448dea71063882c47d472.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3179e01b1fedd24cb29bde371b19d73e48009826.jpg", + "iconName": "Eye to Eye", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_SNIPER_WITH_KNIFE", + "achieved": 1, + "unlocktime": 1624845685, + "name": "KILL_SNIPER_WITH_KNIFE", + "defaultvalue": 0, + "displayName": "Sknifed", + "hidden": 0, + "description": "Kill a zoomed-in enemy sniper with a knife", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/dd3ad6ceec16033d085cdf81466acfee6b78923b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a219eba3d0a3649c277db6f72d513ef7bebcbfc4.jpg", + "iconName": "Sknifed", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_SNIPERS", + "achieved": 1, + "unlocktime": 1625514301, + "name": "KILL_SNIPERS", + "defaultvalue": 0, + "displayName": "Snipe Hunter", + "hidden": 0, + "description": "Kill 100 zoomed-in enemy snipers", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f1dc6a8b736d396c0756e0d397150464a212a460.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0a469eb934ea7748038090e53513f5de3a92afcd.jpg", + "iconName": "Snipe Hunter", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_WHEN_AT_LOW_HEALTH", + "achieved": 1, + "unlocktime": 1491093729, + "name": "KILL_WHEN_AT_LOW_HEALTH", + "defaultvalue": 0, + "displayName": "Dead Man Stalking", + "hidden": 0, + "description": "Kill an enemy while at one health", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/233e0468c1e9f7e29dc65aae90680494f31dbf46.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b0c6a88030d93bf16d697761ca3a1f0b65e36e8c.jpg", + "iconName": "Dead Man Stalking", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "PISTOL_ROUND_KNIFE_KILL", + "achieved": 1, + "unlocktime": 1624941208, + "name": "PISTOL_ROUND_KNIFE_KILL", + "defaultvalue": 0, + "displayName": "Street Fighter", + "hidden": 0, + "description": "Kill an enemy with a knife during the Pistol Round in a Classic match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/399454259d33f0439b1355cc4a9cec4d3fcb7f23.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f495012b74c645c322747630286a6e62a098d11.jpg", + "iconName": "Street Fighter", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "FAST_ROUND_WIN", + "achieved": 1, + "unlocktime": 1490273208, + "name": "FAST_ROUND_WIN", + "defaultvalue": 0, + "displayName": "Blitzkrieg", + "hidden": 0, + "description": "Win a round against five enemies in less than thirty seconds", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a59e158dfc2235c98d8c228ae045ee11ed66f793.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/72235305f0d97186ddaeb7d4364b621a1a2c9472.jpg", + "iconName": "Blitzkrieg", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_PISTOLROUNDS_LOW", + "achieved": 1, + "unlocktime": 1624936021, + "name": "WIN_PISTOLROUNDS_LOW", + "defaultvalue": 0, + "displayName": "Piece Initiative", + "hidden": 0, + "description": "Win 5 Pistol Rounds in Competitive Mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ee63866f1dedc0ff3d1e5d5be973baa85cce0c5c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/705f4da0b87357110215e31e12036ab664d024ab.jpg", + "iconName": "Piece Initiative", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_PISTOLROUNDS_MED", + "achieved": 1, + "unlocktime": 1626578824, + "name": "WIN_PISTOLROUNDS_MED", + "defaultvalue": 0, + "displayName": "Give Piece a Chance", + "hidden": 0, + "description": "Win 25 Pistol Rounds in Competitive Mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/44a470bfba23636be7e1ecbedaff876eae9a4329.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/651b7c255be991abefc3bc486d9d60453e625973.jpg", + "iconName": "Give Piece a Chance", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_PISTOLROUNDS_HIGH", + "achieved": 1, + "unlocktime": 1694982334, + "name": "WIN_PISTOLROUNDS_HIGH", + "defaultvalue": 0, + "displayName": "Piece Treaty", + "hidden": 0, + "description": "Win 250 Pistol Rounds in Competitive Mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8ce444eaa5576a0825498af87079e48a92a5f7b2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b78f58a74a1e16b7fee1c87c823ac8c47927c85d.jpg", + "iconName": "Piece Treaty", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GOOSE_CHASE", + "achieved": 1, + "unlocktime": 1682699335, + "name": "GOOSE_CHASE", + "defaultvalue": 0, + "displayName": "Wild Gooseman Chase", + "hidden": 0, + "description": "As the last living Terrorist, distract a defuser long enough for the bomb to explode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cd81dc5ec3690f20d2686701ed8562f52b18f179.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1da82ab5cca4b7af581d3d17bd02a537cce61ada.jpg", + "iconName": "Wild Gooseman Chase", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_BOMB_PLANT_AFTER_RECOVERY", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT_AFTER_RECOVERY", + "defaultvalue": 0, + "displayName": "Blast Will and Testament", + "hidden": 0, + "description": "Win a round by picking up the bomb from a fallen comrade and successfully planting it", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cf0cd919170e8bc60a58095cc108816849929c2e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/926535a647e8c5d1ebab852b6c24ddf2d877d82f.jpg", + "iconName": "Blast Will and Testament", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "LOSSLESS_EXTERMINATION", + "achieved": 1, + "unlocktime": 1490273165, + "name": "LOSSLESS_EXTERMINATION", + "defaultvalue": 0, + "displayName": "Mercy Rule", + "hidden": 0, + "description": "Kill the entire opposing team without any members of your team dying", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/41015c5223155418271a45369389654ef97db196.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3d5512ff9975e28bd3fcf1655cf4579575d6a381.jpg", + "iconName": "Mercy Rule", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "FLAWLESS_VICTORY", + "achieved": 1, + "unlocktime": 1680759661, + "name": "FLAWLESS_VICTORY", + "defaultvalue": 0, + "displayName": "Clean Sweep", + "hidden": 0, + "description": "Kill the entire opposing team without any members of your team taking damage", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4f931d4e6bbc7ca648b16b0440d4440c79a4f37a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7f149df390f6e69aa21a06464b72946376b3f220.jpg", + "iconName": "Clean Sweep", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_DUAL_DUEL", + "achieved": 1, + "unlocktime": 1627072405, + "name": "WIN_DUAL_DUEL", + "defaultvalue": 0, + "displayName": "Akimbo King", + "hidden": 0, + "description": "Use Dual Berettas to kill an enemy player that is also wielding Dual Berettas", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9caa687914739d5da5200b04eeaaddd5e6f54f7f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6b0ef24cfabc4448d3d5edde30513ca3969158c5.jpg", + "iconName": "Akimbo King", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "UNSTOPPABLE_FORCE", + "achieved": 1, + "unlocktime": 1490379403, + "name": "UNSTOPPABLE_FORCE", + "defaultvalue": 0, + "displayName": "The Unstoppable Force", + "hidden": 0, + "description": "Kill four enemies within a single round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f0100bf4168376212331c5177f3d22a30df12ae.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/386633d066188ea38ac0df02904828ec772833eb.jpg", + "iconName": "The Unstoppable Force", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "IMMOVABLE_OBJECT", + "achieved": 1, + "unlocktime": 1490273538, + "name": "IMMOVABLE_OBJECT", + "defaultvalue": 0, + "displayName": "The Immovable Object", + "hidden": 0, + "description": "Kill an enemy who has killed four of your teammates within the current round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1f267b0abd6d96e464a1ca6903a2ab943153bec3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/40f68cf4f54cd820fc80bdf9c319ce66af9de9d2.jpg", + "iconName": "The Immovable Object", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "HEADSHOTS_IN_ROUND", + "achieved": 1, + "unlocktime": 1491097625, + "name": "HEADSHOTS_IN_ROUND", + "defaultvalue": 0, + "displayName": "Head Shred Redemption", + "hidden": 0, + "description": "Kill five enemy players with headshots in a single round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4f3ae16bccb48c9506e4be1ef4f107445958d527.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5e52593e691714ced65c35f680fc9f2f6469fee9.jpg", + "iconName": "Head Shred Redemption", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_MAP_DE_DUST2", + "achieved": 1, + "unlocktime": 1491441302, + "name": "WIN_MAP_DE_DUST2", + "defaultvalue": 0, + "displayName": "Dust2 Map Veteran", + "hidden": 0, + "description": "Win 100 rounds on Dust2", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5210b418dcb481a9a582a3007c6a1bcc9e0a28fb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4bb16b1f0c2b29d8fc8a9530507ee74e347b5bf8.jpg", + "iconName": "Dust2 Map Veteran", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_MAP_DE_INFERNO", + "achieved": 1, + "unlocktime": 1624939877, + "name": "WIN_MAP_DE_INFERNO", + "defaultvalue": 0, + "displayName": "Inferno Map Veteran", + "hidden": 0, + "description": "Win 100 rounds on Inferno", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/57432488f8e462d84e73b4234b8c0d10b4840320.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/94d47ff130d2e576d56cfe2b37bc5919eccc97e4.jpg", + "iconName": "Inferno Map Veteran", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_MAP_DE_NUKE", + "achieved": 1, + "unlocktime": 1649636358, + "name": "WIN_MAP_DE_NUKE", + "defaultvalue": 0, + "displayName": "Nuke Map Veteran", + "hidden": 0, + "description": "Win 100 rounds on Nuke", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/793ef60b248eee91e24909a802f171ef1e0054fa.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/33d1ab6153d7ea7087feb2b89e303c4f1f5bd4b5.jpg", + "iconName": "Nuke Map Veteran", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_WHILE_IN_AIR", + "achieved": 1, + "unlocktime": 1627011326, + "name": "KILL_WHILE_IN_AIR", + "defaultvalue": 0, + "displayName": "Death From Above", + "hidden": 0, + "description": "Kill an enemy while you are airborne", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d47c7a78c7bc6dcc720afbece64fe8ef0d55f4dd.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/be45e7791dfdeffcd2a12be0fdef91e807a53b02.jpg", + "iconName": "Death From Above", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_IN_AIR", + "achieved": 1, + "unlocktime": 1491095895, + "name": "KILL_ENEMY_IN_AIR", + "defaultvalue": 0, + "displayName": "Bunny Hunt", + "hidden": 0, + "description": "Kill an airborne enemy", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/36bee0e89e3152683990a4e0a6ac3175f14b3c9b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/de394e0ab012d5490bd0b6f229f461e87e79a8a5.jpg", + "iconName": "Bunny Hunt", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILLER_AND_ENEMY_IN_AIR", + "achieved": 1, + "unlocktime": 1627011326, + "name": "KILLER_AND_ENEMY_IN_AIR", + "defaultvalue": 0, + "displayName": "Aerial Necrobatics", + "hidden": 0, + "description": "Kill an airborne enemy while you are also airborne", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f2ad27b9e610de552f3eea70fa1f5ecec17d7400.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ef41b3fa5bd65c9c30b74b0fa0e9f68713b73556.jpg", + "iconName": "Aerial Necrobatics", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DONATE_WEAPONS", + "achieved": 1, + "unlocktime": 1626578255, + "name": "DONATE_WEAPONS", + "defaultvalue": 0, + "displayName": "Killanthropist", + "hidden": 0, + "description": "Donate 100 weapons to your teammates", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d6029b217b817879924136ec61345c9774187ffb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/004af3a53ba5946d961d220448bdc3eaf1cbbce7.jpg", + "iconName": "Killanthropist", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_ROUNDS_WITHOUT_BUYING", + "achieved": 1, + "unlocktime": 1627013263, + "name": "WIN_ROUNDS_WITHOUT_BUYING", + "defaultvalue": 0, + "displayName": "The Frugal Beret", + "hidden": 0, + "description": "Win ten rounds in a row without dying or spending any cash in Classic mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4ef75482e607ffa171598b739985407645be25f3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3a555d55923b301634bc28f8b677be62399235ba.jpg", + "iconName": "The Frugal Beret", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DEFUSE_DEFENSE", + "achieved": 1, + "unlocktime": 1632528434, + "name": "DEFUSE_DEFENSE", + "defaultvalue": 0, + "displayName": "Defusus Interruptus", + "hidden": 0, + "description": "Stop defusing the bomb long enough to kill an enemy, then successfully finish defusing it", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/71d7972286f4037b04343cf14a429e9bb890980c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/792a9f40a7efbbe6db7c4855759403c3b44e5c9b.jpg", + "iconName": "Defusus Interruptus", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_BOMB_PICKUP", + "achieved": 1, + "unlocktime": 1490273165, + "name": "KILL_BOMB_PICKUP", + "defaultvalue": 0, + "displayName": "Participation Award", + "hidden": 0, + "description": "Kill an enemy within three seconds after they recover a dropped bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c8363f9b9d8edefc807592ac0ebf0443638816e4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c582137968e8e30b7ad5ff020a122692ae9eda43.jpg", + "iconName": "Participation Award", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DOMINATIONS_LOW", + "achieved": 1, + "unlocktime": 1491097841, + "name": "DOMINATIONS_LOW", + "defaultvalue": 0, + "displayName": "Repeat Offender", + "hidden": 0, + "description": "Dominate an enemy", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8c161f325310f4319064377fab29f9c7ddb19953.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/93d4894afca8e1fd08e839464a96c16ddfb64aa3.jpg", + "iconName": "Repeat Offender", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DOMINATIONS_HIGH", + "achieved": 1, + "unlocktime": 1624846280, + "name": "DOMINATIONS_HIGH", + "defaultvalue": 0, + "displayName": "Decimator", + "hidden": 0, + "description": "Dominate ten enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/84b5363e331ac0f4f81b25f023dfd441b7704871.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9a67684395c15619e91c29c6aec2f8904065cc1b.jpg", + "iconName": "Decimator", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DOMINATION_OVERKILLS_LOW", + "achieved": 1, + "unlocktime": 1491099071, + "name": "DOMINATION_OVERKILLS_LOW", + "defaultvalue": 0, + "displayName": "Overkill", + "hidden": 0, + "description": "Kill an enemy whom you are already dominating", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/35f678614f16eabd93cf2bfac3d25056c19c05db.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/267be94458e3f79957f06e36b8754d8324b7bf50.jpg", + "iconName": "Overkill", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DOMINATION_OVERKILLS_HIGH", + "achieved": 1, + "unlocktime": 1627078177, + "name": "DOMINATION_OVERKILLS_HIGH", + "defaultvalue": 0, + "displayName": "Command and Control", + "hidden": 0, + "description": "Kill 100 enemies whom you are already dominating", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eb6fbfae0b533923e11313d0b899762a602c85d6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/fde4c00181781f63c793864fb82aff3ccd652af0.jpg", + "iconName": "Command and Control", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "REVENGES_LOW", + "achieved": 1, + "unlocktime": 1491099180, + "name": "REVENGES_LOW", + "defaultvalue": 0, + "displayName": "Insurgent", + "hidden": 0, + "description": "Kill an enemy who is dominating you", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3bcdad95b60feeb79544208afbab7420ba7ca7c0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0169c0d91b886351fe8e98c911655ec407a2e13e.jpg", + "iconName": "Insurgent", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "REVENGES_HIGH", + "achieved": 1, + "unlocktime": 1626712156, + "name": "REVENGES_HIGH", + "defaultvalue": 0, + "displayName": "Can't Keep a Good Man Down", + "hidden": 0, + "description": "Kill 20 enemies who are dominating you", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/318f5f8715d76b9a59ae187ee3d052c533761efc.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/54f01fd1936707ac2988b84d93c9f5ed264a66e9.jpg", + "iconName": "Can't Keep a Good Man Down", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "CONCURRENT_DOMINATIONS", + "achieved": 1, + "unlocktime": 1626468599, + "name": "CONCURRENT_DOMINATIONS", + "defaultvalue": 0, + "displayName": "Hat Trick", + "hidden": 0, + "description": "Dominate three enemies simultaneously", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8fe19e0adf20dfae6ee71dd83c2249ba45b93df9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8abe73ca9f1b49e57f79225dab67f5a679e413bb.jpg", + "iconName": "Hat Trick", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "DOMINATION_OVERKILLS_MATCH", + "achieved": 1, + "unlocktime": 1664560598, + "name": "DOMINATION_OVERKILLS_MATCH", + "defaultvalue": 0, + "displayName": "Ten Angry Men", + "hidden": 0, + "description": "Kill 10 enemies you are already dominating during a single match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d2a9bece8d07edc762f688132f8cbecb6a508057.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/585202a4828b7d6e228a83a6246bf6f53463cfa2.jpg", + "iconName": "Ten Angry Men", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "EXTENDED_DOMINATION", + "achieved": 1, + "unlocktime": 1626467311, + "name": "EXTENDED_DOMINATION", + "defaultvalue": 0, + "displayName": "Excessive Brutality", + "hidden": 0, + "description": "Kill an enemy whom you are dominating four additional times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5d9f9a1cbb9ddcc583a826defa941f2c7240125f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c5f44363ea98bb62baa9ac5a2907808e8e9ccc51.jpg", + "iconName": "Excessive Brutality", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMIES_WHILE_BLIND_HARD", + "achieved": 1, + "unlocktime": 1491439900, + "name": "KILL_ENEMIES_WHILE_BLIND_HARD", + "defaultvalue": 0, + "displayName": "Spray and Pray", + "hidden": 0, + "description": "Kill two enemies while you are blinded from a flashbang", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0080dcf6f75bfa344d7f4d8fa8be790bc28964d7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8ce1ca439ef39f231c60197bb3a74f588ca1cbba.jpg", + "iconName": "Spray and Pray", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "AVENGE_FRIEND", + "achieved": 1, + "unlocktime": 1491097461, + "name": "AVENGE_FRIEND", + "defaultvalue": 0, + "displayName": "Avenging Angel", + "hidden": 0, + "description": "Kill an enemy who has killed a player on your friends list in the same round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a43e9ea14bfc5c7c65d9403bf7ed0869cb1fa0f3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/056f3578244e069b90d75b8124652ae17b744f9b.jpg", + "iconName": "Avenging Angel", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GUN_GAME_KILL_KNIFER", + "achieved": 1, + "unlocktime": 1627007910, + "name": "GUN_GAME_KILL_KNIFER", + "defaultvalue": 0, + "displayName": "Denied!", + "hidden": 0, + "description": "Kill a player who is on gold knife level in Arms Race Mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9a1cd597e0b3b4f24ef9bf2daf4ca67f40aab770.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/15793fee93359e9b019e28eb09a000409273f014.jpg", + "iconName": "Denied!", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_MAP_AR_SHOOTS", + "achieved": 1, + "unlocktime": 1627434444, + "name": "WIN_MAP_AR_SHOOTS", + "defaultvalue": 0, + "displayName": "Shoots Vet", + "hidden": 0, + "description": "Win five matches in Arms Race Mode on Shoots", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/285b0ace38c4a02a02844c8d8b559054877a79f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8a7f730636f7fb94ef405dc5e4f45f58d2ad1667.jpg", + "iconName": "Shoots Vet", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_MAP_DE_LAKE", + "achieved": 1, + "unlocktime": 1626481224, + "name": "WIN_MAP_DE_LAKE", + "defaultvalue": 0, + "displayName": "Vacation", + "hidden": 0, + "description": "Win five matches on Lake", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/31c3ab15c1850db833bb3876df7b9943637e916f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7a3d1294fcfcf61c9e65efba02f2e44fdf6ef0a5.jpg", + "iconName": "Vacation", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GUN_GAME_KNIFE_KILL_KNIFER", + "achieved": 1, + "unlocktime": 1627074951, + "name": "GUN_GAME_KNIFE_KILL_KNIFER", + "defaultvalue": 0, + "displayName": "Knife on Knife", + "hidden": 0, + "description": "Kill an enemy who is on gold knife level with your own knife in Arms Race Mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2f1cc20b9181390d0f10494d9f29b659f7db4623.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/40ee7dae79c9a3b0e5476c504be890c6815a7563.jpg", + "iconName": "Knife on Knife", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GUN_GAME_SMG_KILL_KNIFER", + "achieved": 1, + "unlocktime": 1664559892, + "name": "GUN_GAME_SMG_KILL_KNIFER", + "defaultvalue": 0, + "displayName": "Level Playing Field", + "hidden": 0, + "description": "Kill an enemy who is on gold knife level with a sub-machine gun in Arms Race Mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/975c11095cd8c9bd21773676c519bf279e816e95.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b3d4fed55f308d5f66b6a7f918c2c848f91bf24c.jpg", + "iconName": "Level Playing Field", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GUN_GAME_ROUNDS_LOW", + "achieved": 1, + "unlocktime": 1627073137, + "name": "GUN_GAME_ROUNDS_LOW", + "defaultvalue": 0, + "displayName": "Practice Practice Practice", + "hidden": 0, + "description": "Play 100 matches of Arms Race or Demolition mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/fd2a716c0e7ec6a837748c4ed0834517e431ff94.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/73ca8432b7b5b46cb59a7df3a1e8635cf53ca6d9.jpg", + "iconName": "Practice Practice Practice", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "WIN_GUN_GAME_ROUNDS_LOW", + "achieved": 1, + "unlocktime": 1627008965, + "name": "WIN_GUN_GAME_ROUNDS_LOW", + "defaultvalue": 0, + "displayName": "Gungamer", + "hidden": 0, + "description": "Win one match in Arms Race or Demolition mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4a64a911384776b5b22b6b625739ac80c345ad52.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/93a8f39d8310263c09f5d83975528af3e180397b.jpg", + "iconName": "Gungamer", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GUN_GAME_FIRST_KILL", + "achieved": 1, + "unlocktime": 1627009794, + "name": "GUN_GAME_FIRST_KILL", + "defaultvalue": 0, + "displayName": "FIRST!", + "hidden": 0, + "description": "Be the first player to get a kill in an Arms Race or Demolition match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f43514b35d97147befe3d0206c256abe16494d10.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8d29ee467f4ddd380fc6e5140d0f96c62adeccb4.jpg", + "iconName": "FIRST!", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "ONE_SHOT_ONE_KILL", + "achieved": 1, + "unlocktime": 1627010030, + "name": "ONE_SHOT_ONE_KILL", + "defaultvalue": 0, + "displayName": "One Shot One Kill", + "hidden": 0, + "description": "Kill three consecutive players using the first bullet of your gun in Arms Race mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7ceebbc7a90958c4c50477d313f55f7c371cefa9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0bf0571d2e6cbea466c77a1b28b91f027769a64b.jpg", + "iconName": "One Shot One Kill", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "GUN_GAME_CONSERVATIONIST", + "achieved": 1, + "unlocktime": 1627073137, + "name": "GUN_GAME_CONSERVATIONIST", + "defaultvalue": 0, + "displayName": "Conservationist", + "hidden": 0, + "description": "Win an Arms Race match without reloading any of your weapons", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/aace8291de73c7ef8388cd2a0ba4be87497c5cf5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4483f4a571fad5bb6829fd6d4d17d8f920628cce.jpg", + "iconName": "Conservationist", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "BASE_SCAMPER", + "achieved": 1, + "unlocktime": 1627007793, + "name": "BASE_SCAMPER", + "defaultvalue": 0, + "displayName": "Base Scamper", + "hidden": 0, + "description": "Kill an enemy just as their respawn protection ends in Arms Race mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c1000dbf007206aeddbeed97fcd331405e542adf.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/41d2301e82ddcc783512d0e8dac538767c9af8ff.jpg", + "iconName": "Base Scamper", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "BORN_READY", + "achieved": 1, + "unlocktime": 1627008589, + "name": "BORN_READY", + "defaultvalue": 0, + "displayName": "Born Ready", + "hidden": 0, + "description": "Kill an enemy with the first bullet after your respawn protection ends in Arms Race mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5856a57c4a43a209287ef5d4d2ab2cd2e6d4bc76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a8ad2dc9a198f2a9853297c8def995b38341ac57.jpg", + "iconName": "Born Ready", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "STILL_ALIVE", + "achieved": 1, + "unlocktime": 1491098875, + "name": "STILL_ALIVE", + "defaultvalue": 0, + "displayName": "Still Alive", + "hidden": 0, + "description": "Survive more than 30 seconds with less than ten health in Arms Race or Demolition mode", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/344f2a3aa230450a3e2bda06533b2a632e223b4a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d1981870927d0426646ba0ab59a0e1559ec27de6.jpg", + "iconName": "Still Alive", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "MEDALIST", + "achieved": 1, + "unlocktime": 1680759661, + "name": "MEDALIST", + "defaultvalue": 0, + "displayName": "Awardist", + "hidden": 0, + "description": "Earn 100 achievements", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f6d212f58b1055ddb033af1e30b401c6e04a349b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8b8face693855070499542ea573f4db7880b8983.jpg", + "iconName": "Awardist", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_TEC9", + "achieved": 1, + "unlocktime": 1695410143, + "name": "KILL_ENEMY_TEC9", + "defaultvalue": 0, + "displayName": "Tec-9 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the Tec-9", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d27a9eb65bb331b15c04ea8840ac4de587f38e4b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c0de589d9a345909a4d5f590a9294400798e6bdb.jpg", + "iconName": "Tec-9 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_HKP2000", + "achieved": 1, + "unlocktime": 1626714351, + "name": "KILL_ENEMY_HKP2000", + "defaultvalue": 0, + "displayName": "P2000/USP Tactical Expert", + "hidden": 0, + "description": "Kill 100 enemies with the P2000 or USP", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/819a8572e35a624d545db1608c8feff8842e8b45.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ac79d04b1210aee0272ed24e89897625d3b99745.jpg", + "iconName": "P2000/USP Tactical Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_P250", + "achieved": 1, + "unlocktime": 1491626473, + "name": "KILL_ENEMY_P250", + "defaultvalue": 0, + "displayName": "P250 Expert", + "hidden": 0, + "description": "Kill 25 enemies with the P250", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c3d65d7d4e64ef925e9e9863f466344a1edd2c69.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/42e8c9a645a4eefd48051dde97ac0269795b2b3a.jpg", + "iconName": "P250 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_SCAR20", + "achieved": 1, + "unlocktime": 1680883952, + "name": "KILL_ENEMY_SCAR20", + "defaultvalue": 0, + "displayName": "SCAR-20 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the SCAR-20", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/54b73be2c9b7d265eb9a9aae5dac2492ed9da5f9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ecdedbd60aa53efefa2a3068e546ae94dcbf3959.jpg", + "iconName": "SCAR-20 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_SG556", + "achieved": 1, + "unlocktime": 1664556165, + "name": "KILL_ENEMY_SG556", + "defaultvalue": 0, + "displayName": "SG553 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the SG553", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/48f4510fdc397cc77a6847314edb77b7e5e32351.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f794e47191144b535b067d41873cb1f7b972671a.jpg", + "iconName": "SG553 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_SSG08", + "achieved": 1, + "unlocktime": 1627011061, + "name": "KILL_ENEMY_SSG08", + "defaultvalue": 0, + "displayName": "SSG 08 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the SSG 08", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/46ff7336028888b668484abd48b8d2448dc168c6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/e8e474be5facc60629a08adbcd9d73c35148f7f3.jpg", + "iconName": "SSG 08 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_MP9", + "achieved": 1, + "unlocktime": 1680501851, + "name": "KILL_ENEMY_MP9", + "defaultvalue": 0, + "displayName": "MP9 Expert", + "hidden": 0, + "description": "Kill 100 enemies with the MP9", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/90ad5f5a2c540995f1b6436bd03609ad42c29904.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b692f67c0fab35be6ad9d49474a6eecf4f786e6a.jpg", + "iconName": "MP9 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_MAG7", + "achieved": 1, + "unlocktime": 1627582340, + "name": "KILL_ENEMY_MAG7", + "defaultvalue": 0, + "displayName": "MAG-7 Expert", + "hidden": 0, + "description": "Kill 50 enemies with the MAG-7", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/43a157088b353f1347364fa0dcbb73fca36bc8ec.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3a90b24066b3e62f9fb59d8584acf69ae45c99b1.jpg", + "iconName": "MAG-7 Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_SAWEDOFF", + "achieved": 1, + "unlocktime": 1627434280, + "name": "KILL_ENEMY_SAWEDOFF", + "defaultvalue": 0, + "displayName": "Sawed-Off Expert", + "hidden": 0, + "description": "Kill 50 enemies with the Sawed-Off", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3f5eba75bc35416bda2aade3b717206b68e341f2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4ba6e95affe6c23df0c24a8e8f455ed1c969b864.jpg", + "iconName": "Sawed-Off Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "KILL_ENEMY_GALILAR", + "achieved": 1, + "unlocktime": 1664927023, + "name": "KILL_ENEMY_GALILAR", + "defaultvalue": 0, + "displayName": "Galil AR Expert", + "hidden": 0, + "description": "Kill 250 enemies with the Galil AR", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a3a32715a970dd3a8c174bc57ee1b2204d9d29b1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/61139f5e158c8af4592118802ad1ceb74cd40b57.jpg", + "iconName": "Galil AR Expert", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "TheLovers", + "achieved": 1, + "unlocktime": 1607706771, + "name": "TheLovers", + "defaultvalue": 0, + "displayName": "The Lovers", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/25bab7e2288262ad801664e62f241e2839edb457.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Lovers", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "TheHermit", + "achieved": 1, + "unlocktime": 1663738211, + "name": "TheHermit", + "defaultvalue": 0, + "displayName": "The Hermit", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/d1e79618b612be87bff4f5c70b1e825e37b05540.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/35a05a2c50d604f54724d65b7fdf6f9ee71fe88c.jpg", + "iconName": "The Hermit", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "TheWheelOfFortune", + "achieved": 1, + "unlocktime": 1663828218, + "name": "TheWheelOfFortune", + "defaultvalue": 0, + "displayName": "The Wheel of Fortune", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/61c7ccea74b66ef3f5d51c078d900d930346e74a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Wheel of Fortune", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "TheHightPriestess", + "achieved": 1, + "unlocktime": 1664235184, + "name": "TheHightPriestess", + "defaultvalue": 0, + "displayName": "The High Priestess", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/8f5eacf50eb2ad11fe9dbd1d3a98c306d54ff545.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The High Priestess", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "TheWorld", + "achieved": 1, + "unlocktime": 1664248117, + "name": "TheWorld", + "defaultvalue": 0, + "displayName": "The World", + "hidden": 0, + "description": "Complete the main storyline.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/25c57ecea783efc3f9d04eec43401264ed5eb9b2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The World", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "GunKata", + "achieved": 1, + "unlocktime": 1663636900, + "name": "GunKata", + "defaultvalue": 0, + "displayName": "Gun Fu", + "hidden": 0, + "description": "Kill or incapacitate 3 enemies in quick succession with a revolver or pistol in close combat.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/96b9d0c95bc80867a61a2870c6ddec9ab424f728.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "Gun Fu", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "MasterRunner", + "achieved": 1, + "unlocktime": 1663819262, + "name": "MasterRunner", + "defaultvalue": 0, + "displayName": "Christmas Tree Attack", + "hidden": 0, + "description": "Complete a Breach Protocol with a minimum of 3 daemons uploaded.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/8af08786073d0d2ba2374f00eb6bd876c593891e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "Christmas Tree Attack", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "Roleplayer", + "achieved": 1, + "unlocktime": 1607719788, + "name": "Roleplayer", + "defaultvalue": 0, + "displayName": "Stanislavski's Method", + "hidden": 0, + "description": "Use a dialogue option related to V's life path 10 times.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/943a38cb96238b7b020672cf360d9e763dcf6feb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "Stanislavski's Method", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "TrueSoldier", + "achieved": 1, + "unlocktime": 1664210266, + "name": "TrueSoldier", + "defaultvalue": 0, + "displayName": "True Soldier", + "hidden": 0, + "description": "Kill or incapacitate 300 enemies using ranged weapons.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/2f63e6b9c0774f8f63b9f053ba9ec145e90c678c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "True Soldier", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "Denied", + "achieved": 1, + "unlocktime": 1607567266, + "name": "Denied", + "defaultvalue": 0, + "displayName": "Right Back At Ya", + "hidden": 0, + "description": "Kill or incapacitate an enemy who threw a grenade at you.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/33a8a122a08532ec727598142e6b5689ae7eed8b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "Right Back At Ya", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549" + }, + { + "apiname": "ACH_4", + "achieved": 1, + "unlocktime": 1571865005, + "name": "ACH_4", + "defaultvalue": 0, + "displayName": "Ikora's Protégé", + "hidden": 0, + "description": "Acquire each Warlock subclass.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/a00b8c7394b8af482a2d3fea70e152310d6d8a2f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ab2fc8852927248c06e068acc79bb669651447be.jpg", + "iconName": "Ikora's Protégé", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549" + }, + { + "apiname": "ACH_7", + "achieved": 1, + "unlocktime": 1571871913, + "name": "ACH_7", + "defaultvalue": 0, + "displayName": "The People's Hero", + "hidden": 0, + "description": "Complete a Heroic public event.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/4f1d1d43b60c087bf99bba3061b375fe0f327be7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/588006e6fbef7995fb390c29e9798a8a8f97de66.jpg", + "iconName": "The People's Hero", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549" + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe" + }, + { + "apiname": "エースプレイヤー", + "achieved": 1, + "unlocktime": 1690680618, + "name": "エースプレイヤー", + "defaultvalue": 0, + "displayName": "Ace Pilot", + "hidden": 0, + "description": "Get MVP in a Casual or Ranked Match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Ace Pilot", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe" + }, + { + "apiname": "チャレンジャー", + "achieved": 1, + "unlocktime": 1690758415, + "name": "チャレンジャー", + "defaultvalue": 0, + "displayName": "Duelist", + "hidden": 0, + "description": "Join 10 casual or ranked matches and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Duelist", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe" + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca" + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "NEW_ACHIEVEMENT_3_16", + "achieved": 1, + "unlocktime": 1654130637, + "name": "NEW_ACHIEVEMENT_3_16", + "defaultvalue": 0, + "displayName": "\"Need a Weapon?\"", + "hidden": 0, + "description": "Try out a new weapon customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "\"Need a Weapon?\"", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "NEW_ACHIEVEMENT_3_20", + "achieved": 1, + "unlocktime": 1654133352, + "name": "NEW_ACHIEVEMENT_3_20", + "defaultvalue": 0, + "displayName": "Humble Beginnings", + "hidden": 0, + "description": "Complete one level in a Battle Pass.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/88136bc7244bf35c50dc0779413c7b11953a7032.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/fb3808343958b30bae95cceff8d5850e8230cacd.jpg", + "iconName": "Humble Beginnings", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "NEW_ACHIEVEMENT_3_22", + "achieved": 1, + "unlocktime": 1637302438, + "name": "NEW_ACHIEVEMENT_3_22", + "defaultvalue": 0, + "displayName": "Clocking In", + "hidden": 0, + "description": "Complete a Daily Challenge.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/88136bc7244bf35c50dc0779413c7b11953a7032.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/fb3808343958b30bae95cceff8d5850e8230cacd.jpg", + "iconName": "Clocking In", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "NEW_ACHIEVEMENT_3_23", + "achieved": 1, + "unlocktime": 1654130545, + "name": "NEW_ACHIEVEMENT_3_23", + "defaultvalue": 0, + "displayName": "We Have a Job For You", + "hidden": 0, + "description": "Complete a Weekly Challenge.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/88136bc7244bf35c50dc0779413c7b11953a7032.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/fb3808343958b30bae95cceff8d5850e8230cacd.jpg", + "iconName": "We Have a Job For You", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "NEW_ACHIEVEMENT_3_25", + "achieved": 1, + "unlocktime": 1654133345, + "name": "NEW_ACHIEVEMENT_3_25", + "defaultvalue": 0, + "displayName": "You're Up, Rook'", + "hidden": 0, + "description": "Play a Ranked Match.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/d353de98434bb8120d95a836da7c438043dc97f1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/3f68fd31824525fe542f13dd1f2b6bc960aacc04.jpg", + "iconName": "You're Up, Rook'", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "NEW_ACHIEVEMENT_4_6", + "achieved": 1, + "unlocktime": 1637303158, + "name": "NEW_ACHIEVEMENT_4_6", + "defaultvalue": 0, + "displayName": "Peak Performance", + "hidden": 0, + "description": "Earn 2,000 score in a matchmade game.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/483c8c2701b79a8d86755603bc467acf0053ba5d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/d1dfdbd1f26bead14400e91b851cc07c10314e06.jpg", + "iconName": "Peak Performance", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_5", + "achieved": 1, + "unlocktime": 1676240134, + "name": "PFA_5", + "defaultvalue": 0, + "displayName": "The Wise Owl", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/7984463bf6739db83e7df933a923eb07833b5c5f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/a7b413303a36f40109f1499ff1ac1cbc8d887663.jpg", + "iconName": "The Wise Owl", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_6", + "achieved": 1, + "unlocktime": 1676094172, + "name": "PFA_6", + "defaultvalue": 0, + "displayName": "First Class Student", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/00ed9983fddb95930e090930c9e324089f189fc6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/e466750e42bc7c80d28db7b64c434f25b71182db.jpg", + "iconName": "First Class Student", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_7", + "achieved": 1, + "unlocktime": 1676132894, + "name": "PFA_7", + "defaultvalue": 0, + "displayName": "Troll with the Punches", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/5c9e26c4941ae4fc98c6eaf3c023e3a18dc2df51.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/70b3c64e9777c9e92c2f142c588fbb06f0866047.jpg", + "iconName": "Troll with the Punches", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_8", + "achieved": 1, + "unlocktime": 1676273043, + "name": "PFA_8", + "defaultvalue": 0, + "displayName": "That's a Keeper", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/862757b287f9430989c4c5f27e71b0053966f3b3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/47adf0df129b5f89653bb0dca1e20b02128ba988.jpg", + "iconName": "That's a Keeper", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_23", + "achieved": 1, + "unlocktime": 1676152232, + "name": "PFA_23", + "defaultvalue": 0, + "displayName": "A Keen Sense of Spell", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/c54dcf12698edd975e71c525185854c635f60941.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/d3fd39cd6d573ed5d9e102fcf042c00e003c462d.jpg", + "iconName": "A Keen Sense of Spell", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_30", + "achieved": 1, + "unlocktime": 1676240335, + "name": "PFA_30", + "defaultvalue": 0, + "displayName": "A Talent for Spending", + "hidden": 0, + "description": "Spend 5 Talent Points", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/175cc1a73ae03d7bb6d5153467d8012eabaac2aa.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/3ede5cd4d4e8e217a239bbd4ce0078862730597f.jpg", + "iconName": "A Talent for Spending", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "PFA_35", + "achieved": 1, + "unlocktime": 1676266823, + "name": "PFA_35", + "defaultvalue": 0, + "displayName": "Followed the Butterflies", + "hidden": 0, + "description": "Follow butterflies to a treasure", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/7c843a190fcde960f01f411423468e3ab88944f5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/22b6e534eac3b5e9363fb56e137245c5abe3657a.jpg", + "iconName": "Followed the Butterflies", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70" + }, + { + "apiname": "kz14", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz14", + "defaultvalue": 0, + "displayName": "[Monster] I'm Okay! ( I )", + "hidden": 0, + "description": "Complete Monster Mission Without Being Knocked Out", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e81fe02c42631472edf15e2f275431a4383a0c51.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/3b0ab4fa2dfec4a998c4095267dcc26bbc9d1fb4.jpg", + "iconName": "[Monster] I'm Okay! ( I )", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70" + }, + { + "apiname": "kz43", + "achieved": 1, + "unlocktime": 1557426448, + "name": "kz43", + "defaultvalue": 0, + "displayName": "[Affinity] First Meeting - Lire Eryuell", + "hidden": 0, + "description": "Become Someone She's Met Before with Lire Eryuell", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/253c656b0d46582ad40d6e441d08a91c9da2d097.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/92007e83e570ee999c2012e8288e5a79d16cd500.jpg", + "iconName": "[Affinity] First Meeting - Lire Eryuell", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70" + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030001", + "achieved": 1, + "unlocktime": 1644418438, + "name": "1030001", + "defaultvalue": 0, + "displayName": "Adventurer of Yudia", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Yudia", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/59872cd827805847ad982454c27a1c005765d8f1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e231c057a6d27fb577b6631d403fc4f8c0f9b5e4.jpg", + "iconName": "Adventurer of Yudia", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030002", + "achieved": 1, + "unlocktime": 1644437677, + "name": "1030002", + "defaultvalue": 0, + "displayName": "Adventurer of West Luterra", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: West Luterra", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/80d9722359a3da4671e812e0af59a7aedcafbd11.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/96aa61df95adac6292ca6dc22b604aad210187f0.jpg", + "iconName": "Adventurer of West Luterra", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030003", + "achieved": 1, + "unlocktime": 1644694127, + "name": "1030003", + "defaultvalue": 0, + "displayName": "Adventurer of East Luterra", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: East Luterra", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ce5b0087307fda123c114ec80acc997c6c5e33a0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/cfa2b613816431506a8a94d02531d77627701d68.jpg", + "iconName": "Adventurer of East Luterra", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030005", + "achieved": 1, + "unlocktime": 1644741382, + "name": "1030005", + "defaultvalue": 0, + "displayName": "Adventurer of Anikka", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Anikka", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c99f013fcb6030dd76d37bc29b58710c43d38de7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/f51d5485761c91778ea8d19a9567dbe23c2c99b4.jpg", + "iconName": "Adventurer of Anikka", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030006", + "achieved": 1, + "unlocktime": 1646012535, + "name": "1030006", + "defaultvalue": 0, + "displayName": "Adventurer of Arthetine", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Arthetine", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/6c6c800b717fd3ad0c7db0f709865a517ffa4564.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/cb2340b31d8ec41e53bc64db7052c635f417467d.jpg", + "iconName": "Adventurer of Arthetine", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030007", + "achieved": 1, + "unlocktime": 1646104181, + "name": "1030007", + "defaultvalue": 0, + "displayName": "Adventurer of North Vern", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: North Vern", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/7a90cd6e5002cf275e9b9f30fd70d7ca3f039f30.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/279daea5fda7ffcb8cfc0ada353f00f7dd5bc2b4.jpg", + "iconName": "Adventurer of North Vern", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030004", + "achieved": 1, + "unlocktime": 1644732903, + "name": "1030004", + "defaultvalue": 0, + "displayName": "Adventurer of Tortoyk", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Tortoyk", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c25421de7525dd8f03cfe466bc57846af187d2a4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2502044ddcc86600d9061ac18bb456ad64c53e1f.jpg", + "iconName": "Adventurer of Tortoyk", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030008", + "achieved": 1, + "unlocktime": 1646114034, + "name": "1030008", + "defaultvalue": 0, + "displayName": "Adventurer of Shushire", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Shushire", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/923f6f5538594b18282bf7763a936ba9bf8d6a58.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e857c2a15dc98a0d6ca54aecb3a69a46e22ab39d.jpg", + "iconName": "Adventurer of Shushire", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030012", + "achieved": 1, + "unlocktime": 1646342135, + "name": "1030012", + "defaultvalue": 0, + "displayName": "Adventurer of Rohendel", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Rohendel", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/8dfe21a234d444644520189130280ee1227edd17.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/71d13eb3be6818f35ae32878dcd063d201d8689a.jpg", + "iconName": "Adventurer of Rohendel", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1030013", + "achieved": 1, + "unlocktime": 1647361479, + "name": "1030013", + "defaultvalue": 0, + "displayName": "Adventurer of Yorn", + "hidden": 0, + "description": "Complete 10% of Adventurer's Tome: Yorn", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/23a7e09870715be2e05a0e197c78a88564ef6c90.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/32bf23c595769b0d5a91b49c0184f50cd47bfacc.jpg", + "iconName": "Adventurer of Yorn", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4010003", + "achieved": 1, + "unlocktime": 1644350019, + "name": "4010003", + "defaultvalue": 0, + "displayName": "Basic Training", + "hidden": 0, + "description": "Perform 100 basic attacks", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a1cf993c44232629f90c2c3c2f6b23fd377f09b9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/56a134ba4e8ceaa23a4bf5c8299bef640008d6cb.jpg", + "iconName": "Basic Training", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4010020", + "achieved": 1, + "unlocktime": 1648372617, + "name": "4010020", + "defaultvalue": 0, + "displayName": "M-M-M-Monster Kill!", + "hidden": 0, + "description": "Defeat 120,000 monsters", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5e752e6719fcc2be4223c3c50826a1b191d05bdb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ec042ebc54d8636a7a264836bc6bbc6abdf6c1df.jpg", + "iconName": "M-M-M-Monster Kill!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4010021", + "achieved": 1, + "unlocktime": 1644732132, + "name": "4010021", + "defaultvalue": 0, + "displayName": "Elite? As If", + "hidden": 0, + "description": "Defeat 20 Elite monsters", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/fa242e169a1af83f5b173936231482d2a8aa8402.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/00f07d0390194ebf2381a6d73cbfc4ed8180ca2b.jpg", + "iconName": "Elite? As If", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4020003", + "achieved": 1, + "unlocktime": 1646155701, + "name": "4020003", + "defaultvalue": 0, + "displayName": "Unleash the Power Within", + "hidden": 0, + "description": "Use 10 Awakening Skills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/388c23d5e2aaf0a3f831b7ba82a5b7ae64c8dbc5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/7135ca78c2ea0229aab13b1f01fa712540777459.jpg", + "iconName": "Unleash the Power Within", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4020000", + "achieved": 1, + "unlocktime": 1644372353, + "name": "4020000", + "defaultvalue": 0, + "displayName": "Skill Research", + "hidden": 0, + "description": "Apply 10 skill level changes", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/1cf122a36e0545dd1f7d0654cf12c3779148e4e9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c7d5d6a6e1137883f910b95ea1688d5694e8e978.jpg", + "iconName": "Skill Research", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3030001", + "achieved": 1, + "unlocktime": 1644781489, + "name": "3030001", + "defaultvalue": 0, + "displayName": "Map Trader", + "hidden": 0, + "description": "Trade a map for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/dc7be74df9160688e7a986ea3964628b790b1b38.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65f87beea29959bbfc53540c5f39c9de27fe9293.jpg", + "iconName": "Map Trader", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3030002", + "achieved": 1, + "unlocktime": 1644781489, + "name": "3030002", + "defaultvalue": 0, + "displayName": "Geography Nerd", + "hidden": 0, + "description": "Trade 10 maps", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e40d0bd667ae5df28db6dbb88e1c7dcf977b3875.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/bd6dabfdb67ae3516bc2779955f9ffd727b139cb.jpg", + "iconName": "Geography Nerd", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020009", + "achieved": 1, + "unlocktime": 1646535835, + "name": "3020009", + "defaultvalue": 0, + "displayName": "Creating a Legend", + "hidden": 0, + "description": "Get a Legendary item by crafting", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/22adad04a7fdf651e1a017a19e3c98d201bcc69c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c3471a9c9aa0cb643faf4a915d4cfae14e8af93e.jpg", + "iconName": "Creating a Legend", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020037", + "achieved": 1, + "unlocktime": 1646121877, + "name": "3020037", + "defaultvalue": 0, + "displayName": "For the Most Powerful Weapon Possible", + "hidden": 0, + "description": "Try Honing 10 times\t", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ced2967b0bf4a8b97720dbd526b45fe23c77f585.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a04ad11a2e290df4ca8c20f261edad6914191db2.jpg", + "iconName": "For the Most Powerful Weapon Possible", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "6010008", + "achieved": 1, + "unlocktime": 1647589941, + "name": "6010008", + "defaultvalue": 0, + "displayName": "Exploration: Cube", + "hidden": 0, + "description": "Collect a Diamond Chest from the Cube (normal)", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/319fcf5e67bff487432db0294e04932bace38863.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/49dd8e99620905e3794b66ba880e7f238f4d0dee.jpg", + "iconName": "Exploration: Cube", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020051", + "achieved": 1, + "unlocktime": 1646119510, + "name": "3020051", + "defaultvalue": 0, + "displayName": "Gear of My Dreams", + "hidden": 0, + "description": "Reach Item Level 302", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/41ad83f74805b6256e2adbfeeee0d6af996912e9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ea8ee222ba93b14701e1a6e9e56a37f5954bf8b6.jpg", + "iconName": "Gear of My Dreams", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020054", + "achieved": 1, + "unlocktime": 1647529268, + "name": "3020054", + "defaultvalue": 0, + "displayName": "Superb Gear", + "hidden": 0, + "description": "Reach item level 1300", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/8ea53af21fc58f4ed4ef73bf4d1433d1a4dc85e4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a8160b8582eceb8cd2a4e2d9074d557fd8fa0f07.jpg", + "iconName": "Superb Gear", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3060001", + "achieved": 1, + "unlocktime": 1644522688, + "name": "3060001", + "defaultvalue": 0, + "displayName": "What's This Stone For?", + "hidden": 0, + "description": "Equip an Ability Stone", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/8faecef7a2fa9dd269f840eb436ef7bb080bcd8e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c6537597fe72dc104599be896222aae1a84cd70c.jpg", + "iconName": "What's This Stone For?", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "6040000", + "achieved": 1, + "unlocktime": 1646153562, + "name": "6040000", + "defaultvalue": 0, + "displayName": "Legendary Hunter", + "hidden": 0, + "description": "Clear 3 Guardian Raids", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b83de033f69e32d3f4056c9370cf5ba288e960ea.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2346729036f3407b9e059efaa234cdec40ef087d.jpg", + "iconName": "Legendary Hunter", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "6040003", + "achieved": 1, + "unlocktime": 1647450123, + "name": "6040003", + "defaultvalue": 0, + "displayName": "I Hit Hard", + "hidden": 0, + "description": "Clear 1 Guardian Raid by singlehandedly inflicting at least 50% of the damage it takes to clear", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/1af14ce06b8ab168b4db8729906ed0c939590b2e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d12cd3254989a3126f81f20007a712334bbf45e4.jpg", + "iconName": "I Hit Hard", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1010001", + "achieved": 1, + "unlocktime": 1646406603, + "name": "1010001", + "defaultvalue": 0, + "displayName": "Look at the Time", + "hidden": 0, + "description": "Play for 50 hours in total", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/59941fe39c93f07ae675f3c6333b47bfe1dec4cb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/cae9592547b4f37901d57ef04321e185ccc95791.jpg", + "iconName": "Look at the Time", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1010002", + "achieved": 1, + "unlocktime": 1644347131, + "name": "1010002", + "defaultvalue": 0, + "displayName": "A Leading Life", + "hidden": 0, + "description": "Progress to an Advanced Class", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d4b29533c35708415be43be10e1aa30e0ba72afa.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b60956891ae2bef3bf8362f66b9cb349276c550d.jpg", + "iconName": "A Leading Life", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1010003", + "achieved": 1, + "unlocktime": 1644419011, + "name": "1010003", + "defaultvalue": 0, + "displayName": "Pathfinder", + "hidden": 0, + "description": "Activate 10 Triports", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e68d90d97ea207aa229ff53acedad0065f5aef13.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b4126867b20264dc0299a524dc38df6387efa610.jpg", + "iconName": "Pathfinder", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1010004", + "achieved": 1, + "unlocktime": 1644477471, + "name": "1010004", + "defaultvalue": 0, + "displayName": "Use My Nickname", + "hidden": 0, + "description": "Collect 10 or more titles", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/709ca00519b21baf3ae24d62c2148c63ae79c803.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d2d4ee178c9669dd79c095fb65e1f3df22ff304f.jpg", + "iconName": "Use My Nickname", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1010005", + "achieved": 1, + "unlocktime": 1646932946, + "name": "1010005", + "defaultvalue": 0, + "displayName": "Where Mokokos Come From", + "hidden": 0, + "description": "Pick One Mokoko Seed", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4ae8e8ff7557d1adeefd953d547519d1f6597e63.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/397d67c87431b3f947166f5a7ff1cf5295f58678.jpg", + "iconName": "Where Mokokos Come From", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1050007", + "achieved": 1, + "unlocktime": 1644437965, + "name": "1050007", + "defaultvalue": 0, + "displayName": "Surprise Me", + "hidden": 0, + "description": "Complete 10 Sudden Quests", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/709a73d5e0efd23cecce17f4527763fad9c3b03f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4ad364200ea30ab6513f2916e22369137f2e0188.jpg", + "iconName": "Surprise Me", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "2010001", + "achieved": 1, + "unlocktime": 1644625724, + "name": "2010001", + "defaultvalue": 0, + "displayName": "Mastery", + "hidden": 0, + "description": "Switch to Skill Tree Tier 3", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/620bad1b1613adf4692826e4abc4893a16494321.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/856fb6dead2d2556d9558aed8773c78e6108d51b.jpg", + "iconName": "Mastery", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "2030008", + "achieved": 1, + "unlocktime": 1644477651, + "name": "2030008", + "defaultvalue": 0, + "displayName": "Voice of Arkesia", + "hidden": 0, + "description": "Play an instrument for an Affinity NPC", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/dcda7daf2089ac557472ade5f4e9268bf855cde5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b9ec9ce281d3ab21466ae151b2ffd6036f814f8d.jpg", + "iconName": "Voice of Arkesia", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020007", + "achieved": 1, + "unlocktime": 1646536444, + "name": "3020007", + "defaultvalue": 0, + "displayName": "Struggling Economy", + "hidden": 0, + "description": "Spend 10,000 Silver repairing gear", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/6299599c054104df4e237d5ddcab64201892dca4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/f63ced70c7052a28e1f43057e39d4cb2114ccd0e.jpg", + "iconName": "Struggling Economy", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020012", + "achieved": 1, + "unlocktime": 1646237501, + "name": "3020012", + "defaultvalue": 0, + "displayName": "Broken-Down Legend", + "hidden": 0, + "description": "Successfully dismantle 1 Legendary or better item", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/13eaa7d62c325f3bc257346b79f29c300519c230.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e22df14a05e5bbaed885d66889e46946ef346118.jpg", + "iconName": "Broken-Down Legend", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3020046", + "achieved": 1, + "unlocktime": 1648422592, + "name": "3020046", + "defaultvalue": 0, + "displayName": "So Lux!", + "hidden": 0, + "description": "Fuse Gems into Lv. 5 or above once", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4f6d7888e029b8e4096a693c2d1e0865db16b5ba.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/1201ecf37a1bc0a0ea588567e9e34ddc1358a14f.jpg", + "iconName": "So Lux!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3030006", + "achieved": 1, + "unlocktime": 1646329394, + "name": "3030006", + "defaultvalue": 0, + "displayName": "Vendor on the Move", + "hidden": 0, + "description": "Find the wandering merchant", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5ce17081ca8ecff2076a49bf0fb67a565370637e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/3c12aeddd35c42b381c09a4ee9240c6665ba7b7c.jpg", + "iconName": "Vendor on the Move", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3030009", + "achieved": 1, + "unlocktime": 1646603382, + "name": "3030009", + "defaultvalue": 0, + "displayName": "Not All Who Wander Are Lost", + "hidden": 0, + "description": "Make an exchange with a Wandering Merchant", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c500dd5aa6056562a317c0dcb06767361298b83c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d6e0ada06bf6c9b19b97db9ca30cbd211159e521.jpg", + "iconName": "Not All Who Wander Are Lost", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3030013", + "achieved": 1, + "unlocktime": 1644522919, + "name": "3030013", + "defaultvalue": 0, + "displayName": "Inventory Clearance", + "hidden": 0, + "description": "Sell 100 items", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/64acbe8f322486c1d2e9368855bccac80296d526.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b70c25fd257cdf8ff3dd67c640e68970bad84be0.jpg", + "iconName": "Inventory Clearance", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3050000", + "achieved": 1, + "unlocktime": 1644518033, + "name": "3050000", + "defaultvalue": 0, + "displayName": "Scoring Sheet Music", + "hidden": 0, + "description": "Learn 3 pieces of sheet music", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/3204efed0f34075312b4dc7f0868b7406323f5be.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/01040dca2a7c5b20b60925abbb89c936de3f730a.jpg", + "iconName": "Scoring Sheet Music", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "3060000", + "achieved": 1, + "unlocktime": 1644522541, + "name": "3060000", + "defaultvalue": 0, + "displayName": "Master Jeweler", + "hidden": 0, + "description": "Successfully facet 5 times", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/fea2c24847e6d0e63a9d1ab03f39b3769f4ff418.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4252a42c0f04d37ab5b7751c1386f505b34b95cf.jpg", + "iconName": "Master Jeweler", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4010000", + "achieved": 1, + "unlocktime": 1646626138, + "name": "4010000", + "defaultvalue": 0, + "displayName": "Cold as the Ground", + "hidden": 0, + "description": "Resurrect after being dead for 4 minutes", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a584ae0907849c5df5560a2dc24bc4b7ad15d53b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ccb92bde7dfe10c3bbb2a850761d10646ff83256.jpg", + "iconName": "Cold as the Ground", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "6070001", + "achieved": 1, + "unlocktime": 1644437677, + "name": "6070001", + "defaultvalue": 0, + "displayName": "Something Buried", + "hidden": 0, + "description": "Obtain 5 treasure maps", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a6950683f8885a26523ebc0e4fae7aef24ba2a45.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/035089db02f8a978f39abb225860426ad50fe336.jpg", + "iconName": "Something Buried", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "8010001", + "achieved": 1, + "unlocktime": 1644419104, + "name": "8010001", + "defaultvalue": 0, + "displayName": "Card Collector", + "hidden": 0, + "description": "Put 5 cards in your catalog", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/176e73c8161e40c17d959419c31a91767dd3f2ec.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b12ad87fd8ddfa542f7d87539a9c0703e0764550.jpg", + "iconName": "Card Collector", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4030000", + "achieved": 1, + "unlocktime": 1647220959, + "name": "4030000", + "defaultvalue": 0, + "displayName": "I'm All You Need", + "hidden": 0, + "description": "Inflict at least 10,000 damage in a single battle", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2531db37277b34be59096ae1631ead87f2f3368b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/bf464239ce37089d2e3ed8a38a1520ad77341ff1.jpg", + "iconName": "I'm All You Need", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4030022", + "achieved": 1, + "unlocktime": 1647591797, + "name": "4030022", + "defaultvalue": 0, + "displayName": "Carnage", + "hidden": 0, + "description": "Win in Team Deathmatch by at least 10 more kills than your opponent", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5a61b680d9fccb3e9ee43afdb9f70cad2bc6b193.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/140c2c993329f9394b5725fb3c1aab83544adacf.jpg", + "iconName": "Carnage", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4040001", + "achieved": 1, + "unlocktime": 1644475748, + "name": "4040001", + "defaultvalue": 0, + "displayName": "Duel Victory", + "hidden": 0, + "description": "Win 1 duel", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2209168f8fd2f2035767fff52f37e4ed4189bf1a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/927a529611aad693942c3349e9c02ef3d6101d36.jpg", + "iconName": "Duel Victory", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "7010000", + "achieved": 1, + "unlocktime": 1644717773, + "name": "7010000", + "defaultvalue": 0, + "displayName": "Maiden voyage", + "hidden": 0, + "description": "Make your maiden voyage on the Sea of Gienna", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/759e4e1a773c05fc88e8bb34ecd0f45cf8f5bd1e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/6c0bb65697f27d2e4670b1e55f9c8b383d38cdf6.jpg", + "iconName": "Maiden voyage", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "7010001", + "achieved": 1, + "unlocktime": 1644718139, + "name": "7010001", + "defaultvalue": 0, + "displayName": "Docked", + "hidden": 0, + "description": "Enter a port", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/3379d6f4705d2197a9eb526382a889162cf436c6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/baf74cfdcf5a7ecbe5a27b17b27ba1c5370f3415.jpg", + "iconName": "Docked", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "7060000", + "achieved": 1, + "unlocktime": 1646099797, + "name": "7060000", + "defaultvalue": 0, + "displayName": "Stars across the Ocean", + "hidden": 0, + "description": "Find an island", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e6d7f82825cf9c1bbf80103c533c9b1eb96e8d77.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c57f8c76517cf184ace42eeeeff82989d23cd8d9.jpg", + "iconName": "Stars across the Ocean", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040005", + "achieved": 1, + "unlocktime": 1644347551, + "name": "1040005", + "defaultvalue": 0, + "displayName": "Priest Named Armen", + "hidden": 0, + "description": "Meet a companion on your quest to find the Ark", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/117150b6bfe956b253eb7e2dbcf8762f73034996.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/778f2be25a00d4f9f6f38ef133dd047e3e05eec5.jpg", + "iconName": "Priest Named Armen", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040011", + "achieved": 1, + "unlocktime": 1644438146, + "name": "1040011", + "defaultvalue": 0, + "displayName": "What Truly Shines", + "hidden": 0, + "description": "Complete Crown of Lakebar quest in West Luterra", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d539707db0a2e152129fede3f160a43735cebc55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ef74c7447082a17a2855c097b7f8a55fb73ff324.jpg", + "iconName": "What Truly Shines", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040014", + "achieved": 1, + "unlocktime": 1644477470, + "name": "1040014", + "defaultvalue": 0, + "displayName": "Reclaim the Throne", + "hidden": 0, + "description": "West Luterra: Stop Scherrit's plan", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a0f95ad2122f6e26e166d9f52313f04332d93c2b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/568fa97ad8b94be6d6919cb0e85603960804faad.jpg", + "iconName": "Reclaim the Throne", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040018", + "achieved": 1, + "unlocktime": 1644690491, + "name": "1040018", + "defaultvalue": 0, + "displayName": "Successor of Fate", + "hidden": 0, + "description": "Obtain your first Ark", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5e476ef8d81054b67ab359859612770cfd557e4f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e4a5619fdb84c26a0ad7666144410b7c5219e61f.jpg", + "iconName": "Successor of Fate", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040025", + "achieved": 1, + "unlocktime": 1644737774, + "name": "1040025", + "defaultvalue": 0, + "displayName": "Protected by the Last Giant", + "hidden": 0, + "description": "Complete Peace of Mind quest in Tortoyk", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/780588380b0c41837bb4835e311cf3d5e3fc73d7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e4883d1ee37f5d182f9967d4f52f539461abb344.jpg", + "iconName": "Protected by the Last Giant", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040028", + "achieved": 1, + "unlocktime": 1644778661, + "name": "1040028", + "defaultvalue": 0, + "displayName": "Clash of Tiger and Dragon - the First Sword of Changhun", + "hidden": 0, + "description": "Win the Anikka Tournament", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/912e405871707c908e55b534992d6c96f0540e29.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ae2d26861e8319ec6f2e7730035d60e4c0cdac82.jpg", + "iconName": "Clash of Tiger and Dragon - the First Sword of Changhun", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040033", + "achieved": 1, + "unlocktime": 1646017218, + "name": "1040033", + "defaultvalue": 0, + "displayName": "The Heart Keeps on Beating", + "hidden": 0, + "description": "Complete the Heart of Sceptrum quest in Arthetine", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65e94735399d701b4fcaa02dcfb8b64476d7f03d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b5e325c6e3b98d2b1e4220d2a8ac1eafb49fbe51.jpg", + "iconName": "The Heart Keeps on Beating", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040035", + "achieved": 1, + "unlocktime": 1646707454, + "name": "1040035", + "defaultvalue": 0, + "displayName": "Gorgon Slayer", + "hidden": 0, + "description": "Complete To the Nest quest in North Vern", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e30017275b0fb0e6af8f20cbf36d6c266892be47.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/f0480ac8db033ceeef401dbc745838d375648cfa.jpg", + "iconName": "Gorgon Slayer", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "1040040", + "achieved": 1, + "unlocktime": 1646115903, + "name": "1040040", + "defaultvalue": 0, + "displayName": "Hail, Daybreakers!", + "hidden": 0, + "description": "Kill Vrad", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2b5969e16012ef52c1228288dabbbd2fc8c011d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/40b04f1f9a9b31771e1d531ae145def7d77dffdc.jpg", + "iconName": "Hail, Daybreakers!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "4010011", + "achieved": 1, + "unlocktime": 1646112700, + "name": "4010011", + "defaultvalue": 0, + "displayName": "Rise Up", + "hidden": 0, + "description": "Attack an enemy while disguised as a prisoner", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5267a1449b1ca7229f5eccea7cb53845d83d26e7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d7ebf4f90ca0ae98da20458e0421ea9bfd1383bd.jpg", + "iconName": "Rise Up", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "2010008", + "achieved": 1, + "unlocktime": 1648317978, + "name": "2010008", + "defaultvalue": 0, + "displayName": "Fighting Spirit", + "hidden": 0, + "description": "Participate in a Guild PvP match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/9108169a77174c1a75047893e330ae30cb049400.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/fc5287f347891196df80bbe21603f8c30e0b8af8.jpg", + "iconName": "Fighting Spirit", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28" + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_winmatch2", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch2", + "defaultvalue": 0, + "displayName": "Sergeant", + "hidden": 0, + "description": "Win 10 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/b5ef9569fd4e0eebfd981d36345a2912efa42939.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/e289e5d222e3cffbc228f97561da3130e48bf3c8.jpg", + "iconName": "Sergeant", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_winmatch3", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch3", + "defaultvalue": 0, + "displayName": "Captain", + "hidden": 0, + "description": "Win 50 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/e76ea95e77a31434c2f0f4abfdf685e436ec7a2d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/59391fc3d5c2ab20fbfc37cc7da8067cda55a0d4.jpg", + "iconName": "Captain", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_winmatch4", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch4", + "defaultvalue": 0, + "displayName": "Colonel", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/af3524a273c3c7b675fbc5be7c7456888644d924.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/feae60a0d76af6079370f98da62d571088aa7531.jpg", + "iconName": "Colonel", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_finalshot1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_finalshot1", + "defaultvalue": 0, + "displayName": "Commendation", + "hidden": 0, + "description": "Perform 10 kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/24f2f369c28fecc8bb058fc187cc111ae4926b53.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/cf7336ffd0a2698f3d4ca7d55665c6621a91788b.jpg", + "iconName": "Commendation", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_finalshot2", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_finalshot2", + "defaultvalue": 0, + "displayName": "Stars and Stripes", + "hidden": 0, + "description": "Perform 100 kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/2e1b1ff0b61b6e949ebdd39edf560ba03374f4e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/b50df875085b7c49d008b2915eb24ca915aa3007.jpg", + "iconName": "Stars and Stripes", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_finalshot3", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_finalshot3", + "defaultvalue": 0, + "displayName": "Legion", + "hidden": 0, + "description": "Perform 500 kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/ae97f61820a96db2f05ff9b20a4070c0b4defd70.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/98ddcdab1962c5e166d3908a81f2bf4914ba3bb0.jpg", + "iconName": "Legion", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_finalshot4", + "achieved": 1, + "unlocktime": 1526707014, + "name": "mcvs_finalshot4", + "defaultvalue": 0, + "displayName": "Distinguished Service", + "hidden": 0, + "description": "Perform 2,000 kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/da91dd426754aa90725c19097568f74de138bbf5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/c0ad9fbcc8115b2095d00780d2b2fd65a3d061de.jpg", + "iconName": "Distinguished Service", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_finalshot5", + "achieved": 1, + "unlocktime": 1526707014, + "name": "mcvs_finalshot5", + "defaultvalue": 0, + "displayName": "Above and Beyond", + "hidden": 0, + "description": "Perform 5,000 kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/277ce2ecefb7e5a02b555bbd189f451768168d46.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/1d68f8bd8ee58fe46c72348b7efa7d45828bad0c.jpg", + "iconName": "Above and Beyond", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_opencrate1", + "achieved": 1, + "unlocktime": 1526706843, + "name": "mcvs_opencrate1", + "defaultvalue": 0, + "displayName": "Army Spoils", + "hidden": 0, + "description": "Open 5 Multiplayer Victory Crates", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/0e24047cdbd925ebfb4e7798b9ec4b7eed88dee9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/76fd06bf5a4fda13b6acddbb30db9c257f5cbaa3.jpg", + "iconName": "Army Spoils", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_reachbronze", + "achieved": 1, + "unlocktime": 1526706497, + "name": "mcvs_reachbronze", + "defaultvalue": 0, + "displayName": "Bronze League", + "hidden": 0, + "description": "Reach the BRONZE LEAGUE", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/5f64c60344fdf5feedb2a41180c002eae1b77a26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/adcd0e7f272990f561bdd6e1e2c5ab829f46def5.jpg", + "iconName": "Bronze League", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_reachsilver", + "achieved": 1, + "unlocktime": 1526709125, + "name": "mcvs_reachsilver", + "defaultvalue": 0, + "displayName": "Silver Star", + "hidden": 0, + "description": "Reach the SILVER LEAGUE", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/d2cb78974bae5614f3e3c17174d2f5b36d43aa18.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/956248eb2c201a5cb090d47e3b3d976f13a16b03.jpg", + "iconName": "Silver Star", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_reachgold", + "achieved": 1, + "unlocktime": 1526765809, + "name": "mcvs_reachgold", + "defaultvalue": 0, + "displayName": "Midas Deathtouch", + "hidden": 0, + "description": "Reach the GOLD LEAGUE", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/9c0caef24e468f6d8f3a9fe9db2d7bed5eaae5a6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/7f3ac5f3a68d4fa9c48c96df3aa15e05ebf8662c.jpg", + "iconName": "Midas Deathtouch", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "mcvs_winmatch5", + "achieved": 1, + "unlocktime": 1526707014, + "name": "mcvs_winmatch5", + "defaultvalue": 0, + "displayName": "General", + "hidden": 0, + "description": "Win 500 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/43b10939c0fe0c4e4198e0460e6fd56e36dcdddb.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/ec33c9fce5b4c290d15fb0c398df29400aa29326.jpg", + "iconName": "General", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83" + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" + }, + { + "apiname": "GOAL_ID_1228", + "achieved": 1, + "unlocktime": 1491925375, + "name": "GOAL_ID_1228", + "defaultvalue": 0, + "displayName": "Untouched", + "hidden": 0, + "description": "Win a match where the enemy team scored no points.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/23d85cdd0dbc93fc02dfc6cf245f844e622cda00.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/7274c95efe91ae9ae4741769911597193ab1a37f.jpg", + "iconName": "Untouched", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" + }, + { + "apiname": "GOAL_ID_1340", + "achieved": 1, + "unlocktime": 1491925375, + "name": "GOAL_ID_1340", + "defaultvalue": 0, + "displayName": "Counter-Air Defense", + "hidden": 0, + "description": "Kill a player in the air who is over 100 units above the ground.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/ad093dad4f891e11ade6e574eb7be2f100b8fcf6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/326f6443ed3d9368dc1379239d8971f961968902.jpg", + "iconName": "Counter-Air Defense", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" + }, + { + "apiname": "GOAL_ID_1250", + "achieved": 1, + "unlocktime": 1491926086, + "name": "GOAL_ID_1250", + "defaultvalue": 0, + "displayName": "Give 110 Percent", + "hidden": 0, + "description": "Get a killing blow after the round has ended.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/38b9d311fbfbd797b58ff59a039b6320b78e60ed.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8f6fd6d5208328b5f3244b780a57bfb506daea83.jpg", + "iconName": "Give 110 Percent", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" + }, + { + "apiname": "ACHIVE018", + "achieved": 1, + "unlocktime": 1541679189, + "name": "ACHIVE018", + "defaultvalue": 0, + "displayName": "Blood on My Hands", + "hidden": 0, + "description": "Kill a player by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/a8b5bd3a756e47bb3f75942d6eaab7a3a1125b81.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/662f4dd80856d1bb573ce8b94346eeb881baefde.jpg", + "iconName": "Blood on My Hands", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" + }, + { + "apiname": "ACHIVE020", + "achieved": 1, + "unlocktime": 1627627910, + "name": "ACHIVE020", + "defaultvalue": 0, + "displayName": "Killing Spree", + "hidden": 0, + "description": "Kill at least 4 players in a single match.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/3a0cf87d38da2bb779867cf8bded8ce452528772.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/c975abfb42cb55cd8f0e3004ed856e9e6a601a0b.jpg", + "iconName": "Killing Spree", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" + }, + { + "apiname": "ACHIVE034", + "achieved": 1, + "unlocktime": 1543643164, + "name": "ACHIVE034", + "defaultvalue": 0, + "displayName": "You Complete Me", + "hidden": 0, + "description": "Wear the outfit of a dead player.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/e736b97161e2fa32552ef09f283acfed7c545967.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/2d4b0c3b0a1cef007e3b987e7778416ee4ba4e0b.jpg", + "iconName": "You Complete Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" + }, + { + "apiname": "ACHIVE036", + "achieved": 1, + "unlocktime": 1543643503, + "name": "ACHIVE036", + "defaultvalue": 0, + "displayName": "Health Junkie", + "hidden": 0, + "description": "Charge your boost gauge to the max with energy drink and painkiller overdose.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/b3dcc43eb2b404f201972b863a606947dcb8151e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/8ea390d35efb34ea5188edc697eb99ca9a3cd411.jpg", + "iconName": "Health Junkie", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c" + }, + { + "apiname": "qc_first_taste", + "achieved": 1, + "unlocktime": 1541363947, + "name": "qc_first_taste", + "defaultvalue": 0, + "displayName": "First Taste", + "hidden": 0, + "description": "Complete 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/e8d503bd102c93cc1ce20c19a9b508c8f83f745d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/43d3fcbef6319cc2a58b8d2b9ab82d16bf4ffdeb.jpg", + "iconName": "First Taste", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c" + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_2", + "achieved": 1, + "unlocktime": 1548558374, + "name": "NEW_ACHIEVEMENT_1_2", + "defaultvalue": 0, + "displayName": "Path to the Goddess", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/a5d811701a15e70663870ba8090ba3edd839c2db.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/344901183389ff857a45107de3db2392a78c54df.jpg", + "iconName": "Path to the Goddess", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_10", + "achieved": 1, + "unlocktime": 1548552154, + "name": "NEW_ACHIEVEMENT_1_10", + "defaultvalue": 0, + "displayName": "The Basics of Survival", + "hidden": 0, + "description": "Combine two items together.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/d2d4e533f6e7a3cfb8542de5861ff63a60ca7bb6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/bfd40eddd6e65342e2e6dc4f6e2560c7da82bf93.jpg", + "iconName": "The Basics of Survival", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_11", + "achieved": 1, + "unlocktime": 1548554021, + "name": "NEW_ACHIEVEMENT_1_11", + "defaultvalue": 0, + "displayName": "Hip to Add Squares", + "hidden": 0, + "description": "Increase your inventory slots.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/bdfb992554bb57f830f2e43e26abd3d12f9446b7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/349f8fda66b0c0da8408af3217349175694c6701.jpg", + "iconName": "Hip to Add Squares", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_12", + "achieved": 1, + "unlocktime": 1548553367, + "name": "NEW_ACHIEVEMENT_1_12", + "defaultvalue": 0, + "displayName": "Customizer", + "hidden": 0, + "description": "Customize a weapon.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/7d9dc81dd117b596a8ec59ea4effd8b3f2e513b0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/ac81d1aac560967fa91f6ecde8c6bb642481ca4f.jpg", + "iconName": "Customizer", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_13", + "achieved": 1, + "unlocktime": 1548552676, + "name": "NEW_ACHIEVEMENT_1_13", + "defaultvalue": 0, + "displayName": "Don't Need No Stinkin' Gun", + "hidden": 0, + "description": "Defeat an enemy with a knife.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/7468ff9d6c6df2343d3d0b8f8c3344520c98d97c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/5109ef152d19b00fa88fbeb388b4e8f7580330d7.jpg", + "iconName": "Don't Need No Stinkin' Gun", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_14", + "achieved": 1, + "unlocktime": 1548552900, + "name": "NEW_ACHIEVEMENT_1_14", + "defaultvalue": 0, + "displayName": "Eat This!", + "hidden": 0, + "description": "Counterattack with a sub-weapon.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/bbd4b9a77110bb46a086094efd26e0f1ba264b35.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/097e7946db247778282a711f9a57d3425f9c0b7e.jpg", + "iconName": "Eat This!", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_15", + "achieved": 1, + "unlocktime": 1548553251, + "name": "NEW_ACHIEVEMENT_1_15", + "defaultvalue": 0, + "displayName": "That'll Hold 'Em", + "hidden": 0, + "description": "Use Wooden Boards to board up a window.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/d7570d2b0804260afde59a5e004b1ab94dcb711f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/00656d288d73778ddebd815daae2788afed1d492.jpg", + "iconName": "That'll Hold 'Em", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_16", + "achieved": 1, + "unlocktime": 1548562574, + "name": "NEW_ACHIEVEMENT_1_16", + "defaultvalue": 0, + "displayName": "Vermin Extermination", + "hidden": 0, + "description": "Destroy a Mr. Raccoon.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/548c76314fd3d707f1ca32857115eec89d4e4c90.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/66adfa87b4ffbcd3f4d6a6a425399d9f08545e15.jpg", + "iconName": "Vermin Extermination", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_17", + "achieved": 1, + "unlocktime": 1548553732, + "name": "NEW_ACHIEVEMENT_1_17", + "defaultvalue": 0, + "displayName": "A Vault-like Mind", + "hidden": 0, + "description": "Open a portable safe.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/ded65e5f81af37b77079efc0f8ec2f44be2082c2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/a0c881a8a273caa266584ebc3975489731240066.jpg", + "iconName": "A Vault-like Mind", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_18", + "achieved": 1, + "unlocktime": 1548552798, + "name": "NEW_ACHIEVEMENT_1_18", + "defaultvalue": 0, + "displayName": "First Break-In", + "hidden": 0, + "description": "Open a dial safe.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/be77cb4504a04bf791bca1d7c3582467cdd3f406.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/18e5df7c9912c633d8924b3715f96e60fdc32686.jpg", + "iconName": "First Break-In", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_19", + "achieved": 1, + "unlocktime": 1561562619, + "name": "NEW_ACHIEVEMENT_1_19", + "defaultvalue": 0, + "displayName": "Bon Appétit", + "hidden": 0, + "description": "Shoot the grenade you fed to an enemy.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/c731f2e9235b77b2ec34f5e4fc885b3ee7f716c2.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/1ff1d42c3309c53047a08350ed5ad23916e994d1.jpg", + "iconName": "Bon Appétit", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1547246271, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "10 minutes played", + "hidden": 0, + "description": "10 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/fd750f79e4365f8275e4f0ca480552f143ccc379.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/676e3da70fa8b19dc23adbb392e209ca65563a79.jpg", + "iconName": "10 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_2", + "achieved": 1, + "unlocktime": 1547246571, + "name": "NEW_ACHIEVEMENT_1_2", + "defaultvalue": 0, + "displayName": "15 minutes played", + "hidden": 0, + "description": "15 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7e89eed05d67542b89304c208d48f984bdcb4a63.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/6f00679acbe83ce61ffe8f3a36e847f678e17ec5.jpg", + "iconName": "15 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_3", + "achieved": 1, + "unlocktime": 1547246871, + "name": "NEW_ACHIEVEMENT_1_3", + "defaultvalue": 0, + "displayName": "20 minutes played", + "hidden": 0, + "description": "20 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/d5c1138234abefb3b8a6edb4c1a935e73ef3bf97.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/caf7e318f2cad785736eae68ac9f3bfcbc89d704.jpg", + "iconName": "20 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_4", + "achieved": 1, + "unlocktime": 1547247171, + "name": "NEW_ACHIEVEMENT_1_4", + "defaultvalue": 0, + "displayName": "25 minutes played", + "hidden": 0, + "description": "25 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/a0587557b709a95236dd63ed57d8a5f52e80ac06.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/9345574bdb50678536fee70281f50b34e4c02d03.jpg", + "iconName": "25 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" + }, + { + "apiname": "NEW_ACHIEVEMENT_1_5", + "achieved": 1, + "unlocktime": 1547247471, + "name": "NEW_ACHIEVEMENT_1_5", + "defaultvalue": 0, + "displayName": "30 minutes played", + "hidden": 0, + "description": "30 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/dc98510f759230b836c1d7ebbec502f1814b2c3d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/d7506d76dc9ed6b8dcb5df6f15879138faccc7f0.jpg", + "iconName": "30 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "2", + "achieved": 1, + "unlocktime": 1620406122, + "name": "2", + "defaultvalue": 0, + "displayName": "Four Lords", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/861c475a6195deaef2ea39be24c1cc691d027ece.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/77af01750896351615749300261533c376cb8247.jpg", + "iconName": "Four Lords", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "3", + "achieved": 1, + "unlocktime": 1620416716, + "name": "3", + "defaultvalue": 0, + "displayName": "That Sucked!", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/7fb0ee27e9f91c419488b1474638ef459674ea56.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/faa9972fca0e8068acb42b895a1c78e97dd9f91c.jpg", + "iconName": "That Sucked!", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "4", + "achieved": 1, + "unlocktime": 1620427187, + "name": "4", + "defaultvalue": 0, + "displayName": "Got No Strings", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/3ae1681f0157984b3e1a22bc8f6ae12ed34542f5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0010b1220db8840558616cd7ce4a7acfd5a3602f.jpg", + "iconName": "Got No Strings", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "5", + "achieved": 1, + "unlocktime": 1620432625, + "name": "5", + "defaultvalue": 0, + "displayName": "Fish Out of Water", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ffa2426fc1a2917a430e15b4aa5a9ba1349d7d28.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ce1b16ebd8d323b36cae719c19178bcc551bb825.jpg", + "iconName": "Fish Out of Water", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "6", + "achieved": 1, + "unlocktime": 1620582847, + "name": "6", + "defaultvalue": 0, + "displayName": "Up Urs!", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/86555f104c68140c13f13a9caa4d189f877b250f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/b737b1741920b0634adc438c93e8c13d84f2803e.jpg", + "iconName": "Up Urs!", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "7", + "achieved": 1, + "unlocktime": 1620583438, + "name": "7", + "defaultvalue": 0, + "displayName": "Temporary Measures", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/2d2a1ea487ee5a326aabf345530ebf7e2df9f743.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/8eb45c9178ace6bf4f4e6e3f002227d7ce4d8882.jpg", + "iconName": "Temporary Measures", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "8", + "achieved": 1, + "unlocktime": 1620591709, + "name": "8", + "defaultvalue": 0, + "displayName": "Iron Giant Down", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/c861009d6166f43601a497d58d963fea9387b726.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/034cead1e5c710d54ca9c62d331295e26d0792a8.jpg", + "iconName": "Iron Giant Down", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "9", + "achieved": 1, + "unlocktime": 1620592508, + "name": "9", + "defaultvalue": 0, + "displayName": "The Root of the Matter", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/87c40d74ffdc0c90f1245b17ab955b5ff54b4687.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0bca31fd2955786daec415b6e7205821eb2f6fa3.jpg", + "iconName": "The Root of the Matter", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "10", + "achieved": 1, + "unlocktime": 1620595894, + "name": "10", + "defaultvalue": 0, + "displayName": "Great Dad", + "hidden": 0, + "description": "Finish the story on at least Casual difficulty.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/f55383e473949217b007915db9a26f4d152b0358.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/14ea12e7a1ec9b2fafd130e8c37705a5971c0f95.jpg", + "iconName": "Great Dad", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "11", + "achieved": 1, + "unlocktime": 1620595895, + "name": "11", + "defaultvalue": 0, + "displayName": "Best Dad Ever", + "hidden": 0, + "description": "Finish the story on at least Standard difficulty.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/045fae28c36e04b092e52f527b3f14a9ec373d27.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/f450203ae7d6269858ca566603a90a6b9a7384a1.jpg", + "iconName": "Best Dad Ever", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "14", + "achieved": 1, + "unlocktime": 1620403938, + "name": "14", + "defaultvalue": 0, + "displayName": "Crafter", + "hidden": 0, + "description": "Craft an item in the Crafting menu.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/d50d359b3c82008cffc0ec67c5bfd93d5e8ecfe9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/269d67fcec14745d4be01f8a0a35cced0c976c62.jpg", + "iconName": "Crafter", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "15", + "achieved": 1, + "unlocktime": 1620406348, + "name": "15", + "defaultvalue": 0, + "displayName": "Patron", + "hidden": 0, + "description": "Purchase something from the Duke in the story.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/9f2965c22ea8f0605c9da8b8c82e8c4913542d1c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ea7abf273b64c777875a072c3faaa53f7e45da24.jpg", + "iconName": "Patron", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "16", + "achieved": 1, + "unlocktime": 1620406894, + "name": "16", + "defaultvalue": 0, + "displayName": "Petty Thief", + "hidden": 0, + "description": "Unlock a simple lock with a lockpick.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/6cb2bba6afef0e6d4765e5dd44b61a18bc3a0543.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/7a1959268c41aa5b128bedf28689c6f77532c544.jpg", + "iconName": "Petty Thief", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "17", + "achieved": 1, + "unlocktime": 1620427187, + "name": "17", + "defaultvalue": 0, + "displayName": "Repairer", + "hidden": 0, + "description": "Combine a treasure into its complete form.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/9a413a8d24fa16caddfba507eeca00d9e7d52e07.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/58eff0d2972d225255224accb7404227dd8f919c.jpg", + "iconName": "Repairer", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "18", + "achieved": 1, + "unlocktime": 1620417035, + "name": "18", + "defaultvalue": 0, + "displayName": "Hunter", + "hidden": 0, + "description": "Hunt an animal during the story.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/29d2dedac95a882a0ce3716315154d6f78b79a44.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/e2cd66303551b2f351c648150b4c6395853a0e37.jpg", + "iconName": "Hunter", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "19", + "achieved": 1, + "unlocktime": 1620413378, + "name": "19", + "defaultvalue": 0, + "displayName": "Get the Ball Rolling", + "hidden": 0, + "description": "Solve a Labyrinth.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0db0c99cd2615c88e9a8b23c864e9db07442aa97.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/37bbf9524e947355bf91826a09e4db3008593e07.jpg", + "iconName": "Get the Ball Rolling", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "25", + "achieved": 1, + "unlocktime": 1620437650, + "name": "25", + "defaultvalue": 0, + "displayName": "Push Comes to Shove", + "hidden": 0, + "description": "Push away an enemy after guarding in the story.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/e4f1bdc9264b0033f5327b8fbbc1e121d9c6fb53.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/3251b40175801b204549acdb1f36646974d89ba0.jpg", + "iconName": "Push Comes to Shove", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "26", + "achieved": 1, + "unlocktime": 1620433200, + "name": "26", + "defaultvalue": 0, + "displayName": "Trick Shot", + "hidden": 0, + "description": "Defeat an enemy from long range with the sniper rifle in the story.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/15c742441280690ad5566687bebe3cb00795221b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/a461ad8d1733923f8a525e7af2836fc7477ff246.jpg", + "iconName": "Trick Shot", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "27", + "achieved": 1, + "unlocktime": 1620403778, + "name": "27", + "defaultvalue": 0, + "displayName": "Strategist", + "hidden": 0, + "description": "Defeat at least three enemies with one attack in the story.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/96a5bba0bfe330484a169a5f3e8eda4d4f932b7c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/dce1e948b4b2b53bba3837e9a439c31184828c26.jpg", + "iconName": "Strategist", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "28", + "achieved": 1, + "unlocktime": 1620436532, + "name": "28", + "defaultvalue": 0, + "displayName": "Medium Rare", + "hidden": 0, + "description": "Set fire to a Moroaică in the story.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/e7ea26c4606216f8ca9faf69b3842a5b134bd411.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/2272aae75a00972dc38ac0dbdb312af3e0b211fc.jpg", + "iconName": "Medium Rare", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "34", + "achieved": 1, + "unlocktime": 1620591709, + "name": "34", + "defaultvalue": 0, + "displayName": "Mapmatician", + "hidden": 0, + "description": "Complete the village map.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/d6ef77996e743362dc77cf44f938d0872473d7a5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ae8f35770222900ab5ab8e00a50c221cbc785978.jpg", + "iconName": "Mapmatician", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "35", + "achieved": 1, + "unlocktime": 1620404270, + "name": "35", + "defaultvalue": 0, + "displayName": "Cynic", + "hidden": 0, + "description": "Destroy a Goat of Warding.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/41b7c178aa485f0c0bb696db24650460e40d7265.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/16bd8cd23d6fe38f0cd95875d6ee9ffe69a24d44.jpg", + "iconName": "Cynic", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "37", + "achieved": 1, + "unlocktime": 1620407832, + "name": "37", + "defaultvalue": 0, + "displayName": "Gunsmith", + "hidden": 0, + "description": "Equip a gun with a customizable part.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/80ca8e0fa323d3c3cef0c30ef1df047c167fa8d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/1bf2bde31cae6247a9217c6772c35d1e6ac5c6c5.jpg", + "iconName": "Gunsmith", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_03", + "achieved": 1, + "unlocktime": 1627495065, + "name": "Goal_ID_03", + "defaultvalue": 0, + "displayName": "Ambush", + "hidden": 0, + "description": "Down an enemy without taking return damage", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/2537a3aea1f44577ea0fb19d9e6bf5d111722910.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/13731a74e0642b698e08ffba8acd622d23b7cd7e.jpg", + "iconName": "Ambush", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_04", + "achieved": 1, + "unlocktime": 1627495236, + "name": "Goal_ID_04", + "defaultvalue": 0, + "displayName": "Decimated", + "hidden": 0, + "description": "Down 10 enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/1fca082170f9fcd39dd0790f064357153e865037.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/c7b909fd6e3ce0aeee6a257f161c648bac9b1888.jpg", + "iconName": "Decimated", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_06", + "achieved": 1, + "unlocktime": 1627495099, + "name": "Goal_ID_06", + "defaultvalue": 0, + "displayName": "Fours A Party", + "hidden": 0, + "description": "Down 4 enemies in one round", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/05909f510329d353c80e45604c697e6c4337ec17.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/c9b2b463f1a99659e9f9effbbb2d5c26ee32d722.jpg", + "iconName": "Fours A Party", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_07", + "achieved": 1, + "unlocktime": 1627495510, + "name": "Goal_ID_07", + "defaultvalue": 0, + "displayName": "Good Company", + "hidden": 0, + "description": "Win 8 matches with 8 different Rogues", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/349a945e83211ab4f900fbb7e76de3ee30e9a6d8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/f479958824cff1ccf4aadfa562415fb76c5023da.jpg", + "iconName": "Good Company", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_08", + "achieved": 1, + "unlocktime": 1627497665, + "name": "Goal_ID_08", + "defaultvalue": 0, + "displayName": "Grenadier", + "hidden": 0, + "description": "Deal 1,000 damage with gadgets", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/d7cc5b1cf837ec62d781f5c91a45f289d6c27666.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/ec956e508be3357146222bd876e6685a4fdf0887.jpg", + "iconName": "Grenadier", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_09", + "achieved": 1, + "unlocktime": 1627495196, + "name": "Goal_ID_09", + "defaultvalue": 0, + "displayName": "Gunsmith", + "hidden": 0, + "description": "Fully upgrade a primary weapon", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/d4c2144a6dbfe0d6ead5c31daf45d2e2b9b1415b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/eff0bbd2a8967378588d02f3a0e5eead854b5c18.jpg", + "iconName": "Gunsmith", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_10", + "achieved": 1, + "unlocktime": 1627495291, + "name": "Goal_ID_10", + "defaultvalue": 0, + "displayName": "Hard Carry", + "hidden": 0, + "description": "Down 20 enemies in a single match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/9b4366a8dbff385788e9a68c05ef3926f0840774.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/184f3adb69fefbbc9a14e19a1a931136e491be73.jpg", + "iconName": "Hard Carry", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_11", + "achieved": 1, + "unlocktime": 1627495508, + "name": "Goal_ID_11", + "defaultvalue": 0, + "displayName": "Headhunter", + "hidden": 0, + "description": "Deal a total of 10,000 damage to players via headshots", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/eb081a1dfc451ba1baf60b5b9de52bbe7309c9ab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/38c7db8972b2251b3996473952ca8bea79c70f5d.jpg", + "iconName": "Headhunter", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_12", + "achieved": 1, + "unlocktime": 1627496800, + "name": "Goal_ID_12", + "defaultvalue": 0, + "displayName": "Moneybags", + "hidden": 0, + "description": "Accrue a total of $70,000 in a single match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/8fc23a807ccc70afeec326817fee2adbda22e163.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/1ec0e7313eaedcea3b107891e197ced272d1b63f.jpg", + "iconName": "Moneybags", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_13", + "achieved": 1, + "unlocktime": 1627496673, + "name": "Goal_ID_13", + "defaultvalue": 0, + "displayName": "No Respect", + "hidden": 0, + "description": "Down an enemy with a gadget while looking away from them", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/697a2b1f4b53cda3de765a347410886de0265762.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/db2f6ac3c9e471bc6f86b5d5cf5b6b2bb9a8c4d1.jpg", + "iconName": "No Respect", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_14", + "achieved": 1, + "unlocktime": 1627495157, + "name": "Goal_ID_14", + "defaultvalue": 0, + "displayName": "Not Even Close", + "hidden": 0, + "description": "Down an enemy while you have less than 10% health", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/b5a55863f9e8943d73f599e620d235df5d108dd3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/d1cbe0024e290f9832f198bf12c4cfa4b03af132.jpg", + "iconName": "Not Even Close", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_15", + "achieved": 1, + "unlocktime": 1627495331, + "name": "Goal_ID_15", + "defaultvalue": 0, + "displayName": "Perky", + "hidden": 0, + "description": "Purchase 3 perks in a single match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/ddb0f1c7a1cc18030c891fc9bde9a6ccdac8ea09.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/bf28dc2170af50db68407ddc74bdbb2a2d36e2f7.jpg", + "iconName": "Perky", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_16", + "achieved": 1, + "unlocktime": 1627497994, + "name": "Goal_ID_16", + "defaultvalue": 0, + "displayName": "Scavenger", + "hidden": 0, + "description": "Pick up another player's weapon and down an enemy with it", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/b16ed3c5a35537af3f112174bdf2eccc943fc31a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/e8cf82421fbf1c05c1e30b7856d5edc91dc2eaf7.jpg", + "iconName": "Scavenger", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_18", + "achieved": 1, + "unlocktime": 1627494903, + "name": "Goal_ID_18", + "defaultvalue": 0, + "displayName": "Unflappable", + "hidden": 0, + "description": "Complete the tutorial", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/5db47e59c558e227d241acee0b8cf0602842bc87.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/187a45735f19a15c017d82e010ffc66265bff1c6.jpg", + "iconName": "Unflappable", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "Goal_ID_19", + "achieved": 1, + "unlocktime": 1627495932, + "name": "Goal_ID_19", + "defaultvalue": 0, + "displayName": "Zeal", + "hidden": 0, + "description": "Down an enemy with a melee weapon", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/8f2eca4543cd9018c5517276749dbb1d68af900e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/7473b10d3732e86dc8b967a09d7f56ac13a9bc94.jpg", + "iconName": "Zeal", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "6", + "achieved": 1, + "unlocktime": 1629999830, + "name": "6", + "defaultvalue": 0, + "displayName": "Killing Spree", + "hidden": 0, + "description": "Get 5 kills without dying", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/a24c9bfaec4b8df31f2917799891b427d83bb289.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7e8cc370d7ac48ffad34cbd0357bbbbe4efbf872.jpg", + "iconName": "Killing Spree", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "7", + "achieved": 1, + "unlocktime": 1629999831, + "name": "7", + "defaultvalue": 0, + "displayName": "Killection Agency", + "hidden": 0, + "description": "Get 10 kills without dying", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/9d09fb1bd7f4ab48003bfe17f72da95aeb99fe89.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/dea4096c9de3ab14c7152fd6eae5ed976f258c41.jpg", + "iconName": "Killection Agency", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "8", + "achieved": 1, + "unlocktime": 1630000503, + "name": "8", + "defaultvalue": 0, + "displayName": "Fragtastic", + "hidden": 0, + "description": "Get 15 kills without dying", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/758d4667d5f0f01feee73d6af6697c6104af8cab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/5ec0637b76d1fbb0a1c953acdafd4ffabb673168.jpg", + "iconName": "Fragtastic", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "10", + "achieved": 1, + "unlocktime": 1630083670, + "name": "10", + "defaultvalue": 0, + "displayName": "Back-2-Back", + "hidden": 0, + "description": "Get 25 double kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/623bc779040f3523a25a191b58676ce16bdb88fe.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/398317407c61ee6b99011c74a37ce9982bdf8768.jpg", + "iconName": "Back-2-Back", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "12", + "achieved": 1, + "unlocktime": 1630000503, + "name": "12", + "defaultvalue": 0, + "displayName": "Unstoppable", + "hidden": 0, + "description": "Get a quad kill", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/f8e0e3e14b73d1c1d0e55a40b69aee00a1515cbd.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/bb0ac50b85d6e4cc45f0d3617505722a41fda191.jpg", + "iconName": "Unstoppable", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "13", + "achieved": 1, + "unlocktime": 1630002714, + "name": "13", + "defaultvalue": 0, + "displayName": "Headhunter", + "hidden": 0, + "description": "Get 50 headshot kills", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/427a9145b60a886f6742220bf8b43d1bdbe9f990.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/250169ae1c59fb5f939d3390353b157d44ec18d0.jpg", + "iconName": "Headhunter", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "23", + "achieved": 1, + "unlocktime": 1630001683, + "name": "23", + "defaultvalue": 0, + "displayName": "Dangerous", + "hidden": 0, + "description": "Deal 10,000 damage to enemies", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/f249c0d98a1950902ac35403f4c03bfcc595271e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/00c6384960d4795511f2b8fde6e55879af3967b8.jpg", + "iconName": "Dangerous", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_2", + "achieved": 1, + "unlocktime": 1686452108, + "name": "ACHIEVEMENT_2", + "defaultvalue": 0, + "displayName": "So This Is the Battle Hub...", + "hidden": 0, + "description": "Ah, yes. Welcome to the Battle Hub. I do not know what you seek, but please, enjoy yourself. That is the purpose for which it was built, after all.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/d8556a8160da2bf0d8607032d89963875b208ee3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/fa5c374d64de2ca412030af77861b5d789347703.jpg", + "iconName": "So This Is the Battle Hub...", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_3", + "achieved": 1, + "unlocktime": 1686452312, + "name": "ACHIEVEMENT_3", + "defaultvalue": 0, + "displayName": "First Encounters", + "hidden": 0, + "description": "Start by fighting a match in the Battle Hub. It doesn't matter if you win or lose. What matters is challenging yourself to take that first step.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/198f78e507e128a30bed781a6d46a806d3914c67.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b414161e1112dad8ea85595108284c1eb509f239.jpg", + "iconName": "First Encounters", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_27", + "achieved": 1, + "unlocktime": 1686447740, + "name": "ACHIEVEMENT_27", + "defaultvalue": 0, + "displayName": "My Title, My Life", + "hidden": 0, + "description": "Earned any titles for your efforts yet? Me? Pfft. I don't need a title. I'm Jamie freakin' Siu!", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/0ea31f649ed4db04e0869390fc8038e936e40944.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/1168dfdea4b8024cc6b2b80e07aea91c3a74c82e.jpg", + "iconName": "My Title, My Life", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_29", + "achieved": 1, + "unlocktime": 1686450886, + "name": "ACHIEVEMENT_29", + "defaultvalue": 0, + "displayName": "Fashion Leader", + "hidden": 0, + "description": "Clothing allows us to express ourselves. Know who else never changes their clothes? Animals. Change your outfit. Please.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/af2277a63fb0aa795e60a480a42a321e280c7a89.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b8d4ee0fb8ec12de6be3960b93396d2c308e4652.jpg", + "iconName": "Fashion Leader", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_35", + "achieved": 1, + "unlocktime": 1686447766, + "name": "ACHIEVEMENT_35", + "defaultvalue": 0, + "displayName": "Leaving the Nest", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/e846657465466eb560951885e9c9547d824d7ac4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/5ee7b1e3ed7d5d81e49ab39580250db9887cc421.jpg", + "iconName": "Leaving the Nest", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_37", + "achieved": 1, + "unlocktime": 1686451886, + "name": "ACHIEVEMENT_37", + "defaultvalue": 0, + "displayName": "Actions Speak Louder", + "hidden": 0, + "description": "Something in the way while you're walking through the city? Here's an easy solution: send it flyin' with a Master Action! Mm-mm-mmm... It's the little pleasures in life.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/0e4febd01f1ff012703d1e2cae4e43a3582220f8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b3b7a085bc66bc2a3c9778bcd2f5b6d088e647d6.jpg", + "iconName": "Actions Speak Louder", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACHIEVEMENT_43", + "achieved": 1, + "unlocktime": 1686447025, + "name": "ACHIEVEMENT_43", + "defaultvalue": 0, + "displayName": "Taking Initiative", + "hidden": 0, + "description": "You want to learn street fighting fundamentals? Well, too bad, 'cause I'm not in the mood to take on any students. Go hit the Tutorials, kid.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/7f8428ebba5ef2a6df4d90d1029a905ad7434a0d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/8ddac428e518864687c3cc158d4a45962dd97c55.jpg", + "iconName": "Taking Initiative", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60" + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_32", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_32", + "defaultvalue": 0, + "displayName": "Nestegg", + "hidden": 0, + "description": "Earn 10,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/eb100688bff0270ab51577d5f5bdbd17d687e992.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/8fd80ada476f4fbc782db2899949f58959f0c314.jpg", + "iconName": "Nestegg", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_33", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_33", + "defaultvalue": 0, + "displayName": "Where Credit is Due", + "hidden": 0, + "description": "Earn 100,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/2dde0edbe3354f9f2ce4bbadd7224a1dec83820b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a9119c2673ae99ab0ac0175d544642cf9a9d605e.jpg", + "iconName": "Where Credit is Due", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_34", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_34", + "defaultvalue": 0, + "displayName": "Money is Power", + "hidden": 0, + "description": "Earn 1,000,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a2ff3eb728bd34edc087c26108e8a91e22dd8f16.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/06980a7f80a695414e7b210fd7d04635f51e6b95.jpg", + "iconName": "Money is Power", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_49", + "achieved": 1, + "unlocktime": 1541874712, + "name": "ACHIEVEMENT_49", + "defaultvalue": 0, + "displayName": "The Right Tool for the Job", + "hidden": 0, + "description": "Obtain 5 Warframes.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5fe2f929ae00f0f1e4ac1723838d20b2d5a35f18.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/74bbb9f5b621744900678c421bac3d1b208bdf64.jpg", + "iconName": "The Right Tool for the Job", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_57", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_57", + "defaultvalue": 0, + "displayName": "Hooked", + "hidden": 0, + "description": "Play for 2 hours.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/16558dc785148d1a08f2ba2b57d4d5981f0a81ea.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/cb5f24ccff2aa473cdcbccda068e8359257b4040.jpg", + "iconName": "Hooked", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_58", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_58", + "defaultvalue": 0, + "displayName": "It Keeps Getting Better", + "hidden": 0, + "description": "Play for 10 hours.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/1ce369cff21de3a90f1ed2427b7b8fd6421ac01c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/0e5b24709ca6fe1dfbe7747a1f82967f1c1404d6.jpg", + "iconName": "It Keeps Getting Better", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_60", + "achieved": 1, + "unlocktime": 1541874660, + "name": "ACHIEVEMENT_60", + "defaultvalue": 0, + "displayName": "Initiate", + "hidden": 0, + "description": "Achieve the rank of Initiate.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5696dd384e9386b601425a9415130a71fc8f59ac.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c4e2d3366a6e58ee17b0e3414f45c101f74f2ed7.jpg", + "iconName": "Initiate", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_61", + "achieved": 1, + "unlocktime": 1541874660, + "name": "ACHIEVEMENT_61", + "defaultvalue": 0, + "displayName": "Silver Initiate", + "hidden": 0, + "description": "Achieve the rank of Silver Initiate.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/ffa4d2f0a2609f81174e29e2df438e952bff8dd8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/05da5b280021b8f8bb247e9af5067c58443bacc5.jpg", + "iconName": "Silver Initiate", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_62", + "achieved": 1, + "unlocktime": 1541874660, + "name": "ACHIEVEMENT_62", + "defaultvalue": 0, + "displayName": "Gold Initiate", + "hidden": 0, + "description": "Achieve the rank of Gold Initiate.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/da619d561c76e3cc8c12481d6fcbd282ed72ea66.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/1c9a09b4278199d3786d6334b53b9c6736f264d1.jpg", + "iconName": "Gold Initiate", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_63", + "achieved": 1, + "unlocktime": 1541874660, + "name": "ACHIEVEMENT_63", + "defaultvalue": 0, + "displayName": "Novice", + "hidden": 0, + "description": "Achieve the rank of Novice.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/e2a56659b5f67082b98f38cbc4d814b698d8581a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5a72810746ce6a5c72818a659727e7c7b362b2bc.jpg", + "iconName": "Novice", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_64", + "achieved": 1, + "unlocktime": 1541874660, + "name": "ACHIEVEMENT_64", + "defaultvalue": 0, + "displayName": "Silver Novice", + "hidden": 0, + "description": "Achieve the rank of Silver Novice.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/b7e1d5adf78fad96993cf32ad821dd7ba7afa67a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/d83fcd3be717ad44b77678a3af5124a360414bf2.jpg", + "iconName": "Silver Novice", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_96", + "achieved": 1, + "unlocktime": 1484635851, + "name": "ACHIEVEMENT_96", + "defaultvalue": 0, + "displayName": "All for One", + "hidden": 0, + "description": "Revive an ally.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5eaab8e4ee04a7220b6910cb5ef7e8f0d99a7762.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/101512a6dfc625df8e6c8c4eb03ca5a683885874.jpg", + "iconName": "All for One", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_97", + "achieved": 1, + "unlocktime": 1484635852, + "name": "ACHIEVEMENT_97", + "defaultvalue": 0, + "displayName": "Healer", + "hidden": 0, + "description": "Revive 10 allies.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5e63c962d05ccc6de4ed183c30ff702ade0b7053.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/8df79404201badd3bf305fb9174cd075223130c6.jpg", + "iconName": "Healer", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_98", + "achieved": 1, + "unlocktime": 1484635852, + "name": "ACHIEVEMENT_98", + "defaultvalue": 0, + "displayName": "Field Medic", + "hidden": 0, + "description": "Revive 100 allies.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/ab9d8ceb5f17f1329d50c00180fd5d49e739df21.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c4ec60546e1fe4096d69cc547f46bd8bb6647bcf.jpg", + "iconName": "Field Medic", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_126", + "achieved": 1, + "unlocktime": 1484635852, + "name": "ACHIEVEMENT_126", + "defaultvalue": 0, + "displayName": "Agent", + "hidden": 0, + "description": "Solve a Cipher.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/226b26ce53d72d00fe20f60c8860e0d1ba7687c8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/fa11850aa54af2e6ff4a23382c47272052e252ad.jpg", + "iconName": "Agent", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_127", + "achieved": 1, + "unlocktime": 1484635852, + "name": "ACHIEVEMENT_127", + "defaultvalue": 0, + "displayName": "Special Agent", + "hidden": 0, + "description": "Solve 10 Ciphers.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/d8882c2a0acd8ea3ffc11cd7441044f67344f054.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/d8380dd94482c256d53b1bd766ddffd3cb5ccfb7.jpg", + "iconName": "Special Agent", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACHIEVEMENT_128", + "achieved": 1, + "unlocktime": 1484635852, + "name": "ACHIEVEMENT_128", + "defaultvalue": 0, + "displayName": "Operative", + "hidden": 0, + "description": "Solve 100 Ciphers.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/df065e84f3d9165a3858b5c9a6bc735bf7b8450c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/9a411bb9a92a0404c550660e93f84a587b33aa20.jpg", + "iconName": "Operative", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740" + }, + { + "apiname": "ACH_FORT_VICTORY_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_FORT_VICTORY_SCOUT", + "defaultvalue": 0, + "displayName": "Fort Victory", + "hidden": 0, + "description": "Successfully defend or conquer a Fortress", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/19638d5a925b79ec5ece5345d7d3484d516f732f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Fort Victory", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740" + }, + { + "apiname": "ACH_MAGGON_STATION_DEFENSE_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MAGGON_STATION_DEFENSE_SCOUT", + "defaultvalue": 0, + "displayName": "Maggon Station Defense", + "hidden": 0, + "description": "Successfully defend Maggon Station", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/4941883e3bbf557594a212126a8fb072637fd5dd.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Maggon Station Defense", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740" + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" + }, + { + "apiname": "War07", + "achieved": 1, + "unlocktime": 1675375625, + "name": "War07", + "defaultvalue": 0, + "displayName": "New Warlander", + "hidden": 0, + "description": "Create a character.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/4315b1fa3735667ebe3e40396edb23b6fcbb41a8.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "New Warlander", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" + }, + { + "apiname": "War08", + "achieved": 1, + "unlocktime": 1675375610, + "name": "War08", + "defaultvalue": 0, + "displayName": "Stronger than Yesterday", + "hidden": 0, + "description": "Edit your equipment.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/9ef0c4b1c1488a2ef680c3e8f486dcb8eafa24d5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "Stronger than Yesterday", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" + }, + { + "apiname": "War09", + "achieved": 1, + "unlocktime": 1675378512, + "name": "War09", + "defaultvalue": 0, + "displayName": "The Final Spark", + "hidden": 0, + "description": "Win a Battle by destroying the enemy Core.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/33e8c73cf25268042ad5447267915eec53e2a7da.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "The Final Spark", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" + }, + { + "apiname": "War11", + "achieved": 1, + "unlocktime": 1675377714, + "name": "War11", + "defaultvalue": 0, + "displayName": "Land Dyed Red", + "hidden": 0, + "description": "Deal a totall of 10,000 damage.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/8892001c5611239773213d35abee3cbb1c7c8661.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "Land Dyed Red", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f" + }, + { + "apiname": "jp.konami.masterduel.ach.003", + "achieved": 1, + "unlocktime": 1653324555, + "name": "jp.konami.masterduel.ach.003", + "defaultvalue": 0, + "displayName": "Master of Special Summoning", + "hidden": 0, + "description": "Special Summon a total of 50 or more monsters in Ranked/Event Duels", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Master of Special Summoning", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f" + }, + { + "apiname": "jp.konami.masterduel.ach.006", + "achieved": 1, + "unlocktime": 1653324555, + "name": "jp.konami.masterduel.ach.006", + "defaultvalue": 0, + "displayName": "Beginner No More", + "hidden": 0, + "description": "Duel in Standard 30 times or more in Ranked Duels", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Beginner No More", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f" + } + ] +} diff --git a/src/backend/api/index.ts b/src/backend/api/index.ts index 347cbfe30..889dc6363 100644 --- a/src/backend/api/index.ts +++ b/src/backend/api/index.ts @@ -9,6 +9,7 @@ import * as DownloadManager from './downloadmanager' import * as Extensions from '../hyperplay-extension-helper/api/extensions' import * as Metrics from './metrics' import * as Overlay from 'backend/hyperplay-overlay/api' +import * as Achievements from 'backend/hyperplay-achievements/api' export default { ...Misc, @@ -21,5 +22,6 @@ export default { ...DownloadManager, ...Extensions, ...Metrics, - ...Overlay + ...Overlay, + ...Achievements } diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements new file mode 160000 index 000000000..0ba501231 --- /dev/null +++ b/src/backend/hyperplay-achievements @@ -0,0 +1 @@ +Subproject commit 0ba501231befcf94a3995c17f0e2e24f8a9ef054 diff --git a/src/backend/main.ts b/src/backend/main.ts index 8d34cd067..4174f876b 100644 --- a/src/backend/main.ts +++ b/src/backend/main.ts @@ -1794,6 +1794,7 @@ import { libraryStore as gogLibraryStore } from 'backend/storeManagers/gog/elect import { libraryStore as sideloadLibraryStore } from 'backend/storeManagers/sideload/electronStores' import { backendEvents } from 'backend/backend_events' import { toggleOverlay } from 'backend/hyperplay-overlay' +import 'backend/hyperplay-achievements' // sends messages to renderer process through preload.ts callbacks backendEvents.on('walletConnected', function (accounts: string[]) { diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 282568707..47ab24d76 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -1,4 +1,9 @@ -import { HyperPlayInstallInfo, DownloadManagerState } from './../types' +import { + HyperPlayInstallInfo, + DownloadManagerState, + AchievementStore, + Achievement +} from './../types' import { ProxiedProviderEventCallback } from './../../backend/hyperplay-proxy-server/providers/types' import { MetaMaskImportOptions } from './../../backend/hyperplay-extension-helper/ipcHandlers/index' import { EventEmitter } from 'node:events' @@ -195,6 +200,7 @@ interface HyperPlayAsyncIPCFunctions { removeTempDownloadFiles: (appName: string) => Promise getImportFolderPath: () => Promise appIsInLibrary: (appName: string, runner: Runner) => Promise + getAchievements: (store: AchievementStore) => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { diff --git a/src/common/types.ts b/src/common/types.ts index e9f93eb6f..fc7cac9a2 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -812,3 +812,22 @@ export type AvailablePlatforms = { value: string icon: IconDefinition }[] + +export type AchievementStore = 'hyperplay' | 'steam' | 'epic' + +export interface Achievement { + apiname: string + achieved: number + unlocktime: number + name: string + defaultvalue: number + displayName: string + hidden: number + description: string + icon: string + icongray: string + iconName: string + gameId: number + gameName: string + gameIconURL: string +} diff --git a/yarn.lock b/yarn.lock index 0deb290e2..33db28f9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1648,10 +1648,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/ui@^0.1.14": - version "0.1.14" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.14.tgz#3af3752766978060063cbdb69aaa2b93ca14c16e" - integrity sha512-c5VcCFSDgk0VxtFHGxy5PG3KuajXTgZHKLQLK7erm3eXlM+/auZH5Yr72NXIcrLCBBJmMMY+fa0ZNmC494GZnA== +"@hyperplay/ui@^0.1.19-auth-0.5": + version "0.1.19-auth-0.5" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.19-auth-0.5.tgz#956b6bc5d02dd76304a9cadefe20a46449b9351c" + integrity sha512-c6IADLd6IsU5paeIdRnxFiMgMh1CdabAX9B7/Z6VUAzTuDgqJMOSUZCTy6MJHvIhyVD9cCXCFHfkHKUiXwvqGA== "@ioredis/commands@^1.1.1": version "1.2.0" From cc14757415912f6c7518ce6910dfd887ea83b60f Mon Sep 17 00:00:00 2001 From: Brett Cleary <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 28 Sep 2023 22:16:11 -0700 Subject: [PATCH 002/106] prettier --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 0ba501231..79124903b 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 0ba501231befcf94a3995c17f0e2e24f8a9ef054 +Subproject commit 79124903b9908fee124ff5a2c306839caf79d580 From 39d239bd7db083cb147a55045b59d4326195f710 Mon Sep 17 00:00:00 2001 From: Bobby Blackstock Date: Mon, 2 Oct 2023 17:15:51 -0600 Subject: [PATCH 003/106] WIP: rought in front end components --- package.json | 2 +- src/frontend/App.tsx | 2 + .../Sidebar/components/SidebarLinks/index.tsx | 16 +++ .../screens/Achievements/index.module.css | 26 ++++ src/frontend/screens/Achievements/index.tsx | 119 ++++++++++++++++++ yarn.lock | 57 ++++++++- 6 files changed, 217 insertions(+), 5 deletions(-) create mode 100644 src/frontend/screens/Achievements/index.module.css create mode 100644 src/frontend/screens/Achievements/index.tsx diff --git a/package.json b/package.json index 37f411c2d..407009d52 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.19-auth-0.5", + "@hyperplay/ui": "^0.1.20", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", diff --git a/src/frontend/App.tsx b/src/frontend/App.tsx index c320a6981..3d6e9215a 100644 --- a/src/frontend/App.tsx +++ b/src/frontend/App.tsx @@ -6,6 +6,7 @@ import Login from './screens/Login' import WebView from './screens/WebView' import { GamePage } from './screens/Game' import Library from './screens/Library' +import Achievements from './screens/Achievements' import Sidebar from './components/UI/Sidebar' import Settings from './screens/Settings' import ContextProvider from './state/ContextProvider' @@ -58,6 +59,7 @@ function App() { element={} /> } /> + } /> } /> +
+ + classNames('Sidebar__item', { + active: + isActive || + location.pathname.includes('achievements') + }) + } + end + to={'/achievements'} + onClick={async () => handleRefresh()} + > + + +
diff --git a/src/frontend/screens/Achievements/index.module.css b/src/frontend/screens/Achievements/index.module.css new file mode 100644 index 000000000..3f6332494 --- /dev/null +++ b/src/frontend/screens/Achievements/index.module.css @@ -0,0 +1,26 @@ +.gridItems { + height: 100%; +} + +.storeCard { + flex-grow: 1; + gap: var(--space-2lg); + width: 100%; + border-radius: var(--space-md); + background: var(--color-neutral-800); + padding: var(--space-2lg); +} + +.storeTitle { + font-size: 1.5em; + margin-bottom: var(--space-xl-fixed); +} + +.fullHeight { + height: 100%; +} + +.achievementTable > div:first-child { + height: 100%; + border-radius: var(--space-md); +} diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx new file mode 100644 index 000000000..68a287296 --- /dev/null +++ b/src/frontend/screens/Achievements/index.tsx @@ -0,0 +1,119 @@ +import React, { useMemo, useState } from 'react' + +import { Background, AchievementsInfo, AchievementSummaryTable, StoreRow , Images } from '@hyperplay/ui' +import { Flex, Grid } from '@mantine/core' + +import styles from './index.module.css' + +// TODO Remove - Fake Data For Now +const games = [ + { + id: '1', + image: 'https://i.imgur.com/Cij5vdL.png', + title: 'Diablo II', + mintedAchievementsCount: 5, + mintableAchievementsCount: 10, + state: 'default', + + totalAchievementsCount: 30 + }, + { + id: '2', + image: 'https://i.imgur.com/Cij5vdL.png', + title: 'Star Wars: Knights of the Old Republic', + mintedAchievementsCount: 5, + mintableAchievementsCount: 10, + totalAchievementsCount: 30, + state: 'default', + + ctaProps: { disabled: true } + }, + { + id: '3', + image: 'https://i.imgur.com/Cij5vdL.png', + title: 'Star Wars: Knights of the Old Republic', + mintedAchievementsCount: 5, + mintableAchievementsCount: 10, + totalAchievementsCount: 30, + state: 'active' + }, + { + id: '4', + image: '', + title: 'Star Wars: Knights of the Old Republic', + mintedAchievementsCount: 5, + mintableAchievementsCount: 10, + totalAchievementsCount: 30, + isNewAchievement: true, + state: 'default' + } +] + +type AchievementFilter = 'all' | 'new' | 'minted' + +export default React.memo(function Achievements(): JSX.Element { + const achievementsSortOptions = [{ text: 'Alphabetically' }] + const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) + const [activeFilter, setActiveFilter] = useState('all') + const filteredGames = useMemo(() => { + if (activeFilter === 'minted') { + return games.filter((game) => game.state === 'active') + } + if (activeFilter === 'new') { + return games.filter((game) => game.isNewAchievement) + } + return games + }, [activeFilter]) + + return ( + <> + +
+ + + + +
+
+ My Stores +
+ + + + + + + + +

Link Store

+
+
+
+
+
+ + console.log('next page'), + handlePrevPage: () => console.log('prev page') + }} + filterProps={{ + activeFilter, + setActiveFilter + }} + mintButtonProps={{ onClick: () => console.log('mint') }} + /> + +
+
+ + ) +}) diff --git a/yarn.lock b/yarn.lock index 33db28f9e..c8b5cb618 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,6 +1594,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== +"@fortawesome/fontawesome-common-types@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" + integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== + "@fortawesome/fontawesome-svg-core@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1601,6 +1606,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/fontawesome-svg-core@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz#37f4507d5ec645c8b50df6db14eced32a6f9be09" + integrity sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-brands-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" @@ -1615,6 +1627,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-regular-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz#aee79ed76ce5dd04931352f9d83700761b8b1b25" + integrity sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-solid-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz#8dcde48109354fd7a5ece8ea48d678bb91d4b5f0" @@ -1622,6 +1641,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-solid-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz#33a02c4cb6aa28abea7bc082a9626b7922099df4" + integrity sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/react-fontawesome@^0.1.18": version "0.1.19" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz#2b36917578596f31934e71f92b7cf9c425fd06e4" @@ -1629,6 +1655,13 @@ dependencies: prop-types "^15.8.1" +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1648,10 +1681,17 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/ui@^0.1.19-auth-0.5": - version "0.1.19-auth-0.5" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.19-auth-0.5.tgz#956b6bc5d02dd76304a9cadefe20a46449b9351c" - integrity sha512-c6IADLd6IsU5paeIdRnxFiMgMh1CdabAX9B7/Z6VUAzTuDgqJMOSUZCTy6MJHvIhyVD9cCXCFHfkHKUiXwvqGA== +"@hyperplay/chains@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" + integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== + dependencies: + axios "^1.4.0" + +"@hyperplay/ui@^0.1.20": + version "0.1.20" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.20.tgz#ccb5d0e0c2d5ec8a844fc9b7b6dac0224df74142" + integrity sha512-vsI+QgPY6PTQn83Y42tg0/40IXLN27bLUxDSeY+iBa8NmK88WP90BkkQjA/FaT8u7H14CPCaWGNtP9BgGt6kHQ== "@ioredis/commands@^1.1.1": version "1.2.0" @@ -4507,6 +4547,15 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" + integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" From 5f5761616e6d22b068ca4c79bf1fbf101c250593 Mon Sep 17 00:00:00 2001 From: Bobby Blackstock Date: Mon, 2 Oct 2023 17:21:10 -0600 Subject: [PATCH 004/106] chore: prettier --- .../Sidebar/components/SidebarLinks/index.tsx | 4 +- src/frontend/screens/Achievements/index.tsx | 37 ++++++++++++++----- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx index 03d4708f8..392f011e2 100644 --- a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx +++ b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx @@ -88,9 +88,7 @@ export default function SidebarLinks() { classNames('Sidebar__item', { - active: - isActive || - location.pathname.includes('achievements') + active: isActive || location.pathname.includes('achievements') }) } end diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 68a287296..32f01da3b 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,6 +1,12 @@ import React, { useMemo, useState } from 'react' -import { Background, AchievementsInfo, AchievementSummaryTable, StoreRow , Images } from '@hyperplay/ui' +import { + Background, + AchievementsInfo, + AchievementSummaryTable, + StoreRow, + Images +} from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' @@ -71,13 +77,23 @@ export default React.memo(function Achievements(): JSX.Element {
- - + +
-
- My Stores -
- +
My Stores
+ @@ -89,9 +105,12 @@ export default React.memo(function Achievements(): JSX.Element {
-
+
- + Date: Mon, 2 Oct 2023 17:22:24 -0600 Subject: [PATCH 005/106] chore: yarn lock --- yarn.lock | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/yarn.lock b/yarn.lock index c8b5cb618..9e3216545 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,11 +1594,6 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== -"@fortawesome/fontawesome-common-types@6.4.2": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" - integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== - "@fortawesome/fontawesome-svg-core@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1606,13 +1601,6 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/fontawesome-svg-core@^6.4.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz#37f4507d5ec645c8b50df6db14eced32a6f9be09" - integrity sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg== - dependencies: - "@fortawesome/fontawesome-common-types" "6.4.2" - "@fortawesome/free-brands-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" @@ -1627,13 +1615,6 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/free-regular-svg-icons@^6.4.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz#aee79ed76ce5dd04931352f9d83700761b8b1b25" - integrity sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q== - dependencies: - "@fortawesome/fontawesome-common-types" "6.4.2" - "@fortawesome/free-solid-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz#8dcde48109354fd7a5ece8ea48d678bb91d4b5f0" @@ -1641,13 +1622,6 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/free-solid-svg-icons@^6.4.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz#33a02c4cb6aa28abea7bc082a9626b7922099df4" - integrity sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA== - dependencies: - "@fortawesome/fontawesome-common-types" "6.4.2" - "@fortawesome/react-fontawesome@^0.1.18": version "0.1.19" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz#2b36917578596f31934e71f92b7cf9c425fd06e4" @@ -1655,13 +1629,6 @@ dependencies: prop-types "^15.8.1" -"@fortawesome/react-fontawesome@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" - integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== - dependencies: - prop-types "^15.8.1" - "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1681,13 +1648,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/chains@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" - integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== - dependencies: - axios "^1.4.0" - "@hyperplay/ui@^0.1.20": version "0.1.20" resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.20.tgz#ccb5d0e0c2d5ec8a844fc9b7b6dac0224df74142" @@ -4547,15 +4507,6 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" - integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" From ecdac291ca957a7e3cf5895e41456a0cf1cc76f2 Mon Sep 17 00:00:00 2001 From: Bobby Blackstock Date: Mon, 2 Oct 2023 17:44:42 -0600 Subject: [PATCH 006/106] wip: add type to mocked data --- src/frontend/screens/Achievements/index.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 32f01da3b..ffc2c05d2 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -10,6 +10,7 @@ import { import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' +import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' // TODO Remove - Fake Data For Now const games = [ @@ -19,8 +20,7 @@ const games = [ title: 'Diablo II', mintedAchievementsCount: 5, mintableAchievementsCount: 10, - state: 'default', - + state: 'default' as StatusIconState, totalAchievementsCount: 30 }, { @@ -30,8 +30,7 @@ const games = [ mintedAchievementsCount: 5, mintableAchievementsCount: 10, totalAchievementsCount: 30, - state: 'default', - + state: 'default' as StatusIconState, ctaProps: { disabled: true } }, { @@ -41,7 +40,7 @@ const games = [ mintedAchievementsCount: 5, mintableAchievementsCount: 10, totalAchievementsCount: 30, - state: 'active' + state: 'active' as StatusIconState }, { id: '4', @@ -51,7 +50,7 @@ const games = [ mintableAchievementsCount: 10, totalAchievementsCount: 30, isNewAchievement: true, - state: 'default' + state: 'default' as StatusIconState } ] From 61d7928c377219aa001556d9abf8fb9764faa538 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 3 Oct 2023 10:17:08 -0600 Subject: [PATCH 007/106] wip: consume mock data --- .../screens/Achievements/index.module.css | 2 +- src/frontend/screens/Achievements/index.tsx | 60 +++++++++++++++---- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/frontend/screens/Achievements/index.module.css b/src/frontend/screens/Achievements/index.module.css index 3f6332494..efae8b9f7 100644 --- a/src/frontend/screens/Achievements/index.module.css +++ b/src/frontend/screens/Achievements/index.module.css @@ -17,7 +17,7 @@ } .fullHeight { - height: 100%; + min-height: 100%; } .achievementTable > div:first-child { diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index ffc2c05d2..ed92d1cf6 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import { Background, @@ -11,9 +11,10 @@ import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' +import { Game } from '@hyperplay/ui/dist/components/AchievementSummaryTable' // TODO Remove - Fake Data For Now -const games = [ +const gamesDefault = [ { id: '1', image: 'https://i.imgur.com/Cij5vdL.png', @@ -56,19 +57,56 @@ const games = [ type AchievementFilter = 'all' | 'new' | 'minted' +// TODO: Remove - When api paginates +function paginate(array: Game[], page: number, perPage: number) { + const start = (page - 1) * perPage; + const end = start + perPage; + return array.slice(start, end); +} +const pageSize = 12 + export default React.memo(function Achievements(): JSX.Element { const achievementsSortOptions = [{ text: 'Alphabetically' }] const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [activeFilter, setActiveFilter] = useState('all') + const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: Game[] }>({ currentPage: 0, totalPages: 0, games: [] }) + const filteredGames = useMemo(() => { if (activeFilter === 'minted') { - return games.filter((game) => game.state === 'active') + return achievementsData.games.filter((game) => game.state === 'active') } if (activeFilter === 'new') { - return games.filter((game) => game.isNewAchievement) + return achievementsData.games.filter((game) => game.isNewAchievement) + } + return achievementsData.games + }, [activeFilter, achievementsData]) + + useEffect(() => { + const getAchievements = async () => { + const achievementApiData = await window.api.getAchievements('hyperplay') + const firstPage = paginate(achievementApiData.data, 1, pageSize) as Game[] + const totalPages = Math.ceil(achievementApiData.data.length / pageSize) + setAchievementData({ currentPage: 1, totalPages, games: firstPage }) } - return games - }, [activeFilter]) + + getAchievements() + }, []) + + const handleNextPage = useCallback(async () => { + const achievementApiData = await window.api.getAchievements('hyperplay') + const totalPages = Math.ceil(achievementApiData.data.length / pageSize) + const nextPage = achievementsData.currentPage + 1 + const data = paginate(achievementApiData.data, nextPage, 12) + setAchievementData({ currentPage: nextPage, totalPages, games: data }) + }, [achievementsData]) + + const handlePrevPage = useCallback(async () => { + const achievementApiData = await window.api.getAchievements('hyperplay') + const totalPages = Math.ceil(achievementApiData.data.length / pageSize) + const previousPage = achievementsData.currentPage - 1 + const data = paginate(achievementApiData.data, previousPage, 12) + setAchievementData({ currentPage: previousPage, totalPages, games: data }) + }, [achievementsData]) return ( <> @@ -111,17 +149,17 @@ export default React.memo(function Achievements(): JSX.Element { className={`${styles.fullHeight} ${styles.achievementTable}`} > ({ id: game.gameId, title: game.gameName, image: game.icon, state: 'disabled', ctaProps: { onClick: () => console.log('click') } }))} sortProps={{ options: achievementsSortOptions, selected: selectedSort, onItemChange: setSelectedSort }} paginationProps={{ - currentPage: 1, - totalPages: 3, - handleNextPage: () => console.log('next page'), - handlePrevPage: () => console.log('prev page') + currentPage: achievementsData.currentPage, + totalPages: achievementsData.totalPages, + handleNextPage, + handlePrevPage, }} filterProps={{ activeFilter, From 765b64e7fc74b582049ef8b40765a2cfb465485e Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 3 Oct 2023 14:28:14 -0600 Subject: [PATCH 008/106] wip: wire up handle add and put in mock timeout for handling mint --- .../screens/Achievements/index.module.css | 10 +- src/frontend/screens/Achievements/index.tsx | 132 +++++++++--------- 2 files changed, 70 insertions(+), 72 deletions(-) diff --git a/src/frontend/screens/Achievements/index.module.css b/src/frontend/screens/Achievements/index.module.css index efae8b9f7..2aa6a49de 100644 --- a/src/frontend/screens/Achievements/index.module.css +++ b/src/frontend/screens/Achievements/index.module.css @@ -12,15 +12,11 @@ } .storeTitle { - font-size: 1.5em; - margin-bottom: var(--space-xl-fixed); + font-size: var(--text-2xl); + color: var(--color-neutral-400); + margin-bottom: var(--space-lg); } .fullHeight { min-height: 100%; } - -.achievementTable > div:first-child { - height: 100%; - border-radius: var(--space-md); -} diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index ed92d1cf6..40e73b9f4 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react' +import walletStore from 'frontend/store/WalletStore' import { Background, @@ -10,104 +11,83 @@ import { import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' -import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' -import { Game } from '@hyperplay/ui/dist/components/AchievementSummaryTable' - -// TODO Remove - Fake Data For Now -const gamesDefault = [ - { - id: '1', - image: 'https://i.imgur.com/Cij5vdL.png', - title: 'Diablo II', - mintedAchievementsCount: 5, - mintableAchievementsCount: 10, - state: 'default' as StatusIconState, - totalAchievementsCount: 30 - }, - { - id: '2', - image: 'https://i.imgur.com/Cij5vdL.png', - title: 'Star Wars: Knights of the Old Republic', - mintedAchievementsCount: 5, - mintableAchievementsCount: 10, - totalAchievementsCount: 30, - state: 'default' as StatusIconState, - ctaProps: { disabled: true } - }, - { - id: '3', - image: 'https://i.imgur.com/Cij5vdL.png', - title: 'Star Wars: Knights of the Old Republic', - mintedAchievementsCount: 5, - mintableAchievementsCount: 10, - totalAchievementsCount: 30, - state: 'active' as StatusIconState - }, - { - id: '4', - image: '', - title: 'Star Wars: Knights of the Old Republic', - mintedAchievementsCount: 5, - mintableAchievementsCount: 10, - totalAchievementsCount: 30, - isNewAchievement: true, - state: 'default' as StatusIconState - } -] - -type AchievementFilter = 'all' | 'new' | 'minted' +import { Achievement } from 'common/types' +import { AchievementFilter } from '@hyperplay/ui/dist/components/AchievementSummaryTable' // TODO: Remove - When api paginates -function paginate(array: Game[], page: number, perPage: number) { +function paginate(array: Achievement[], page: number, perPage: number) { const start = (page - 1) * perPage; const end = start + perPage; return array.slice(start, end); } + const pageSize = 12 export default React.memo(function Achievements(): JSX.Element { const achievementsSortOptions = [{ text: 'Alphabetically' }] const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [activeFilter, setActiveFilter] = useState('all') - const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: Game[] }>({ currentPage: 0, totalPages: 0, games: [] }) + const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: Achievement[] }>({ currentPage: 0, totalPages: 0, games: [] }) + const [achievementsToBeMinted, setAchievementsToBeMinted] = useState([]) + const [isLoading, setIsLoading] = useState(false) const filteredGames = useMemo(() => { if (activeFilter === 'minted') { - return achievementsData.games.filter((game) => game.state === 'active') + return achievementsData.games.filter((game) => game.mintedAchievementsCount > 0) } if (activeFilter === 'new') { - return achievementsData.games.filter((game) => game.isNewAchievement) + return achievementsData.games.filter((game) => game.mintedAchievementsCount === 0) } return achievementsData.games }, [activeFilter, achievementsData]) useEffect(() => { const getAchievements = async () => { - const achievementApiData = await window.api.getAchievements('hyperplay') - const firstPage = paginate(achievementApiData.data, 1, pageSize) as Game[] - const totalPages = Math.ceil(achievementApiData.data.length / pageSize) - setAchievementData({ currentPage: 1, totalPages, games: firstPage }) + const achievementApiData = await window.api.getAchievements('hyperplay') as { data: Achievement[] } + const { data } = achievementApiData + const totalPages = Math.ceil(data.length / pageSize) + setAchievementData({ currentPage: 1, totalPages, games: paginate(data, 1, pageSize) }) } getAchievements() }, []) const handleNextPage = useCallback(async () => { - const achievementApiData = await window.api.getAchievements('hyperplay') - const totalPages = Math.ceil(achievementApiData.data.length / pageSize) + const achievementApiData = await window.api.getAchievements('hyperplay') as { data: Achievement[] } + const { data } = achievementApiData + const totalPages = Math.ceil(data.length / pageSize) const nextPage = achievementsData.currentPage + 1 - const data = paginate(achievementApiData.data, nextPage, 12) - setAchievementData({ currentPage: nextPage, totalPages, games: data }) + setAchievementData({ currentPage: nextPage, totalPages, games: paginate(data, nextPage, 12) }) }, [achievementsData]) const handlePrevPage = useCallback(async () => { - const achievementApiData = await window.api.getAchievements('hyperplay') - const totalPages = Math.ceil(achievementApiData.data.length / pageSize) + const achievementApiData = await window.api.getAchievements('hyperplay') as { data: Achievement[] } + const { data } = achievementApiData + const totalPages = Math.ceil(data.length / pageSize) const previousPage = achievementsData.currentPage - 1 - const data = paginate(achievementApiData.data, previousPage, 12) - setAchievementData({ currentPage: previousPage, totalPages, games: data }) + setAchievementData({ currentPage: previousPage, totalPages, games: paginate(data, previousPage, 12) }) }, [achievementsData]) + const handleAdd = useCallback((id: string) => { + if (achievementsToBeMinted.includes(id)) { + setAchievementsToBeMinted((state) => state.filter((item) => item !== id)) + } else { + setAchievementsToBeMinted((state) => ([...state, id])) + } + }, [achievementsToBeMinted]) + + const handleMint = useCallback(() => { + setIsLoading(true) + setTimeout(() => { + setIsLoading(false) + setAchievementsToBeMinted([]) + }, 3000) + }, [achievementsToBeMinted]) + + const isDisabled = useMemo(() => { + return !walletStore.isConnected || isLoading + }, [isLoading, walletStore.isConnected]) + return ( <> @@ -146,10 +126,29 @@ export default React.memo(function Achievements(): JSX.Element { ({ id: game.gameId, title: game.gameName, image: game.icon, state: 'disabled', ctaProps: { onClick: () => console.log('click') } }))} + games={filteredGames.map((game, index) => { + // TODO: Remove - When we have a real achievement id + const id = `${game.gameId}-${index}` + const state = achievementsToBeMinted.includes(id) ? 'active' : 'default' + + return ({ + id: id, + title: game.gameName, + image: game.icon, + mintableAchievementsCount: 40, + mintedAchievementsCount: 20, + totalAchievementsCount: 50, + isNewAchievement: game.mintableAchievementsCount === 0, + state: walletStore.isConnected ? 'disabled' : state, + ctaProps: { + onClick: () => handleAdd(id), + disabled: isDisabled + } + }) + })} sortProps={{ options: achievementsSortOptions, selected: selectedSort, @@ -165,7 +164,10 @@ export default React.memo(function Achievements(): JSX.Element { activeFilter, setActiveFilter }} - mintButtonProps={{ onClick: () => console.log('mint') }} + mintButtonProps={{ + onClick: handleMint, + disabled: isDisabled ?? achievementsToBeMinted.length === 0, + }} />
From 6e1e94fb1cf9112fdc60a0ad3aa0e51fbc0296f4 Mon Sep 17 00:00:00 2001 From: Brett Cleary <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 3 Oct 2023 21:54:28 -0700 Subject: [PATCH 009/106] add props to summary, add individual achievement api method --- public/summary_achievements_mock.json | 730 ++++++++++++++++++++++++++ src/backend/hyperplay-achievements | 2 +- src/common/typedefs/ipcBridge.d.ts | 6 +- src/common/types.ts | 19 + 4 files changed, 754 insertions(+), 3 deletions(-) create mode 100644 public/summary_achievements_mock.json diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json new file mode 100644 index 000000000..d8bb7ef6a --- /dev/null +++ b/public/summary_achievements_mock.json @@ -0,0 +1,730 @@ +[ + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", + "totalAchievementCount": 646, + "mintedAchievementCount": 15, + "mintableAchievementsCount": 105, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", + "totalAchievementCount": 17, + "mintedAchievementCount": 17, + "mintableAchievementsCount": 17, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", + "totalAchievementCount": 172, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 3, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", + "totalAchievementCount": 26, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", + "totalAchievementCount": 8, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", + "totalAchievementCount": 6, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", + "totalAchievementCount": 7, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", + "totalAchievementCount": 23, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", + "totalAchievementCount": 149, + "mintedAchievementCount": 44, + "mintableAchievementsCount": 52, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", + "totalAchievementCount": 15, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 13, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", + "totalAchievementCount": 15, + "mintedAchievementCount": 15, + "mintableAchievementsCount": 15, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", + "totalAchievementCount": 18, + "mintedAchievementCount": 9, + "mintableAchievementsCount": 11, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", + "totalAchievementCount": 16, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 5, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", + "totalAchievementCount": 16, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", + "totalAchievementCount": 6, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", + "totalAchievementCount": 10, + "mintedAchievementCount": 10, + "mintableAchievementsCount": 10, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", + "totalAchievementCount": 18, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", + "totalAchievementCount": 157, + "mintedAchievementCount": 18, + "mintableAchievementsCount": 23, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", + "totalAchievementCount": 7, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", + "totalAchievementCount": 7, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", + "totalAchievementCount": 3, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", + "totalAchievementCount": 12, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", + "totalAchievementCount": 61, + "mintedAchievementCount": 61, + "mintableAchievementsCount": 61, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", + "totalAchievementCount": 23, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + } +] \ No newline at end of file diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 79124903b..3b45092a1 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 79124903b9908fee124ff5a2c306839caf79d580 +Subproject commit 3b45092a12d2fe5dfb160797c55e8d7171f4778e diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 47ab24d76..3d54f82f4 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -1,7 +1,6 @@ import { HyperPlayInstallInfo, DownloadManagerState, - AchievementStore, Achievement } from './../types' import { ProxiedProviderEventCallback } from './../../backend/hyperplay-proxy-server/providers/types' @@ -200,7 +199,10 @@ interface HyperPlayAsyncIPCFunctions { removeTempDownloadFiles: (appName: string) => Promise getImportFolderPath: () => Promise appIsInLibrary: (appName: string, runner: Runner) => Promise - getAchievements: (store: AchievementStore) => Promise + getSummaryAchievements: ( + options: GetAchievementsOptions + ) => Promise + getIndividualAchievements: (gameId: number) => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { diff --git a/src/common/types.ts b/src/common/types.ts index fc7cac9a2..5570a7e16 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -831,3 +831,22 @@ export interface Achievement { gameName: string gameIconURL: string } + +export interface SummaryAchievement extends Achievement { + totalAchievementCount: number + mintedAchievementCount: number + mintableAchievementsCount: number + isNewAchievement: boolean + isMinted: boolean +} + +export type AcheivementSort = 'ALPHA_A_TO_Z' | 'ALPHA_Z_TO_A' | 'SORT_BY_STATUS' + +export type AchievementFilter = 'ALL' | 'NEW' | 'MINTED' + +export interface GetAchievementsOptions { + store: AchievementStore + filter: AchievementFilter + sort: AcheivementSort + page: number +} From e22cda2c8ac3dabf0ec7e743ec494ed06c631c20 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 08:49:56 -0600 Subject: [PATCH 010/106] chore: render test data until api returns correct types --- .../screens/Achievements/index.module.css | 2 +- src/frontend/screens/Achievements/index.tsx | 120 +++++++++++++++--- 2 files changed, 106 insertions(+), 16 deletions(-) diff --git a/src/frontend/screens/Achievements/index.module.css b/src/frontend/screens/Achievements/index.module.css index 2aa6a49de..a17702c3f 100644 --- a/src/frontend/screens/Achievements/index.module.css +++ b/src/frontend/screens/Achievements/index.module.css @@ -18,5 +18,5 @@ } .fullHeight { - min-height: 100%; + height: 100%; } diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 40e73b9f4..5fe144153 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -14,8 +14,11 @@ import styles from './index.module.css' import { Achievement } from 'common/types' import { AchievementFilter } from '@hyperplay/ui/dist/components/AchievementSummaryTable' +// TODO: Remove - When api has all the data +type AchievementData = Achievement & { id: string; mintedAchievementsCount: number; mintableAchievementsCount: number; totalAchievementsCount: number } + // TODO: Remove - When api paginates -function paginate(array: Achievement[], page: number, perPage: number) { +function paginate(array: AchievementData[], page: number, perPage: number) { const start = (page - 1) * perPage; const end = start + perPage; return array.slice(start, end); @@ -23,11 +26,94 @@ function paginate(array: Achievement[], page: number, perPage: number) { const pageSize = 12 +const testData = [ + { + achieved: 1, + apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + defaultvalue: 0, + description: 'Lose an unfinished Castle that is at least 95% complete.', + displayName: 'Castle of Doubt', + gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', + gameId: 813780, + gameName: 'Age of Empires II: Definitive Edition', + hidden: 0, + icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', + iconName: 'Castle of Doubt', + icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', + name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + id: 'id-1', + unlocktime: 1628474277, + mintableAchievementsCount: 40, + mintedAchievementsCount: 20, + totalAchievementsCount: 50, + }, + { + achieved: 1, + apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + defaultvalue: 0, + description: 'Lose an unfinished Castle that is at least 95% complete.', + displayName: 'Castle of Doubt', + gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', + gameId: 813780, + gameName: 'Age of Empires II: Definitive Edition', + hidden: 0, + icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', + iconName: 'Castle of Doubt', + icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', + name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + id: 'id-2', + unlocktime: 1628474277, + mintableAchievementsCount: 40, + mintedAchievementsCount: 20, + totalAchievementsCount: 50, + }, + { + achieved: 1, + apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + defaultvalue: 0, + description: 'Lose an unfinished Castle that is at least 95% complete.', + displayName: 'Castle of Doubt', + gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', + gameId: 813780, + gameName: 'Age of Empires II: Definitive Edition', + hidden: 0, + icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', + iconName: 'Castle of Doubt', + icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', + name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + id: 'id-3', + unlocktime: 1628474277, + mintableAchievementsCount: 40, + mintedAchievementsCount: 20, + totalAchievementsCount: 50, + }, + { + achieved: 1, + apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + defaultvalue: 0, + description: 'Lose an unfinished Castle that is at least 95% complete.', + displayName: 'Castle of Doubt', + gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', + gameId: 813780, + gameName: 'Age of Empires II: Definitive Edition', + hidden: 0, + icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', + iconName: 'Castle of Doubt', + icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', + name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', + id: 'id-4', + unlocktime: 1628474277, + mintableAchievementsCount: 40, + mintedAchievementsCount: 20, + totalAchievementsCount: 50, + } +] + export default React.memo(function Achievements(): JSX.Element { const achievementsSortOptions = [{ text: 'Alphabetically' }] const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [activeFilter, setActiveFilter] = useState('all') - const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: Achievement[] }>({ currentPage: 0, totalPages: 0, games: [] }) + const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: AchievementData[] }>({ currentPage: 0, totalPages: 0, games: [] }) const [achievementsToBeMinted, setAchievementsToBeMinted] = useState([]) const [isLoading, setIsLoading] = useState(false) @@ -43,7 +129,9 @@ export default React.memo(function Achievements(): JSX.Element { useEffect(() => { const getAchievements = async () => { - const achievementApiData = await window.api.getAchievements('hyperplay') as { data: Achievement[] } + // TODO: Remove - When api returns the correct data format + // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } + const achievementApiData = { data: testData } const { data } = achievementApiData const totalPages = Math.ceil(data.length / pageSize) setAchievementData({ currentPage: 1, totalPages, games: paginate(data, 1, pageSize) }) @@ -53,7 +141,9 @@ export default React.memo(function Achievements(): JSX.Element { }, []) const handleNextPage = useCallback(async () => { - const achievementApiData = await window.api.getAchievements('hyperplay') as { data: Achievement[] } + // TODO: Remove - When api returns the correct data format + // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } + const achievementApiData = { data: testData } const { data } = achievementApiData const totalPages = Math.ceil(data.length / pageSize) const nextPage = achievementsData.currentPage + 1 @@ -61,7 +151,9 @@ export default React.memo(function Achievements(): JSX.Element { }, [achievementsData]) const handlePrevPage = useCallback(async () => { - const achievementApiData = await window.api.getAchievements('hyperplay') as { data: Achievement[] } + // TODO: Remove - When api returns the correct data format + // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } + const achievementApiData = { data: testData } const { data } = achievementApiData const totalPages = Math.ceil(data.length / pageSize) const previousPage = achievementsData.currentPage - 1 @@ -96,7 +188,7 @@ export default React.memo(function Achievements(): JSX.Element { { - // TODO: Remove - When we have a real achievement id - const id = `${game.gameId}-${index}` - const state = achievementsToBeMinted.includes(id) ? 'active' : 'default' + games={filteredGames.map((game) => { + const state = achievementsToBeMinted.includes(game.id) ? 'active' : 'default' return ({ - id: id, + id: game.id, title: game.gameName, image: game.icon, - mintableAchievementsCount: 40, - mintedAchievementsCount: 20, - totalAchievementsCount: 50, + mintableAchievementsCount: game.mintableAchievementsCount, + mintedAchievementsCount: game.mintedAchievementsCount, + totalAchievementsCount: game.totalAchievementsCount, isNewAchievement: game.mintableAchievementsCount === 0, state: walletStore.isConnected ? 'disabled' : state, ctaProps: { - onClick: () => handleAdd(id), + onClick: () => handleAdd(game.id), disabled: isDisabled } }) From dff3401ac7314bc223cd9e3e751b7d6ddb79df1b Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 09:25:13 -0600 Subject: [PATCH 011/106] chore: dont use real data just yet --- src/frontend/screens/Achievements/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 5fe144153..434cbb2d9 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -131,10 +131,11 @@ export default React.memo(function Achievements(): JSX.Element { const getAchievements = async () => { // TODO: Remove - When api returns the correct data format // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } + // const test = await window.api.getSummaryAchievements({ store: 'steam', filter: 'ALL', sort: 'ALPHA_A_TO_Z', page: 0 }) const achievementApiData = { data: testData } const { data } = achievementApiData const totalPages = Math.ceil(data.length / pageSize) - setAchievementData({ currentPage: 1, totalPages, games: paginate(data, 1, pageSize) }) + setAchievementData({ currentPage: 0, totalPages, games: paginate(data, 1, pageSize) }) } getAchievements() From e252dafb7c99b0598571639fa44a9f2d5c90d6e4 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 10:37:15 -0600 Subject: [PATCH 012/106] feat: add pagination, fliters and sort --- public/summary_achievements_mock.json | 98 +++++------ src/common/typedefs/ipcBridge.d.ts | 11 +- src/common/types.ts | 5 +- src/frontend/screens/Achievements/index.tsx | 172 +++++--------------- 4 files changed, 99 insertions(+), 187 deletions(-) diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index d8bb7ef6a..97a5c5a3e 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -14,8 +14,8 @@ "gameId": 730, "gameName": "Counter-Strike: Global Offensive", "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 646, - "mintedAchievementCount": 15, + "totalAchievementCount": 293, + "mintedAchievementCount": 71, "mintableAchievementsCount": 105, "isNewAchievement": true, "isMinted": true @@ -35,8 +35,8 @@ "gameId": 230410, "gameName": "Warframe", "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 17, - "mintedAchievementCount": 17, + "totalAchievementCount": 26, + "mintedAchievementCount": 3, "mintableAchievementsCount": 17, "isNewAchievement": true, "isMinted": true @@ -77,8 +77,8 @@ "gameId": 444090, "gameName": "Paladins", "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 172, - "mintedAchievementCount": 2, + "totalAchievementCount": 11, + "mintedAchievementCount": 1, "mintableAchievementsCount": 3, "isNewAchievement": true, "isMinted": true @@ -139,8 +139,8 @@ "gameId": 550650, "gameName": "Black Squad", "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 26, - "mintedAchievementCount": 1, + "totalAchievementCount": 6, + "mintedAchievementCount": 6, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -160,7 +160,7 @@ "gameId": 578080, "gameName": "PUBG: BATTLEGROUNDS", "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 8, + "totalAchievementCount": 7, "mintedAchievementCount": 3, "mintableAchievementsCount": 4, "isNewAchievement": true, @@ -181,8 +181,8 @@ "gameId": 611500, "gameName": "Quake Champions", "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 6, - "mintedAchievementCount": 0, + "totalAchievementCount": 1, + "mintedAchievementCount": 1, "mintableAchievementsCount": 1, "isNewAchievement": true, "isMinted": true @@ -202,8 +202,8 @@ "gameId": 677620, "gameName": "Splitgate", "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, + "totalAchievementCount": 17, + "mintedAchievementCount": 3, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -243,7 +243,7 @@ "gameId": 681660, "gameName": "Bless Online", "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 23, + "totalAchievementCount": 1, "mintedAchievementCount": 0, "mintableAchievementsCount": 1, "isNewAchievement": true, @@ -264,8 +264,8 @@ "gameId": 714010, "gameName": "Aimlabs", "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 149, - "mintedAchievementCount": 44, + "totalAchievementCount": 226, + "mintedAchievementCount": 21, "mintableAchievementsCount": 52, "isNewAchievement": true, "isMinted": true @@ -285,8 +285,8 @@ "gameId": 723780, "gameName": "Modern Combat Versus", "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 15, - "mintedAchievementCount": 0, + "totalAchievementCount": 322, + "mintedAchievementCount": 6, "mintableAchievementsCount": 13, "isNewAchievement": true, "isMinted": true @@ -369,8 +369,8 @@ "gameId": 844870, "gameName": "KurtzPel", "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, + "totalAchievementCount": 6, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -390,8 +390,8 @@ "gameId": 872200, "gameName": "Rogue Company", "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 15, - "mintedAchievementCount": 15, + "totalAchievementCount": 69, + "mintedAchievementCount": 9, "mintableAchievementsCount": 15, "isNewAchievement": true, "isMinted": true @@ -410,8 +410,8 @@ "gameId": 883710, "gameName": "Resident Evil 2", "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 18, - "mintedAchievementCount": 9, + "totalAchievementCount": 11, + "mintedAchievementCount": 11, "mintableAchievementsCount": 11, "isNewAchievement": true, "isMinted": true @@ -431,8 +431,8 @@ "gameId": 961440, "gameName": "Resident Evil 2 \"1-Shot Demo\"", "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 16, - "mintedAchievementCount": 1, + "totalAchievementCount": 15, + "mintedAchievementCount": 3, "mintableAchievementsCount": 5, "isNewAchievement": true, "isMinted": true @@ -451,8 +451,8 @@ "gameId": 990080, "gameName": "Hogwarts Legacy", "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 16, - "mintedAchievementCount": 3, + "totalAchievementCount": 8, + "mintedAchievementCount": 4, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -472,8 +472,8 @@ "gameId": 1085660, "gameName": "Destiny 2", "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 6, - "mintedAchievementCount": 2, + "totalAchievementCount": 2, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -492,8 +492,8 @@ "gameId": 1091500, "gameName": "Cyberpunk 2077", "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 10, - "mintedAchievementCount": 10, + "totalAchievementCount": 15, + "mintedAchievementCount": 1, "mintableAchievementsCount": 10, "isNewAchievement": true, "isMinted": true @@ -513,8 +513,8 @@ "gameId": 1100990, "gameName": "Aimbeast", "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 18, - "mintedAchievementCount": 1, + "totalAchievementCount": 2, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -554,8 +554,8 @@ "gameId": 1196590, "gameName": "Resident Evil Village", "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 157, - "mintedAchievementCount": 18, + "totalAchievementCount": 23, + "mintedAchievementCount": 23, "mintableAchievementsCount": 23, "isNewAchievement": true, "isMinted": true @@ -575,8 +575,8 @@ "gameId": 1240440, "gameName": "Halo Infinite", "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 7, - "mintedAchievementCount": 1, + "totalAchievementCount": 24, + "mintedAchievementCount": 3, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -597,7 +597,7 @@ "gameName": "Street Fighter™ 6", "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", "totalAchievementCount": 7, - "mintedAchievementCount": 7, + "mintedAchievementCount": 5, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -617,8 +617,8 @@ "gameId": 1449850, "gameName": "Yu-Gi-Oh! Master Duel", "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 3, - "mintedAchievementCount": 1, + "totalAchievementCount": 2, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -638,8 +638,8 @@ "gameId": 1466860, "gameName": "Age of Empires IV: Anniversary Edition", "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 12, - "mintedAchievementCount": 3, + "totalAchievementCount": 7, + "mintedAchievementCount": 2, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -659,8 +659,8 @@ "gameId": 1599340, "gameName": "Lost Ark", "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 61, - "mintedAchievementCount": 61, + "totalAchievementCount": 380, + "mintedAchievementCount": 60, "mintableAchievementsCount": 61, "isNewAchievement": true, "isMinted": true @@ -680,8 +680,8 @@ "gameId": 1675900, "gameName": "Warlander", "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 23, - "mintedAchievementCount": 3, + "totalAchievementCount": 184, + "mintedAchievementCount": 4, "mintableAchievementsCount": 4, "isNewAchievement": true, "isMinted": true @@ -701,7 +701,7 @@ "gameId": 1816670, "gameName": "GUNDAM EVOLUTION", "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 2, + "totalAchievementCount": 6, "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, @@ -721,7 +721,7 @@ "gameId": 1888160, "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 2, + "totalAchievementCount": 6, "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 3d54f82f4..c6fbbf20f 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -1,7 +1,8 @@ import { HyperPlayInstallInfo, DownloadManagerState, - Achievement + Achievement, + SummaryAchievement } from './../types' import { ProxiedProviderEventCallback } from './../../backend/hyperplay-proxy-server/providers/types' import { MetaMaskImportOptions } from './../../backend/hyperplay-extension-helper/ipcHandlers/index' @@ -199,9 +200,11 @@ interface HyperPlayAsyncIPCFunctions { removeTempDownloadFiles: (appName: string) => Promise getImportFolderPath: () => Promise appIsInLibrary: (appName: string, runner: Runner) => Promise - getSummaryAchievements: ( - options: GetAchievementsOptions - ) => Promise + getSummaryAchievements: (options: GetAchievementsOptions) => Promise<{ + data: SummaryAchievement[] + currentPage: number + totalPages: number + }> getIndividualAchievements: (gameId: number) => Promise } diff --git a/src/common/types.ts b/src/common/types.ts index 5570a7e16..61196a469 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -840,13 +840,14 @@ export interface SummaryAchievement extends Achievement { isMinted: boolean } -export type AcheivementSort = 'ALPHA_A_TO_Z' | 'ALPHA_Z_TO_A' | 'SORT_BY_STATUS' +export type AchievementSort = 'ALPHA_A_TO_Z' | 'ALPHA_Z_TO_A' | 'SORT_BY_STATUS' export type AchievementFilter = 'ALL' | 'NEW' | 'MINTED' export interface GetAchievementsOptions { store: AchievementStore filter: AchievementFilter - sort: AcheivementSort + sort: AchievementSort page: number + pageSize: number } diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 434cbb2d9..be51e1ee1 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -11,154 +11,47 @@ import { import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' -import { Achievement } from 'common/types' -import { AchievementFilter } from '@hyperplay/ui/dist/components/AchievementSummaryTable' - -// TODO: Remove - When api has all the data -type AchievementData = Achievement & { id: string; mintedAchievementsCount: number; mintableAchievementsCount: number; totalAchievementsCount: number } - -// TODO: Remove - When api paginates -function paginate(array: AchievementData[], page: number, perPage: number) { - const start = (page - 1) * perPage; - const end = start + perPage; - return array.slice(start, end); -} +import { AchievementFilter, AchievementSort, SummaryAchievement } from 'common/types' const pageSize = 12 - -const testData = [ - { - achieved: 1, - apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - defaultvalue: 0, - description: 'Lose an unfinished Castle that is at least 95% complete.', - displayName: 'Castle of Doubt', - gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', - gameId: 813780, - gameName: 'Age of Empires II: Definitive Edition', - hidden: 0, - icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', - iconName: 'Castle of Doubt', - icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', - name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - id: 'id-1', - unlocktime: 1628474277, - mintableAchievementsCount: 40, - mintedAchievementsCount: 20, - totalAchievementsCount: 50, - }, - { - achieved: 1, - apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - defaultvalue: 0, - description: 'Lose an unfinished Castle that is at least 95% complete.', - displayName: 'Castle of Doubt', - gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', - gameId: 813780, - gameName: 'Age of Empires II: Definitive Edition', - hidden: 0, - icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', - iconName: 'Castle of Doubt', - icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', - name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - id: 'id-2', - unlocktime: 1628474277, - mintableAchievementsCount: 40, - mintedAchievementsCount: 20, - totalAchievementsCount: 50, - }, - { - achieved: 1, - apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - defaultvalue: 0, - description: 'Lose an unfinished Castle that is at least 95% complete.', - displayName: 'Castle of Doubt', - gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', - gameId: 813780, - gameName: 'Age of Empires II: Definitive Edition', - hidden: 0, - icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', - iconName: 'Castle of Doubt', - icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', - name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - id: 'id-3', - unlocktime: 1628474277, - mintableAchievementsCount: 40, - mintedAchievementsCount: 20, - totalAchievementsCount: 50, - }, - { - achieved: 1, - apiname: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - defaultvalue: 0, - description: 'Lose an unfinished Castle that is at least 95% complete.', - displayName: 'Castle of Doubt', - gameIconURL: 'e2b5a7beb58136b892e517cb93ae08b36065363c', - gameId: 813780, - gameName: 'Age of Empires II: Definitive Edition', - hidden: 0, - icon: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg', - iconName: 'Castle of Doubt', - icongray: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg', - name: 'ACHIEVEMENT_CASTLE_OF_DOUBT', - id: 'id-4', - unlocktime: 1628474277, - mintableAchievementsCount: 40, - mintedAchievementsCount: 20, - totalAchievementsCount: 50, - } -] +const achievementsSortOptions = [{ text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' }] as { text: string; value: AchievementSort }[] export default React.memo(function Achievements(): JSX.Element { - const achievementsSortOptions = [{ text: 'Alphabetically' }] const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) - const [activeFilter, setActiveFilter] = useState('all') - const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: AchievementData[] }>({ currentPage: 0, totalPages: 0, games: [] }) + const [activeFilter, setActiveFilter] = useState('ALL') + const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: SummaryAchievement[] }>({ currentPage: 0, totalPages: 0, games: [] }) const [achievementsToBeMinted, setAchievementsToBeMinted] = useState([]) const [isLoading, setIsLoading] = useState(false) const filteredGames = useMemo(() => { - if (activeFilter === 'minted') { - return achievementsData.games.filter((game) => game.mintedAchievementsCount > 0) + if (activeFilter === 'MINTED') { + return achievementsData.games.filter((game) => game.isMinted) } - if (activeFilter === 'new') { - return achievementsData.games.filter((game) => game.mintedAchievementsCount === 0) + if (activeFilter === 'NEW') { + return achievementsData.games.filter((game) => game.isNewAchievement) } return achievementsData.games }, [activeFilter, achievementsData]) useEffect(() => { const getAchievements = async () => { - // TODO: Remove - When api returns the correct data format - // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } - // const test = await window.api.getSummaryAchievements({ store: 'steam', filter: 'ALL', sort: 'ALPHA_A_TO_Z', page: 0 }) - const achievementApiData = { data: testData } - const { data } = achievementApiData - const totalPages = Math.ceil(data.length / pageSize) - setAchievementData({ currentPage: 0, totalPages, games: paginate(data, 1, pageSize) }) + const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', filter: activeFilter, sort: selectedSort.value, page: 1, pageSize }) + setAchievementData({ currentPage, totalPages, games: data }) } getAchievements() }, []) const handleNextPage = useCallback(async () => { - // TODO: Remove - When api returns the correct data format - // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } - const achievementApiData = { data: testData } - const { data } = achievementApiData - const totalPages = Math.ceil(data.length / pageSize) const nextPage = achievementsData.currentPage + 1 - setAchievementData({ currentPage: nextPage, totalPages, games: paginate(data, nextPage, 12) }) + const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', filter: activeFilter, sort: selectedSort.value, page: nextPage, pageSize }) + setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData]) const handlePrevPage = useCallback(async () => { - // TODO: Remove - When api returns the correct data format - // const achievementApiData = await window.api.getAchievements('hyperplay') as { data: AchievementData[] } - const achievementApiData = { data: testData } - const { data } = achievementApiData - const totalPages = Math.ceil(data.length / pageSize) - const previousPage = achievementsData.currentPage - 1 - setAchievementData({ currentPage: previousPage, totalPages, games: paginate(data, previousPage, 12) }) + const prevPage = achievementsData.currentPage - 1 + const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', filter: activeFilter, sort: selectedSort.value, page: prevPage, pageSize }) + setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData]) const handleAdd = useCallback((id: string) => { @@ -181,6 +74,12 @@ export default React.memo(function Achievements(): JSX.Element { return !walletStore.isConnected || isLoading }, [isLoading, walletStore.isConnected]) + const filter = useMemo(() => { + if (activeFilter === 'NEW') return 'new' + if (activeFilter === 'MINTED') return 'minted' + return 'all' + }, [activeFilter]) + return ( <> @@ -222,20 +121,22 @@ export default React.memo(function Achievements(): JSX.Element { className={`${styles.fullHeight}`} > { - const state = achievementsToBeMinted.includes(game.id) ? 'active' : 'default' + games={filteredGames.map((game, index) => { + // TODO: remove when there is a real id + const id = `${game.gameName}-${index}` + const state = achievementsToBeMinted.includes(id) ? 'active' : 'default' return ({ - id: game.id, + id, title: game.gameName, image: game.icon, mintableAchievementsCount: game.mintableAchievementsCount, - mintedAchievementsCount: game.mintedAchievementsCount, - totalAchievementsCount: game.totalAchievementsCount, - isNewAchievement: game.mintableAchievementsCount === 0, + mintedAchievementsCount: game.mintedAchievementCount, + totalAchievementsCount: game.totalAchievementCount, + isNewAchievement: game.isNewAchievement, state: walletStore.isConnected ? 'disabled' : state, ctaProps: { - onClick: () => handleAdd(game.id), + onClick: () => handleAdd(id), disabled: isDisabled } }) @@ -243,7 +144,10 @@ export default React.memo(function Achievements(): JSX.Element { sortProps={{ options: achievementsSortOptions, selected: selectedSort, - onItemChange: setSelectedSort + onItemChange: (sortOption) => { + const chosenItem = achievementsSortOptions.find((option) => option.text === sortOption.text) + if (chosenItem) setSelectedSort(chosenItem) + } }} paginationProps={{ currentPage: achievementsData.currentPage, @@ -252,8 +156,12 @@ export default React.memo(function Achievements(): JSX.Element { handlePrevPage, }} filterProps={{ - activeFilter, - setActiveFilter + activeFilter: filter, + setActiveFilter: (filter) => { + if (filter === 'new') return setActiveFilter('NEW') + if (filter === 'minted') return setActiveFilter('MINTED') + return setActiveFilter('ALL') + } }} mintButtonProps={{ onClick: handleMint, From abeab29bbda94f56647ae5dc4365d024ff9e1d69 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 10:44:07 -0600 Subject: [PATCH 013/106] chore: prettier --- public/summary_achievements_mock.json | 1458 +++++++++---------- src/frontend/screens/Achievements/index.tsx | 88 +- 2 files changed, 793 insertions(+), 753 deletions(-) diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index 97a5c5a3e..3f49f3df1 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -1,730 +1,730 @@ [ - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 293, - "mintedAchievementCount": 71, - "mintableAchievementsCount": 105, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 26, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 17, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 11, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 3, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 6, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 7, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 1, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 17, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 1, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 226, - "mintedAchievementCount": 21, - "mintableAchievementsCount": 52, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 322, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 13, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 6, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 69, - "mintedAchievementCount": 9, - "mintableAchievementsCount": 15, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 11, - "mintedAchievementCount": 11, - "mintableAchievementsCount": 11, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 15, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 5, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 8, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 2, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 15, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 10, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 23, - "mintedAchievementCount": 23, - "mintableAchievementsCount": 23, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 24, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 7, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 7, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 380, - "mintedAchievementCount": 60, - "mintableAchievementsCount": 61, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 184, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 6, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 6, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - } -] \ No newline at end of file + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", + "totalAchievementCount": 293, + "mintedAchievementCount": 71, + "mintableAchievementsCount": 105, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", + "totalAchievementCount": 26, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 17, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", + "totalAchievementCount": 11, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 3, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", + "totalAchievementCount": 6, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", + "totalAchievementCount": 7, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", + "totalAchievementCount": 1, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", + "totalAchievementCount": 17, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", + "totalAchievementCount": 1, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", + "totalAchievementCount": 226, + "mintedAchievementCount": 21, + "mintableAchievementsCount": 52, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", + "totalAchievementCount": 322, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 13, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", + "totalAchievementCount": 6, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", + "totalAchievementCount": 69, + "mintedAchievementCount": 9, + "mintableAchievementsCount": 15, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", + "totalAchievementCount": 11, + "mintedAchievementCount": 11, + "mintableAchievementsCount": 11, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", + "totalAchievementCount": 15, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 5, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", + "totalAchievementCount": 8, + "mintedAchievementCount": 4, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", + "totalAchievementCount": 15, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 10, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", + "totalAchievementCount": 23, + "mintedAchievementCount": 23, + "mintableAchievementsCount": 23, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", + "totalAchievementCount": 24, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", + "totalAchievementCount": 7, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", + "totalAchievementCount": 7, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", + "totalAchievementCount": 380, + "mintedAchievementCount": 60, + "mintableAchievementsCount": 61, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", + "totalAchievementCount": 184, + "mintedAchievementCount": 4, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", + "totalAchievementCount": 6, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", + "totalAchievementCount": 6, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + } +] diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index be51e1ee1..4835ee29e 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -11,16 +11,29 @@ import { import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' -import { AchievementFilter, AchievementSort, SummaryAchievement } from 'common/types' +import { + AchievementFilter, + AchievementSort, + SummaryAchievement +} from 'common/types' const pageSize = 12 -const achievementsSortOptions = [{ text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' }] as { text: string; value: AchievementSort }[] +const achievementsSortOptions = [ + { text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, + { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } +] as { text: string; value: AchievementSort }[] export default React.memo(function Achievements(): JSX.Element { const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [activeFilter, setActiveFilter] = useState('ALL') - const [achievementsData, setAchievementData] = useState<{ currentPage: number; totalPages: number; games: SummaryAchievement[] }>({ currentPage: 0, totalPages: 0, games: [] }) - const [achievementsToBeMinted, setAchievementsToBeMinted] = useState([]) + const [achievementsData, setAchievementData] = useState<{ + currentPage: number + totalPages: number + games: SummaryAchievement[] + }>({ currentPage: 0, totalPages: 0, games: [] }) + const [achievementsToBeMinted, setAchievementsToBeMinted] = useState< + string[] + >([]) const [isLoading, setIsLoading] = useState(false) const filteredGames = useMemo(() => { @@ -35,7 +48,14 @@ export default React.memo(function Achievements(): JSX.Element { useEffect(() => { const getAchievements = async () => { - const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', filter: activeFilter, sort: selectedSort.value, page: 1, pageSize }) + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: activeFilter, + sort: selectedSort.value, + page: 1, + pageSize + }) setAchievementData({ currentPage, totalPages, games: data }) } @@ -44,23 +64,42 @@ export default React.memo(function Achievements(): JSX.Element { const handleNextPage = useCallback(async () => { const nextPage = achievementsData.currentPage + 1 - const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', filter: activeFilter, sort: selectedSort.value, page: nextPage, pageSize }) + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: activeFilter, + sort: selectedSort.value, + page: nextPage, + pageSize + }) setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData]) const handlePrevPage = useCallback(async () => { const prevPage = achievementsData.currentPage - 1 - const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', filter: activeFilter, sort: selectedSort.value, page: prevPage, pageSize }) + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: activeFilter, + sort: selectedSort.value, + page: prevPage, + pageSize + }) setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData]) - const handleAdd = useCallback((id: string) => { - if (achievementsToBeMinted.includes(id)) { - setAchievementsToBeMinted((state) => state.filter((item) => item !== id)) - } else { - setAchievementsToBeMinted((state) => ([...state, id])) - } - }, [achievementsToBeMinted]) + const handleAdd = useCallback( + (id: string) => { + if (achievementsToBeMinted.includes(id)) { + setAchievementsToBeMinted((state) => + state.filter((item) => item !== id) + ) + } else { + setAchievementsToBeMinted((state) => [...state, id]) + } + }, + [achievementsToBeMinted] + ) const handleMint = useCallback(() => { setIsLoading(true) @@ -116,17 +155,16 @@ export default React.memo(function Achievements(): JSX.Element {
- + { // TODO: remove when there is a real id const id = `${game.gameName}-${index}` - const state = achievementsToBeMinted.includes(id) ? 'active' : 'default' + const state = achievementsToBeMinted.includes(id) + ? 'active' + : 'default' - return ({ + return { id, title: game.gameName, image: game.icon, @@ -139,13 +177,15 @@ export default React.memo(function Achievements(): JSX.Element { onClick: () => handleAdd(id), disabled: isDisabled } - }) + } })} sortProps={{ options: achievementsSortOptions, selected: selectedSort, onItemChange: (sortOption) => { - const chosenItem = achievementsSortOptions.find((option) => option.text === sortOption.text) + const chosenItem = achievementsSortOptions.find( + (option) => option.text === sortOption.text + ) if (chosenItem) setSelectedSort(chosenItem) } }} @@ -153,7 +193,7 @@ export default React.memo(function Achievements(): JSX.Element { currentPage: achievementsData.currentPage, totalPages: achievementsData.totalPages, handleNextPage, - handlePrevPage, + handlePrevPage }} filterProps={{ activeFilter: filter, @@ -165,7 +205,7 @@ export default React.memo(function Achievements(): JSX.Element { }} mintButtonProps={{ onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0, + disabled: isDisabled ?? achievementsToBeMinted.length === 0 }} /> From fbcc01ee6d55d2ff065b1e9517e9afa38963b034 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 12:54:32 -0600 Subject: [PATCH 014/106] feat: update achievements submodule --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 3b45092a1..a17776c1d 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 3b45092a12d2fe5dfb160797c55e8d7171f4778e +Subproject commit a17776c1d0fe46bebf0d0afa59edefb4e6980d4f From 570ad68948b5bbbf4c3b558817737aa58841047b Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 12:57:51 -0600 Subject: [PATCH 015/106] feat: update achievements api --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index a17776c1d..bcc582737 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit a17776c1d0fe46bebf0d0afa59edefb4e6980d4f +Subproject commit bcc582737fbacf2591cd188bcdbe983994b5fa04 From 267b7136ba181e7ff5ac5584b570ae68416e9274 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 15:01:27 -0600 Subject: [PATCH 016/106] feat: allow filters and sort to make api call --- src/frontend/screens/Achievements/index.tsx | 51 +++++++++++++-------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 4835ee29e..30983147a 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -36,16 +36,6 @@ export default React.memo(function Achievements(): JSX.Element { >([]) const [isLoading, setIsLoading] = useState(false) - const filteredGames = useMemo(() => { - if (activeFilter === 'MINTED') { - return achievementsData.games.filter((game) => game.isMinted) - } - if (activeFilter === 'NEW') { - return achievementsData.games.filter((game) => game.isNewAchievement) - } - return achievementsData.games - }, [activeFilter, achievementsData]) - useEffect(() => { const getAchievements = async () => { const { data, totalPages, currentPage } = @@ -73,7 +63,7 @@ export default React.memo(function Achievements(): JSX.Element { pageSize }) setAchievementData({ currentPage, totalPages, games: data }) - }, [achievementsData]) + }, [achievementsData, activeFilter, selectedSort]) const handlePrevPage = useCallback(async () => { const prevPage = achievementsData.currentPage - 1 @@ -86,7 +76,7 @@ export default React.memo(function Achievements(): JSX.Element { pageSize }) setAchievementData({ currentPage, totalPages, games: data }) - }, [achievementsData]) + }, [achievementsData, activeFilter, selectedSort]) const handleAdd = useCallback( (id: string) => { @@ -157,7 +147,7 @@ export default React.memo(function Achievements(): JSX.Element { { + games={achievementsData.games.map((game, index) => { // TODO: remove when there is a real id const id = `${game.gameName}-${index}` const state = achievementsToBeMinted.includes(id) @@ -182,11 +172,23 @@ export default React.memo(function Achievements(): JSX.Element { sortProps={{ options: achievementsSortOptions, selected: selectedSort, - onItemChange: (sortOption) => { + onItemChange: async (sortOption) => { const chosenItem = achievementsSortOptions.find( (option) => option.text === sortOption.text ) - if (chosenItem) setSelectedSort(chosenItem) + + if (chosenItem) { + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: activeFilter, + sort: chosenItem.value, + page: 1, + pageSize + }) + setSelectedSort(chosenItem) + setAchievementData({ currentPage, totalPages, games: data }) + } } }} paginationProps={{ @@ -197,10 +199,21 @@ export default React.memo(function Achievements(): JSX.Element { }} filterProps={{ activeFilter: filter, - setActiveFilter: (filter) => { - if (filter === 'new') return setActiveFilter('NEW') - if (filter === 'minted') return setActiveFilter('MINTED') - return setActiveFilter('ALL') + setActiveFilter: async (filter) => { + let newFilter = 'ALL' as AchievementFilter + if (filter === 'new') newFilter = 'NEW' + if (filter === 'minted') newFilter = 'MINTED' + + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: newFilter, + sort: selectedSort.value, + page: 1, + pageSize + }) + setActiveFilter(newFilter) + setAchievementData({ currentPage, totalPages, games: data }) } }} mintButtonProps={{ From ae3b2b92bc7a9f00e419fae0e64b9d768e095145 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 4 Oct 2023 15:24:04 -0600 Subject: [PATCH 017/106] chore: pull achievement layout out into parent route --- public/summary_achievements_mock.json | 86 ++++---- src/frontend/App.tsx | 14 +- .../{ => AchievementsLayout}/index.module.css | 0 .../Achievements/AchievementsLayout/index.tsx | 54 +++++ src/frontend/screens/Achievements/index.tsx | 199 +++++++----------- 5 files changed, 183 insertions(+), 170 deletions(-) rename src/frontend/screens/Achievements/{ => AchievementsLayout}/index.module.css (100%) create mode 100644 src/frontend/screens/Achievements/AchievementsLayout/index.tsx diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index 3f49f3df1..1814223da 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -14,8 +14,8 @@ "gameId": 730, "gameName": "Counter-Strike: Global Offensive", "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 293, - "mintedAchievementCount": 71, + "totalAchievementCount": 105, + "mintedAchievementCount": 105, "mintableAchievementsCount": 105, "isNewAchievement": true, "isMinted": true @@ -35,8 +35,8 @@ "gameId": 230410, "gameName": "Warframe", "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 26, - "mintedAchievementCount": 3, + "totalAchievementCount": 17, + "mintedAchievementCount": 17, "mintableAchievementsCount": 17, "isNewAchievement": true, "isMinted": true @@ -56,8 +56,8 @@ "gameId": 375230, "gameName": "Warhammer 40,000: Eternal Crusade", "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, + "totalAchievementCount": 4, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -77,7 +77,7 @@ "gameId": 444090, "gameName": "Paladins", "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 11, + "totalAchievementCount": 9, "mintedAchievementCount": 1, "mintableAchievementsCount": 3, "isNewAchievement": true, @@ -139,8 +139,8 @@ "gameId": 550650, "gameName": "Black Squad", "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 6, - "mintedAchievementCount": 6, + "totalAchievementCount": 9, + "mintedAchievementCount": 3, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -160,8 +160,8 @@ "gameId": 578080, "gameName": "PUBG: BATTLEGROUNDS", "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 7, - "mintedAchievementCount": 3, + "totalAchievementCount": 10, + "mintedAchievementCount": 2, "mintableAchievementsCount": 4, "isNewAchievement": true, "isMinted": true @@ -181,8 +181,8 @@ "gameId": 611500, "gameName": "Quake Champions", "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 1, - "mintedAchievementCount": 1, + "totalAchievementCount": 2, + "mintedAchievementCount": 0, "mintableAchievementsCount": 1, "isNewAchievement": true, "isMinted": true @@ -202,8 +202,8 @@ "gameId": 677620, "gameName": "Splitgate", "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 17, - "mintedAchievementCount": 3, + "totalAchievementCount": 7, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -243,7 +243,7 @@ "gameId": 681660, "gameName": "Bless Online", "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 1, + "totalAchievementCount": 4, "mintedAchievementCount": 0, "mintableAchievementsCount": 1, "isNewAchievement": true, @@ -264,8 +264,8 @@ "gameId": 714010, "gameName": "Aimlabs", "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 226, - "mintedAchievementCount": 21, + "totalAchievementCount": 119, + "mintedAchievementCount": 34, "mintableAchievementsCount": 52, "isNewAchievement": true, "isMinted": true @@ -285,8 +285,8 @@ "gameId": 723780, "gameName": "Modern Combat Versus", "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 322, - "mintedAchievementCount": 6, + "totalAchievementCount": 77, + "mintedAchievementCount": 9, "mintableAchievementsCount": 13, "isNewAchievement": true, "isMinted": true @@ -369,8 +369,8 @@ "gameId": 844870, "gameName": "KurtzPel", "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 6, - "mintedAchievementCount": 1, + "totalAchievementCount": 55, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -390,8 +390,8 @@ "gameId": 872200, "gameName": "Rogue Company", "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 69, - "mintedAchievementCount": 9, + "totalAchievementCount": 17, + "mintedAchievementCount": 14, "mintableAchievementsCount": 15, "isNewAchievement": true, "isMinted": true @@ -431,7 +431,7 @@ "gameId": 961440, "gameName": "Resident Evil 2 \"1-Shot Demo\"", "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 15, + "totalAchievementCount": 7, "mintedAchievementCount": 3, "mintableAchievementsCount": 5, "isNewAchievement": true, @@ -452,7 +452,7 @@ "gameName": "Hogwarts Legacy", "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", "totalAchievementCount": 8, - "mintedAchievementCount": 4, + "mintedAchievementCount": 1, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -472,7 +472,7 @@ "gameId": 1085660, "gameName": "Destiny 2", "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 2, + "totalAchievementCount": 7, "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, @@ -492,8 +492,8 @@ "gameId": 1091500, "gameName": "Cyberpunk 2077", "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 15, - "mintedAchievementCount": 1, + "totalAchievementCount": 13, + "mintedAchievementCount": 8, "mintableAchievementsCount": 10, "isNewAchievement": true, "isMinted": true @@ -513,8 +513,8 @@ "gameId": 1100990, "gameName": "Aimbeast", "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, + "totalAchievementCount": 6, + "mintedAchievementCount": 0, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -554,8 +554,8 @@ "gameId": 1196590, "gameName": "Resident Evil Village", "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 23, - "mintedAchievementCount": 23, + "totalAchievementCount": 26, + "mintedAchievementCount": 13, "mintableAchievementsCount": 23, "isNewAchievement": true, "isMinted": true @@ -575,8 +575,8 @@ "gameId": 1240440, "gameName": "Halo Infinite", "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 24, - "mintedAchievementCount": 3, + "totalAchievementCount": 11, + "mintedAchievementCount": 1, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -597,7 +597,7 @@ "gameName": "Street Fighter™ 6", "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", "totalAchievementCount": 7, - "mintedAchievementCount": 5, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -639,7 +639,7 @@ "gameName": "Age of Empires IV: Anniversary Edition", "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", "totalAchievementCount": 7, - "mintedAchievementCount": 2, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -659,8 +659,8 @@ "gameId": 1599340, "gameName": "Lost Ark", "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 380, - "mintedAchievementCount": 60, + "totalAchievementCount": 143, + "mintedAchievementCount": 51, "mintableAchievementsCount": 61, "isNewAchievement": true, "isMinted": true @@ -680,7 +680,7 @@ "gameId": 1675900, "gameName": "Warlander", "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 184, + "totalAchievementCount": 4, "mintedAchievementCount": 4, "mintableAchievementsCount": 4, "isNewAchievement": true, @@ -701,7 +701,7 @@ "gameId": 1816670, "gameName": "GUNDAM EVOLUTION", "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 6, + "totalAchievementCount": 4, "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, @@ -721,8 +721,8 @@ "gameId": 1888160, "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 6, - "mintedAchievementCount": 1, + "totalAchievementCount": 2, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true diff --git a/src/frontend/App.tsx b/src/frontend/App.tsx index 3d6e9215a..639018286 100644 --- a/src/frontend/App.tsx +++ b/src/frontend/App.tsx @@ -1,7 +1,7 @@ import React, { useContext } from 'react' import './App.css' -import { HashRouter, Navigate, Route, Routes } from 'react-router-dom' +import { HashRouter, Navigate, Outlet, Route, Routes } from 'react-router-dom' import Login from './screens/Login' import WebView from './screens/WebView' import { GamePage } from './screens/Game' @@ -30,6 +30,7 @@ import DownloadToastManager from './components/UI/DownloadToastManager' import TopNavBar from './components/UI/TopNavBar' import StoreNavHandler from './StoreNavHandler' import QaAuthHandler from './QaAuthHandler' +import AchievementsLayout from './screens/Achievements/AchievementsLayout' function App() { const { sidebarCollapsed, isSettingsModalOpen } = useContext(ContextProvider) @@ -59,7 +60,16 @@ function App() { element={} /> } /> - } /> + + + + } + > + } /> + } /> + +
+ + + + +
+
My Stores
+ + + + + + + + +

Link Store

+
+
+
+
+
+ + {children} + +
+
+ + ) +}) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 30983147a..a32054275 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,16 +1,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react' import walletStore from 'frontend/store/WalletStore' -import { - Background, - AchievementsInfo, - AchievementSummaryTable, - StoreRow, - Images -} from '@hyperplay/ui' -import { Flex, Grid } from '@mantine/core' - -import styles from './index.module.css' +import { AchievementSummaryTable } from '@hyperplay/ui' import { AchievementFilter, AchievementSort, @@ -110,120 +101,78 @@ export default React.memo(function Achievements(): JSX.Element { }, [activeFilter]) return ( - <> - -
- - - - -
-
My Stores
- - - - - - - - -

Link Store

-
-
-
-
-
- - { - // TODO: remove when there is a real id - const id = `${game.gameName}-${index}` - const state = achievementsToBeMinted.includes(id) - ? 'active' - : 'default' - - return { - id, - title: game.gameName, - image: game.icon, - mintableAchievementsCount: game.mintableAchievementsCount, - mintedAchievementsCount: game.mintedAchievementCount, - totalAchievementsCount: game.totalAchievementCount, - isNewAchievement: game.isNewAchievement, - state: walletStore.isConnected ? 'disabled' : state, - ctaProps: { - onClick: () => handleAdd(id), - disabled: isDisabled - } - } - })} - sortProps={{ - options: achievementsSortOptions, - selected: selectedSort, - onItemChange: async (sortOption) => { - const chosenItem = achievementsSortOptions.find( - (option) => option.text === sortOption.text - ) - - if (chosenItem) { - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store: 'steam', - filter: activeFilter, - sort: chosenItem.value, - page: 1, - pageSize - }) - setSelectedSort(chosenItem) - setAchievementData({ currentPage, totalPages, games: data }) - } - } - }} - paginationProps={{ - currentPage: achievementsData.currentPage, - totalPages: achievementsData.totalPages, - handleNextPage, - handlePrevPage - }} - filterProps={{ - activeFilter: filter, - setActiveFilter: async (filter) => { - let newFilter = 'ALL' as AchievementFilter - if (filter === 'new') newFilter = 'NEW' - if (filter === 'minted') newFilter = 'MINTED' - - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store: 'steam', - filter: newFilter, - sort: selectedSort.value, - page: 1, - pageSize - }) - setActiveFilter(newFilter) - setAchievementData({ currentPage, totalPages, games: data }) - } - }} - mintButtonProps={{ - onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0 - }} - /> - -
-
- + { + // TODO: remove when there is a real id + const id = `${game.gameName}-${index}` + const state = achievementsToBeMinted.includes(id) ? 'active' : 'default' + + return { + id, + title: game.gameName, + image: game.icon, + mintableAchievementsCount: game.mintableAchievementsCount, + mintedAchievementsCount: game.mintedAchievementCount, + totalAchievementsCount: game.totalAchievementCount, + isNewAchievement: game.isNewAchievement, + state: walletStore.isConnected ? 'disabled' : state, + ctaProps: { + onClick: () => handleAdd(id), + disabled: isDisabled + } + } + })} + sortProps={{ + options: achievementsSortOptions, + selected: selectedSort, + onItemChange: async (sortOption) => { + const chosenItem = achievementsSortOptions.find( + (option) => option.text === sortOption.text + ) + + if (chosenItem) { + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: activeFilter, + sort: chosenItem.value, + page: 1, + pageSize + }) + setSelectedSort(chosenItem) + setAchievementData({ currentPage, totalPages, games: data }) + } + } + }} + paginationProps={{ + currentPage: achievementsData.currentPage, + totalPages: achievementsData.totalPages, + handleNextPage, + handlePrevPage + }} + filterProps={{ + activeFilter: filter, + setActiveFilter: async (filter) => { + let newFilter = 'ALL' as AchievementFilter + if (filter === 'new') newFilter = 'NEW' + if (filter === 'minted') newFilter = 'MINTED' + + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: newFilter, + sort: selectedSort.value, + page: 1, + pageSize + }) + setActiveFilter(newFilter) + setAchievementData({ currentPage, totalPages, games: data }) + } + }} + mintButtonProps={{ + onClick: handleMint, + disabled: isDisabled ?? achievementsToBeMinted.length === 0 + }} + /> ) }) From 9ad290e09def5c8f404778a4c52af701ae212191 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 08:15:13 -0600 Subject: [PATCH 018/106] wip: add game achievements page --- package.json | 2 +- public/summary_achievements_mock.json | 94 ++++++------ src/frontend/App.tsx | 5 + .../GameAchievementDetails/index.tsx | 72 +++++++++ src/frontend/screens/Achievements/index.tsx | 138 ++++++++++-------- yarn.lock | 57 +++++++- 6 files changed, 253 insertions(+), 115 deletions(-) create mode 100644 src/frontend/screens/Achievements/GameAchievementDetails/index.tsx diff --git a/package.json b/package.json index 407009d52..9d1bdd0d8 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.20", + "@hyperplay/ui": "^0.1.21", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index 1814223da..dd8ce2ac1 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -14,8 +14,8 @@ "gameId": 730, "gameName": "Counter-Strike: Global Offensive", "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 105, - "mintedAchievementCount": 105, + "totalAchievementCount": 124, + "mintedAchievementCount": 93, "mintableAchievementsCount": 105, "isNewAchievement": true, "isMinted": true @@ -35,8 +35,8 @@ "gameId": 230410, "gameName": "Warframe", "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 17, - "mintedAchievementCount": 17, + "totalAchievementCount": 19, + "mintedAchievementCount": 14, "mintableAchievementsCount": 17, "isNewAchievement": true, "isMinted": true @@ -56,8 +56,8 @@ "gameId": 375230, "gameName": "Warhammer 40,000: Eternal Crusade", "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 4, - "mintedAchievementCount": 1, + "totalAchievementCount": 2, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -77,8 +77,8 @@ "gameId": 444090, "gameName": "Paladins", "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 9, - "mintedAchievementCount": 1, + "totalAchievementCount": 3, + "mintedAchievementCount": 3, "mintableAchievementsCount": 3, "isNewAchievement": true, "isMinted": true @@ -139,8 +139,8 @@ "gameId": 550650, "gameName": "Black Squad", "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 9, - "mintedAchievementCount": 3, + "totalAchievementCount": 51, + "mintedAchievementCount": 6, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -160,8 +160,8 @@ "gameId": 578080, "gameName": "PUBG: BATTLEGROUNDS", "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 10, - "mintedAchievementCount": 2, + "totalAchievementCount": 4, + "mintedAchievementCount": 4, "mintableAchievementsCount": 4, "isNewAchievement": true, "isMinted": true @@ -181,7 +181,7 @@ "gameId": 611500, "gameName": "Quake Champions", "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 2, + "totalAchievementCount": 4, "mintedAchievementCount": 0, "mintableAchievementsCount": 1, "isNewAchievement": true, @@ -243,8 +243,8 @@ "gameId": 681660, "gameName": "Bless Online", "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 4, - "mintedAchievementCount": 0, + "totalAchievementCount": 1, + "mintedAchievementCount": 1, "mintableAchievementsCount": 1, "isNewAchievement": true, "isMinted": true @@ -264,8 +264,8 @@ "gameId": 714010, "gameName": "Aimlabs", "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 119, - "mintedAchievementCount": 34, + "totalAchievementCount": 79, + "mintedAchievementCount": 41, "mintableAchievementsCount": 52, "isNewAchievement": true, "isMinted": true @@ -285,8 +285,8 @@ "gameId": 723780, "gameName": "Modern Combat Versus", "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 77, - "mintedAchievementCount": 9, + "totalAchievementCount": 13, + "mintedAchievementCount": 10, "mintableAchievementsCount": 13, "isNewAchievement": true, "isMinted": true @@ -369,7 +369,7 @@ "gameId": 844870, "gameName": "KurtzPel", "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 55, + "totalAchievementCount": 3, "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, @@ -390,8 +390,8 @@ "gameId": 872200, "gameName": "Rogue Company", "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 17, - "mintedAchievementCount": 14, + "totalAchievementCount": 64, + "mintedAchievementCount": 3, "mintableAchievementsCount": 15, "isNewAchievement": true, "isMinted": true @@ -410,8 +410,8 @@ "gameId": 883710, "gameName": "Resident Evil 2", "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 11, - "mintedAchievementCount": 11, + "totalAchievementCount": 13, + "mintedAchievementCount": 0, "mintableAchievementsCount": 11, "isNewAchievement": true, "isMinted": true @@ -431,8 +431,8 @@ "gameId": 961440, "gameName": "Resident Evil 2 \"1-Shot Demo\"", "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 7, - "mintedAchievementCount": 3, + "totalAchievementCount": 19, + "mintedAchievementCount": 1, "mintableAchievementsCount": 5, "isNewAchievement": true, "isMinted": true @@ -451,8 +451,8 @@ "gameId": 990080, "gameName": "Hogwarts Legacy", "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 8, - "mintedAchievementCount": 1, + "totalAchievementCount": 7, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -472,8 +472,8 @@ "gameId": 1085660, "gameName": "Destiny 2", "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 7, - "mintedAchievementCount": 1, + "totalAchievementCount": 2, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -492,8 +492,8 @@ "gameId": 1091500, "gameName": "Cyberpunk 2077", "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 13, - "mintedAchievementCount": 8, + "totalAchievementCount": 17, + "mintedAchievementCount": 2, "mintableAchievementsCount": 10, "isNewAchievement": true, "isMinted": true @@ -513,8 +513,8 @@ "gameId": 1100990, "gameName": "Aimbeast", "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 6, - "mintedAchievementCount": 0, + "totalAchievementCount": 30, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -554,8 +554,8 @@ "gameId": 1196590, "gameName": "Resident Evil Village", "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 26, - "mintedAchievementCount": 13, + "totalAchievementCount": 23, + "mintedAchievementCount": 23, "mintableAchievementsCount": 23, "isNewAchievement": true, "isMinted": true @@ -575,8 +575,8 @@ "gameId": 1240440, "gameName": "Halo Infinite", "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 11, - "mintedAchievementCount": 1, + "totalAchievementCount": 9, + "mintedAchievementCount": 3, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -597,7 +597,7 @@ "gameName": "Street Fighter™ 6", "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", "totalAchievementCount": 7, - "mintedAchievementCount": 7, + "mintedAchievementCount": 2, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -638,8 +638,8 @@ "gameId": 1466860, "gameName": "Age of Empires IV: Anniversary Edition", "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, + "totalAchievementCount": 10, + "mintedAchievementCount": 6, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -659,8 +659,8 @@ "gameId": 1599340, "gameName": "Lost Ark", "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 143, - "mintedAchievementCount": 51, + "totalAchievementCount": 61, + "mintedAchievementCount": 61, "mintableAchievementsCount": 61, "isNewAchievement": true, "isMinted": true @@ -680,7 +680,7 @@ "gameId": 1675900, "gameName": "Warlander", "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 4, + "totalAchievementCount": 9, "mintedAchievementCount": 4, "mintableAchievementsCount": 4, "isNewAchievement": true, @@ -702,7 +702,7 @@ "gameName": "GUNDAM EVOLUTION", "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", "totalAchievementCount": 4, - "mintedAchievementCount": 1, + "mintedAchievementCount": 0, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -721,8 +721,8 @@ "gameId": 1888160, "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, + "totalAchievementCount": 28, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true diff --git a/src/frontend/App.tsx b/src/frontend/App.tsx index 639018286..06633dcd7 100644 --- a/src/frontend/App.tsx +++ b/src/frontend/App.tsx @@ -31,6 +31,7 @@ import TopNavBar from './components/UI/TopNavBar' import StoreNavHandler from './StoreNavHandler' import QaAuthHandler from './QaAuthHandler' import AchievementsLayout from './screens/Achievements/AchievementsLayout' +import GameAchievementDetails from './screens/Achievements/GameAchievementDetails' function App() { const { sidebarCollapsed, isSettingsModalOpen } = useContext(ContextProvider) @@ -69,6 +70,10 @@ function App() { } > } /> + } + /> } /> { + const getAchievements = async () => { + const test = await window.api.getIndividualAchievements(Number(id)) + console.log(test) + } + + getAchievements() + }, []) + + return ( + <>{id} + // console.log('next page'), + // handlePrevPage: () => console.log('prev page') + // }} + // /> + ) +}) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index a32054275..12e9df77f 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,12 +1,14 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react' import walletStore from 'frontend/store/WalletStore' -import { AchievementSummaryTable } from '@hyperplay/ui' +import { AchievementCard, AchievementSummaryTable } from '@hyperplay/ui' import { AchievementFilter, AchievementSort, SummaryAchievement } from 'common/types' +import { NavLink } from 'react-router-dom' +import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' const pageSize = 12 const achievementsSortOptions = [ @@ -101,78 +103,88 @@ export default React.memo(function Achievements(): JSX.Element { }, [activeFilter]) return ( - { - // TODO: remove when there is a real id - const id = `${game.gameName}-${index}` - const state = achievementsToBeMinted.includes(id) ? 'active' : 'default' + <> + { + // TODO: remove when there is a real id + const id = `${game.gameName}-${index}` + const state = walletStore.isConnected + ? 'disabled' + : achievementsToBeMinted.includes(id) + ? 'active' + : 'default' - return { - id, - title: game.gameName, - image: game.icon, - mintableAchievementsCount: game.mintableAchievementsCount, - mintedAchievementsCount: game.mintedAchievementCount, - totalAchievementsCount: game.totalAchievementCount, - isNewAchievement: game.isNewAchievement, - state: walletStore.isConnected ? 'disabled' : state, - ctaProps: { - onClick: () => handleAdd(id), - disabled: isDisabled - } - } - })} - sortProps={{ - options: achievementsSortOptions, - selected: selectedSort, - onItemChange: async (sortOption) => { - const chosenItem = achievementsSortOptions.find( - (option) => option.text === sortOption.text + return ( + + handleAdd(id), + disabled: isDisabled + }} + /> + ) + })} + sortProps={{ + options: achievementsSortOptions, + selected: selectedSort, + onItemChange: async (sortOption) => { + const chosenItem = achievementsSortOptions.find( + (option) => option.text === sortOption.text + ) + + if (chosenItem) { + const { data, totalPages, currentPage } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: activeFilter, + sort: chosenItem.value, + page: 1, + pageSize + }) + setSelectedSort(chosenItem) + setAchievementData({ currentPage, totalPages, games: data }) + } + } + }} + paginationProps={{ + currentPage: achievementsData.currentPage, + totalPages: achievementsData.totalPages, + handleNextPage, + handlePrevPage + }} + filterProps={{ + activeFilter: filter, + setActiveFilter: async (filter) => { + let newFilter = 'ALL' as AchievementFilter + if (filter === 'new') newFilter = 'NEW' + if (filter === 'minted') newFilter = 'MINTED' - if (chosenItem) { const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ store: 'steam', - filter: activeFilter, - sort: chosenItem.value, + filter: newFilter, + sort: selectedSort.value, page: 1, pageSize }) - setSelectedSort(chosenItem) + setActiveFilter(newFilter) setAchievementData({ currentPage, totalPages, games: data }) } - } - }} - paginationProps={{ - currentPage: achievementsData.currentPage, - totalPages: achievementsData.totalPages, - handleNextPage, - handlePrevPage - }} - filterProps={{ - activeFilter: filter, - setActiveFilter: async (filter) => { - let newFilter = 'ALL' as AchievementFilter - if (filter === 'new') newFilter = 'NEW' - if (filter === 'minted') newFilter = 'MINTED' - - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store: 'steam', - filter: newFilter, - sort: selectedSort.value, - page: 1, - pageSize - }) - setActiveFilter(newFilter) - setAchievementData({ currentPage, totalPages, games: data }) - } - }} - mintButtonProps={{ - onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0 - }} - /> + }} + mintButtonProps={{ + onClick: handleMint, + disabled: isDisabled ?? achievementsToBeMinted.length === 0 + }} + /> + ) }) diff --git a/yarn.lock b/yarn.lock index 9e3216545..e42e6492e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,6 +1594,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== +"@fortawesome/fontawesome-common-types@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" + integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== + "@fortawesome/fontawesome-svg-core@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1601,6 +1606,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/fontawesome-svg-core@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz#37f4507d5ec645c8b50df6db14eced32a6f9be09" + integrity sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-brands-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" @@ -1615,6 +1627,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-regular-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz#aee79ed76ce5dd04931352f9d83700761b8b1b25" + integrity sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-solid-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz#8dcde48109354fd7a5ece8ea48d678bb91d4b5f0" @@ -1622,6 +1641,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-solid-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz#33a02c4cb6aa28abea7bc082a9626b7922099df4" + integrity sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/react-fontawesome@^0.1.18": version "0.1.19" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz#2b36917578596f31934e71f92b7cf9c425fd06e4" @@ -1629,6 +1655,13 @@ dependencies: prop-types "^15.8.1" +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1648,10 +1681,17 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/ui@^0.1.20": - version "0.1.20" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.20.tgz#ccb5d0e0c2d5ec8a844fc9b7b6dac0224df74142" - integrity sha512-vsI+QgPY6PTQn83Y42tg0/40IXLN27bLUxDSeY+iBa8NmK88WP90BkkQjA/FaT8u7H14CPCaWGNtP9BgGt6kHQ== +"@hyperplay/chains@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" + integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== + dependencies: + axios "^1.4.0" + +"@hyperplay/ui@^0.1.21": + version "0.1.21" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.21.tgz#235c6567c49a37a15ec9ea012f2ea12fa5a96690" + integrity sha512-+BngEguUyGYhQJjHVbQZV1Lawo2kGmBP6At6hKPKp0HW1sPuFkeZtKKtAP9VzV1zcsUVIbdY8n5BqDQB/aKckQ== "@ioredis/commands@^1.1.1": version "1.2.0" @@ -4507,6 +4547,15 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" + integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" From 8a8a4fa9f9cda61f883ea42c8b6cc9617cba5634 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 09:48:39 -0600 Subject: [PATCH 019/106] feat: add pagination and sorting to getIndividualAchievemnts --- public/summary_achievements_mock.json | 1458 ++++++++--------- src/common/typedefs/ipcBridge.d.ts | 9 +- src/common/types.ts | 17 + .../GameAchievementDetails/index.tsx | 130 +- src/frontend/screens/Achievements/index.tsx | 2 +- 5 files changed, 827 insertions(+), 789 deletions(-) diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index dd8ce2ac1..d88fff551 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -1,730 +1,730 @@ [ - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 124, - "mintedAchievementCount": 93, - "mintableAchievementsCount": 105, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 19, - "mintedAchievementCount": 14, - "mintableAchievementsCount": 17, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 3, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 3, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 51, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 4, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 4, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 1, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 79, - "mintedAchievementCount": 41, - "mintableAchievementsCount": 52, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 13, - "mintedAchievementCount": 10, - "mintableAchievementsCount": 13, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 3, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 64, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 15, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 13, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 11, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 19, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 5, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 17, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 10, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 30, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 23, - "mintedAchievementCount": 23, - "mintableAchievementsCount": 23, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 9, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 7, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 10, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 61, - "mintedAchievementCount": 61, - "mintableAchievementsCount": 61, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 9, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 4, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 28, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - } -] + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", + "totalAchievementCount": 1744, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 105, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", + "totalAchievementCount": 17, + "mintedAchievementCount": 17, + "mintableAchievementsCount": 17, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", + "totalAchievementCount": 3, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 3, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", + "totalAchievementCount": 6, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", + "totalAchievementCount": 8, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", + "totalAchievementCount": 3, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", + "totalAchievementCount": 2362, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", + "totalAchievementCount": 3, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", + "totalAchievementCount": 1207, + "mintedAchievementCount": 47, + "mintableAchievementsCount": 52, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", + "totalAchievementCount": 13, + "mintedAchievementCount": 13, + "mintableAchievementsCount": 13, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", + "totalAchievementCount": 16, + "mintedAchievementCount": 4, + "mintableAchievementsCount": 15, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", + "totalAchievementCount": 29, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 11, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", + "totalAchievementCount": 11, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 5, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", + "totalAchievementCount": 9, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", + "totalAchievementCount": 15, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 10, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", + "totalAchievementCount": 9, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", + "totalAchievementCount": 41, + "mintedAchievementCount": 8, + "mintableAchievementsCount": 23, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", + "totalAchievementCount": 7, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", + "totalAchievementCount": 100, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", + "totalAchievementCount": 2499, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", + "totalAchievementCount": 86, + "mintedAchievementCount": 39, + "mintableAchievementsCount": 61, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", + "totalAchievementCount": 694, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + } +] \ No newline at end of file diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index c6fbbf20f..115ee8424 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -205,7 +205,14 @@ interface HyperPlayAsyncIPCFunctions { currentPage: number totalPages: number }> - getIndividualAchievements: (gameId: number) => Promise + getIndividualAchievements: ( + options: GetIndividualAchievementsOptions + ) => Promise<{ + data: Achievement[] + currentPage: number + totalPages: number + }> + getGame: (gameId: number) => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { diff --git a/src/common/types.ts b/src/common/types.ts index 61196a469..a9533b705 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -1,3 +1,4 @@ +import { getIndividualAchievements } from './../backend/hyperplay-achievements/api' import { GOGCloudSavesLocation, GogInstallPlatform } from './types/gog' import { LegendaryInstallPlatform, GameMetadataInner } from './types/legendary' import { IpcRendererEvent } from 'electron' @@ -851,3 +852,19 @@ export interface GetAchievementsOptions { page: number pageSize: number } + +export interface Game { + id: number + name: string + tags: string[] + totalAchievementCount: number + mintedAchievementCount: number + mintableAchievementsCount: number +} + +export interface GetIndividualAchievementsOptions { + gameId: number + sort: AchievementSort + page: number + pageSize: number +} diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index b19981243..21f0e1b0d 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,72 +1,86 @@ -import React, { useEffect } from 'react' +import { GameAchievements } from '@hyperplay/ui' +import { Achievement, Game } from 'common/types' +import React, { useCallback, useEffect, useState } from 'react' import { useParams } from 'react-router-dom' +import { achievementsSortOptions } from '..' + +const pageSize = 6 + +function isTimestampInPast(unixTimestamp: number) { + const currentTime = new Date().getTime(); + const timestampInMilliseconds = unixTimestamp * 1000; // Convert to milliseconds + + return timestampInMilliseconds < currentTime; +} + export default React.memo(function GameAchievementDetails(): JSX.Element { const { id } = useParams() + const [game, setGame] = useState() + const [achievementsData, setAchievementData] = useState<{data: Achievement[]; currentPage: number; totalPages: number }>({ data: [], currentPage: 0, totalPages: 0 }) + const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) + useEffect(() => { const getAchievements = async () => { - const test = await window.api.getIndividualAchievements(Number(id)) - console.log(test) + const gameData = await window.api.getGame(Number(id)) + setGame(gameData) + + const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), sort: selectedSort.value, page: 1, pageSize }) + setAchievementData(achievements) } getAchievements() }, []) + const handleNextPage = useCallback(async () => { + const nextPage = achievementsData.currentPage + 1 + const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), sort: selectedSort.value, page: nextPage, pageSize }) + setAchievementData(achievements) + }, [achievementsData, selectedSort]) + + const handlePrevPage = useCallback(async () => { + const prevPage = achievementsData.currentPage - 1 + const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), sort: selectedSort.value, page: prevPage, pageSize }) + setAchievementData(achievements) + }, [achievementsData, selectedSort]) + + if (!game) return <> + return ( - <>{id} - // console.log('next page'), - // handlePrevPage: () => console.log('prev page') - // }} - // /> + ({ id: '', title: achievement.displayName, description: achievement.description, image: achievement.icon, isLocked: !isTimestampInPast(achievement.unlocktime) }))} + sortProps={{ + options: achievementsSortOptions, + selected: selectedSort, + onItemChange: async (sortOption) => { + const chosenItem = achievementsSortOptions.find( + (option) => option.text === sortOption.text + ) + + if (chosenItem) { + const { data, totalPages, currentPage } = await window.api.getIndividualAchievements({ gameId: Number(id), sort: chosenItem.value, page: 1, pageSize }) + setSelectedSort(chosenItem) + setAchievementData({ currentPage, totalPages, data }) + } + } + }} + paginationProps={{ + currentPage: achievementsData.currentPage, + totalPages: achievementsData.totalPages, + handleNextPage, + handlePrevPage + }} + /> ) }) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 12e9df77f..e8dc0f7ce 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -11,7 +11,7 @@ import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' const pageSize = 12 -const achievementsSortOptions = [ +export const achievementsSortOptions = [ { text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } ] as { text: string; value: AchievementSort }[] From 399209cf7b88e4d64db67cc2dee65c20a5b24375 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 10:08:20 -0600 Subject: [PATCH 020/106] feat: add data for achievement stats --- public/summary_achievements_mock.json | 80 +++++++++---------- src/common/typedefs/ipcBridge.d.ts | 1 + src/common/types.ts | 6 ++ .../Achievements/AchievementsLayout/index.tsx | 22 ++++- 4 files changed, 65 insertions(+), 44 deletions(-) diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index d88fff551..800086804 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -14,8 +14,8 @@ "gameId": 730, "gameName": "Counter-Strike: Global Offensive", "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 1744, - "mintedAchievementCount": 0, + "totalAchievementCount": 145, + "mintedAchievementCount": 58, "mintableAchievementsCount": 105, "isNewAchievement": true, "isMinted": true @@ -35,8 +35,8 @@ "gameId": 230410, "gameName": "Warframe", "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 17, - "mintedAchievementCount": 17, + "totalAchievementCount": 27, + "mintedAchievementCount": 11, "mintableAchievementsCount": 17, "isNewAchievement": true, "isMinted": true @@ -57,7 +57,7 @@ "gameName": "Warhammer 40,000: Eternal Crusade", "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", "totalAchievementCount": 2, - "mintedAchievementCount": 1, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -78,7 +78,7 @@ "gameName": "Paladins", "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", "totalAchievementCount": 3, - "mintedAchievementCount": 3, + "mintedAchievementCount": 0, "mintableAchievementsCount": 3, "isNewAchievement": true, "isMinted": true @@ -139,7 +139,7 @@ "gameId": 550650, "gameName": "Black Squad", "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 6, + "totalAchievementCount": 18, "mintedAchievementCount": 0, "mintableAchievementsCount": 6, "isNewAchievement": true, @@ -160,7 +160,7 @@ "gameId": 578080, "gameName": "PUBG: BATTLEGROUNDS", "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 8, + "totalAchievementCount": 6, "mintedAchievementCount": 0, "mintableAchievementsCount": 4, "isNewAchievement": true, @@ -181,7 +181,7 @@ "gameId": 611500, "gameName": "Quake Champions", "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 3, + "totalAchievementCount": 2, "mintedAchievementCount": 1, "mintableAchievementsCount": 1, "isNewAchievement": true, @@ -202,8 +202,8 @@ "gameId": 677620, "gameName": "Splitgate", "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 2362, - "mintedAchievementCount": 3, + "totalAchievementCount": 7, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -243,7 +243,7 @@ "gameId": 681660, "gameName": "Bless Online", "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 3, + "totalAchievementCount": 1, "mintedAchievementCount": 1, "mintableAchievementsCount": 1, "isNewAchievement": true, @@ -264,8 +264,8 @@ "gameId": 714010, "gameName": "Aimlabs", "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 1207, - "mintedAchievementCount": 47, + "totalAchievementCount": 52, + "mintedAchievementCount": 52, "mintableAchievementsCount": 52, "isNewAchievement": true, "isMinted": true @@ -390,8 +390,8 @@ "gameId": 872200, "gameName": "Rogue Company", "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 16, - "mintedAchievementCount": 4, + "totalAchievementCount": 93, + "mintedAchievementCount": 5, "mintableAchievementsCount": 15, "isNewAchievement": true, "isMinted": true @@ -410,8 +410,8 @@ "gameId": 883710, "gameName": "Resident Evil 2", "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 29, - "mintedAchievementCount": 7, + "totalAchievementCount": 11, + "mintedAchievementCount": 11, "mintableAchievementsCount": 11, "isNewAchievement": true, "isMinted": true @@ -431,8 +431,8 @@ "gameId": 961440, "gameName": "Resident Evil 2 \"1-Shot Demo\"", "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 11, - "mintedAchievementCount": 3, + "totalAchievementCount": 7, + "mintedAchievementCount": 1, "mintableAchievementsCount": 5, "isNewAchievement": true, "isMinted": true @@ -452,7 +452,7 @@ "gameName": "Hogwarts Legacy", "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", "totalAchievementCount": 9, - "mintedAchievementCount": 5, + "mintedAchievementCount": 0, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -492,8 +492,8 @@ "gameId": 1091500, "gameName": "Cyberpunk 2077", "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 15, - "mintedAchievementCount": 3, + "totalAchievementCount": 18, + "mintedAchievementCount": 8, "mintableAchievementsCount": 10, "isNewAchievement": true, "isMinted": true @@ -513,8 +513,8 @@ "gameId": 1100990, "gameName": "Aimbeast", "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 9, - "mintedAchievementCount": 2, + "totalAchievementCount": 2, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -554,8 +554,8 @@ "gameId": 1196590, "gameName": "Resident Evil Village", "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 41, - "mintedAchievementCount": 8, + "totalAchievementCount": 23, + "mintedAchievementCount": 11, "mintableAchievementsCount": 23, "isNewAchievement": true, "isMinted": true @@ -575,8 +575,8 @@ "gameId": 1240440, "gameName": "Halo Infinite", "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 7, - "mintedAchievementCount": 5, + "totalAchievementCount": 8, + "mintedAchievementCount": 4, "mintableAchievementsCount": 6, "isNewAchievement": true, "isMinted": true @@ -596,8 +596,8 @@ "gameId": 1364780, "gameName": "Street Fighter™ 6", "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 100, - "mintedAchievementCount": 3, + "totalAchievementCount": 7, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -638,8 +638,8 @@ "gameId": 1466860, "gameName": "Age of Empires IV: Anniversary Edition", "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 2499, - "mintedAchievementCount": 6, + "totalAchievementCount": 12, + "mintedAchievementCount": 4, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": true @@ -659,8 +659,8 @@ "gameId": 1599340, "gameName": "Lost Ark", "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 86, - "mintedAchievementCount": 39, + "totalAchievementCount": 61, + "mintedAchievementCount": 61, "mintableAchievementsCount": 61, "isNewAchievement": true, "isMinted": true @@ -680,8 +680,8 @@ "gameId": 1675900, "gameName": "Warlander", "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 694, - "mintedAchievementCount": 0, + "totalAchievementCount": 5, + "mintedAchievementCount": 4, "mintableAchievementsCount": 4, "isNewAchievement": true, "isMinted": true @@ -702,7 +702,7 @@ "gameName": "GUNDAM EVOLUTION", "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", "totalAchievementCount": 2, - "mintedAchievementCount": 1, + "mintedAchievementCount": 2, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true @@ -721,8 +721,8 @@ "gameId": 1888160, "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 2, - "mintedAchievementCount": 1, + "totalAchievementCount": 26, + "mintedAchievementCount": 0, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": true diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 115ee8424..b86a32c47 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -213,6 +213,7 @@ interface HyperPlayAsyncIPCFunctions { totalPages: number }> getGame: (gameId: number) => Promise + getAchievementsStats: (store: AchievementStore) => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { diff --git a/src/common/types.ts b/src/common/types.ts index a9533b705..680697f42 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -868,3 +868,9 @@ export interface GetIndividualAchievementsOptions { page: number pageSize: number } +export interface AchievementsStats { + newAchievements: number + mintedAchievements: number + totalAchievements: number + totalGames: number +} diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 5b368c7d7..1a9350fae 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -1,4 +1,4 @@ -import React, { PropsWithChildren } from 'react' +import React, { PropsWithChildren, useEffect, useState } from 'react' import { Background, AchievementsInfo, StoreRow, Images } from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' @@ -8,6 +8,20 @@ import styles from './index.module.css' export default React.memo(function AchievementsLayout({ children }: PropsWithChildren): JSX.Element { + const [stats, setStats] = useState({ totalNewAchievements: 0, + totalMintedAchievements: 0, + totalAchievements: 0, + totalGames: 0}) + + useEffect(() => { + const getStats = async () => { + const stats = await window.api.getAchievementsStats('steam') + setStats(stats) + } + + getStats() + }, []) + return ( <> @@ -20,9 +34,9 @@ export default React.memo(function AchievementsLayout({ className={`${styles.fullHeight}`} >
My Stores
From f78e335d29442d8fa5277b90a12f7eade173d2f6 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 10:19:34 -0600 Subject: [PATCH 021/106] chore: prettier --- public/summary_achievements_mock.json | 1458 ++++++++--------- .../Achievements/AchievementsLayout/index.tsx | 6 +- .../GameAchievementDetails/index.tsx | 51 +- 3 files changed, 774 insertions(+), 741 deletions(-) diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index 800086804..95056b000 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -1,730 +1,730 @@ [ - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 145, - "mintedAchievementCount": 58, - "mintableAchievementsCount": 105, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 27, - "mintedAchievementCount": 11, - "mintableAchievementsCount": 17, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 3, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 3, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 18, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 6, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 2, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 1, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 52, - "mintedAchievementCount": 52, - "mintableAchievementsCount": 52, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 13, - "mintedAchievementCount": 13, - "mintableAchievementsCount": 13, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 93, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 15, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 11, - "mintedAchievementCount": 11, - "mintableAchievementsCount": 11, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 7, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 5, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 9, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 18, - "mintedAchievementCount": 8, - "mintableAchievementsCount": 10, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 2, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 23, - "mintedAchievementCount": 11, - "mintableAchievementsCount": 23, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 8, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 12, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 61, - "mintedAchievementCount": 61, - "mintableAchievementsCount": 61, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 5, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 26, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - } -] \ No newline at end of file + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", + "totalAchievementCount": 247, + "mintedAchievementCount": 56, + "mintableAchievementsCount": 105, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", + "totalAchievementCount": 18, + "mintedAchievementCount": 15, + "mintableAchievementsCount": 17, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", + "totalAchievementCount": 13, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", + "totalAchievementCount": 9, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 3, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", + "totalAchievementCount": 7, + "mintedAchievementCount": 4, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", + "totalAchievementCount": 9, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", + "totalAchievementCount": 2, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", + "totalAchievementCount": 26, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", + "totalAchievementCount": 20, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 1, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", + "totalAchievementCount": 52, + "mintedAchievementCount": 52, + "mintableAchievementsCount": 52, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", + "totalAchievementCount": 13, + "mintedAchievementCount": 13, + "mintableAchievementsCount": 13, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", + "totalAchievementCount": 15, + "mintedAchievementCount": 15, + "mintableAchievementsCount": 15, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", + "totalAchievementCount": 58, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 11, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", + "totalAchievementCount": 8, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 5, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", + "totalAchievementCount": 7, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", + "totalAchievementCount": 12, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", + "totalAchievementCount": 15, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 10, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", + "totalAchievementCount": 93, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 23, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", + "totalAchievementCount": 12, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", + "totalAchievementCount": 10, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", + "totalAchievementCount": 3, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", + "totalAchievementCount": 15, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", + "totalAchievementCount": 126, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 61, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", + "totalAchievementCount": 15, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": true + } +] diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 1a9350fae..9d548de92 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -8,10 +8,12 @@ import styles from './index.module.css' export default React.memo(function AchievementsLayout({ children }: PropsWithChildren): JSX.Element { - const [stats, setStats] = useState({ totalNewAchievements: 0, + const [stats, setStats] = useState({ + totalNewAchievements: 0, totalMintedAchievements: 0, totalAchievements: 0, - totalGames: 0}) + totalGames: 0 + }) useEffect(() => { const getStats = async () => { diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 21f0e1b0d..2c3f5e289 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -7,17 +7,20 @@ import { achievementsSortOptions } from '..' const pageSize = 6 function isTimestampInPast(unixTimestamp: number) { - const currentTime = new Date().getTime(); - const timestampInMilliseconds = unixTimestamp * 1000; // Convert to milliseconds + const currentTime = new Date().getTime() + const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds - return timestampInMilliseconds < currentTime; + return timestampInMilliseconds < currentTime } - export default React.memo(function GameAchievementDetails(): JSX.Element { const { id } = useParams() const [game, setGame] = useState() - const [achievementsData, setAchievementData] = useState<{data: Achievement[]; currentPage: number; totalPages: number }>({ data: [], currentPage: 0, totalPages: 0 }) + const [achievementsData, setAchievementData] = useState<{ + data: Achievement[] + currentPage: number + totalPages: number + }>({ data: [], currentPage: 0, totalPages: 0 }) const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) useEffect(() => { @@ -25,7 +28,12 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const gameData = await window.api.getGame(Number(id)) setGame(gameData) - const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), sort: selectedSort.value, page: 1, pageSize }) + const achievements = await window.api.getIndividualAchievements({ + gameId: Number(id), + sort: selectedSort.value, + page: 1, + pageSize + }) setAchievementData(achievements) } @@ -34,13 +42,23 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const handleNextPage = useCallback(async () => { const nextPage = achievementsData.currentPage + 1 - const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), sort: selectedSort.value, page: nextPage, pageSize }) + const achievements = await window.api.getIndividualAchievements({ + gameId: Number(id), + sort: selectedSort.value, + page: nextPage, + pageSize + }) setAchievementData(achievements) }, [achievementsData, selectedSort]) const handlePrevPage = useCallback(async () => { const prevPage = achievementsData.currentPage - 1 - const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), sort: selectedSort.value, page: prevPage, pageSize }) + const achievements = await window.api.getIndividualAchievements({ + gameId: Number(id), + sort: selectedSort.value, + page: prevPage, + pageSize + }) setAchievementData(achievements) }, [achievementsData, selectedSort]) @@ -59,7 +77,14 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { mintedAchievementsCount={game.mintedAchievementCount} totalAchievementsCount={game.totalAchievementCount} mintableAchievementsCount={game.mintableAchievementsCount} - achievements={achievementsData.data.map(achievement => ({ id: '', title: achievement.displayName, description: achievement.description, image: achievement.icon, isLocked: !isTimestampInPast(achievement.unlocktime) }))} + achievements={achievementsData.data.map((achievement, index) => ({ + // TODO: remove when there is a real id + id: `${index}`, + title: achievement.displayName, + description: achievement.description, + image: achievement.icon, + isLocked: !isTimestampInPast(achievement.unlocktime) + }))} sortProps={{ options: achievementsSortOptions, selected: selectedSort, @@ -69,7 +94,13 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { ) if (chosenItem) { - const { data, totalPages, currentPage } = await window.api.getIndividualAchievements({ gameId: Number(id), sort: chosenItem.value, page: 1, pageSize }) + const { data, totalPages, currentPage } = + await window.api.getIndividualAchievements({ + gameId: Number(id), + sort: chosenItem.value, + page: 1, + pageSize + }) setSelectedSort(chosenItem) setAchievementData({ currentPage, totalPages, data }) } From 1d0d93435360aec8d9caa211dc38dda6b217bbb5 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 12:26:23 -0600 Subject: [PATCH 022/106] feat: allow mint selection to persist across achievement pages --- src/common/typedefs/ipcBridge.d.ts | 1 + .../Achievements/AchievementsLayout/index.tsx | 5 +- .../GameAchievementDetails/index.tsx | 21 +++++- .../Achievements/MintAchievements/index.tsx | 67 +++++++++++++++++++ src/frontend/screens/Achievements/index.tsx | 41 +++++------- 5 files changed, 104 insertions(+), 31 deletions(-) create mode 100644 src/frontend/screens/Achievements/MintAchievements/index.tsx diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index b86a32c47..73066890f 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -214,6 +214,7 @@ interface HyperPlayAsyncIPCFunctions { }> getGame: (gameId: number) => Promise getAchievementsStats: (store: AchievementStore) => Promise + getFreeMints: () => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 9d548de92..aa9e5cd8d 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -4,6 +4,7 @@ import { Background, AchievementsInfo, StoreRow, Images } from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' +import { MintAchievementsProvider } from '../MintAchievements' export default React.memo(function AchievementsLayout({ children @@ -25,7 +26,7 @@ export default React.memo(function AchievementsLayout({ }, []) return ( - <> +
@@ -65,6 +66,6 @@ export default React.memo(function AchievementsLayout({
- +
) }) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 2c3f5e289..85e0a95b5 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,8 +1,10 @@ import { GameAchievements } from '@hyperplay/ui' import { Achievement, Game } from 'common/types' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' +import { useMintAchievements } from '../MintAchievements' +import walletStore from 'frontend/store/WalletStore' const pageSize = 6 @@ -22,6 +24,8 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { totalPages: number }>({ data: [], currentPage: 0, totalPages: 0 }) const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) + const [freeMints, setFreeMints] = useState(0) + const { achievementsToBeMinted, handleMint, isLoading } = useMintAchievements() useEffect(() => { const getAchievements = async () => { @@ -35,6 +39,9 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { pageSize }) setAchievementData(achievements) + + const freeMintsData = await window.api.getFreeMints() + setFreeMints(freeMintsData) } getAchievements() @@ -62,13 +69,17 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { setAchievementData(achievements) }, [achievementsData, selectedSort]) + const isDisabled = useMemo(() => { + return !walletStore.isConnected || isLoading + }, [isLoading, walletStore.isConnected]) + if (!game) return <> return ( ) }) diff --git a/src/frontend/screens/Achievements/MintAchievements/index.tsx b/src/frontend/screens/Achievements/MintAchievements/index.tsx new file mode 100644 index 000000000..89f60d9d8 --- /dev/null +++ b/src/frontend/screens/Achievements/MintAchievements/index.tsx @@ -0,0 +1,67 @@ +import React, { createContext, useContext, ReactNode, useState, useMemo, useCallback } from 'react'; + +// Define the context type +interface MintAchievementsType { + achievementsToBeMinted: string[]; // Define the type of your context value + toggleAchievement: (id: string) => void; + handleMint: () => void; + isLoading: boolean; +} + +// Create the context with an initial value +const MintAchievements = createContext(undefined); + +// Define a provider component +interface MintAchievementsProviderProps { + children: ReactNode; +} + +const MintAchievementsProvider: React.FC = ({ children }) => { + const [achievementsToBeMinted, setAchievementsToBeMinted] = useState([]) + const [isLoading, setIsLoading] = useState(false) + + const toggleAchievement = useCallback( + (id: string) => { + console.log('toggleAchievement', id) + if (achievementsToBeMinted.includes(id)) { + setAchievementsToBeMinted((state) => + state.filter((item) => item !== id) + ) + } else { + setAchievementsToBeMinted((state) => [...state, id]) + } + }, + [achievementsToBeMinted] + ) + + const handleMint = useCallback(() => { + setIsLoading(true) + setTimeout(() => { + setIsLoading(false) + setAchievementsToBeMinted([]) + }, 3000) + }, [achievementsToBeMinted]) + + const value = useMemo(() => { + return { achievementsToBeMinted, toggleAchievement, handleMint, isLoading } + }, [achievementsToBeMinted, toggleAchievement, handleMint, isLoading]) + + return ( + + {children} + + ); +}; + +// Define a custom hook to access the context value +const useMintAchievements = () => { + const context = useContext(MintAchievements); + + if (context === undefined) { + throw new Error('useMintAchievements must be used within a MintAchievementsProvider'); + } + + return context; +}; + +export { MintAchievementsProvider, useMintAchievements }; diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index e8dc0f7ce..50d2e93ab 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -9,6 +9,7 @@ import { } from 'common/types' import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' +import { useMintAchievements } from './MintAchievements' const pageSize = 12 export const achievementsSortOptions = [ @@ -24,10 +25,9 @@ export default React.memo(function Achievements(): JSX.Element { totalPages: number games: SummaryAchievement[] }>({ currentPage: 0, totalPages: 0, games: [] }) - const [achievementsToBeMinted, setAchievementsToBeMinted] = useState< - string[] - >([]) - const [isLoading, setIsLoading] = useState(false) + const [freeMints, setFreeMints] = useState(0) + + const { achievementsToBeMinted, toggleAchievement, isLoading, handleMint } = useMintAchievements() useEffect(() => { const getAchievements = async () => { @@ -40,6 +40,9 @@ export default React.memo(function Achievements(): JSX.Element { pageSize }) setAchievementData({ currentPage, totalPages, games: data }) + + const freeMintsData = await window.api.getFreeMints() + setFreeMints(freeMintsData) } getAchievements() @@ -71,27 +74,6 @@ export default React.memo(function Achievements(): JSX.Element { setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData, activeFilter, selectedSort]) - const handleAdd = useCallback( - (id: string) => { - if (achievementsToBeMinted.includes(id)) { - setAchievementsToBeMinted((state) => - state.filter((item) => item !== id) - ) - } else { - setAchievementsToBeMinted((state) => [...state, id]) - } - }, - [achievementsToBeMinted] - ) - - const handleMint = useCallback(() => { - setIsLoading(true) - setTimeout(() => { - setIsLoading(false) - setAchievementsToBeMinted([]) - }, 3000) - }, [achievementsToBeMinted]) - const isDisabled = useMemo(() => { return !walletStore.isConnected || isLoading }, [isLoading, walletStore.isConnected]) @@ -126,7 +108,10 @@ export default React.memo(function Achievements(): JSX.Element { isNewAchievement={game.isNewAchievement} state={state as StatusIconState} ctaProps={{ - onClick: () => handleAdd(id), + onClick: (e) => { + e.preventDefault() + toggleAchievement(id) + }, disabled: isDisabled }} /> @@ -184,6 +169,10 @@ export default React.memo(function Achievements(): JSX.Element { onClick: handleMint, disabled: isDisabled ?? achievementsToBeMinted.length === 0 }} + achievementNavProps={{ + freeMints, + basketAmount: achievementsToBeMinted.length + }} /> ) From cdfc7461847baf2d45da115d2bfe9e8af73d3c69 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 12:29:42 -0600 Subject: [PATCH 023/106] fix: prettir --- .../GameAchievementDetails/index.tsx | 3 +- .../Achievements/MintAchievements/index.tsx | 47 ++++++++++++------- src/frontend/screens/Achievements/index.tsx | 3 +- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 85e0a95b5..beeb0ba91 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -25,7 +25,8 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }>({ data: [], currentPage: 0, totalPages: 0 }) const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [freeMints, setFreeMints] = useState(0) - const { achievementsToBeMinted, handleMint, isLoading } = useMintAchievements() + const { achievementsToBeMinted, handleMint, isLoading } = + useMintAchievements() useEffect(() => { const getAchievements = async () => { diff --git a/src/frontend/screens/Achievements/MintAchievements/index.tsx b/src/frontend/screens/Achievements/MintAchievements/index.tsx index 89f60d9d8..0c9c2c736 100644 --- a/src/frontend/screens/Achievements/MintAchievements/index.tsx +++ b/src/frontend/screens/Achievements/MintAchievements/index.tsx @@ -1,23 +1,36 @@ -import React, { createContext, useContext, ReactNode, useState, useMemo, useCallback } from 'react'; +import React, { + createContext, + useContext, + ReactNode, + useState, + useMemo, + useCallback +} from 'react' // Define the context type interface MintAchievementsType { - achievementsToBeMinted: string[]; // Define the type of your context value - toggleAchievement: (id: string) => void; - handleMint: () => void; - isLoading: boolean; + achievementsToBeMinted: string[] // Define the type of your context value + toggleAchievement: (id: string) => void + handleMint: () => void + isLoading: boolean } // Create the context with an initial value -const MintAchievements = createContext(undefined); +const MintAchievements = createContext( + undefined +) // Define a provider component interface MintAchievementsProviderProps { - children: ReactNode; + children: ReactNode } -const MintAchievementsProvider: React.FC = ({ children }) => { - const [achievementsToBeMinted, setAchievementsToBeMinted] = useState([]) +const MintAchievementsProvider: React.FC = ({ + children +}) => { + const [achievementsToBeMinted, setAchievementsToBeMinted] = useState< + string[] + >([]) const [isLoading, setIsLoading] = useState(false) const toggleAchievement = useCallback( @@ -50,18 +63,20 @@ const MintAchievementsProvider: React.FC = ({ chi {children} - ); -}; + ) +} // Define a custom hook to access the context value const useMintAchievements = () => { - const context = useContext(MintAchievements); + const context = useContext(MintAchievements) if (context === undefined) { - throw new Error('useMintAchievements must be used within a MintAchievementsProvider'); + throw new Error( + 'useMintAchievements must be used within a MintAchievementsProvider' + ) } - return context; -}; + return context +} -export { MintAchievementsProvider, useMintAchievements }; +export { MintAchievementsProvider, useMintAchievements } diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 50d2e93ab..dbcd87db2 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -27,7 +27,8 @@ export default React.memo(function Achievements(): JSX.Element { }>({ currentPage: 0, totalPages: 0, games: [] }) const [freeMints, setFreeMints] = useState(0) - const { achievementsToBeMinted, toggleAchievement, isLoading, handleMint } = useMintAchievements() + const { achievementsToBeMinted, toggleAchievement, isLoading, handleMint } = + useMintAchievements() useEffect(() => { const getAchievements = async () => { From 8841a169633bf2bc23d5a967c1bca79ede8a1610 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 5 Oct 2023 12:35:43 -0600 Subject: [PATCH 024/106] fix: lint --- src/common/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common/types.ts b/src/common/types.ts index 680697f42..ddb4deb78 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -1,4 +1,3 @@ -import { getIndividualAchievements } from './../backend/hyperplay-achievements/api' import { GOGCloudSavesLocation, GogInstallPlatform } from './types/gog' import { LegendaryInstallPlatform, GameMetadataInner } from './types/legendary' import { IpcRendererEvent } from 'electron' From 121a88b2f0806c4ca6ac012f315f41b8a1c460d4 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Mon, 9 Oct 2023 10:15:53 -0600 Subject: [PATCH 025/106] chore: update sub module branch --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index bcc582737..72f1fff53 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit bcc582737fbacf2591cd188bcdbe983994b5fa04 +Subproject commit 72f1fff53886ccee7fa51eb65c494c610fc3ddda From 8e8e2e17e4968d8a32e39949653249438b66cbcf Mon Sep 17 00:00:00 2001 From: Andrew James Date: Mon, 9 Oct 2023 10:38:52 -0600 Subject: [PATCH 026/106] chore: remove getGame function --- src/common/typedefs/ipcBridge.d.ts | 1 - src/common/types.ts | 11 ++------ .../GameAchievementDetails/index.tsx | 28 ++++++++++++------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 73066890f..20728b8f9 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -212,7 +212,6 @@ interface HyperPlayAsyncIPCFunctions { currentPage: number totalPages: number }> - getGame: (gameId: number) => Promise getAchievementsStats: (store: AchievementStore) => Promise getFreeMints: () => Promise } diff --git a/src/common/types.ts b/src/common/types.ts index ddb4deb78..f77651476 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -816,6 +816,7 @@ export type AvailablePlatforms = { export type AchievementStore = 'hyperplay' | 'steam' | 'epic' export interface Achievement { + id: number apiname: string achieved: number unlocktime: number @@ -838,6 +839,7 @@ export interface SummaryAchievement extends Achievement { mintableAchievementsCount: number isNewAchievement: boolean isMinted: boolean + tags: string[] } export type AchievementSort = 'ALPHA_A_TO_Z' | 'ALPHA_Z_TO_A' | 'SORT_BY_STATUS' @@ -852,15 +854,6 @@ export interface GetAchievementsOptions { pageSize: number } -export interface Game { - id: number - name: string - tags: string[] - totalAchievementCount: number - mintedAchievementCount: number - mintableAchievementsCount: number -} - export interface GetIndividualAchievementsOptions { gameId: number sort: AchievementSort diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index beeb0ba91..885743591 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,5 +1,5 @@ import { GameAchievements } from '@hyperplay/ui' -import { Achievement, Game } from 'common/types' +import { Achievement, SummaryAchievement } from 'common/types' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' @@ -17,12 +17,13 @@ function isTimestampInPast(unixTimestamp: number) { export default React.memo(function GameAchievementDetails(): JSX.Element { const { id } = useParams() - const [game, setGame] = useState() + const [summaryAchievement, setSummaryAchievement] = useState() const [achievementsData, setAchievementData] = useState<{ data: Achievement[] currentPage: number totalPages: number }>({ data: [], currentPage: 0, totalPages: 0 }) + const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [freeMints, setFreeMints] = useState(0) const { achievementsToBeMinted, handleMint, isLoading } = @@ -30,8 +31,15 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { useEffect(() => { const getAchievements = async () => { - const gameData = await window.api.getGame(Number(id)) - setGame(gameData) + const { data } = + await window.api.getSummaryAchievements({ + store: 'steam', + filter: 'ALL', + sort: 'ALPHA_A_TO_Z', + page: 1, + pageSize: 1 + }) + setSummaryAchievement(data[0]) const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), @@ -74,7 +82,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { return !walletStore.isConnected || isLoading }, [isLoading, walletStore.isConnected]) - if (!game) return <> + if (!summaryAchievement) return <> return ( ({ // TODO: remove when there is a real id id: `${index}`, From 1410a3f1b57d6a2759ec715414996f30162d06da Mon Sep 17 00:00:00 2001 From: Andrew James Date: Mon, 9 Oct 2023 10:41:44 -0600 Subject: [PATCH 027/106] chore: move freeMints into stats --- src/backend/hyperplay-achievements | 2 +- src/common/typedefs/ipcBridge.d.ts | 1 - src/common/types.ts | 1 + .../screens/Achievements/AchievementsLayout/index.tsx | 3 ++- .../screens/Achievements/GameAchievementDetails/index.tsx | 5 +++-- src/frontend/screens/Achievements/index.tsx | 4 ++-- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 72f1fff53..7dd4549e7 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 72f1fff53886ccee7fa51eb65c494c610fc3ddda +Subproject commit 7dd4549e7801ca5d01aeac5c99c291f8ead7065c diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 20728b8f9..83fa05f38 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -213,7 +213,6 @@ interface HyperPlayAsyncIPCFunctions { totalPages: number }> getAchievementsStats: (store: AchievementStore) => Promise - getFreeMints: () => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { diff --git a/src/common/types.ts b/src/common/types.ts index f77651476..160374719 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -865,4 +865,5 @@ export interface AchievementsStats { mintedAchievements: number totalAchievements: number totalGames: number + freeMints: number } diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index aa9e5cd8d..2081bf2a3 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -13,7 +13,8 @@ export default React.memo(function AchievementsLayout({ totalNewAchievements: 0, totalMintedAchievements: 0, totalAchievements: 0, - totalGames: 0 + totalGames: 0, + freeMints: 0 }) useEffect(() => { diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 885743591..143ecdebe 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -49,8 +49,9 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }) setAchievementData(achievements) - const freeMintsData = await window.api.getFreeMints() - setFreeMints(freeMintsData) + const stats = await window.api.getAchievementsStats('steam') + + setFreeMints(stats.freeMints) } getAchievements() diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index dbcd87db2..85fa0bd46 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -42,8 +42,8 @@ export default React.memo(function Achievements(): JSX.Element { }) setAchievementData({ currentPage, totalPages, games: data }) - const freeMintsData = await window.api.getFreeMints() - setFreeMints(freeMintsData) + const stats = await window.api.getAchievementsStats('steam') + setFreeMints(stats.freeMints) } getAchievements() From a71c1b0a3b9d780f7879dab804a1d7f8a794d165 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Mon, 9 Oct 2023 10:46:57 -0600 Subject: [PATCH 028/106] chore: prettier --- .../GameAchievementDetails/index.tsx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 143ecdebe..4abd761f0 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -17,13 +17,14 @@ function isTimestampInPast(unixTimestamp: number) { export default React.memo(function GameAchievementDetails(): JSX.Element { const { id } = useParams() - const [summaryAchievement, setSummaryAchievement] = useState() + const [summaryAchievement, setSummaryAchievement] = + useState() const [achievementsData, setAchievementData] = useState<{ data: Achievement[] currentPage: number totalPages: number }>({ data: [], currentPage: 0, totalPages: 0 }) - + const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [freeMints, setFreeMints] = useState(0) const { achievementsToBeMinted, handleMint, isLoading } = @@ -31,14 +32,13 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { useEffect(() => { const getAchievements = async () => { - const { data } = - await window.api.getSummaryAchievements({ - store: 'steam', - filter: 'ALL', - sort: 'ALPHA_A_TO_Z', - page: 1, - pageSize: 1 - }) + const { data } = await window.api.getSummaryAchievements({ + store: 'steam', + filter: 'ALL', + sort: 'ALPHA_A_TO_Z', + page: 1, + pageSize: 1 + }) setSummaryAchievement(data[0]) const achievements = await window.api.getIndividualAchievements({ From b8a862b98b8b0871c90ddbe7bc1c49e1e1dd57b7 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Mon, 9 Oct 2023 10:50:06 -0600 Subject: [PATCH 029/106] chore: update to numFreeMints --- src/backend/hyperplay-achievements | 2 +- src/common/types.ts | 2 +- src/frontend/screens/Achievements/AchievementsLayout/index.tsx | 2 +- .../screens/Achievements/GameAchievementDetails/index.tsx | 2 +- src/frontend/screens/Achievements/index.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 7dd4549e7..083eb8dd5 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 7dd4549e7801ca5d01aeac5c99c291f8ead7065c +Subproject commit 083eb8dd519a2b1590439b9a2670b168587bcf76 diff --git a/src/common/types.ts b/src/common/types.ts index 160374719..3cb8fcba0 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -865,5 +865,5 @@ export interface AchievementsStats { mintedAchievements: number totalAchievements: number totalGames: number - freeMints: number + numFreeMints: number } diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 2081bf2a3..f613ce368 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -14,7 +14,7 @@ export default React.memo(function AchievementsLayout({ totalMintedAchievements: 0, totalAchievements: 0, totalGames: 0, - freeMints: 0 + numFreeMints: 0 }) useEffect(() => { diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 4abd761f0..255dac4f3 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -51,7 +51,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const stats = await window.api.getAchievementsStats('steam') - setFreeMints(stats.freeMints) + setFreeMints(stats.numFreeMints) } getAchievements() diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 85fa0bd46..f7b143ccd 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -43,7 +43,7 @@ export default React.memo(function Achievements(): JSX.Element { setAchievementData({ currentPage, totalPages, games: data }) const stats = await window.api.getAchievementsStats('steam') - setFreeMints(stats.freeMints) + setFreeMints(stats.numFreeMints) } getAchievements() From 62584f72e21cb260d009b8a1321d6cb10edae51d Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 11 Oct 2023 14:44:55 -0600 Subject: [PATCH 030/106] feat: handle mint and update with separate buttons --- public/summary_achievements_mock.json | 1458 ++++++++--------- src/backend/hyperplay-achievements | 2 +- .../Achievements/AchievementsLayout/index.tsx | 2 +- .../GameAchievementDetails/index.tsx | 2 +- .../index.tsx | 52 +- src/frontend/screens/Achievements/index.tsx | 42 +- 6 files changed, 810 insertions(+), 748 deletions(-) rename src/frontend/screens/Achievements/{MintAchievements => MintAchievementsContext}/index.tsx (57%) diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index 95056b000..e06186335 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -1,730 +1,730 @@ [ - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 247, - "mintedAchievementCount": 56, - "mintableAchievementsCount": 105, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 18, - "mintedAchievementCount": 15, - "mintableAchievementsCount": 17, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 13, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 9, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 3, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 7, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 9, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 2, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 26, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 20, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 1, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 52, - "mintedAchievementCount": 52, - "mintableAchievementsCount": 52, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 13, - "mintedAchievementCount": 13, - "mintableAchievementsCount": 13, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 15, - "mintedAchievementCount": 15, - "mintableAchievementsCount": 15, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 58, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 11, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 8, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 5, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 12, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 15, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 10, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 93, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 23, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 12, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 10, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 3, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 15, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 126, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 61, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 15, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true - } -] + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", + "totalAchievementCount": 675, + "mintedAchievementCount": 4, + "mintableAchievementsCount": 105, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", + "totalAchievementCount": 50, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 17, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", + "totalAchievementCount": 7, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 2, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", + "totalAchievementCount": 7, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 3, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", + "totalAchievementCount": 7, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", + "totalAchievementCount": 10, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", + "totalAchievementCount": 4, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": false, + "isMinted": false + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", + "totalAchievementCount": 7, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 7, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", + "totalAchievementCount": 1, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", + "totalAchievementCount": 87, + "mintedAchievementCount": 41, + "mintableAchievementsCount": 52, + "isNewAchievement": false, + "isMinted": false + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", + "totalAchievementCount": 23, + "mintedAchievementCount": 10, + "mintableAchievementsCount": 13, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", + "totalAchievementCount": 3, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", + "totalAchievementCount": 17, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 15, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", + "totalAchievementCount": 63, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 11, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", + "totalAchievementCount": 5, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 5, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", + "totalAchievementCount": 29, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", + "totalAchievementCount": 14, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 10, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", + "totalAchievementCount": 2, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", + "totalAchievementCount": 23, + "mintedAchievementCount": 23, + "mintableAchievementsCount": 23, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", + "totalAchievementCount": 17, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", + "totalAchievementCount": 14, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 7, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", + "totalAchievementCount": 12, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", + "totalAchievementCount": 87, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 61, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", + "totalAchievementCount": 12, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", + "totalAchievementCount": 5, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": false, + "isMinted": true + } +] \ No newline at end of file diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 083eb8dd5..ce621b48d 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 083eb8dd519a2b1590439b9a2670b168587bcf76 +Subproject commit ce621b48dbf52064c7865676c02ebf92f1f8ad18 diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index f613ce368..17ad5526f 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -4,7 +4,7 @@ import { Background, AchievementsInfo, StoreRow, Images } from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' -import { MintAchievementsProvider } from '../MintAchievements' +import { MintAchievementsProvider } from '../MintAchievementsContext' export default React.memo(function AchievementsLayout({ children diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 255dac4f3..a3bcc87ee 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -3,7 +3,7 @@ import { Achievement, SummaryAchievement } from 'common/types' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' -import { useMintAchievements } from '../MintAchievements' +import { useMintAchievements } from '../MintAchievementsContext' import walletStore from 'frontend/store/WalletStore' const pageSize = 6 diff --git a/src/frontend/screens/Achievements/MintAchievements/index.tsx b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx similarity index 57% rename from src/frontend/screens/Achievements/MintAchievements/index.tsx rename to src/frontend/screens/Achievements/MintAchievementsContext/index.tsx index 0c9c2c736..7d07f7079 100644 --- a/src/frontend/screens/Achievements/MintAchievements/index.tsx +++ b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx @@ -10,8 +10,11 @@ import React, { // Define the context type interface MintAchievementsType { achievementsToBeMinted: string[] // Define the type of your context value - toggleAchievement: (id: string) => void + achievementsToBeUpdated: string[] // Define the type of your context value + toggleAchievementToBeMinted: (id: string) => void + toggleAchievementToBeUpdated: (id: string) => void handleMint: () => void + handleUpdate: () => void isLoading: boolean } @@ -31,11 +34,13 @@ const MintAchievementsProvider: React.FC = ({ const [achievementsToBeMinted, setAchievementsToBeMinted] = useState< string[] >([]) + const [achievementsToBeUpdated, setAchievementsToBeUpdated] = useState< + string[] + >([]) const [isLoading, setIsLoading] = useState(false) - const toggleAchievement = useCallback( + const toggleAchievementToBeMinted = useCallback( (id: string) => { - console.log('toggleAchievement', id) if (achievementsToBeMinted.includes(id)) { setAchievementsToBeMinted((state) => state.filter((item) => item !== id) @@ -47,6 +52,19 @@ const MintAchievementsProvider: React.FC = ({ [achievementsToBeMinted] ) + const toggleAchievementToBeUpdated = useCallback( + (id: string) => { + if (achievementsToBeUpdated.includes(id)) { + setAchievementsToBeUpdated((state) => + state.filter((item) => item !== id) + ) + } else { + setAchievementsToBeUpdated((state) => [...state, id]) + } + }, + [achievementsToBeUpdated] + ) + const handleMint = useCallback(() => { setIsLoading(true) setTimeout(() => { @@ -55,9 +73,33 @@ const MintAchievementsProvider: React.FC = ({ }, 3000) }, [achievementsToBeMinted]) + const handleUpdate = useCallback(() => { + setIsLoading(true) + setTimeout(() => { + setIsLoading(false) + setAchievementsToBeUpdated([]) + }, 3000) + }, [achievementsToBeUpdated]) + const value = useMemo(() => { - return { achievementsToBeMinted, toggleAchievement, handleMint, isLoading } - }, [achievementsToBeMinted, toggleAchievement, handleMint, isLoading]) + return { + achievementsToBeMinted, + toggleAchievementToBeMinted, + handleMint, + isLoading, + toggleAchievementToBeUpdated, + handleUpdate, + achievementsToBeUpdated + } + }, [ + achievementsToBeMinted, + toggleAchievementToBeMinted, + handleMint, + isLoading, + toggleAchievementToBeUpdated, + handleUpdate, + achievementsToBeUpdated + ]) return ( diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index f7b143ccd..7778c041e 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -9,7 +9,7 @@ import { } from 'common/types' import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' -import { useMintAchievements } from './MintAchievements' +import { useMintAchievements } from './MintAchievementsContext' const pageSize = 12 export const achievementsSortOptions = [ @@ -27,8 +27,15 @@ export default React.memo(function Achievements(): JSX.Element { }>({ currentPage: 0, totalPages: 0, games: [] }) const [freeMints, setFreeMints] = useState(0) - const { achievementsToBeMinted, toggleAchievement, isLoading, handleMint } = - useMintAchievements() + const { + achievementsToBeMinted, + toggleAchievementToBeMinted, + isLoading, + handleMint, + handleUpdate, + achievementsToBeUpdated, + toggleAchievementToBeUpdated + } = useMintAchievements() useEffect(() => { const getAchievements = async () => { @@ -88,13 +95,15 @@ export default React.memo(function Achievements(): JSX.Element { return ( <> { - // TODO: remove when there is a real id - const id = `${game.gameName}-${index}` - const state = walletStore.isConnected + games={achievementsData.games.map((game) => { + const id = String(game.gameId) + const state = !walletStore.isConnected ? 'disabled' - : achievementsToBeMinted.includes(id) + : achievementsToBeMinted.includes(id) || + achievementsToBeUpdated.includes(id) ? 'active' + : game.isNewAchievement + ? 'update' : 'default' return ( @@ -111,7 +120,11 @@ export default React.memo(function Achievements(): JSX.Element { ctaProps={{ onClick: (e) => { e.preventDefault() - toggleAchievement(id) + if (game.isNewAchievement) { + toggleAchievementToBeUpdated(id) + } else { + toggleAchievementToBeMinted(id) + } }, disabled: isDisabled }} @@ -168,11 +181,18 @@ export default React.memo(function Achievements(): JSX.Element { }} mintButtonProps={{ onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0 + disabled: isDisabled ?? achievementsToBeMinted.length === 0, + totalToMint: achievementsToBeMinted.length + }} + updateButtonProps={{ + onClick: handleUpdate, + disabled: isDisabled ?? achievementsToBeUpdated.length === 0, + totalToUpdate: achievementsToBeUpdated.length }} achievementNavProps={{ freeMints, - basketAmount: achievementsToBeMinted.length + basketAmount: + achievementsToBeMinted.length + achievementsToBeUpdated.length }} /> From 646af216568e02e8afe8ee4d15ef7e873775b478 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 11 Oct 2023 14:53:08 -0600 Subject: [PATCH 031/106] chore: bump hyperplay ui --- package.json | 4 ++-- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 9d1bdd0d8..b7422a501 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.21", + "@hyperplay/ui": "^0.1.22", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", @@ -345,4 +345,4 @@ "vite>esbuild": true } } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index e42e6492e..8c6cfef7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1688,10 +1688,10 @@ dependencies: axios "^1.4.0" -"@hyperplay/ui@^0.1.21": - version "0.1.21" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.21.tgz#235c6567c49a37a15ec9ea012f2ea12fa5a96690" - integrity sha512-+BngEguUyGYhQJjHVbQZV1Lawo2kGmBP6At6hKPKp0HW1sPuFkeZtKKtAP9VzV1zcsUVIbdY8n5BqDQB/aKckQ== +"@hyperplay/ui@^0.1.22": + version "0.1.22" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.22.tgz#c498020a32b04572b05c0397c69d7e2cccb7c6ab" + integrity sha512-+PkD92OwRT9Y8PtPGyHqAdlDkNXbT51AqjGiQQWRc5z2T8qxS2ic1cQan9Kl5BvpDIG/QhPeMPJyXSwA7L0cfQ== "@ioredis/commands@^1.1.1": version "1.2.0" From 0d77927e0f882da90c59ddc3f94727c2e4f122be Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 11 Oct 2023 15:06:26 -0600 Subject: [PATCH 032/106] fix: put hyperplay extension helper back to main commit --- src/backend/hyperplay-extension-helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-extension-helper b/src/backend/hyperplay-extension-helper index 71b4a9edc..cfd4aa763 160000 --- a/src/backend/hyperplay-extension-helper +++ b/src/backend/hyperplay-extension-helper @@ -1 +1 @@ -Subproject commit 71b4a9edcb47f9c4857e1602714050b4a066bb2f +Subproject commit cfd4aa7633817c2e54f1e771800e685cee08adba From 1be98d11d7b423f27146aa4542050190a786eb1d Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 11 Oct 2023 15:15:20 -0600 Subject: [PATCH 033/106] fix: prettier --- package.json | 2 +- public/summary_achievements_mock.json | 1458 ++++++++++++------------- 2 files changed, 730 insertions(+), 730 deletions(-) diff --git a/package.json b/package.json index 455c68c13..d61152279 100644 --- a/package.json +++ b/package.json @@ -352,4 +352,4 @@ "vite>esbuild": true } } -} \ No newline at end of file +} diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index e06186335..aa7a2a9bf 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -1,730 +1,730 @@ [ - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 675, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 105, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 50, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 17, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 7, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 2, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 7, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 3, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 7, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 10, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 4, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": false, - "isMinted": false - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 1, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 87, - "mintedAchievementCount": 41, - "mintableAchievementsCount": 52, - "isNewAchievement": false, - "isMinted": false - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 23, - "mintedAchievementCount": 10, - "mintableAchievementsCount": 13, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 3, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 17, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 15, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 63, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 11, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 5, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 5, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 29, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 14, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 10, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 2, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 23, - "mintedAchievementCount": 23, - "mintableAchievementsCount": 23, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 17, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 6, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 14, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 7, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 12, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 87, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 61, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 12, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 5, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": false, - "isMinted": true - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, - "isNewAchievement": false, - "isMinted": true - } -] \ No newline at end of file + { + "apiname": "WIN_BOMB_PLANT", + "achieved": 1, + "unlocktime": 1490273819, + "name": "WIN_BOMB_PLANT", + "defaultvalue": 0, + "displayName": "Someone Set Up Us The Bomb", + "hidden": 0, + "description": "Win a round by planting a bomb", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", + "iconName": "Someone Set Up Us The Bomb", + "gameId": 730, + "gameName": "Counter-Strike: Global Offensive", + "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", + "totalAchievementCount": 675, + "mintedAchievementCount": 4, + "mintableAchievementsCount": 105, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACHIEVEMENT_31", + "achieved": 1, + "unlocktime": 1484637768, + "name": "ACHIEVEMENT_31", + "defaultvalue": 0, + "displayName": "Payday", + "hidden": 0, + "description": "Earn 1,000 Credits.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", + "iconName": "Payday", + "gameId": 230410, + "gameName": "Warframe", + "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", + "totalAchievementCount": 50, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 17, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACH_MATCHES_SCOUT", + "achieved": 1, + "unlocktime": 1489966357, + "name": "ACH_MATCHES_SCOUT", + "defaultvalue": 0, + "displayName": "Scout", + "hidden": 0, + "description": "Complete one match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", + "iconName": "Scout", + "gameId": 375230, + "gameName": "Warhammer 40,000: Eternal Crusade", + "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", + "totalAchievementCount": 7, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 2, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1215", + "achieved": 1, + "unlocktime": 1491925374, + "name": "GOAL_ID_1215", + "defaultvalue": 0, + "displayName": "Survivor", + "hidden": 0, + "description": "Survive more than 50 battles with less than 10% health.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", + "iconName": "Survivor", + "gameId": 444090, + "gameName": "Paladins", + "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", + "totalAchievementCount": 7, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 3, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "Quest_39", + "achieved": 1, + "unlocktime": 1654040623, + "name": "Quest_39", + "defaultvalue": 0, + "displayName": "Ranked Winner", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", + "iconName": "Ranked Winner", + "gameId": 489520, + "gameName": "Minion Masters", + "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GLOBAL_GNOME_ALONE", + "achieved": 1, + "unlocktime": 1669600143, + "name": "GLOBAL_GNOME_ALONE", + "defaultvalue": 0, + "displayName": "Gnome Alone", + "hidden": 0, + "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", + "iconName": "Gnome Alone", + "gameId": 546560, + "gameName": "Half-Life: Alyx", + "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "A001_NewBeginning", + "achieved": 1, + "unlocktime": 1557640287, + "name": "A001_NewBeginning", + "defaultvalue": 0, + "displayName": "New Beginning", + "hidden": 0, + "description": "Create call sign name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", + "iconName": "New Beginning", + "gameId": 550650, + "gameName": "Black Squad", + "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", + "totalAchievementCount": 7, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACHIVE017", + "achieved": 1, + "unlocktime": 1627627907, + "name": "ACHIVE017", + "defaultvalue": 0, + "displayName": "Devil Inside Me", + "hidden": 0, + "description": "Kill 10 players by any means.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", + "iconName": "Devil Inside Me", + "gameId": 578080, + "gameName": "PUBG: BATTLEGROUNDS", + "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", + "totalAchievementCount": 10, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "qc_victory", + "achieved": 1, + "unlocktime": 1541363946, + "name": "qc_victory", + "defaultvalue": 0, + "displayName": "Victory", + "hidden": 0, + "description": "Win 1 match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", + "iconName": "Victory", + "gameId": 611500, + "gameName": "Quake Champions", + "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", + "totalAchievementCount": 4, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": false, + "isMinted": false + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1629999830, + "name": "1", + "defaultvalue": 0, + "displayName": "So it begins... ", + "hidden": 0, + "description": "Complete a match", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", + "iconName": "So it begins... ", + "gameId": 677620, + "gameName": "Splitgate", + "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", + "totalAchievementCount": 7, + "mintedAchievementCount": 7, + "mintableAchievementsCount": 7, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ach_story_1", + "achieved": 1, + "unlocktime": 1617342580, + "name": "ach_story_1", + "defaultvalue": 0, + "displayName": "Awoken to a Nightmare", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", + "iconName": "Awoken to a Nightmare", + "gameId": 680420, + "gameName": "OUTRIDERS", + "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "LIFE_TRAVEL_1_1", + "achieved": 1, + "unlocktime": 1528117267, + "name": "LIFE_TRAVEL_1_1", + "defaultvalue": 0, + "displayName": "Woah. This Place is Huge!", + "hidden": 0, + "description": "Entered a big city", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", + "iconName": "Woah. This Place is Huge!", + "gameId": 681660, + "gameName": "Bless Online", + "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", + "totalAchievementCount": 1, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 1, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "founder_achievement", + "achieved": 1, + "unlocktime": 1595000551, + "name": "founder_achievement", + "defaultvalue": 0, + "displayName": "Founder", + "hidden": 0, + "description": "Aim Lab Founder", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", + "iconName": "Founder", + "gameId": 714010, + "gameName": "Aimlabs", + "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", + "totalAchievementCount": 87, + "mintedAchievementCount": 41, + "mintableAchievementsCount": 52, + "isNewAchievement": false, + "isMinted": false + }, + { + "apiname": "mcvs_winmatch1", + "achieved": 1, + "unlocktime": 1526706559, + "name": "mcvs_winmatch1", + "defaultvalue": 0, + "displayName": "Private", + "hidden": 0, + "description": "Win 3 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", + "iconName": "Private", + "gameId": 723780, + "gameName": "Modern Combat Versus", + "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", + "totalAchievementCount": 23, + "mintedAchievementCount": 10, + "mintableAchievementsCount": 13, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACH_ENTER_ELYSIUM", + "achieved": 1, + "unlocktime": 1653184380, + "name": "ACH_ENTER_ELYSIUM", + "defaultvalue": 0, + "displayName": "Welcome to the Masquerade", + "hidden": 0, + "description": "Visit the Elysium for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", + "iconName": "Welcome to the Masquerade", + "gameId": 760160, + "gameName": "Vampire: The Masquerade - Bloodhunt", + "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "achieved": 1, + "unlocktime": 1628474277, + "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", + "defaultvalue": 0, + "displayName": "Castle of Doubt", + "hidden": 0, + "description": "Lose an unfinished Castle that is at least 95% complete.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", + "iconName": "Castle of Doubt", + "gameId": 813780, + "gameName": "Age of Empires II: Definitive Edition", + "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "GOAL_ID_1604", + "achieved": 1, + "unlocktime": 1540770708, + "name": "GOAL_ID_1604", + "defaultvalue": 0, + "displayName": "Novice Assassin", + "hidden": 0, + "description": "Eliminate an enemy player as an Assassin.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", + "iconName": "Novice Assassin", + "gameId": 813820, + "gameName": "Realm Royale Reforged", + "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "kz1", + "achieved": 1, + "unlocktime": 1557462038, + "name": "kz1", + "defaultvalue": 0, + "displayName": "[Monster] Exciting First Mission", + "hidden": 0, + "description": "Complete Monster Mission 1 Time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", + "iconName": "[Monster] Exciting First Mission", + "gameId": 844870, + "gameName": "KurtzPel", + "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", + "totalAchievementCount": 3, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "Goal_ID_01", + "achieved": 1, + "unlocktime": 1627496905, + "name": "Goal_ID_01", + "defaultvalue": 0, + "displayName": "All I Do Is Win", + "hidden": 0, + "description": "Win 100 matches", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", + "iconName": "All I Do Is Win", + "gameId": 872200, + "gameName": "Rogue Company", + "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", + "totalAchievementCount": 17, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 15, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "NEW_ACHIEVEMENT_1_1", + "achieved": 1, + "unlocktime": 1548420881, + "name": "NEW_ACHIEVEMENT_1_1", + "defaultvalue": 0, + "displayName": "Welcome to the City of the Dead", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", + "iconName": "Welcome to the City of the Dead", + "gameId": 883710, + "gameName": "Resident Evil 2", + "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", + "totalAchievementCount": 63, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 11, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "NEW_ACHIEVEMENT_1_0", + "achieved": 1, + "unlocktime": 1547245970, + "name": "NEW_ACHIEVEMENT_1_0", + "defaultvalue": 0, + "displayName": "5 minutes played", + "hidden": 0, + "description": "5 minutes played", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", + "iconName": "5 minutes played", + "gameId": 961440, + "gameName": "Resident Evil 2 \"1-Shot Demo\"", + "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", + "totalAchievementCount": 5, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 5, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "PFA_1", + "achieved": 1, + "unlocktime": 1676092491, + "name": "PFA_1", + "defaultvalue": 0, + "displayName": "The Sort Who Makes an Entrance", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", + "iconName": "The Sort Who Makes an Entrance", + "gameId": 990080, + "gameName": "Hogwarts Legacy", + "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", + "totalAchievementCount": 29, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACH_1", + "achieved": 1, + "unlocktime": 1571866035, + "name": "ACH_1", + "defaultvalue": 0, + "displayName": "Long and Winding Road", + "hidden": 0, + "description": "Reach level 20.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", + "iconName": "Long and Winding Road", + "gameId": 1085660, + "gameName": "Destiny 2", + "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "TheFool", + "achieved": 1, + "unlocktime": 1607567313, + "name": "TheFool", + "defaultvalue": 0, + "displayName": "The Fool", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", + "iconName": "The Fool", + "gameId": 1091500, + "gameName": "Cyberpunk 2077", + "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", + "totalAchievementCount": 14, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 10, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "ACH_READY_TO_BECOME_AG", + "achieved": 1, + "unlocktime": 1655762412, + "name": "ACH_READY_TO_BECOME_AG", + "defaultvalue": 0, + "displayName": "Ready to become an Aimbeast?", + "hidden": 0, + "description": "Start Aimbeast for the first time", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", + "iconName": "Ready to become an Aimbeast?", + "gameId": 1100990, + "gameName": "Aimbeast", + "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", + "totalAchievementCount": 2, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "FISFORFAILURE", + "achieved": 1, + "unlocktime": 1628475706, + "name": "FISFORFAILURE", + "defaultvalue": 0, + "displayName": "F is for Failure", + "hidden": 0, + "description": "Fail a test", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", + "iconName": "F is for Failure", + "gameId": 1126320, + "gameName": "Being a DIK", + "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", + "totalAchievementCount": 0, + "mintedAchievementCount": 0, + "mintableAchievementsCount": 0, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "1", + "achieved": 1, + "unlocktime": 1620404061, + "name": "1", + "defaultvalue": 0, + "displayName": "Not Lycan This...", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", + "iconName": "Not Lycan This...", + "gameId": 1196590, + "gameName": "Resident Evil Village", + "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", + "totalAchievementCount": 23, + "mintedAchievementCount": 23, + "mintableAchievementsCount": 23, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "NEW_ACHIEVEMENT_3_15", + "achieved": 1, + "unlocktime": 1654130612, + "name": "NEW_ACHIEVEMENT_3_15", + "defaultvalue": 0, + "displayName": "Passion for Fashion", + "hidden": 0, + "description": "Wear a new armor customization item.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", + "iconName": "Passion for Fashion", + "gameId": 1240440, + "gameName": "Halo Infinite", + "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", + "totalAchievementCount": 17, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 6, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "ACHIEVEMENT_1", + "achieved": 1, + "unlocktime": 1686447606, + "name": "ACHIEVEMENT_1", + "defaultvalue": 0, + "displayName": "Get Your Game Face On!", + "hidden": 0, + "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", + "iconName": "Get Your Game Face On!", + "gameId": 1364780, + "gameName": "Street Fighter™ 6", + "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", + "totalAchievementCount": 14, + "mintedAchievementCount": 6, + "mintableAchievementsCount": 7, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "jp.konami.masterduel.ach.001", + "achieved": 1, + "unlocktime": 1653104296, + "name": "jp.konami.masterduel.ach.001", + "defaultvalue": 0, + "displayName": "Welcome to MASTER DUEL", + "hidden": 0, + "description": "Register your player name", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", + "iconName": "Welcome to MASTER DUEL", + "gameId": 1449850, + "gameName": "Yu-Gi-Oh! Master Duel", + "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "A001_", + "achieved": 1, + "unlocktime": 1642288026, + "name": "A001_", + "defaultvalue": 0, + "displayName": "Empires Will Rise", + "hidden": 0, + "description": "Construct your first Landmark.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", + "iconName": "Empires Will Rise", + "gameId": 1466860, + "gameName": "Age of Empires IV: Anniversary Edition", + "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", + "totalAchievementCount": 12, + "mintedAchievementCount": 5, + "mintableAchievementsCount": 7, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "2010007", + "achieved": 1, + "unlocktime": 1644521999, + "name": "2010007", + "defaultvalue": 0, + "displayName": "We're All Buddies!", + "hidden": 0, + "description": "Join a guild", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", + "iconName": "We're All Buddies!", + "gameId": 1599340, + "gameName": "Lost Ark", + "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", + "totalAchievementCount": 87, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 61, + "isNewAchievement": true, + "isMinted": true + }, + { + "apiname": "War06", + "achieved": 1, + "unlocktime": 1675375599, + "name": "War06", + "defaultvalue": 0, + "displayName": "First Steps", + "hidden": 0, + "description": "Equip the character with a rank 1 title.", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", + "iconName": "First Steps", + "gameId": 1675900, + "gameName": "Warlander", + "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", + "totalAchievementCount": 12, + "mintedAchievementCount": 3, + "mintableAchievementsCount": 4, + "isNewAchievement": true, + "isMinted": false + }, + { + "apiname": "クインティプルキル", + "achieved": 1, + "unlocktime": 1690680618, + "name": "クインティプルキル", + "defaultvalue": 0, + "displayName": "Rush Attack", + "hidden": 0, + "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", + "iconName": "Rush Attack", + "gameId": 1816670, + "gameName": "GUNDAM EVOLUTION", + "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", + "totalAchievementCount": 5, + "mintedAchievementCount": 1, + "mintableAchievementsCount": 2, + "isNewAchievement": false, + "isMinted": true + }, + { + "apiname": "ACH16", + "achieved": 1, + "unlocktime": 1692933429, + "name": "ACH16", + "defaultvalue": 0, + "displayName": "Illegal Entry", + "hidden": 1, + "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", + "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", + "iconName": "Illegal Entry", + "gameId": 1888160, + "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", + "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", + "totalAchievementCount": 2, + "mintedAchievementCount": 2, + "mintableAchievementsCount": 2, + "isNewAchievement": false, + "isMinted": true + } +] From cfe89ae874d6dcd257edadcdd4a3661a1bd22409 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 12 Oct 2023 08:34:59 -0600 Subject: [PATCH 034/106] feat: add updateButtonProps to game achievement --- .../GameAchievementDetails/index.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index a3bcc87ee..8079b3c2f 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -27,8 +27,13 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [freeMints, setFreeMints] = useState(0) - const { achievementsToBeMinted, handleMint, isLoading } = - useMintAchievements() + const { + achievementsToBeMinted, + isLoading, + handleMint, + handleUpdate, + achievementsToBeUpdated + } = useMintAchievements() useEffect(() => { const getAchievements = async () => { @@ -135,7 +140,13 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }} mintButtonProps={{ onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0 + disabled: isDisabled ?? achievementsToBeMinted.length === 0, + totalToMint: achievementsToBeMinted.length + }} + updateButtonProps={{ + onClick: handleUpdate, + disabled: isDisabled ?? achievementsToBeUpdated.length === 0, + totalToUpdate: achievementsToBeUpdated.length }} /> ) From c530df755081cb9e0f9ef2cb3ae542d92fccac4f Mon Sep 17 00:00:00 2001 From: Andrew James Date: Fri, 13 Oct 2023 11:22:50 -0600 Subject: [PATCH 035/106] feat: bump ui package 0.1.24 --- package.json | 4 ++-- yarn.lock | 57 ++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index d61152279..b81896a3f 100644 --- a/package.json +++ b/package.json @@ -156,7 +156,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.22", + "@hyperplay/ui": "^0.1.24", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", @@ -352,4 +352,4 @@ "vite>esbuild": true } } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 7311ef568..66159c4b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,6 +1594,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== +"@fortawesome/fontawesome-common-types@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" + integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== + "@fortawesome/fontawesome-svg-core@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1601,6 +1606,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/fontawesome-svg-core@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz#37f4507d5ec645c8b50df6db14eced32a6f9be09" + integrity sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-brands-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" @@ -1615,6 +1627,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-regular-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz#aee79ed76ce5dd04931352f9d83700761b8b1b25" + integrity sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-solid-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz#8dcde48109354fd7a5ece8ea48d678bb91d4b5f0" @@ -1622,6 +1641,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-solid-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz#33a02c4cb6aa28abea7bc082a9626b7922099df4" + integrity sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/react-fontawesome@^0.1.18": version "0.1.19" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz#2b36917578596f31934e71f92b7cf9c425fd06e4" @@ -1629,6 +1655,13 @@ dependencies: prop-types "^15.8.1" +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1648,10 +1681,17 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/ui@^0.1.22": - version "0.1.22" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.22.tgz#c498020a32b04572b05c0397c69d7e2cccb7c6ab" - integrity sha512-+PkD92OwRT9Y8PtPGyHqAdlDkNXbT51AqjGiQQWRc5z2T8qxS2ic1cQan9Kl5BvpDIG/QhPeMPJyXSwA7L0cfQ== +"@hyperplay/chains@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" + integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== + dependencies: + axios "^1.4.0" + +"@hyperplay/ui@^0.1.24": + version "0.1.24" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.24.tgz#3529285d8a27685c275f280284cb8aed5d443ced" + integrity sha512-hQv5ktQTAuyLl8FAWKSXfVVkfLyVbKlGnCwL7tfIPl9pHqWVdLY3upficTVCUrcRL7U+UjRGCG1DjEqV/jyQHg== "@ioredis/commands@^1.1.1": version "1.2.0" @@ -4595,6 +4635,15 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" + integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" From 6972ea38eeaab5ac3a3c43997733803a99d8844a Mon Sep 17 00:00:00 2001 From: Andrew James Date: Fri, 13 Oct 2023 11:23:59 -0600 Subject: [PATCH 036/106] feat: add accounts tab and steam id input to it --- package.json | 2 +- public/locales/en/translation.json | 9 +- public/summary_achievements_mock.json | 170 +++++++++--------- src/common/types.ts | 1 + .../screens/Settings/components/SteamId.tsx | 26 +++ src/frontend/screens/Settings/index.scss | 6 +- src/frontend/screens/Settings/index.tsx | 7 + .../sections/AccountSettings/index.tsx | 17 ++ 8 files changed, 149 insertions(+), 89 deletions(-) create mode 100644 src/frontend/screens/Settings/components/SteamId.tsx create mode 100644 src/frontend/screens/Settings/sections/AccountSettings/index.tsx diff --git a/package.json b/package.json index b81896a3f..5573c9355 100644 --- a/package.json +++ b/package.json @@ -352,4 +352,4 @@ "vite>esbuild": true } } -} \ No newline at end of file +} diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 33391a727..7dfa8e847 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -696,6 +696,7 @@ "showfps": "Show FPS (DX9, 10 and 11)", "showMetalOverlay": "Show Stats Overlay", "start-in-tray": "Start Minimized", + "steamId": "Steam ID", "steamruntime": "Use Steam Runtime", "winecrossoverbottle": "CrossOver Bottle", "wineprefix": "WinePrefix folder", @@ -733,7 +734,8 @@ "general": "General", "log": "Log", "other": "Other", - "sync": "Cloud Saves Sync" + "sync": "Cloud Saves Sync", + "accounts": "Accounts" }, "open-config-file": "Open Config File", "reset-hyperplay": "Reset HyperPlay", @@ -758,6 +760,9 @@ "processing": "Processing files, please wait" }, "store": "Epic Store", + "stores": { + "title": "Stores" + }, "title": { "allGames": "All Games" }, @@ -809,4 +814,4 @@ "release": "Release Date", "size": "Size" } -} +} \ No newline at end of file diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index aa7a2a9bf..80b6f69e4 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -14,11 +14,11 @@ "gameId": 730, "gameName": "Counter-Strike: Global Offensive", "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 675, - "mintedAchievementCount": 4, + "totalAchievementCount": 161, + "mintedAchievementCount": 22, "mintableAchievementsCount": 105, - "isNewAchievement": true, - "isMinted": false + "isNewAchievement": false, + "isMinted": true }, { "apiname": "ACHIEVEMENT_31", @@ -35,11 +35,11 @@ "gameId": 230410, "gameName": "Warframe", "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 50, - "mintedAchievementCount": 3, + "totalAchievementCount": 36, + "mintedAchievementCount": 7, "mintableAchievementsCount": 17, - "isNewAchievement": false, - "isMinted": true + "isNewAchievement": true, + "isMinted": false }, { "apiname": "ACH_MATCHES_SCOUT", @@ -56,10 +56,10 @@ "gameId": 375230, "gameName": "Warhammer 40,000: Eternal Crusade", "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 7, - "mintedAchievementCount": 0, + "totalAchievementCount": 10, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, - "isNewAchievement": false, + "isNewAchievement": true, "isMinted": true }, { @@ -77,8 +77,8 @@ "gameId": 444090, "gameName": "Paladins", "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 7, - "mintedAchievementCount": 1, + "totalAchievementCount": 3, + "mintedAchievementCount": 3, "mintableAchievementsCount": 3, "isNewAchievement": false, "isMinted": true @@ -100,7 +100,7 @@ "totalAchievementCount": 0, "mintedAchievementCount": 0, "mintableAchievementsCount": 0, - "isNewAchievement": true, + "isNewAchievement": false, "isMinted": true }, { @@ -122,7 +122,7 @@ "mintedAchievementCount": 0, "mintableAchievementsCount": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": false }, { "apiname": "A001_NewBeginning", @@ -139,10 +139,10 @@ "gameId": 550650, "gameName": "Black Squad", "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 7, - "mintedAchievementCount": 6, + "totalAchievementCount": 33, + "mintedAchievementCount": 1, "mintableAchievementsCount": 6, - "isNewAchievement": true, + "isNewAchievement": false, "isMinted": false }, { @@ -160,11 +160,11 @@ "gameId": 578080, "gameName": "PUBG: BATTLEGROUNDS", "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 10, - "mintedAchievementCount": 3, + "totalAchievementCount": 21, + "mintedAchievementCount": 1, "mintableAchievementsCount": 4, - "isNewAchievement": true, - "isMinted": false + "isNewAchievement": false, + "isMinted": true }, { "apiname": "qc_victory", @@ -181,11 +181,11 @@ "gameId": 611500, "gameName": "Quake Champions", "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 4, + "totalAchievementCount": 1, "mintedAchievementCount": 1, "mintableAchievementsCount": 1, - "isNewAchievement": false, - "isMinted": false + "isNewAchievement": true, + "isMinted": true }, { "apiname": "1", @@ -205,8 +205,8 @@ "totalAchievementCount": 7, "mintedAchievementCount": 7, "mintableAchievementsCount": 7, - "isNewAchievement": false, - "isMinted": true + "isNewAchievement": true, + "isMinted": false }, { "apiname": "ach_story_1", @@ -225,8 +225,8 @@ "totalAchievementCount": 0, "mintedAchievementCount": 0, "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": false + "isNewAchievement": false, + "isMinted": true }, { "apiname": "LIFE_TRAVEL_1_1", @@ -243,7 +243,7 @@ "gameId": 681660, "gameName": "Bless Online", "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 1, + "totalAchievementCount": 18, "mintedAchievementCount": 1, "mintableAchievementsCount": 1, "isNewAchievement": false, @@ -264,11 +264,11 @@ "gameId": 714010, "gameName": "Aimlabs", "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 87, - "mintedAchievementCount": 41, + "totalAchievementCount": 86, + "mintedAchievementCount": 19, "mintableAchievementsCount": 52, - "isNewAchievement": false, - "isMinted": false + "isNewAchievement": true, + "isMinted": true }, { "apiname": "mcvs_winmatch1", @@ -285,11 +285,11 @@ "gameId": 723780, "gameName": "Modern Combat Versus", "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 23, - "mintedAchievementCount": 10, + "totalAchievementCount": 39, + "mintedAchievementCount": 6, "mintableAchievementsCount": 13, - "isNewAchievement": false, - "isMinted": true + "isNewAchievement": true, + "isMinted": false }, { "apiname": "ACH_ENTER_ELYSIUM", @@ -330,8 +330,8 @@ "totalAchievementCount": 0, "mintedAchievementCount": 0, "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true + "isNewAchievement": false, + "isMinted": false }, { "apiname": "GOAL_ID_1604", @@ -369,11 +369,11 @@ "gameId": 844870, "gameName": "KurtzPel", "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 3, + "totalAchievementCount": 2, "mintedAchievementCount": 2, "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false + "isNewAchievement": false, + "isMinted": true }, { "apiname": "Goal_ID_01", @@ -390,8 +390,8 @@ "gameId": 872200, "gameName": "Rogue Company", "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 17, - "mintedAchievementCount": 6, + "totalAchievementCount": 300, + "mintedAchievementCount": 11, "mintableAchievementsCount": 15, "isNewAchievement": true, "isMinted": false @@ -410,8 +410,8 @@ "gameId": 883710, "gameName": "Resident Evil 2", "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 63, - "mintedAchievementCount": 5, + "totalAchievementCount": 32, + "mintedAchievementCount": 3, "mintableAchievementsCount": 11, "isNewAchievement": true, "isMinted": true @@ -431,11 +431,11 @@ "gameId": 961440, "gameName": "Resident Evil 2 \"1-Shot Demo\"", "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 5, - "mintedAchievementCount": 5, + "totalAchievementCount": 136, + "mintedAchievementCount": 4, "mintableAchievementsCount": 5, "isNewAchievement": true, - "isMinted": false + "isMinted": true }, { "apiname": "PFA_1", @@ -451,8 +451,8 @@ "gameId": 990080, "gameName": "Hogwarts Legacy", "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 29, - "mintedAchievementCount": 1, + "totalAchievementCount": 7, + "mintedAchievementCount": 7, "mintableAchievementsCount": 7, "isNewAchievement": true, "isMinted": false @@ -475,7 +475,7 @@ "totalAchievementCount": 2, "mintedAchievementCount": 2, "mintableAchievementsCount": 2, - "isNewAchievement": true, + "isNewAchievement": false, "isMinted": false }, { @@ -492,11 +492,11 @@ "gameId": 1091500, "gameName": "Cyberpunk 2077", "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 14, - "mintedAchievementCount": 1, + "totalAchievementCount": 29, + "mintedAchievementCount": 9, "mintableAchievementsCount": 10, - "isNewAchievement": true, - "isMinted": false + "isNewAchievement": false, + "isMinted": true }, { "apiname": "ACH_READY_TO_BECOME_AG", @@ -513,11 +513,11 @@ "gameId": 1100990, "gameName": "Aimbeast", "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 2, - "mintedAchievementCount": 0, + "totalAchievementCount": 19, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false + "isNewAchievement": false, + "isMinted": true }, { "apiname": "FISFORFAILURE", @@ -537,8 +537,8 @@ "totalAchievementCount": 0, "mintedAchievementCount": 0, "mintableAchievementsCount": 0, - "isNewAchievement": true, - "isMinted": true + "isNewAchievement": false, + "isMinted": false }, { "apiname": "1", @@ -557,7 +557,7 @@ "totalAchievementCount": 23, "mintedAchievementCount": 23, "mintableAchievementsCount": 23, - "isNewAchievement": true, + "isNewAchievement": false, "isMinted": false }, { @@ -575,10 +575,10 @@ "gameId": 1240440, "gameName": "Halo Infinite", "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 17, - "mintedAchievementCount": 3, + "totalAchievementCount": 6, + "mintedAchievementCount": 1, "mintableAchievementsCount": 6, - "isNewAchievement": true, + "isNewAchievement": false, "isMinted": true }, { @@ -596,11 +596,11 @@ "gameId": 1364780, "gameName": "Street Fighter™ 6", "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 14, - "mintedAchievementCount": 6, + "totalAchievementCount": 15, + "mintedAchievementCount": 5, "mintableAchievementsCount": 7, - "isNewAchievement": false, - "isMinted": true + "isNewAchievement": true, + "isMinted": false }, { "apiname": "jp.konami.masterduel.ach.001", @@ -617,8 +617,8 @@ "gameId": 1449850, "gameName": "Yu-Gi-Oh! Master Duel", "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, + "totalAchievementCount": 17, + "mintedAchievementCount": 0, "mintableAchievementsCount": 2, "isNewAchievement": true, "isMinted": false @@ -638,11 +638,11 @@ "gameId": 1466860, "gameName": "Age of Empires IV: Anniversary Edition", "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 12, + "totalAchievementCount": 10, "mintedAchievementCount": 5, "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": true + "isNewAchievement": false, + "isMinted": false }, { "apiname": "2010007", @@ -659,8 +659,8 @@ "gameId": 1599340, "gameName": "Lost Ark", "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 87, - "mintedAchievementCount": 3, + "totalAchievementCount": 61, + "mintedAchievementCount": 61, "mintableAchievementsCount": 61, "isNewAchievement": true, "isMinted": true @@ -680,10 +680,10 @@ "gameId": 1675900, "gameName": "Warlander", "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 12, - "mintedAchievementCount": 3, + "totalAchievementCount": 4, + "mintedAchievementCount": 4, "mintableAchievementsCount": 4, - "isNewAchievement": true, + "isNewAchievement": false, "isMinted": false }, { @@ -701,7 +701,7 @@ "gameId": 1816670, "gameName": "GUNDAM EVOLUTION", "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 5, + "totalAchievementCount": 3, "mintedAchievementCount": 1, "mintableAchievementsCount": 2, "isNewAchievement": false, @@ -722,9 +722,9 @@ "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", "totalAchievementCount": 2, - "mintedAchievementCount": 2, + "mintedAchievementCount": 1, "mintableAchievementsCount": 2, - "isNewAchievement": false, - "isMinted": true + "isNewAchievement": true, + "isMinted": false } ] diff --git a/src/common/types.ts b/src/common/types.ts index fed34dc0a..f766d604d 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -116,6 +116,7 @@ export interface AppSettings extends GameSettings { minimizeOnGameLaunch: boolean startInTray: boolean userInfo: UserInfo + steamId: string } export type LibraryTopSectionOptions = diff --git a/src/frontend/screens/Settings/components/SteamId.tsx b/src/frontend/screens/Settings/components/SteamId.tsx new file mode 100644 index 000000000..0019d6816 --- /dev/null +++ b/src/frontend/screens/Settings/components/SteamId.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' +import useSetting from 'frontend/hooks/useSetting' +import { configStore } from 'frontend/helpers/electronStores' +import { TextInput } from '@hyperplay/ui' + +const SteamId = () => { + const { t } = useTranslation() + const [steamId, setSteamId] = useSetting('steamId', '') + + function setInstallPath(path: string) { + setSteamId(path) + configStore.set('settings.steamId', path) + } + + return ( + setInstallPath(event.target.value)} + /> + ) +} + +export default SteamId diff --git a/src/frontend/screens/Settings/index.scss b/src/frontend/screens/Settings/index.scss index 117c21722..b616f72b8 100644 --- a/src/frontend/screens/Settings/index.scss +++ b/src/frontend/screens/Settings/index.scss @@ -61,7 +61,7 @@ .save { cursor: default; - margin: var(--space-md) 0 0 var(--space-md); + margin: var(--space-md) 0 0 0; padding-block-end: var(--space-xs); display: flex; align-items: center; @@ -216,3 +216,7 @@ a { .settingsSectionHeader { text-align: left; } + +.capitalize { + text-transform: capitalize; +} diff --git a/src/frontend/screens/Settings/index.tsx b/src/frontend/screens/Settings/index.tsx index 0465cba2e..36b7da183 100644 --- a/src/frontend/screens/Settings/index.tsx +++ b/src/frontend/screens/Settings/index.tsx @@ -18,6 +18,7 @@ import { Tabs } from '@hyperplay/ui' import Accessibility from '../Accessibility' import WineManager from '../WineManager' import ContextProvider from 'frontend/state/ContextProvider' +import AccountSettings from './sections/AccountSettings' export const defaultWineVersion: WineInstallation = { bin: '/usr/bin/wine', @@ -132,6 +133,9 @@ function Settings() {
{t('accessibility.title')}
+ +
{t('accounts')}
+
{!isWin ? (
@@ -155,6 +159,9 @@ function Settings() { + + + {!isWin ? ( diff --git a/src/frontend/screens/Settings/sections/AccountSettings/index.tsx b/src/frontend/screens/Settings/sections/AccountSettings/index.tsx new file mode 100644 index 000000000..4f953d97f --- /dev/null +++ b/src/frontend/screens/Settings/sections/AccountSettings/index.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' +import SteamId from '../../components/SteamId' + +export default function AccountSettings() { + const { t } = useTranslation() + + return ( + <> +
+ {t('settings.navbar.accounts')} +
+ + + + ) +} From 06f0abbcd19ffd46f46f070e827ea5b11a4e2ce4 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 17 Oct 2023 20:05:35 -0500 Subject: [PATCH 037/106] add flag (#594) --- src/backend/hyperplay-achievements | 2 +- src/common/typedefs/ipcBridge.d.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index ce621b48d..06d92357d 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit ce621b48dbf52064c7865676c02ebf92f1f8ad18 +Subproject commit 06d92357d52f227197cc6bbe897215f02c04b80c diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index b9c7ebf12..5de278915 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -223,6 +223,7 @@ interface HyperPlayAsyncIPCFunctions { channelId: number, accessCode: string ) => Promise + shouldShowAchievements: () => Promise } interface AsyncIPCFunctions extends HyperPlayAsyncIPCFunctions { From 61b0390dca55cd99e7240dcaecf353a173eb26e1 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 08:11:09 -0600 Subject: [PATCH 038/106] wip: use real end points to get data --- public/locales/en/translation.json | 6 + public/summary_achievements_mock.json | 394 +++++++++++------- src/common/typedefs/ipcBridge.d.ts | 5 +- src/common/types.ts | 23 +- src/frontend/hooks/useSettingsContext.ts | 2 +- .../AchievementStoreContext/index.tsx | 51 +++ .../Achievements/AchievementsLayout/index.tsx | 101 +++-- .../GameAchievementDetails/index.tsx | 44 +- .../MintAchievementsContext/index.tsx | 4 - .../components/AchievementsStats.tsx | 36 ++ src/frontend/screens/Achievements/index.tsx | 56 ++- src/frontend/screens/Settings/index.tsx | 2 +- 12 files changed, 485 insertions(+), 239 deletions(-) create mode 100644 src/frontend/screens/Achievements/AchievementStoreContext/index.tsx create mode 100644 src/frontend/screens/Achievements/components/AchievementsStats.tsx diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 7dfa8e847..d36502051 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -8,6 +8,12 @@ "zoom": "Zoom" }, "accounts": "accounts", + "achievements": { + "progress": { + "minted": "on chain", + "notMinted": "off chain" + } + }, "add_game": "Add Game", "All": "All", "ALL": "ALL", diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json index 80b6f69e4..558c858c0 100644 --- a/public/summary_achievements_mock.json +++ b/public/summary_achievements_mock.json @@ -14,11 +14,14 @@ "gameId": 730, "gameName": "Counter-Strike: Global Offensive", "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievementCount": 161, - "mintedAchievementCount": 22, - "mintableAchievementsCount": 105, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACHIEVEMENT_31", @@ -35,11 +38,14 @@ "gameId": 230410, "gameName": "Warframe", "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievementCount": 36, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 17, - "isNewAchievement": true, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACH_MATCHES_SCOUT", @@ -56,11 +62,14 @@ "gameId": 375230, "gameName": "Warhammer 40,000: Eternal Crusade", "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievementCount": 10, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "GOAL_ID_1215", @@ -77,11 +86,14 @@ "gameId": 444090, "gameName": "Paladins", "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievementCount": 3, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 3, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "Quest_39", @@ -97,11 +109,11 @@ "gameId": 489520, "gameName": "Minion Masters", "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": false }, { "apiname": "GLOBAL_GNOME_ALONE", @@ -118,9 +130,9 @@ "gameId": 546560, "gameName": "Half-Life: Alyx", "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, "isMinted": false }, @@ -139,11 +151,14 @@ "gameId": 550650, "gameName": "Black Squad", "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievementCount": 33, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 6, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": false + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACHIVE017", @@ -160,11 +175,14 @@ "gameId": 578080, "gameName": "PUBG: BATTLEGROUNDS", "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievementCount": 21, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 4, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "qc_victory", @@ -181,11 +199,14 @@ "gameId": 611500, "gameName": "Quake Champions", "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievementCount": 1, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": true, - "isMinted": true + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "1", @@ -202,11 +223,14 @@ "gameId": 677620, "gameName": "Splitgate", "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": true, - "isMinted": false + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ach_story_1", @@ -222,10 +246,10 @@ "gameId": 680420, "gameName": "OUTRIDERS", "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": false, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, "isMinted": true }, { @@ -243,11 +267,14 @@ "gameId": 681660, "gameName": "Bless Online", "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievementCount": 18, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 1, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "founder_achievement", @@ -264,11 +291,14 @@ "gameId": 714010, "gameName": "Aimlabs", "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievementCount": 86, - "mintedAchievementCount": 19, - "mintableAchievementsCount": 52, - "isNewAchievement": true, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "mcvs_winmatch1", @@ -285,11 +315,14 @@ "gameId": 723780, "gameName": "Modern Combat Versus", "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievementCount": 39, - "mintedAchievementCount": 6, - "mintableAchievementsCount": 13, - "isNewAchievement": true, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACH_ENTER_ELYSIUM", @@ -306,11 +339,11 @@ "gameId": 760160, "gameName": "Vampire: The Masquerade - Bloodhunt", "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": false, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, + "isMinted": false }, { "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", @@ -327,10 +360,10 @@ "gameId": 813780, "gameName": "Age of Empires II: Definitive Edition", "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": false, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, "isMinted": false }, { @@ -348,11 +381,11 @@ "gameId": 813820, "gameName": "Realm Royale Reforged", "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": true, - "isMinted": false + "isMinted": true }, { "apiname": "kz1", @@ -369,11 +402,14 @@ "gameId": 844870, "gameName": "KurtzPel", "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "Goal_ID_01", @@ -390,11 +426,14 @@ "gameId": 872200, "gameName": "Rogue Company", "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievementCount": 300, - "mintedAchievementCount": 11, - "mintableAchievementsCount": 15, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": true, - "isMinted": false + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "NEW_ACHIEVEMENT_1_1", @@ -410,11 +449,14 @@ "gameId": 883710, "gameName": "Resident Evil 2", "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievementCount": 32, - "mintedAchievementCount": 3, - "mintableAchievementsCount": 11, - "isNewAchievement": true, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "NEW_ACHIEVEMENT_1_0", @@ -431,11 +473,14 @@ "gameId": 961440, "gameName": "Resident Evil 2 \"1-Shot Demo\"", "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievementCount": 136, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 5, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": true, - "isMinted": true + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "PFA_1", @@ -451,11 +496,14 @@ "gameId": 990080, "gameName": "Hogwarts Legacy", "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievementCount": 7, - "mintedAchievementCount": 7, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACH_1", @@ -472,11 +520,14 @@ "gameId": 1085660, "gameName": "Destiny 2", "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievementCount": 2, - "mintedAchievementCount": 2, - "mintableAchievementsCount": 2, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": false + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "TheFool", @@ -492,11 +543,14 @@ "gameId": 1091500, "gameName": "Cyberpunk 2077", "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievementCount": 29, - "mintedAchievementCount": 9, - "mintableAchievementsCount": 10, - "isNewAchievement": false, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACH_READY_TO_BECOME_AG", @@ -513,11 +567,14 @@ "gameId": 1100990, "gameName": "Aimbeast", "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievementCount": 19, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": false, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "FISFORFAILURE", @@ -534,11 +591,11 @@ "gameId": 1126320, "gameName": "Being a DIK", "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievementCount": 0, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 0, - "isNewAchievement": false, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, + "isMinted": true }, { "apiname": "1", @@ -554,11 +611,14 @@ "gameId": 1196590, "gameName": "Resident Evil Village", "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievementCount": 23, - "mintedAchievementCount": 23, - "mintableAchievementsCount": 23, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": false + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "NEW_ACHIEVEMENT_3_15", @@ -575,11 +635,14 @@ "gameId": 1240440, "gameName": "Halo Infinite", "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievementCount": 6, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 6, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACHIEVEMENT_1", @@ -596,11 +659,14 @@ "gameId": 1364780, "gameName": "Street Fighter™ 6", "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievementCount": 15, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 7, - "isNewAchievement": true, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "jp.konami.masterduel.ach.001", @@ -617,11 +683,14 @@ "gameId": 1449850, "gameName": "Yu-Gi-Oh! Master Duel", "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievementCount": 17, - "mintedAchievementCount": 0, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "A001_", @@ -638,11 +707,14 @@ "gameId": 1466860, "gameName": "Age of Empires IV: Anniversary Edition", "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievementCount": 10, - "mintedAchievementCount": 5, - "mintableAchievementsCount": 7, - "isNewAchievement": false, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "2010007", @@ -659,11 +731,14 @@ "gameId": 1599340, "gameName": "Lost Ark", "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievementCount": 61, - "mintedAchievementCount": 61, - "mintableAchievementsCount": 61, - "isNewAchievement": true, - "isMinted": true + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": true, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "War06", @@ -680,11 +755,14 @@ "gameId": 1675900, "gameName": "Warlander", "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievementCount": 4, - "mintedAchievementCount": 4, - "mintableAchievementsCount": 4, - "isNewAchievement": false, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": true, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "クインティプルキル", @@ -701,11 +779,14 @@ "gameId": 1816670, "gameName": "GUNDAM EVOLUTION", "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievementCount": 3, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, "isNewAchievement": false, - "isMinted": true + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null }, { "apiname": "ACH16", @@ -721,10 +802,13 @@ "gameId": 1888160, "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievementCount": 2, - "mintedAchievementCount": 1, - "mintableAchievementsCount": 2, - "isNewAchievement": true, - "isMinted": false + "totalAchievements": 0, + "mintedAchievements": 0, + "mintableAchievements": 0, + "isNewAchievement": false, + "isMinted": false, + "totalAchievementsCount": null, + "mintableAchievementsCount": null, + "mintedAchievementsCount": null } ] diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index b9c7ebf12..a77d03971 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -218,7 +218,10 @@ interface HyperPlayAsyncIPCFunctions { currentPage: number totalPages: number }> - getAchievementsStats: (store: AchievementStore) => Promise + getAchievementsStats: ( + options: GetAchievementsStatsOptions + ) => Promise + syncAchievements: (options: SyncAchievementsOptions) => Promise checkHyperPlayAccessCode: ( channelId: number, accessCode: string diff --git a/src/common/types.ts b/src/common/types.ts index f766d604d..feddcc80b 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -792,10 +792,10 @@ export type AvailablePlatforms = { icon: IconDefinition }[] -export type AchievementStore = 'hyperplay' | 'steam' | 'epic' +export type AchievementStore = 'HYPERPLAY' | 'STEAM' | 'EPIC' export interface Achievement { - id: number + id: string apiname: string achieved: number unlocktime: number @@ -809,7 +809,7 @@ export interface Achievement { iconName: string gameId: number gameName: string - gameIconURL: string + gameImageURL: string } export interface SummaryAchievement extends Achievement { @@ -825,7 +825,19 @@ export type AchievementSort = 'ALPHA_A_TO_Z' | 'ALPHA_Z_TO_A' | 'SORT_BY_STATUS' export type AchievementFilter = 'ALL' | 'NEW' | 'MINTED' -export interface GetAchievementsOptions { +export interface PlayerOptions { + playerStoreId: string + playerAddress: string +} +export interface GetAchievementsStatsOptions extends PlayerOptions { + store: AchievementStore +} + +export interface SyncAchievementsOptions extends PlayerOptions { + store: AchievementStore +} + +export interface GetAchievementsOptions extends PlayerOptions { store: AchievementStore filter: AchievementFilter sort: AchievementSort @@ -833,11 +845,12 @@ export interface GetAchievementsOptions { pageSize: number } -export interface GetIndividualAchievementsOptions { +export interface GetIndividualAchievementsOptions extends PlayerOptions { gameId: number sort: AchievementSort page: number pageSize: number + store: AchievementStore } export interface AchievementsStats { newAchievements: number diff --git a/src/frontend/hooks/useSettingsContext.ts b/src/frontend/hooks/useSettingsContext.ts index 686fe2742..bb55b131b 100644 --- a/src/frontend/hooks/useSettingsContext.ts +++ b/src/frontend/hooks/useSettingsContext.ts @@ -6,7 +6,7 @@ import ContextProvider from 'frontend/state/ContextProvider' type Props = { appName: string - gameInfo: GameInfo + gameInfo: GameInfo | null runner: Runner } diff --git a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx new file mode 100644 index 000000000..00ee04649 --- /dev/null +++ b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx @@ -0,0 +1,51 @@ +import useSetting from 'frontend/hooks/useSetting' +import React, { createContext, useContext, ReactNode, useMemo } from 'react' + +import { AchievementStore as StoreType } from '../../../../common/types' + +interface AchievementStoreType { + store: StoreType + playerStoreId: string +} + +const AchievementStore = createContext({ + store: 'STEAM', + playerStoreId: '' +}) + +interface AchievementStoreProviderProps { + children: ReactNode +} + +const AchievementStoreProvider: React.FC = ({ + children +}) => { + const [steamId] = useSetting('steamId', '') + + const value = useMemo(() => { + return { + store: 'STEAM' as StoreType, + playerStoreId: steamId + } + }, [steamId]) + + return ( + + {children} + + ) +} + +const useAchievementStore = () => { + const context = useContext(AchievementStore) + + if (context === undefined) { + throw new Error( + 'useAchievementStore must be used within a AchievementStoreProvider and SettingsProvider' + ) + } + + return context +} + +export { AchievementStoreProvider, useAchievementStore } diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 17ad5526f..5ab73627d 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -1,72 +1,69 @@ -import React, { PropsWithChildren, useEffect, useState } from 'react' +import React, { PropsWithChildren } from 'react' -import { Background, AchievementsInfo, StoreRow, Images } from '@hyperplay/ui' +import { Background, StoreRow, Images } from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' import { MintAchievementsProvider } from '../MintAchievementsContext' +import { AchievementsStats } from '../components/AchievementsStats' +import useSettingsContext from 'frontend/hooks/useSettingsContext' +import SettingsContext from 'frontend/screens/Settings/SettingsContext' +import { AchievementStoreProvider } from '../AchievementStoreContext' export default React.memo(function AchievementsLayout({ children }: PropsWithChildren): JSX.Element { - const [stats, setStats] = useState({ - totalNewAchievements: 0, - totalMintedAchievements: 0, - totalAchievements: 0, - totalGames: 0, - numFreeMints: 0 + const contextValues = useSettingsContext({ + appName: 'default', + runner: 'hyperplay', + gameInfo: null }) - useEffect(() => { - const getStats = async () => { - const stats = await window.api.getAchievementsStats('steam') - setStats(stats) - } - - getStats() - }, []) + if (!contextValues) { + return <> + } return ( - - -
- - - - -
-
My Stores
+ + + + +
+ + - - - - - - - -

Link Store

-
+ +
+
My Stores
+ + + + + + + + +

Link Store

+
+
+
-
- - - - {children} - - -
- +
+ + {children} + +
+
+
+ + ) }) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 8079b3c2f..56ef406e9 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -5,6 +5,8 @@ import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' import { useMintAchievements } from '../MintAchievementsContext' import walletStore from 'frontend/store/WalletStore' +import { useTranslation } from 'react-i18next' +import { useAchievementStore } from '../AchievementStoreContext' const pageSize = 6 @@ -16,6 +18,7 @@ function isTimestampInPast(unixTimestamp: number) { } export default React.memo(function GameAchievementDetails(): JSX.Element { + const { t } = useTranslation() const { id } = useParams() const [summaryAchievement, setSummaryAchievement] = useState() @@ -34,27 +37,37 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { handleUpdate, achievementsToBeUpdated } = useMintAchievements() + const { store, playerStoreId } = useAchievementStore() useEffect(() => { const getAchievements = async () => { const { data } = await window.api.getSummaryAchievements({ - store: 'steam', + store, filter: 'ALL', sort: 'ALPHA_A_TO_Z', page: 1, - pageSize: 1 + pageSize: 1, + playerStoreId, + playerAddress: walletStore.address }) setSummaryAchievement(data[0]) const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), + store, sort: selectedSort.value, page: 1, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setAchievementData(achievements) - const stats = await window.api.getAchievementsStats('steam') + const stats = await window.api.getAchievementsStats({ + store, + playerStoreId, + playerAddress: walletStore.address + }) setFreeMints(stats.numFreeMints) } @@ -66,9 +79,12 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const nextPage = achievementsData.currentPage + 1 const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), + store, sort: selectedSort.value, page: nextPage, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setAchievementData(achievements) }, [achievementsData, selectedSort]) @@ -77,9 +93,12 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const prevPage = achievementsData.currentPage - 1 const achievements = await window.api.getIndividualAchievements({ gameId: Number(id), + store, sort: selectedSort.value, page: prevPage, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setAchievementData(achievements) }, [achievementsData, selectedSort]) @@ -97,7 +116,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { basketAmount: achievementsToBeMinted.length }} game={{ - title: summaryAchievement.name, + title: summaryAchievement.gameName, tags: summaryAchievement.tags ?? [] }} mintedAchievementsCount={summaryAchievement.mintedAchievementCount} @@ -123,9 +142,12 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const { data, totalPages, currentPage } = await window.api.getIndividualAchievements({ gameId: Number(id), + store, sort: chosenItem.value, page: 1, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setSelectedSort(chosenItem) setAchievementData({ currentPage, totalPages, data }) @@ -148,6 +170,12 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { disabled: isDisabled ?? achievementsToBeUpdated.length === 0, totalToUpdate: achievementsToBeUpdated.length }} + progressKeyProps={{ + i18n: { + mintedLabel: t('achievements.progress.minted'), + notMintedLabel: t('achievements.progress.notMinted') + } + }} /> ) }) diff --git a/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx index 7d07f7079..b70bc5c74 100644 --- a/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx +++ b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx @@ -7,7 +7,6 @@ import React, { useCallback } from 'react' -// Define the context type interface MintAchievementsType { achievementsToBeMinted: string[] // Define the type of your context value achievementsToBeUpdated: string[] // Define the type of your context value @@ -18,12 +17,10 @@ interface MintAchievementsType { isLoading: boolean } -// Create the context with an initial value const MintAchievements = createContext( undefined ) -// Define a provider component interface MintAchievementsProviderProps { children: ReactNode } @@ -108,7 +105,6 @@ const MintAchievementsProvider: React.FC = ({ ) } -// Define a custom hook to access the context value const useMintAchievements = () => { const context = useContext(MintAchievements) diff --git a/src/frontend/screens/Achievements/components/AchievementsStats.tsx b/src/frontend/screens/Achievements/components/AchievementsStats.tsx new file mode 100644 index 000000000..d0b415313 --- /dev/null +++ b/src/frontend/screens/Achievements/components/AchievementsStats.tsx @@ -0,0 +1,36 @@ +import { AchievementsInfo } from '@hyperplay/ui' +import React, { useEffect, useState } from 'react' +import walletStore from 'frontend/store/WalletStore' +import { useAchievementStore } from '../AchievementStoreContext' + +export const AchievementsStats = () => { + const [stats, setStats] = useState({ + totalNewAchievements: 0, + totalMintedAchievements: 0, + totalAchievements: 0, + totalGames: 0, + numFreeMints: 0 + }) + const { store, playerStoreId } = useAchievementStore() + + useEffect(() => { + const getStats = async () => { + const stats = await window.api.getAchievementsStats({ + store, + playerStoreId, + playerAddress: walletStore.address + }) + setStats(stats) + } + + getStats() + }, []) + + return ( + + ) +} diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 7778c041e..a441881de 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -10,6 +10,8 @@ import { import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' import { useMintAchievements } from './MintAchievementsContext' +import { useTranslation } from 'react-i18next' +import { useAchievementStore } from './AchievementStoreContext' const pageSize = 12 export const achievementsSortOptions = [ @@ -18,6 +20,8 @@ export const achievementsSortOptions = [ ] as { text: string; value: AchievementSort }[] export default React.memo(function Achievements(): JSX.Element { + const { t } = useTranslation() + const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [activeFilter, setActiveFilter] = useState('ALL') const [achievementsData, setAchievementData] = useState<{ @@ -27,6 +31,8 @@ export default React.memo(function Achievements(): JSX.Element { }>({ currentPage: 0, totalPages: 0, games: [] }) const [freeMints, setFreeMints] = useState(0) + const { store, playerStoreId } = useAchievementStore() + const { achievementsToBeMinted, toggleAchievementToBeMinted, @@ -39,17 +45,29 @@ export default React.memo(function Achievements(): JSX.Element { useEffect(() => { const getAchievements = async () => { + window.api.syncAchievements({ + store, + playerStoreId, + playerAddress: walletStore.address + }) const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ - store: 'steam', + store, filter: activeFilter, sort: selectedSort.value, page: 1, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) + setAchievementData({ currentPage, totalPages, games: data }) - const stats = await window.api.getAchievementsStats('steam') + const stats = await window.api.getAchievementsStats({ + store, + playerStoreId, + playerAddress: walletStore.address + }) setFreeMints(stats.numFreeMints) } @@ -60,11 +78,13 @@ export default React.memo(function Achievements(): JSX.Element { const nextPage = achievementsData.currentPage + 1 const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ - store: 'steam', + store, filter: activeFilter, sort: selectedSort.value, page: nextPage, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData, activeFilter, selectedSort]) @@ -73,11 +93,13 @@ export default React.memo(function Achievements(): JSX.Element { const prevPage = achievementsData.currentPage - 1 const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ - store: 'steam', + store, filter: activeFilter, sort: selectedSort.value, page: prevPage, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData, activeFilter, selectedSort]) @@ -111,7 +133,7 @@ export default React.memo(function Achievements(): JSX.Element { ) @@ -143,11 +171,13 @@ export default React.memo(function Achievements(): JSX.Element { if (chosenItem) { const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ - store: 'steam', + store, filter: activeFilter, sort: chosenItem.value, page: 1, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setSelectedSort(chosenItem) setAchievementData({ currentPage, totalPages, games: data }) @@ -169,11 +199,13 @@ export default React.memo(function Achievements(): JSX.Element { const { data, totalPages, currentPage } = await window.api.getSummaryAchievements({ - store: 'steam', + store, filter: newFilter, sort: selectedSort.value, page: 1, - pageSize + pageSize, + playerStoreId, + playerAddress: walletStore.address }) setActiveFilter(newFilter) setAchievementData({ currentPage, totalPages, games: data }) diff --git a/src/frontend/screens/Settings/index.tsx b/src/frontend/screens/Settings/index.tsx index 36b7da183..2ea67581e 100644 --- a/src/frontend/screens/Settings/index.tsx +++ b/src/frontend/screens/Settings/index.tsx @@ -71,7 +71,7 @@ function Settings() { returnPath = '/library' } } - + console.log({ gameInfo }, { runner }, { appName }) // create setting context functions const contextValues: SettingsContextType | null = useSettingsContext({ appName, From 65257a3c832386dab35f856809df477c81e292cf Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 08:12:20 -0600 Subject: [PATCH 039/106] feat: update backend commit --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index ce621b48d..117cc6000 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit ce621b48dbf52064c7865676c02ebf92f1f8ad18 +Subproject commit 117cc600049ef97b75c96e9e1da7edfc87f81b85 From 4baa5c50d76f00beda708de9cf3d0ade2b960d99 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 08:59:22 -0600 Subject: [PATCH 040/106] fix: disabled buttons and update state --- .../Achievements/GameAchievementDetails/index.tsx | 6 +++--- src/frontend/screens/Achievements/index.tsx | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 56ef406e9..716a00010 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -104,7 +104,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }, [achievementsData, selectedSort]) const isDisabled = useMemo(() => { - return !walletStore.isConnected || isLoading + return isLoading || !walletStore.isConnected }, [isLoading, walletStore.isConnected]) if (!summaryAchievement) return <> @@ -162,12 +162,12 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }} mintButtonProps={{ onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0, + disabled: achievementsToBeMinted.length === 0 ?? isDisabled, totalToMint: achievementsToBeMinted.length }} updateButtonProps={{ onClick: handleUpdate, - disabled: isDisabled ?? achievementsToBeUpdated.length === 0, + disabled: achievementsToBeUpdated.length === 0 ?? isDisabled, totalToUpdate: achievementsToBeUpdated.length }} progressKeyProps={{ diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index a441881de..334d9b902 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -105,7 +105,7 @@ export default React.memo(function Achievements(): JSX.Element { }, [achievementsData, activeFilter, selectedSort]) const isDisabled = useMemo(() => { - return !walletStore.isConnected || isLoading + return isLoading || !walletStore.isConnected }, [isLoading, walletStore.isConnected]) const filter = useMemo(() => { @@ -113,18 +113,19 @@ export default React.memo(function Achievements(): JSX.Element { if (activeFilter === 'MINTED') return 'minted' return 'all' }, [activeFilter]) - + console.log(achievementsData, 'dats') return ( <> { const id = String(game.gameId) + const isUpdate = game.isNewAchievement && game.mintedAchievementCount > 0 const state = !walletStore.isConnected ? 'disabled' : achievementsToBeMinted.includes(id) || achievementsToBeUpdated.includes(id) ? 'active' - : game.isNewAchievement + : isUpdate ? 'update' : 'default' @@ -142,7 +143,7 @@ export default React.memo(function Achievements(): JSX.Element { ctaProps={{ onClick: (e) => { e.preventDefault() - if (game.isNewAchievement) { + if (isUpdate) { toggleAchievementToBeUpdated(id) } else { toggleAchievementToBeMinted(id) @@ -213,12 +214,12 @@ export default React.memo(function Achievements(): JSX.Element { }} mintButtonProps={{ onClick: handleMint, - disabled: isDisabled ?? achievementsToBeMinted.length === 0, + disabled: achievementsToBeMinted.length === 0 ?? isDisabled, totalToMint: achievementsToBeMinted.length }} updateButtonProps={{ onClick: handleUpdate, - disabled: isDisabled ?? achievementsToBeUpdated.length === 0, + disabled: achievementsToBeUpdated.length === 0 ?? isDisabled, totalToUpdate: achievementsToBeUpdated.length }} achievementNavProps={{ From a7fd3456e48dc1a778362ea9b8aa270ee4493832 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 09:00:23 -0600 Subject: [PATCH 041/106] chore: update api commit --- src/backend/hyperplay-achievements | 2 +- src/frontend/screens/Achievements/index.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 911783ac9..58b7db8e0 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 911783ac90a4d487fc630fa7bc3fa7d84d845b89 +Subproject commit 58b7db8e0d7d4b670615ae03ec507baf88782115 diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 334d9b902..3fadb894e 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -119,7 +119,8 @@ export default React.memo(function Achievements(): JSX.Element { { const id = String(game.gameId) - const isUpdate = game.isNewAchievement && game.mintedAchievementCount > 0 + const isUpdate = + game.isNewAchievement && game.mintedAchievementCount > 0 const state = !walletStore.isConnected ? 'disabled' : achievementsToBeMinted.includes(id) || From 1c7af538cfb079ea0ff3bdd09eb00839b302ce4e Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 09:02:01 -0600 Subject: [PATCH 042/106] chore: remove log --- src/frontend/screens/Settings/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/screens/Settings/index.tsx b/src/frontend/screens/Settings/index.tsx index 2ea67581e..36b7da183 100644 --- a/src/frontend/screens/Settings/index.tsx +++ b/src/frontend/screens/Settings/index.tsx @@ -71,7 +71,7 @@ function Settings() { returnPath = '/library' } } - console.log({ gameInfo }, { runner }, { appName }) + // create setting context functions const contextValues: SettingsContextType | null = useSettingsContext({ appName, From 90f2618d9c83ed3fca6b5570aaf089859e8fe155 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 09:03:59 -0600 Subject: [PATCH 043/106] feat: remove mock data --- public/achievements_mock.json | 6603 ------------------------- public/summary_achievements_mock.json | 814 --- 2 files changed, 7417 deletions(-) delete mode 100644 public/achievements_mock.json delete mode 100644 public/summary_achievements_mock.json diff --git a/public/achievements_mock.json b/public/achievements_mock.json deleted file mode 100644 index 7c9b296cf..000000000 --- a/public/achievements_mock.json +++ /dev/null @@ -1,6603 +0,0 @@ -{ - "status": 1, - "message": "processed successfully", - "data": [ - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c" - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A002_", - "achieved": 1, - "unlocktime": 1642288866, - "name": "A002_", - "defaultvalue": 0, - "displayName": "Kingdoms Will Fall", - "hidden": 0, - "description": "Defeat 20 enemy units.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/2341aa974fb9d279d361477db4c360ca16b11f02.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/17ed6021db943ae012d579c9edeefe7c9fcd7a58.jpg", - "iconName": "Kingdoms Will Fall", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A003_", - "achieved": 1, - "unlocktime": 1642289389, - "name": "A003_", - "defaultvalue": 0, - "displayName": "A New Age Is Upon Us", - "hidden": 0, - "description": "Complete the Introductory Tutorial.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/658480662c2b1a1cabbe56131317021751365e03.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9a200b8f62d7f1fca02340178e04853807ec057d.jpg", - "iconName": "A New Age Is Upon Us", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A026_", - "achieved": 1, - "unlocktime": 1642352859, - "name": "A026_", - "defaultvalue": 0, - "displayName": "Quick Study", - "hidden": 0, - "description": "Complete your first Civilization Mastery task.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/3c96a502dae11a84e18b82b4325297fc8b957a53.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/0a1c1e654dab3e006e094d2e37f9b77626ab020c.jpg", - "iconName": "Quick Study", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A065_", - "achieved": 1, - "unlocktime": 1642356477, - "name": "A065_", - "defaultvalue": 0, - "displayName": "Deforestation", - "hidden": 0, - "description": "Gather Wood 1,000 times as the Rus.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/02487cf9561c4e039935ecdf5a3b2783107a47eb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/98b1ea2d23e4a05349c940a838e5a2cdd33df387.jpg", - "iconName": "Deforestation", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A066_", - "achieved": 1, - "unlocktime": 1642355022, - "name": "A066_", - "defaultvalue": 0, - "displayName": "In Memory of Kulikovo", - "hidden": 0, - "description": "Enhance 10 units with a single Saint's Blessing strike as the Rus.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/2b945c31fa04e8aa0a77131271b57158ef230302.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/654abda980ee8c2983ddfceb647012f7ebd3df28.jpg", - "iconName": "In Memory of Kulikovo", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A070_", - "achieved": 1, - "unlocktime": 1642824762, - "name": "A070_", - "defaultvalue": 0, - "displayName": "Explore, Expand, Exploit", - "hidden": 0, - "description": "Accrue 10,000 Stone in a single match as the Mongols.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/bfcaef0842bbfe610362a937fee3ec426da3fe47.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/6c857f101fa02c06384c5ff1d2636fba2c38c17e.jpg", - "iconName": "Explore, Expand, Exploit", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "A092_", - "achieved": 1, - "unlocktime": 1643169840, - "name": "A092_", - "defaultvalue": 0, - "displayName": "We Charge Extra for That", - "hidden": 0, - "description": "Shutdown a Cavalry Charge with Palings as the English.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/fb1ffdecfe0324ef50308b4e507d6c71e8205b0d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/c2871c3b53b088b9f696b43d231aba51ea784604.jpg", - "iconName": "We Charge Extra for That", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e" - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e" - }, - { - "apiname": "ACH_EAT_SLEEP_PLAY_REPEAT", - "achieved": 1, - "unlocktime": 1655763083, - "name": "ACH_EAT_SLEEP_PLAY_REPEAT", - "defaultvalue": 0, - "displayName": "Eat, Sleep, Play, Repeat", - "hidden": 0, - "description": "Play a routine for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/e0672a0dddd92ece36408b5f23c44c50bacdfb61.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/f5e1b5e2441a7308d2a44044dbbcb32173a4ab5e.jpg", - "iconName": "Eat, Sleep, Play, Repeat", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e" - }, - { - "apiname": "ACH_GLOBAL_RANK", - "achieved": 1, - "unlocktime": 1655763083, - "name": "ACH_GLOBAL_RANK", - "defaultvalue": 0, - "displayName": "Ready to climb?", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/eb27c8f7fe83a960c51be972ba40eb643b5c4c8b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/08e7d0592400d334bbcbc403f566b96715b66c38.jpg", - "iconName": "Ready to climb?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e" - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "ea_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "ea_achievement", - "defaultvalue": 0, - "displayName": "Early Access User", - "hidden": 0, - "description": "Aim Lab Early Access User", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/0ec4cea50cc6770963477d82c56449e75f92ed59.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/751cd1fb3068438111eccd21b7a4cdbf42802e79.jpg", - "iconName": "Early Access User", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_NOOB", - "achieved": 1, - "unlocktime": 1595005531, - "name": "SPIDERSHOT_NOOB", - "defaultvalue": 0, - "displayName": "Spidershot Noob", - "hidden": 0, - "description": "Played Spidershot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/db72557053d344775c8679a5b617ea77d5960b1d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/98d66b8ca30c8fe46a5d201863ca24910017b702.jpg", - "iconName": "Spidershot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_ROOKIE", - "achieved": 1, - "unlocktime": 1595005532, - "name": "SPIDERSHOT_ROOKIE", - "defaultvalue": 0, - "displayName": "Spidershot Rookie", - "hidden": 0, - "description": "Played Spidershot 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f6791fee6c78c387e898a1e77d6e42bb6322bc51.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b99b8befad76146b063bd81ea5555f27ec633a46.jpg", - "iconName": "Spidershot Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_COMPETENT", - "achieved": 1, - "unlocktime": 1596412603, - "name": "SPIDERSHOT_COMPETENT", - "defaultvalue": 0, - "displayName": "Spidershot Competent", - "hidden": 0, - "description": "Played Spidershot 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8e23097ced0d6be68744cf195cbfe09d0d4a50b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c33b3490dadada9df764558154e9f8ebbcff4fd8.jpg", - "iconName": "Spidershot Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_PRO", - "achieved": 1, - "unlocktime": 1596412603, - "name": "SPIDERSHOT_PRO", - "defaultvalue": 0, - "displayName": "Spidershot Pro", - "hidden": 0, - "description": "Played Spidershot 30 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/966cc31062242595f187c75ccdd7b955429676b8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/32ab82f0481fdde29c71cd234eb6180f13dbe679.jpg", - "iconName": "Spidershot Pro", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_EXPERT", - "achieved": 1, - "unlocktime": 1597252119, - "name": "SPIDERSHOT_EXPERT", - "defaultvalue": 0, - "displayName": "Spidershot Expert", - "hidden": 0, - "description": "Played Spidershot 50 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/516778d7feee38249819e419e6648bf565324039.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/844efa9c0e2a1723bb37d03765e9da978e79cec3.jpg", - "iconName": "Spidershot Expert", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_MASTER", - "achieved": 1, - "unlocktime": 1598201098, - "name": "SPIDERSHOT_MASTER", - "defaultvalue": 0, - "displayName": "Spidershot Master", - "hidden": 0, - "description": "Played Spidershot 75 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2a1d6f3aeb1ee481c8f2cc7f603605a212197364.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/614aec113318b2b713c03c97b929c845a7d81548.jpg", - "iconName": "Spidershot Master", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "SPIDERSHOT_LEGEND", - "achieved": 1, - "unlocktime": 1601063117, - "name": "SPIDERSHOT_LEGEND", - "defaultvalue": 0, - "displayName": "Spidershot Legend", - "hidden": 0, - "description": "Played Spidershot 100 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c6a090d2803546e10a964a0a96152202ad5e6367.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9c8584942b1222c41223dde3a6503c01f2b1a9d9.jpg", - "iconName": "Spidershot Legend", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "REFLEXSHOT_NOOB", - "achieved": 1, - "unlocktime": 1595005532, - "name": "REFLEXSHOT_NOOB", - "defaultvalue": 0, - "displayName": "Reflexshot Noob", - "hidden": 0, - "description": "Played Reflexshot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/823201f3cef165035a93b6531bc7dd3fdc50a7d6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d9a32a4e78b3bdd26b7385315866259604cbf3dc.jpg", - "iconName": "Reflexshot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "REFLEXSHOT_ROOKIE", - "achieved": 1, - "unlocktime": 1596550770, - "name": "REFLEXSHOT_ROOKIE", - "defaultvalue": 0, - "displayName": "Reflexshot Rookie", - "hidden": 0, - "description": "Played Reflexshot 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2dab8c099ce612ffa4454b8016fdea6f4874a11e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8491a0e6fc00b213e0af277d48a8b9c3220a22f4.jpg", - "iconName": "Reflexshot Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "REFLEXSHOT_COMPETENT", - "achieved": 1, - "unlocktime": 1597368249, - "name": "REFLEXSHOT_COMPETENT", - "defaultvalue": 0, - "displayName": "Reflexshot Competent", - "hidden": 0, - "description": "Played Reflexshot 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/01fb3b214a2747769ac3e605ed74c7494b272367.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/30f0c2fa33e34c4ba253547816f4773b59bb4e65.jpg", - "iconName": "Reflexshot Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "REFLEXSHOT_PRO", - "achieved": 1, - "unlocktime": 1599103980, - "name": "REFLEXSHOT_PRO", - "defaultvalue": 0, - "displayName": "Reflexshot Pro", - "hidden": 0, - "description": "Played Reflexshot 30 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d66850d48f591ce582c7cef0ad158e4b64283b43.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/a1d63fa242d10e360d6f341c021bb0353739eec9.jpg", - "iconName": "Reflexshot Pro", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "REFLEXSHOT_EXPERT", - "achieved": 1, - "unlocktime": 1628707394, - "name": "REFLEXSHOT_EXPERT", - "defaultvalue": 0, - "displayName": "Reflexshot Expert", - "hidden": 0, - "description": "Played Reflexshot 50 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/acfbe4ceacab2b2553538ba54f9feb42770c2c31.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c1a97b8279d3c46301bf2b09a4f3430b764d539f.jpg", - "iconName": "Reflexshot Expert", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "REFLEXSHOT_MASTER", - "achieved": 1, - "unlocktime": 1645552997, - "name": "REFLEXSHOT_MASTER", - "defaultvalue": 0, - "displayName": "Reflexshot Master", - "hidden": 0, - "description": "Played Reflexshot 75 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2d35c1e2afd3ae3450df9d2f3e8b1882a4442297.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/e5392aeb3d3c8a15f4eb4e8ec75b27f1e0888010.jpg", - "iconName": "Reflexshot Master", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFESHOT_NOOB", - "achieved": 1, - "unlocktime": 1596468751, - "name": "STRAFESHOT_NOOB", - "defaultvalue": 0, - "displayName": "Strafeshot Noob", - "hidden": 0, - "description": "Played Strafeshot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2e19e113caa16ac1030b42fce9379579ed9ff043.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/3795e8a66ecf98931bf80e2f68e8e3afdd2ce10b.jpg", - "iconName": "Strafeshot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFESHOT_ROOKIE", - "achieved": 1, - "unlocktime": 1596904047, - "name": "STRAFESHOT_ROOKIE", - "defaultvalue": 0, - "displayName": "Strafeshot Rookie", - "hidden": 0, - "description": "Played Strafeshot 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9fe6956682039b3555a2049e46823545cd57efb1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/dad3c9bb4736f699e190e1a5a45888bcc09bb115.jpg", - "iconName": "Strafeshot Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFESHOT_COMPETENT", - "achieved": 1, - "unlocktime": 1597368250, - "name": "STRAFESHOT_COMPETENT", - "defaultvalue": 0, - "displayName": "Strafeshot Competent", - "hidden": 0, - "description": "Played Strafeshot 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/bad615cfc2622e603ec9b8108dbd385f1f03d91d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/dea675763e478b97c689fce061fcab7d1d8591ed.jpg", - "iconName": "Strafeshot Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFESHOT_PRO", - "achieved": 1, - "unlocktime": 1599661231, - "name": "STRAFESHOT_PRO", - "defaultvalue": 0, - "displayName": "Strafeshot Pro", - "hidden": 0, - "description": "Played Strafeshot 30 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/0043e84013bd8305880cb96dc7e69c593b6141ca.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/bbaeb7ec1179135db4f6cd38a3d0056ecf24622c.jpg", - "iconName": "Strafeshot Pro", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "PENTAKILL_NOOB", - "achieved": 1, - "unlocktime": 1598386192, - "name": "PENTAKILL_NOOB", - "defaultvalue": 0, - "displayName": "Pentakill Noob", - "hidden": 0, - "description": "Played Pentakill 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/4aed36ce731a7751aa98ec9efec99b5e7b3335f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9b257a6411677267826020744a383df522f72506.jpg", - "iconName": "Pentakill Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFETRACK_NOOB", - "achieved": 1, - "unlocktime": 1596412603, - "name": "STRAFETRACK_NOOB", - "defaultvalue": 0, - "displayName": "Strafetrack Noob", - "hidden": 0, - "description": "Played Strafetrack 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2de9c9e258cd1c9b5c3c2bcab57b00690d5b2dca.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/425d96fb0bb9fb9a5e3f61a160e9750947e0a855.jpg", - "iconName": "Strafetrack Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFETRACK_ROOKIE", - "achieved": 1, - "unlocktime": 1596559996, - "name": "STRAFETRACK_ROOKIE", - "defaultvalue": 0, - "displayName": "Strafetrack Rookie", - "hidden": 0, - "description": "Played Strafetrack 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/81dba386f9fab7b94190b356add970a9206477bb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b2f085ddd9038eb3dde53a535321f206cf78de35.jpg", - "iconName": "Strafetrack Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFETRACK_COMPETENT", - "achieved": 1, - "unlocktime": 1597368250, - "name": "STRAFETRACK_COMPETENT", - "defaultvalue": 0, - "displayName": "Strafetrack Competent", - "hidden": 0, - "description": "Played Strafetrack 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/51c26801e6c8f14c704eb87f912944772d912a49.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/21f7f5863d32b828b9346a0c09332cc0b6f91cbb.jpg", - "iconName": "Strafetrack Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFETRACK_PRO", - "achieved": 1, - "unlocktime": 1599144640, - "name": "STRAFETRACK_PRO", - "defaultvalue": 0, - "displayName": "Strafetrack Pro", - "hidden": 0, - "description": "Played Strafetrack 30 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/87ecf726cff8e509f270e6ecba564a51e2c18d38.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/66396ea3e5ab9df4666f1bc4a05468d10bdfa5a3.jpg", - "iconName": "Strafetrack Pro", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFETRACK_EXPERT", - "achieved": 1, - "unlocktime": 1606232164, - "name": "STRAFETRACK_EXPERT", - "defaultvalue": 0, - "displayName": "Strafetrack Expert", - "hidden": 0, - "description": "Played Strafetrack 50 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/bd8c085d76ea95e16cdfb0d726d466a5e52e0436.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/da9387e2f5cf785a026e46aa2c9e4010182da40a.jpg", - "iconName": "Strafetrack Expert", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "STRAFETRACK_MASTER", - "achieved": 1, - "unlocktime": 1649276374, - "name": "STRAFETRACK_MASTER", - "defaultvalue": 0, - "displayName": "Strafetrack Master", - "hidden": 0, - "description": "Played Strafetrack 75 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/6d30554a465d2314fe57f1b5fee1c501986fccc8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/134e204eadd39f4fa2d40f5cf0401caf1a6580d3.jpg", - "iconName": "Strafetrack Master", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "CIRCLETRACK_NOOB", - "achieved": 1, - "unlocktime": 1596561174, - "name": "CIRCLETRACK_NOOB", - "defaultvalue": 0, - "displayName": "Circletrack Noob", - "hidden": 0, - "description": "Played Circletrack 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d8296837063e534fbe42b6948b8c159a73c762c9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/4c6339765df833784cd1b10355cec56435c306f7.jpg", - "iconName": "Circletrack Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "CIRCLETRACK_ROOKIE", - "achieved": 1, - "unlocktime": 1601658875, - "name": "CIRCLETRACK_ROOKIE", - "defaultvalue": 0, - "displayName": "Circletrack Rookie", - "hidden": 0, - "description": "Played Circletrack 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f76dd43dfe2a23c93a5dbcac6f17f596defce1df.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/44a44fa50ae74400ebdec3f59d7e391138f9e5fd.jpg", - "iconName": "Circletrack Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "CIRCLETRACK_COMPETENT", - "achieved": 1, - "unlocktime": 1615591501, - "name": "CIRCLETRACK_COMPETENT", - "defaultvalue": 0, - "displayName": "Circletrack Competent", - "hidden": 0, - "description": "Played Circletrack 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/999e415a3eed1de6551c8289dea4196e7528342b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/7ece6c889e65819d648455f9c53f3579521d1b54.jpg", - "iconName": "Circletrack Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "BLINKSHOT_NOOB", - "achieved": 1, - "unlocktime": 1601658875, - "name": "BLINKSHOT_NOOB", - "defaultvalue": 0, - "displayName": "Blinkshot Noob", - "hidden": 0, - "description": "Played Blinkshot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/67687507b62cac0151f144e7510d9ad00df069cd.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8a9cdd8f222434818f28c43157f39bd81e5cc6de.jpg", - "iconName": "Blinkshot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "NINJASHOT_NOOB", - "achieved": 1, - "unlocktime": 1598721618, - "name": "NINJASHOT_NOOB", - "defaultvalue": 0, - "displayName": "Ninjashot Noob", - "hidden": 0, - "description": "Played Ninjashot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/3d03bc69280aab1d2517cb6b1f1e6d1bde9f996b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c8098440b532c1efdbc444f1d087cdddd4276b54.jpg", - "iconName": "Ninjashot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "NINJASHOT_ROOKIE", - "achieved": 1, - "unlocktime": 1602176603, - "name": "NINJASHOT_ROOKIE", - "defaultvalue": 0, - "displayName": "Ninjashot Rookie", - "hidden": 0, - "description": "Played Ninjashot 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/e18e5464065261db97f70cd0a1b091f802c9d63d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/5962c01ee6424ff57a5a757b3da5bf6c55f85621.jpg", - "iconName": "Ninjashot Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DETECTION_NOOB", - "achieved": 1, - "unlocktime": 1596412603, - "name": "DETECTION_NOOB", - "defaultvalue": 0, - "displayName": "Detection Noob", - "hidden": 0, - "description": "Played Detection 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/1a60e34a94578adf75df4294dcc8c4346b2a34f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9e799d33261655375678f5346df2785ca543f262.jpg", - "iconName": "Detection Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DETECTION_ROOKIE", - "achieved": 1, - "unlocktime": 1599103980, - "name": "DETECTION_ROOKIE", - "defaultvalue": 0, - "displayName": "Detection Rookie", - "hidden": 0, - "description": "Played Detection 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/1775697a0d09bde54673bd3863b3d2f22b7fd753.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9571c6a3824e8a3331daf78a307ec1b7cec47bb5.jpg", - "iconName": "Detection Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DETECTION_COMPETENT", - "achieved": 1, - "unlocktime": 1615591501, - "name": "DETECTION_COMPETENT", - "defaultvalue": 0, - "displayName": "Detection Competent", - "hidden": 0, - "description": "Played Detection 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/de91d4143bc7ced14ffbfb612559ebd7e1f7b60a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/02e0367d860151aeccf69d58dc44834a0b80470e.jpg", - "iconName": "Detection Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_NOOB", - "achieved": 1, - "unlocktime": 1596412603, - "name": "MICROSHOT_NOOB", - "defaultvalue": 0, - "displayName": "Microshot Noob", - "hidden": 0, - "description": "Played Microshot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/6e0fff090d86ee05122a1fff6df0a739a57feba8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f4d6b66b284cdd71a520ce75866ded1e0198d923.jpg", - "iconName": "Microshot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_ROOKIE", - "achieved": 1, - "unlocktime": 1596735749, - "name": "MICROSHOT_ROOKIE", - "defaultvalue": 0, - "displayName": "Microshot Rookie", - "hidden": 0, - "description": "Played Microshot 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f2090ce65f7cdcfa4230d076683e33365151b53e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/fe57d42907c7d27b836ad8b1d085519dfde03fb1.jpg", - "iconName": "Microshot Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_COMPETENT", - "achieved": 1, - "unlocktime": 1597414100, - "name": "MICROSHOT_COMPETENT", - "defaultvalue": 0, - "displayName": "Microshot Competent", - "hidden": 0, - "description": "Played Microshot 15 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b2a8c1c8f72d414a724247d9176b7ff0f4901dbf.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c25fe16cc0a622995005207ec642336192119ed7.jpg", - "iconName": "Microshot Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_PRO", - "achieved": 1, - "unlocktime": 1598755816, - "name": "MICROSHOT_PRO", - "defaultvalue": 0, - "displayName": "Microshot Pro", - "hidden": 0, - "description": "Played Microshot 30 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/858692df5080c4fee768242699a91f80b4008354.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/48348ca233f4bfb7b74d50ba93a167e221f6b121.jpg", - "iconName": "Microshot Pro", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_EXPERT", - "achieved": 1, - "unlocktime": 1606335543, - "name": "MICROSHOT_EXPERT", - "defaultvalue": 0, - "displayName": "Microshot Expert", - "hidden": 0, - "description": "Played Microshot 50 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d29c4a0f9dce3c412409c71124f7b3c83784331b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/5261150655778ce8a53eac9be466c68af203f662.jpg", - "iconName": "Microshot Expert", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_MASTER", - "achieved": 1, - "unlocktime": 1615920915, - "name": "MICROSHOT_MASTER", - "defaultvalue": 0, - "displayName": "Microshot Master", - "hidden": 0, - "description": "Played Microshot 75 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/0312cd7bcb35b67a8385c04ac484ca1173cbbd8b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/ec2e11c1db77a6163c4b97a9fd19791dea544112.jpg", - "iconName": "Microshot Master", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "MICROSHOT_LEGEND", - "achieved": 1, - "unlocktime": 1625590672, - "name": "MICROSHOT_LEGEND", - "defaultvalue": 0, - "displayName": "Microshot Legend", - "hidden": 0, - "description": "Played Microshot 100 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2c252e531c01175194c57ef1fb34f8cd9c7fbde0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9c2b3405a4f973e7c0b63d99f8604c61fa5a93dc.jpg", - "iconName": "Microshot Legend", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "FREETRACK_NOOB", - "achieved": 1, - "unlocktime": 1596468752, - "name": "FREETRACK_NOOB", - "defaultvalue": 0, - "displayName": "Freetrack Noob", - "hidden": 0, - "description": "Played Freetrack 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/2cea4e6a7654acd4bd692de2b7a0dead486a128d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8721085efe1151a8150a039677ef696e9a08b57c.jpg", - "iconName": "Freetrack Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "FREETRACK_ROOKIE", - "achieved": 1, - "unlocktime": 1596559998, - "name": "FREETRACK_ROOKIE", - "defaultvalue": 0, - "displayName": "Freetrack Rookie", - "hidden": 0, - "description": "Played Freetrack 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/17c0247327c5fb501359e7833ef20c6e89735207.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/abf402a4e0cdf30ee7039a176ca49cef932134a4.jpg", - "iconName": "Freetrack Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "FREETRACK_COMPETENT", - "achieved": 1, - "unlocktime": 1597792959, - "name": "FREETRACK_COMPETENT", - "defaultvalue": 0, - "displayName": "Freetrack Competent", - "hidden": 0, - "description": "Played Freetrack 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/94f98ef52ad9555fb75edda1be3a7bf919863f8c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/4ee46ea4132750370fa60cfee3b38df12e089885.jpg", - "iconName": "Freetrack Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "AUDIOSPATIAL_NOOB", - "achieved": 1, - "unlocktime": 1596412603, - "name": "AUDIOSPATIAL_NOOB", - "defaultvalue": 0, - "displayName": "Audiospatial Noob", - "hidden": 0, - "description": "Played Audiospatial 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/882f690f675de002a6ae20dfaa400c272de6f785.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/c94de7ee3a58ea829a13f5b25ba855707b203473.jpg", - "iconName": "Audiospatial Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_NOOB", - "achieved": 1, - "unlocktime": 1597368250, - "name": "DECISIONSHOT_NOOB", - "defaultvalue": 0, - "displayName": "Decisionshot Noob", - "hidden": 0, - "description": "Played Decisionshot 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/f84eb2b0a7ce24d3009ad184ecbd57e28e9c53cf.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/45fff81c85232d6bce2b45aa5a4ebbf4ac520217.jpg", - "iconName": "Decisionshot Noob", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_ROOKIE", - "achieved": 1, - "unlocktime": 1606423392, - "name": "DECISIONSHOT_ROOKIE", - "defaultvalue": 0, - "displayName": "Decisionshot Rookie", - "hidden": 0, - "description": "Played Decisionshot 5 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/a7b4eb210aa094745a256a24e1002b01fab06586.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/e4bfea58a1522a6f8ab027766a64e5ab85d8295a.jpg", - "iconName": "Decisionshot Rookie", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_COMPETENT", - "achieved": 1, - "unlocktime": 1606677058, - "name": "DECISIONSHOT_COMPETENT", - "defaultvalue": 0, - "displayName": "Decisionshot Competent", - "hidden": 0, - "description": "Played Decisionshot 15 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/367a483c0484b748de16241f977a5e0c589d7750.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/eb2f0e9363581e988446317327c9085611f8dbff.jpg", - "iconName": "Decisionshot Competent", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_PRO", - "achieved": 1, - "unlocktime": 1607040260, - "name": "DECISIONSHOT_PRO", - "defaultvalue": 0, - "displayName": "Decisionshot Pro", - "hidden": 0, - "description": "Played Decisionshot 30 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/d7c3c1e290f473f91ad9bcf07795b5e2474ecc79.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/a2ce45f0bbac76a548654c812220249d6677032f.jpg", - "iconName": "Decisionshot Pro", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_EXPERT", - "achieved": 1, - "unlocktime": 1612022685, - "name": "DECISIONSHOT_EXPERT", - "defaultvalue": 0, - "displayName": "Decisionshot Expert", - "hidden": 0, - "description": "Played Decisionshot 50 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/b3bcb95cff5b11d6e8e167e24cdb5fd14f47b951.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/de4bc0c87151ca47bd40984a1476f4eed9469170.jpg", - "iconName": "Decisionshot Expert", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_MASTER", - "achieved": 1, - "unlocktime": 1615411978, - "name": "DECISIONSHOT_MASTER", - "defaultvalue": 0, - "displayName": "Decisionshot Master", - "hidden": 0, - "description": "Played Decisionshot 75 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/9462a441e5003b3d07c9c05e9e9bde2427f4ea80.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/473d3739a4fcac0205af1dd2a212bb95bd378db3.jpg", - "iconName": "Decisionshot Master", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "DECISIONSHOT_LEGEND", - "achieved": 1, - "unlocktime": 1630179729, - "name": "DECISIONSHOT_LEGEND", - "defaultvalue": 0, - "displayName": "Decisionshot Legend", - "hidden": 0, - "description": "Played Decisionshot 100 Times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/61f9d389273f5f2cb71bd5472840edeba050426e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/7a86cbdafad8e86c1b0b2ecc3bb398ed3a4a46b0.jpg", - "iconName": "Decisionshot Legend", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189" - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808" - }, - { - "apiname": "ACH27", - "achieved": 1, - "unlocktime": 1692933591, - "name": "ACH27", - "defaultvalue": 0, - "displayName": "Hardware Engineer", - "hidden": 0, - "description": "Assembled an AC.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/2f02f63e0a349136407c7b681f5543fad4ee43f2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Hardware Engineer", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808" - }, - { - "apiname": "ACH29", - "achieved": 1, - "unlocktime": 1692933669, - "name": "ACH29", - "defaultvalue": 0, - "displayName": "Graphic Designer", - "hidden": 0, - "description": "Changed the coloration of your AC.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0309a1922cf8a8111f6b4af58a2a0e475e78ec78.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Graphic Designer", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808" - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e" - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "A022_FirstBlood", - "achieved": 1, - "unlocktime": 1661915651, - "name": "A022_FirstBlood", - "defaultvalue": 0, - "displayName": "First Blood", - "hidden": 0, - "description": "Achieve first kill", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/62faf347fa98fc3552bc5862b3ae56cc15995412.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/07460d385ef8239ae0dac9f63cc16e269818e971.jpg", - "iconName": "First Blood", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "A024_LastMan", - "achieved": 1, - "unlocktime": 1661916339, - "name": "A024_LastMan", - "defaultvalue": 0, - "displayName": "Last Man Standing", - "hidden": 0, - "description": "Be the last survivor and win in Demolition mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/2bf4019c3041ec0fbd3eda89a8bfbc1d2c4b08cb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/4bf9727cb3f53a86649713043c002dd8050929d2.jpg", - "iconName": "Last Man Standing", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "A032_LuckyDay", - "achieved": 1, - "unlocktime": 1661914667, - "name": "A032_LuckyDay", - "defaultvalue": 0, - "displayName": "Lucky Day", - "hidden": 0, - "description": "Open any Random Box ", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/b315101f5235e2fbee45159faf057d8d5e6f337c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/7da4a12bd40f735c6b006c13ea7847c2f83ab347.jpg", - "iconName": "Lucky Day", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "A033_ItemDelivery", - "achieved": 1, - "unlocktime": 1661914664, - "name": "A033_ItemDelivery", - "defaultvalue": 0, - "displayName": "Yeah! It's like a christmas", - "hidden": 0, - "description": "Receive first item", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/b0a1efeb97358eaee6c8193975dc3b6ed137fa70.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/8f29551e1e6fec8cbdc08a9a1d14333d4998034a.jpg", - "iconName": "Yeah! It's like a christmas", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "A034_GoodFriends", - "achieved": 1, - "unlocktime": 1661914845, - "name": "A034_GoodFriends", - "defaultvalue": 0, - "displayName": "Good Friends", - "hidden": 0, - "description": "Add friends", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/8b8558619f59a0b1ba3c7551b2094c5ab68476ca.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/15279f60ba5397e4098033e2ef05027e782aea66.jpg", - "iconName": "Good Friends", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "A035_PartyTime", - "achieved": 1, - "unlocktime": 1661915890, - "name": "A035_PartyTime", - "defaultvalue": 0, - "displayName": "Party Time", - "hidden": 0, - "description": "Play 1 Quick match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/02e1e732d358f80b5ed90fce68f26cb929b07d9e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/929a8459bc12db1ebfd2d75cb86486a9d8beb90e.jpg", - "iconName": "Party Time", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a" - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7" - }, - { - "apiname": "LIFE_TRAVEL_2_1", - "achieved": 1, - "unlocktime": 1527898896, - "name": "LIFE_TRAVEL_2_1", - "defaultvalue": 0, - "displayName": "Watch Your Back", - "hidden": 0, - "description": "Entered disputed territory", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/2b8c4ac4e5e11886258d2f50f5d09d197afccc73.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/0f4976c5badffc9020d897b7794d7a36e53b3ec3.jpg", - "iconName": "Watch Your Back", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7" - }, - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "BOMB_PLANT_LOW", - "achieved": 1, - "unlocktime": 1627172140, - "name": "BOMB_PLANT_LOW", - "defaultvalue": 0, - "displayName": "Boomala Boomala", - "hidden": 0, - "description": "Plant 100 bombs", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/325ccbd68e599083c1597fd90dc6d4265d1ca3b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a4f62b47ba5a852c71af6fe35411addbc0d1d193.jpg", - "iconName": "Boomala Boomala", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_LOW", - "achieved": 1, - "unlocktime": 1490379415, - "name": "KILL_ENEMY_LOW", - "defaultvalue": 0, - "displayName": "Body Bagger", - "hidden": 0, - "description": "Kill 25 enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b11ef0453168cd3d10684e184004f71dcc0faa82.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c2fc81593400110271e1f968f0e704a19ee83011.jpg", - "iconName": "Body Bagger", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_MED", - "achieved": 1, - "unlocktime": 1492041834, - "name": "KILL_ENEMY_MED", - "defaultvalue": 0, - "displayName": "Corpseman", - "hidden": 0, - "description": "Kill 500 enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/60d83a42df84fa5d84910af681370579e3bb16bf.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4ddb4bf34e96d538b6c9aab1ff1796f51d218e5d.jpg", - "iconName": "Corpseman", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_HIGH", - "achieved": 1, - "unlocktime": 1665097091, - "name": "KILL_ENEMY_HIGH", - "defaultvalue": 0, - "displayName": "God of War", - "hidden": 0, - "description": "Kill 10,000 enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2c2bb56a4f7376b53eeaf8e6d84044460b0d1cf2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/55fbfbb54876d0e777f430062201b9ea616face5.jpg", - "iconName": "God of War", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "BOMB_DEFUSE_CLOSE_CALL", - "achieved": 1, - "unlocktime": 1626295113, - "name": "BOMB_DEFUSE_CLOSE_CALL", - "defaultvalue": 0, - "displayName": "Second to None", - "hidden": 0, - "description": "Successfully defuse a bomb with less than one second remaining", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/986a53e24114699cb1f230f52b55b27e0de28ecf.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eb4763f562c2ea763afab225e410e74245893e43.jpg", - "iconName": "Second to None", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_BOMB_DEFUSER", - "achieved": 1, - "unlocktime": 1627420151, - "name": "KILL_BOMB_DEFUSER", - "defaultvalue": 0, - "displayName": "Counter-Counter-Terrorist", - "hidden": 0, - "description": "Kill a Counter-Terrorist while he is defusing the bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c09cb3fe34841fd1000a48c3b7825c4fde026188.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/010dc024d20bb7471a6ada87ba3d92c840228cbe.jpg", - "iconName": "Counter-Counter-Terrorist", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_BOMB_DEFUSE", - "achieved": 1, - "unlocktime": 1491005231, - "name": "WIN_BOMB_DEFUSE", - "defaultvalue": 0, - "displayName": "Rite of First Defusal", - "hidden": 0, - "description": "Win a round by defusing a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b2027dac5a9883f0f145e78a33e531a58944f3ec.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3c3e898c96d92e3f77624bbcf7b02c38d6cc3506.jpg", - "iconName": "Rite of First Defusal", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "BOMB_PLANT_IN_25_SECONDS", - "achieved": 1, - "unlocktime": 1518136122, - "name": "BOMB_PLANT_IN_25_SECONDS", - "defaultvalue": 0, - "displayName": "Short Fuse", - "hidden": 0, - "description": "Plant a bomb within 25 seconds (excluding Demolition mode)", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/648550738f4845f12aa686a1b4ee8c4a51ec2348.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3c8e0316829a1c3db72668b239ce2ea8669cb781.jpg", - "iconName": "Short Fuse", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_ROUNDS_LOW", - "achieved": 1, - "unlocktime": 1490390933, - "name": "WIN_ROUNDS_LOW", - "defaultvalue": 0, - "displayName": "Newb World Order", - "hidden": 0, - "description": "Win ten rounds", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9c759a9201a6fd54539f639e3815aa09a7c92d59.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a8fd9e9be81d3fe455b412ef9d99209e9f2cada7.jpg", - "iconName": "Newb World Order", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_ROUNDS_MED", - "achieved": 1, - "unlocktime": 1492032023, - "name": "WIN_ROUNDS_MED", - "defaultvalue": 0, - "displayName": "Pro-moted", - "hidden": 0, - "description": "Win 200 rounds", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2cd1d88ac944725d8782a55194a2d69b9b66104d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6b1fa9ba30d05ebf806d23a2375a781d99b5fbe3.jpg", - "iconName": "Pro-moted", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GIVE_DAMAGE_LOW", - "achieved": 1, - "unlocktime": 1490286109, - "name": "GIVE_DAMAGE_LOW", - "defaultvalue": 0, - "displayName": "Points in Your Favor", - "hidden": 0, - "description": "Inflict 2,500 total points of damage to enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/55650ec8f0cec4ea9b80d10e5ff420904b2a52a9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7c8f03d055680ddca6b70a3418d55971bfadceec.jpg", - "iconName": "Points in Your Favor", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GIVE_DAMAGE_MED", - "achieved": 1, - "unlocktime": 1491439901, - "name": "GIVE_DAMAGE_MED", - "defaultvalue": 0, - "displayName": "You've Made Your Points", - "hidden": 0, - "description": "Inflict 50,000 total points of damage to enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d676e407e16a75e5c9309779f436c1a3f1432442.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/64cf7c3474a9d1f755fb9d5977a913829f6b9f22.jpg", - "iconName": "You've Made Your Points", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GIVE_DAMAGE_HIGH", - "achieved": 1, - "unlocktime": 1640924231, - "name": "GIVE_DAMAGE_HIGH", - "defaultvalue": 0, - "displayName": "A Million Points of Blight", - "hidden": 0, - "description": "Inflict 1,000,000 total points of damage to enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/46d932bd2bc68f28e0fa8a03e92e5180fc5735dc.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3be2d4f83efcced660843484f3e042439ac9a517.jpg", - "iconName": "A Million Points of Blight", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILLING_SPREE", - "achieved": 1, - "unlocktime": 1491096895, - "name": "KILLING_SPREE", - "defaultvalue": 0, - "displayName": "Ballistic", - "hidden": 0, - "description": "In Classic mode, kill four enemy players within fifteen seconds", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/bfedf671220f823ddbeec18a16dc14d2ae32bcde.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/638d69d2fc898d91d7380ad7a29f328f760266e8.jpg", - "iconName": "Ballistic", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_WITH_OWN_GUN", - "achieved": 1, - "unlocktime": 1492543232, - "name": "KILL_WITH_OWN_GUN", - "defaultvalue": 0, - "displayName": "Lost and F0wnd", - "hidden": 0, - "description": "Kill an enemy with a gun they dropped during the current round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/66538681d639abe28a849f1c75e0862ac10fc687.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/21b522d0e28f5ca7c741687f7fe9d262fa96dbfc.jpg", - "iconName": "Lost and F0wnd", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_TWO_WITH_ONE_SHOT", - "achieved": 1, - "unlocktime": 1509422015, - "name": "KILL_TWO_WITH_ONE_SHOT", - "defaultvalue": 0, - "displayName": "Ammo Conservation", - "hidden": 0, - "description": "Kill two enemy players with a single bullet", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0d608d5c66449213da0efa3269081381929c1f6a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cdd82951e4ef1e95a310e6a09c122fca110eb665.jpg", - "iconName": "Ammo Conservation", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "EARN_MONEY_LOW", - "achieved": 1, - "unlocktime": 1490285370, - "name": "EARN_MONEY_LOW", - "defaultvalue": 0, - "displayName": "War Bonds", - "hidden": 0, - "description": "Earn $50,000 total cash", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2157e303dc3add51087496ef3a0a21a8c95e3d6f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b444bce6ad70aa28a40486c720438ef8995aed8a.jpg", - "iconName": "War Bonds", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "EARN_MONEY_MED", - "achieved": 1, - "unlocktime": 1624852690, - "name": "EARN_MONEY_MED", - "defaultvalue": 0, - "displayName": "Spoils of War", - "hidden": 0, - "description": "Earn $2,500,000 total cash", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2062cb82b9b58bcbdac27c827b42f57e1a57f83e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f133ba71921296999d89531dec05447235869fa2.jpg", - "iconName": "Spoils of War", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DEAD_GRENADE_KILL", - "achieved": 1, - "unlocktime": 1491172054, - "name": "DEAD_GRENADE_KILL", - "defaultvalue": 0, - "displayName": "Premature Burial", - "hidden": 0, - "description": "Kill an enemy with a grenade after dying", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7097e88eb11ea78696befe3827f4ed279f8c72e2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/18f9b47fb628c194e48d91f91b5253d7ab40dc4d.jpg", - "iconName": "Premature Burial", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_DEAGLE", - "achieved": 1, - "unlocktime": 1627073842, - "name": "KILL_ENEMY_DEAGLE", - "defaultvalue": 0, - "displayName": "Desert Eagle Expert", - "hidden": 0, - "description": "Kill 200 enemies with the Desert Eagle", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/16a8d6f8f89f9d960516a9e3bf265e48c8f233f8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b85c72c79dde29ccd221ef5affa0e5545e61736d.jpg", - "iconName": "Desert Eagle Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_GLOCK", - "achieved": 1, - "unlocktime": 1627442076, - "name": "KILL_ENEMY_GLOCK", - "defaultvalue": 0, - "displayName": "Glock-18 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the Glock-18", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/dfd91ef491bd48ee68c55ad9e26f75ca78391ac9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cec717d6be33402b011fb9a3869d01d305a16154.jpg", - "iconName": "Glock-18 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_ELITE", - "achieved": 1, - "unlocktime": 1626467911, - "name": "KILL_ENEMY_ELITE", - "defaultvalue": 0, - "displayName": "Dual Berettas Expert", - "hidden": 0, - "description": "Kill 25 enemies with the Dual Berettas", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1f058def617b3054389ec65ae25de22af8824628.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/713f3faeda54a19e8f02ffcd0fa87e28d686c891.jpg", - "iconName": "Dual Berettas Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_FIVESEVEN", - "achieved": 1, - "unlocktime": 1627071988, - "name": "KILL_ENEMY_FIVESEVEN", - "defaultvalue": 0, - "displayName": "Five-SeveN Expert", - "hidden": 0, - "description": "Kill 25 enemies with the Five-SeveN", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/05ce551a5f4e8c2395ed4c20ce80e6b380f201de.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/e7cfae0401070da6a748976f96c701fe26ed5b15.jpg", - "iconName": "Five-SeveN Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_AWP", - "achieved": 1, - "unlocktime": 1626395718, - "name": "KILL_ENEMY_AWP", - "defaultvalue": 0, - "displayName": "AWP Expert", - "hidden": 0, - "description": "Kill 500 enemies with the AWP", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2e9c84d626c81874d0ac4634d2a28024d8f8f6dc.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ce5a1333c6797e58c24cbe121fe0ecaa6c3a7510.jpg", - "iconName": "AWP Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_AK47", - "achieved": 1, - "unlocktime": 1627235731, - "name": "KILL_ENEMY_AK47", - "defaultvalue": 0, - "displayName": "AK-47 Expert", - "hidden": 0, - "description": "Kill 1,000 enemies with the AK-47", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/e61e83d7ccd73f122d98368190eff560f3a968ae.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b64ebdd96b843723ae699a091577310ffef67acd.jpg", - "iconName": "AK-47 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_M4A1", - "achieved": 1, - "unlocktime": 1627234998, - "name": "KILL_ENEMY_M4A1", - "defaultvalue": 0, - "displayName": "M4 AR Expert", - "hidden": 0, - "description": "Kill 1,000 enemies with an M4 Assault Rifle", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cd2c685b7e02156e6423602868d1ef91515a8f07.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b07067309a39c94df6f71d13020e7443bc709d9a.jpg", - "iconName": "M4 AR Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_FAMAS", - "achieved": 1, - "unlocktime": 1626652955, - "name": "KILL_ENEMY_FAMAS", - "defaultvalue": 0, - "displayName": "FAMAS Expert", - "hidden": 0, - "description": "Kill 100 enemies with the FAMAS", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0e2e2fd07d06b03bd61ea1d7a08d03cb76e06684.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/17ad7e0641476abda9c75d35f8076840b0234f20.jpg", - "iconName": "FAMAS Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_MAC10", - "achieved": 1, - "unlocktime": 1695662416, - "name": "KILL_ENEMY_MAC10", - "defaultvalue": 0, - "displayName": "MAC-10 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the MAC-10", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d32269eeec2a5605c8e658dd6d3c2cfc2c12018d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1681d7c3ef5c830c2ca1cad2b8a8df906e71b79a.jpg", - "iconName": "MAC-10 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_KNIFE", - "achieved": 1, - "unlocktime": 1664558087, - "name": "KILL_ENEMY_KNIFE", - "defaultvalue": 0, - "displayName": "Knife Expert", - "hidden": 0, - "description": "Kill 100 enemies with the knife", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f299cfa70e7b6b09a54834967eb9d2ba3d9f0631.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ca24c796cba96e5a3a3f79ae86621877a4615a49.jpg", - "iconName": "Knife Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_TEAM", - "achieved": 1, - "unlocktime": 1491096902, - "name": "KILL_ENEMY_TEAM", - "defaultvalue": 0, - "displayName": "The Cleaner", - "hidden": 0, - "description": "In Classic mode, kill five enemies in a single round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1e363fcb0d6f929079bf5cd5712801492231a436.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eeae6a08e52f3cb51c50cb82b089440c2fe735e3.jpg", - "iconName": "The Cleaner", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILLS_WITH_MULTIPLE_GUNS", - "achieved": 1, - "unlocktime": 1490379850, - "name": "KILLS_WITH_MULTIPLE_GUNS", - "defaultvalue": 0, - "displayName": "Variety Hour", - "hidden": 0, - "description": "Get kills with five different guns in a single round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/75030fe4dead2cf4ff26aa22373ff1e97319f127.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/212be5810ad72d9c10df2e3da4b4fcbef831f62c.jpg", - "iconName": "Variety Hour", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "LAST_PLAYER_ALIVE", - "achieved": 1, - "unlocktime": 1490989354, - "name": "LAST_PLAYER_ALIVE", - "defaultvalue": 0, - "displayName": "War of Attrition", - "hidden": 0, - "description": "Be the last player alive in a round with five players on your team", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c078614a0d546908b67740b113a65831c33e39a8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7f370bafba7252d904a3cb9926f054b076e0e9ce.jpg", - "iconName": "War of Attrition", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_LAST_BULLET", - "achieved": 1, - "unlocktime": 1491142154, - "name": "KILL_ENEMY_LAST_BULLET", - "defaultvalue": 0, - "displayName": "Magic Bullet", - "hidden": 0, - "description": "Kill an enemy with the last bullet in your magazine (excluding sniper rifles and Zeus x27)", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/20547dff510be3d7df94dc2c82ca7326eaf24641.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/387a9b977433aeb7df56556a51853a5577b2093d.jpg", - "iconName": "Magic Bullet", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILLING_SPREE_ENDER", - "achieved": 1, - "unlocktime": 1490988538, - "name": "KILLING_SPREE_ENDER", - "defaultvalue": 0, - "displayName": "Kill One, Get One Spree", - "hidden": 0, - "description": "Kill an enemy player who has just killed four of your teammates within 15 seconds", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b46735e642fe0146eaaf8da87bd9d426ad5510ac.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7bafc7e7f62f5fb6bf7dc6fc294d2efb651b57e3.jpg", - "iconName": "Kill One, Get One Spree", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "HEADSHOTS", - "achieved": 1, - "unlocktime": 1493012737, - "name": "HEADSHOTS", - "defaultvalue": 0, - "displayName": "Battle Sight Zero", - "hidden": 0, - "description": "Kill 250 enemies with headshots", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/72e142a6cbef679ffda7245b1074d1d52700ea98.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b36533f8ede908216ba43fbd50cfab87ce3a5c2a.jpg", - "iconName": "Battle Sight Zero", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DAMAGE_NO_KILL", - "achieved": 1, - "unlocktime": 1490968498, - "name": "DAMAGE_NO_KILL", - "defaultvalue": 0, - "displayName": "Primer", - "hidden": 0, - "description": "Do at least 95% damage to an enemy who is then killed by a another player", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6f731c184c8b54ef26f142d644cfe3a8082c4484.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/263f1b85e0c0584f6c64dd1eced477d5ee8d83ec.jpg", - "iconName": "Primer", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_LOW_DAMAGE", - "achieved": 1, - "unlocktime": 1490284929, - "name": "KILL_LOW_DAMAGE", - "defaultvalue": 0, - "displayName": "Finishing Schooled", - "hidden": 0, - "description": "Kill an enemy who has been reduced to less than 5% health by other players", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/81e3fcdf714a1b6124ac80918dff5b45ec1cdb79.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/aa274283103024a097145ff572d07033da426347.jpg", - "iconName": "Finishing Schooled", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_RELOADING", - "achieved": 1, - "unlocktime": 1490274200, - "name": "KILL_ENEMY_RELOADING", - "defaultvalue": 0, - "displayName": "Shot With Their Pants Down", - "hidden": 0, - "description": "Kill an enemy while they are reloading", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8348876e42a26000ec596a690ee962ff441f3d1f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/fc524700dc21b054f7d7223b0107991fff89e2f9.jpg", - "iconName": "Shot With Their Pants Down", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_BLINDED", - "achieved": 1, - "unlocktime": 1626141039, - "name": "KILL_ENEMY_BLINDED", - "defaultvalue": 0, - "displayName": "Blind Ambition", - "hidden": 0, - "description": "Kill 25 enemies blinded by flashbangs", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6439356b22bfb76c8b2693a25b5291e1ec4b6f0d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3bd6bbc5a689edb6cc2339261576c7b81ae95fca.jpg", - "iconName": "Blind Ambition", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMIES_WHILE_BLIND", - "achieved": 1, - "unlocktime": 1490986709, - "name": "KILL_ENEMIES_WHILE_BLIND", - "defaultvalue": 0, - "displayName": "Blind Fury", - "hidden": 0, - "description": "Kill an enemy while you are blinded from a flashbang", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5ee37dd9a04c583317d32af15f0a65b902ea7279.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eecfd460660516c8e15db282d1e97e3b352c0b12.jpg", - "iconName": "Blind Fury", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILLS_ENEMY_WEAPON", - "achieved": 1, - "unlocktime": 1626296766, - "name": "KILLS_ENEMY_WEAPON", - "defaultvalue": 0, - "displayName": "Friendly Firearms", - "hidden": 0, - "description": "Kill 100 enemies with enemy weapons", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/83325a3c5d679bd363102cd9abd3c9cac649497c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cb46c843305953d379ddc84e49c2ae5eb6493e44.jpg", - "iconName": "Friendly Firearms", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_KNIFE_FIGHTS_LOW", - "achieved": 1, - "unlocktime": 1493184194, - "name": "WIN_KNIFE_FIGHTS_LOW", - "defaultvalue": 0, - "displayName": "Make the Cut", - "hidden": 0, - "description": "Win a knife fight", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/99285573701d0823655458f538edc8c143397d83.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/90cd8554100f7f1c93de9c9b92ab989295331614.jpg", - "iconName": "Make the Cut", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "HIP_SHOT", - "achieved": 1, - "unlocktime": 1490380108, - "name": "HIP_SHOT", - "defaultvalue": 0, - "displayName": "Hip Shot", - "hidden": 0, - "description": "Kill an enemy with an un-zoomed sniper rifle", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3f4eadad4eddba8bc1f93e26ad8fd8f58bfcc204.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/dc4eb62a721ad0d1cb5a4483f42759ffd77b0b17.jpg", - "iconName": "Hip Shot", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_SNIPER_WITH_SNIPER", - "achieved": 1, - "unlocktime": 1491092271, - "name": "KILL_SNIPER_WITH_SNIPER", - "defaultvalue": 0, - "displayName": "Eye to Eye", - "hidden": 0, - "description": "Kill a zoomed-in enemy sniper with a sniper rifle of your own", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/60eee51a175e9de8486448dea71063882c47d472.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3179e01b1fedd24cb29bde371b19d73e48009826.jpg", - "iconName": "Eye to Eye", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_SNIPER_WITH_KNIFE", - "achieved": 1, - "unlocktime": 1624845685, - "name": "KILL_SNIPER_WITH_KNIFE", - "defaultvalue": 0, - "displayName": "Sknifed", - "hidden": 0, - "description": "Kill a zoomed-in enemy sniper with a knife", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/dd3ad6ceec16033d085cdf81466acfee6b78923b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a219eba3d0a3649c277db6f72d513ef7bebcbfc4.jpg", - "iconName": "Sknifed", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_SNIPERS", - "achieved": 1, - "unlocktime": 1625514301, - "name": "KILL_SNIPERS", - "defaultvalue": 0, - "displayName": "Snipe Hunter", - "hidden": 0, - "description": "Kill 100 zoomed-in enemy snipers", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f1dc6a8b736d396c0756e0d397150464a212a460.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0a469eb934ea7748038090e53513f5de3a92afcd.jpg", - "iconName": "Snipe Hunter", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_WHEN_AT_LOW_HEALTH", - "achieved": 1, - "unlocktime": 1491093729, - "name": "KILL_WHEN_AT_LOW_HEALTH", - "defaultvalue": 0, - "displayName": "Dead Man Stalking", - "hidden": 0, - "description": "Kill an enemy while at one health", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/233e0468c1e9f7e29dc65aae90680494f31dbf46.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b0c6a88030d93bf16d697761ca3a1f0b65e36e8c.jpg", - "iconName": "Dead Man Stalking", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "PISTOL_ROUND_KNIFE_KILL", - "achieved": 1, - "unlocktime": 1624941208, - "name": "PISTOL_ROUND_KNIFE_KILL", - "defaultvalue": 0, - "displayName": "Street Fighter", - "hidden": 0, - "description": "Kill an enemy with a knife during the Pistol Round in a Classic match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/399454259d33f0439b1355cc4a9cec4d3fcb7f23.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f495012b74c645c322747630286a6e62a098d11.jpg", - "iconName": "Street Fighter", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "FAST_ROUND_WIN", - "achieved": 1, - "unlocktime": 1490273208, - "name": "FAST_ROUND_WIN", - "defaultvalue": 0, - "displayName": "Blitzkrieg", - "hidden": 0, - "description": "Win a round against five enemies in less than thirty seconds", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a59e158dfc2235c98d8c228ae045ee11ed66f793.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/72235305f0d97186ddaeb7d4364b621a1a2c9472.jpg", - "iconName": "Blitzkrieg", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_PISTOLROUNDS_LOW", - "achieved": 1, - "unlocktime": 1624936021, - "name": "WIN_PISTOLROUNDS_LOW", - "defaultvalue": 0, - "displayName": "Piece Initiative", - "hidden": 0, - "description": "Win 5 Pistol Rounds in Competitive Mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ee63866f1dedc0ff3d1e5d5be973baa85cce0c5c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/705f4da0b87357110215e31e12036ab664d024ab.jpg", - "iconName": "Piece Initiative", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_PISTOLROUNDS_MED", - "achieved": 1, - "unlocktime": 1626578824, - "name": "WIN_PISTOLROUNDS_MED", - "defaultvalue": 0, - "displayName": "Give Piece a Chance", - "hidden": 0, - "description": "Win 25 Pistol Rounds in Competitive Mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/44a470bfba23636be7e1ecbedaff876eae9a4329.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/651b7c255be991abefc3bc486d9d60453e625973.jpg", - "iconName": "Give Piece a Chance", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_PISTOLROUNDS_HIGH", - "achieved": 1, - "unlocktime": 1694982334, - "name": "WIN_PISTOLROUNDS_HIGH", - "defaultvalue": 0, - "displayName": "Piece Treaty", - "hidden": 0, - "description": "Win 250 Pistol Rounds in Competitive Mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8ce444eaa5576a0825498af87079e48a92a5f7b2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b78f58a74a1e16b7fee1c87c823ac8c47927c85d.jpg", - "iconName": "Piece Treaty", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GOOSE_CHASE", - "achieved": 1, - "unlocktime": 1682699335, - "name": "GOOSE_CHASE", - "defaultvalue": 0, - "displayName": "Wild Gooseman Chase", - "hidden": 0, - "description": "As the last living Terrorist, distract a defuser long enough for the bomb to explode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cd81dc5ec3690f20d2686701ed8562f52b18f179.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1da82ab5cca4b7af581d3d17bd02a537cce61ada.jpg", - "iconName": "Wild Gooseman Chase", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_BOMB_PLANT_AFTER_RECOVERY", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT_AFTER_RECOVERY", - "defaultvalue": 0, - "displayName": "Blast Will and Testament", - "hidden": 0, - "description": "Win a round by picking up the bomb from a fallen comrade and successfully planting it", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/cf0cd919170e8bc60a58095cc108816849929c2e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/926535a647e8c5d1ebab852b6c24ddf2d877d82f.jpg", - "iconName": "Blast Will and Testament", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "LOSSLESS_EXTERMINATION", - "achieved": 1, - "unlocktime": 1490273165, - "name": "LOSSLESS_EXTERMINATION", - "defaultvalue": 0, - "displayName": "Mercy Rule", - "hidden": 0, - "description": "Kill the entire opposing team without any members of your team dying", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/41015c5223155418271a45369389654ef97db196.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3d5512ff9975e28bd3fcf1655cf4579575d6a381.jpg", - "iconName": "Mercy Rule", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "FLAWLESS_VICTORY", - "achieved": 1, - "unlocktime": 1680759661, - "name": "FLAWLESS_VICTORY", - "defaultvalue": 0, - "displayName": "Clean Sweep", - "hidden": 0, - "description": "Kill the entire opposing team without any members of your team taking damage", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4f931d4e6bbc7ca648b16b0440d4440c79a4f37a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7f149df390f6e69aa21a06464b72946376b3f220.jpg", - "iconName": "Clean Sweep", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_DUAL_DUEL", - "achieved": 1, - "unlocktime": 1627072405, - "name": "WIN_DUAL_DUEL", - "defaultvalue": 0, - "displayName": "Akimbo King", - "hidden": 0, - "description": "Use Dual Berettas to kill an enemy player that is also wielding Dual Berettas", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9caa687914739d5da5200b04eeaaddd5e6f54f7f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/6b0ef24cfabc4448d3d5edde30513ca3969158c5.jpg", - "iconName": "Akimbo King", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "UNSTOPPABLE_FORCE", - "achieved": 1, - "unlocktime": 1490379403, - "name": "UNSTOPPABLE_FORCE", - "defaultvalue": 0, - "displayName": "The Unstoppable Force", - "hidden": 0, - "description": "Kill four enemies within a single round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f0100bf4168376212331c5177f3d22a30df12ae.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/386633d066188ea38ac0df02904828ec772833eb.jpg", - "iconName": "The Unstoppable Force", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "IMMOVABLE_OBJECT", - "achieved": 1, - "unlocktime": 1490273538, - "name": "IMMOVABLE_OBJECT", - "defaultvalue": 0, - "displayName": "The Immovable Object", - "hidden": 0, - "description": "Kill an enemy who has killed four of your teammates within the current round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/1f267b0abd6d96e464a1ca6903a2ab943153bec3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/40f68cf4f54cd820fc80bdf9c319ce66af9de9d2.jpg", - "iconName": "The Immovable Object", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "HEADSHOTS_IN_ROUND", - "achieved": 1, - "unlocktime": 1491097625, - "name": "HEADSHOTS_IN_ROUND", - "defaultvalue": 0, - "displayName": "Head Shred Redemption", - "hidden": 0, - "description": "Kill five enemy players with headshots in a single round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4f3ae16bccb48c9506e4be1ef4f107445958d527.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5e52593e691714ced65c35f680fc9f2f6469fee9.jpg", - "iconName": "Head Shred Redemption", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_MAP_DE_DUST2", - "achieved": 1, - "unlocktime": 1491441302, - "name": "WIN_MAP_DE_DUST2", - "defaultvalue": 0, - "displayName": "Dust2 Map Veteran", - "hidden": 0, - "description": "Win 100 rounds on Dust2", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5210b418dcb481a9a582a3007c6a1bcc9e0a28fb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4bb16b1f0c2b29d8fc8a9530507ee74e347b5bf8.jpg", - "iconName": "Dust2 Map Veteran", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_MAP_DE_INFERNO", - "achieved": 1, - "unlocktime": 1624939877, - "name": "WIN_MAP_DE_INFERNO", - "defaultvalue": 0, - "displayName": "Inferno Map Veteran", - "hidden": 0, - "description": "Win 100 rounds on Inferno", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/57432488f8e462d84e73b4234b8c0d10b4840320.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/94d47ff130d2e576d56cfe2b37bc5919eccc97e4.jpg", - "iconName": "Inferno Map Veteran", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_MAP_DE_NUKE", - "achieved": 1, - "unlocktime": 1649636358, - "name": "WIN_MAP_DE_NUKE", - "defaultvalue": 0, - "displayName": "Nuke Map Veteran", - "hidden": 0, - "description": "Win 100 rounds on Nuke", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/793ef60b248eee91e24909a802f171ef1e0054fa.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/33d1ab6153d7ea7087feb2b89e303c4f1f5bd4b5.jpg", - "iconName": "Nuke Map Veteran", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_WHILE_IN_AIR", - "achieved": 1, - "unlocktime": 1627011326, - "name": "KILL_WHILE_IN_AIR", - "defaultvalue": 0, - "displayName": "Death From Above", - "hidden": 0, - "description": "Kill an enemy while you are airborne", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d47c7a78c7bc6dcc720afbece64fe8ef0d55f4dd.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/be45e7791dfdeffcd2a12be0fdef91e807a53b02.jpg", - "iconName": "Death From Above", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_IN_AIR", - "achieved": 1, - "unlocktime": 1491095895, - "name": "KILL_ENEMY_IN_AIR", - "defaultvalue": 0, - "displayName": "Bunny Hunt", - "hidden": 0, - "description": "Kill an airborne enemy", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/36bee0e89e3152683990a4e0a6ac3175f14b3c9b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/de394e0ab012d5490bd0b6f229f461e87e79a8a5.jpg", - "iconName": "Bunny Hunt", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILLER_AND_ENEMY_IN_AIR", - "achieved": 1, - "unlocktime": 1627011326, - "name": "KILLER_AND_ENEMY_IN_AIR", - "defaultvalue": 0, - "displayName": "Aerial Necrobatics", - "hidden": 0, - "description": "Kill an airborne enemy while you are also airborne", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f2ad27b9e610de552f3eea70fa1f5ecec17d7400.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ef41b3fa5bd65c9c30b74b0fa0e9f68713b73556.jpg", - "iconName": "Aerial Necrobatics", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DONATE_WEAPONS", - "achieved": 1, - "unlocktime": 1626578255, - "name": "DONATE_WEAPONS", - "defaultvalue": 0, - "displayName": "Killanthropist", - "hidden": 0, - "description": "Donate 100 weapons to your teammates", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d6029b217b817879924136ec61345c9774187ffb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/004af3a53ba5946d961d220448bdc3eaf1cbbce7.jpg", - "iconName": "Killanthropist", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_ROUNDS_WITHOUT_BUYING", - "achieved": 1, - "unlocktime": 1627013263, - "name": "WIN_ROUNDS_WITHOUT_BUYING", - "defaultvalue": 0, - "displayName": "The Frugal Beret", - "hidden": 0, - "description": "Win ten rounds in a row without dying or spending any cash in Classic mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4ef75482e607ffa171598b739985407645be25f3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3a555d55923b301634bc28f8b677be62399235ba.jpg", - "iconName": "The Frugal Beret", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DEFUSE_DEFENSE", - "achieved": 1, - "unlocktime": 1632528434, - "name": "DEFUSE_DEFENSE", - "defaultvalue": 0, - "displayName": "Defusus Interruptus", - "hidden": 0, - "description": "Stop defusing the bomb long enough to kill an enemy, then successfully finish defusing it", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/71d7972286f4037b04343cf14a429e9bb890980c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/792a9f40a7efbbe6db7c4855759403c3b44e5c9b.jpg", - "iconName": "Defusus Interruptus", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_BOMB_PICKUP", - "achieved": 1, - "unlocktime": 1490273165, - "name": "KILL_BOMB_PICKUP", - "defaultvalue": 0, - "displayName": "Participation Award", - "hidden": 0, - "description": "Kill an enemy within three seconds after they recover a dropped bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c8363f9b9d8edefc807592ac0ebf0443638816e4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c582137968e8e30b7ad5ff020a122692ae9eda43.jpg", - "iconName": "Participation Award", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DOMINATIONS_LOW", - "achieved": 1, - "unlocktime": 1491097841, - "name": "DOMINATIONS_LOW", - "defaultvalue": 0, - "displayName": "Repeat Offender", - "hidden": 0, - "description": "Dominate an enemy", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8c161f325310f4319064377fab29f9c7ddb19953.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/93d4894afca8e1fd08e839464a96c16ddfb64aa3.jpg", - "iconName": "Repeat Offender", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DOMINATIONS_HIGH", - "achieved": 1, - "unlocktime": 1624846280, - "name": "DOMINATIONS_HIGH", - "defaultvalue": 0, - "displayName": "Decimator", - "hidden": 0, - "description": "Dominate ten enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/84b5363e331ac0f4f81b25f023dfd441b7704871.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9a67684395c15619e91c29c6aec2f8904065cc1b.jpg", - "iconName": "Decimator", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DOMINATION_OVERKILLS_LOW", - "achieved": 1, - "unlocktime": 1491099071, - "name": "DOMINATION_OVERKILLS_LOW", - "defaultvalue": 0, - "displayName": "Overkill", - "hidden": 0, - "description": "Kill an enemy whom you are already dominating", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/35f678614f16eabd93cf2bfac3d25056c19c05db.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/267be94458e3f79957f06e36b8754d8324b7bf50.jpg", - "iconName": "Overkill", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DOMINATION_OVERKILLS_HIGH", - "achieved": 1, - "unlocktime": 1627078177, - "name": "DOMINATION_OVERKILLS_HIGH", - "defaultvalue": 0, - "displayName": "Command and Control", - "hidden": 0, - "description": "Kill 100 enemies whom you are already dominating", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/eb6fbfae0b533923e11313d0b899762a602c85d6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/fde4c00181781f63c793864fb82aff3ccd652af0.jpg", - "iconName": "Command and Control", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "REVENGES_LOW", - "achieved": 1, - "unlocktime": 1491099180, - "name": "REVENGES_LOW", - "defaultvalue": 0, - "displayName": "Insurgent", - "hidden": 0, - "description": "Kill an enemy who is dominating you", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3bcdad95b60feeb79544208afbab7420ba7ca7c0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0169c0d91b886351fe8e98c911655ec407a2e13e.jpg", - "iconName": "Insurgent", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "REVENGES_HIGH", - "achieved": 1, - "unlocktime": 1626712156, - "name": "REVENGES_HIGH", - "defaultvalue": 0, - "displayName": "Can't Keep a Good Man Down", - "hidden": 0, - "description": "Kill 20 enemies who are dominating you", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/318f5f8715d76b9a59ae187ee3d052c533761efc.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/54f01fd1936707ac2988b84d93c9f5ed264a66e9.jpg", - "iconName": "Can't Keep a Good Man Down", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "CONCURRENT_DOMINATIONS", - "achieved": 1, - "unlocktime": 1626468599, - "name": "CONCURRENT_DOMINATIONS", - "defaultvalue": 0, - "displayName": "Hat Trick", - "hidden": 0, - "description": "Dominate three enemies simultaneously", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8fe19e0adf20dfae6ee71dd83c2249ba45b93df9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8abe73ca9f1b49e57f79225dab67f5a679e413bb.jpg", - "iconName": "Hat Trick", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "DOMINATION_OVERKILLS_MATCH", - "achieved": 1, - "unlocktime": 1664560598, - "name": "DOMINATION_OVERKILLS_MATCH", - "defaultvalue": 0, - "displayName": "Ten Angry Men", - "hidden": 0, - "description": "Kill 10 enemies you are already dominating during a single match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d2a9bece8d07edc762f688132f8cbecb6a508057.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/585202a4828b7d6e228a83a6246bf6f53463cfa2.jpg", - "iconName": "Ten Angry Men", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "EXTENDED_DOMINATION", - "achieved": 1, - "unlocktime": 1626467311, - "name": "EXTENDED_DOMINATION", - "defaultvalue": 0, - "displayName": "Excessive Brutality", - "hidden": 0, - "description": "Kill an enemy whom you are dominating four additional times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5d9f9a1cbb9ddcc583a826defa941f2c7240125f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c5f44363ea98bb62baa9ac5a2907808e8e9ccc51.jpg", - "iconName": "Excessive Brutality", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMIES_WHILE_BLIND_HARD", - "achieved": 1, - "unlocktime": 1491439900, - "name": "KILL_ENEMIES_WHILE_BLIND_HARD", - "defaultvalue": 0, - "displayName": "Spray and Pray", - "hidden": 0, - "description": "Kill two enemies while you are blinded from a flashbang", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0080dcf6f75bfa344d7f4d8fa8be790bc28964d7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8ce1ca439ef39f231c60197bb3a74f588ca1cbba.jpg", - "iconName": "Spray and Pray", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "AVENGE_FRIEND", - "achieved": 1, - "unlocktime": 1491097461, - "name": "AVENGE_FRIEND", - "defaultvalue": 0, - "displayName": "Avenging Angel", - "hidden": 0, - "description": "Kill an enemy who has killed a player on your friends list in the same round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a43e9ea14bfc5c7c65d9403bf7ed0869cb1fa0f3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/056f3578244e069b90d75b8124652ae17b744f9b.jpg", - "iconName": "Avenging Angel", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GUN_GAME_KILL_KNIFER", - "achieved": 1, - "unlocktime": 1627007910, - "name": "GUN_GAME_KILL_KNIFER", - "defaultvalue": 0, - "displayName": "Denied!", - "hidden": 0, - "description": "Kill a player who is on gold knife level in Arms Race Mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9a1cd597e0b3b4f24ef9bf2daf4ca67f40aab770.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/15793fee93359e9b019e28eb09a000409273f014.jpg", - "iconName": "Denied!", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_MAP_AR_SHOOTS", - "achieved": 1, - "unlocktime": 1627434444, - "name": "WIN_MAP_AR_SHOOTS", - "defaultvalue": 0, - "displayName": "Shoots Vet", - "hidden": 0, - "description": "Win five matches in Arms Race Mode on Shoots", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/285b0ace38c4a02a02844c8d8b559054877a79f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8a7f730636f7fb94ef405dc5e4f45f58d2ad1667.jpg", - "iconName": "Shoots Vet", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_MAP_DE_LAKE", - "achieved": 1, - "unlocktime": 1626481224, - "name": "WIN_MAP_DE_LAKE", - "defaultvalue": 0, - "displayName": "Vacation", - "hidden": 0, - "description": "Win five matches on Lake", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/31c3ab15c1850db833bb3876df7b9943637e916f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7a3d1294fcfcf61c9e65efba02f2e44fdf6ef0a5.jpg", - "iconName": "Vacation", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GUN_GAME_KNIFE_KILL_KNIFER", - "achieved": 1, - "unlocktime": 1627074951, - "name": "GUN_GAME_KNIFE_KILL_KNIFER", - "defaultvalue": 0, - "displayName": "Knife on Knife", - "hidden": 0, - "description": "Kill an enemy who is on gold knife level with your own knife in Arms Race Mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/2f1cc20b9181390d0f10494d9f29b659f7db4623.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/40ee7dae79c9a3b0e5476c504be890c6815a7563.jpg", - "iconName": "Knife on Knife", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GUN_GAME_SMG_KILL_KNIFER", - "achieved": 1, - "unlocktime": 1664559892, - "name": "GUN_GAME_SMG_KILL_KNIFER", - "defaultvalue": 0, - "displayName": "Level Playing Field", - "hidden": 0, - "description": "Kill an enemy who is on gold knife level with a sub-machine gun in Arms Race Mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/975c11095cd8c9bd21773676c519bf279e816e95.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b3d4fed55f308d5f66b6a7f918c2c848f91bf24c.jpg", - "iconName": "Level Playing Field", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GUN_GAME_ROUNDS_LOW", - "achieved": 1, - "unlocktime": 1627073137, - "name": "GUN_GAME_ROUNDS_LOW", - "defaultvalue": 0, - "displayName": "Practice Practice Practice", - "hidden": 0, - "description": "Play 100 matches of Arms Race or Demolition mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/fd2a716c0e7ec6a837748c4ed0834517e431ff94.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/73ca8432b7b5b46cb59a7df3a1e8635cf53ca6d9.jpg", - "iconName": "Practice Practice Practice", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "WIN_GUN_GAME_ROUNDS_LOW", - "achieved": 1, - "unlocktime": 1627008965, - "name": "WIN_GUN_GAME_ROUNDS_LOW", - "defaultvalue": 0, - "displayName": "Gungamer", - "hidden": 0, - "description": "Win one match in Arms Race or Demolition mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4a64a911384776b5b22b6b625739ac80c345ad52.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/93a8f39d8310263c09f5d83975528af3e180397b.jpg", - "iconName": "Gungamer", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GUN_GAME_FIRST_KILL", - "achieved": 1, - "unlocktime": 1627009794, - "name": "GUN_GAME_FIRST_KILL", - "defaultvalue": 0, - "displayName": "FIRST!", - "hidden": 0, - "description": "Be the first player to get a kill in an Arms Race or Demolition match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f43514b35d97147befe3d0206c256abe16494d10.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8d29ee467f4ddd380fc6e5140d0f96c62adeccb4.jpg", - "iconName": "FIRST!", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "ONE_SHOT_ONE_KILL", - "achieved": 1, - "unlocktime": 1627010030, - "name": "ONE_SHOT_ONE_KILL", - "defaultvalue": 0, - "displayName": "One Shot One Kill", - "hidden": 0, - "description": "Kill three consecutive players using the first bullet of your gun in Arms Race mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/7ceebbc7a90958c4c50477d313f55f7c371cefa9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/0bf0571d2e6cbea466c77a1b28b91f027769a64b.jpg", - "iconName": "One Shot One Kill", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "GUN_GAME_CONSERVATIONIST", - "achieved": 1, - "unlocktime": 1627073137, - "name": "GUN_GAME_CONSERVATIONIST", - "defaultvalue": 0, - "displayName": "Conservationist", - "hidden": 0, - "description": "Win an Arms Race match without reloading any of your weapons", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/aace8291de73c7ef8388cd2a0ba4be87497c5cf5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4483f4a571fad5bb6829fd6d4d17d8f920628cce.jpg", - "iconName": "Conservationist", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "BASE_SCAMPER", - "achieved": 1, - "unlocktime": 1627007793, - "name": "BASE_SCAMPER", - "defaultvalue": 0, - "displayName": "Base Scamper", - "hidden": 0, - "description": "Kill an enemy just as their respawn protection ends in Arms Race mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c1000dbf007206aeddbeed97fcd331405e542adf.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/41d2301e82ddcc783512d0e8dac538767c9af8ff.jpg", - "iconName": "Base Scamper", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "BORN_READY", - "achieved": 1, - "unlocktime": 1627008589, - "name": "BORN_READY", - "defaultvalue": 0, - "displayName": "Born Ready", - "hidden": 0, - "description": "Kill an enemy with the first bullet after your respawn protection ends in Arms Race mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/5856a57c4a43a209287ef5d4d2ab2cd2e6d4bc76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a8ad2dc9a198f2a9853297c8def995b38341ac57.jpg", - "iconName": "Born Ready", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "STILL_ALIVE", - "achieved": 1, - "unlocktime": 1491098875, - "name": "STILL_ALIVE", - "defaultvalue": 0, - "displayName": "Still Alive", - "hidden": 0, - "description": "Survive more than 30 seconds with less than ten health in Arms Race or Demolition mode", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/344f2a3aa230450a3e2bda06533b2a632e223b4a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d1981870927d0426646ba0ab59a0e1559ec27de6.jpg", - "iconName": "Still Alive", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "MEDALIST", - "achieved": 1, - "unlocktime": 1680759661, - "name": "MEDALIST", - "defaultvalue": 0, - "displayName": "Awardist", - "hidden": 0, - "description": "Earn 100 achievements", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f6d212f58b1055ddb033af1e30b401c6e04a349b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/8b8face693855070499542ea573f4db7880b8983.jpg", - "iconName": "Awardist", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_TEC9", - "achieved": 1, - "unlocktime": 1695410143, - "name": "KILL_ENEMY_TEC9", - "defaultvalue": 0, - "displayName": "Tec-9 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the Tec-9", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/d27a9eb65bb331b15c04ea8840ac4de587f38e4b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c0de589d9a345909a4d5f590a9294400798e6bdb.jpg", - "iconName": "Tec-9 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_HKP2000", - "achieved": 1, - "unlocktime": 1626714351, - "name": "KILL_ENEMY_HKP2000", - "defaultvalue": 0, - "displayName": "P2000/USP Tactical Expert", - "hidden": 0, - "description": "Kill 100 enemies with the P2000 or USP", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/819a8572e35a624d545db1608c8feff8842e8b45.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ac79d04b1210aee0272ed24e89897625d3b99745.jpg", - "iconName": "P2000/USP Tactical Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_P250", - "achieved": 1, - "unlocktime": 1491626473, - "name": "KILL_ENEMY_P250", - "defaultvalue": 0, - "displayName": "P250 Expert", - "hidden": 0, - "description": "Kill 25 enemies with the P250", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/c3d65d7d4e64ef925e9e9863f466344a1edd2c69.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/42e8c9a645a4eefd48051dde97ac0269795b2b3a.jpg", - "iconName": "P250 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_SCAR20", - "achieved": 1, - "unlocktime": 1680883952, - "name": "KILL_ENEMY_SCAR20", - "defaultvalue": 0, - "displayName": "SCAR-20 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the SCAR-20", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/54b73be2c9b7d265eb9a9aae5dac2492ed9da5f9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/ecdedbd60aa53efefa2a3068e546ae94dcbf3959.jpg", - "iconName": "SCAR-20 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_SG556", - "achieved": 1, - "unlocktime": 1664556165, - "name": "KILL_ENEMY_SG556", - "defaultvalue": 0, - "displayName": "SG553 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the SG553", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/48f4510fdc397cc77a6847314edb77b7e5e32351.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/f794e47191144b535b067d41873cb1f7b972671a.jpg", - "iconName": "SG553 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_SSG08", - "achieved": 1, - "unlocktime": 1627011061, - "name": "KILL_ENEMY_SSG08", - "defaultvalue": 0, - "displayName": "SSG 08 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the SSG 08", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/46ff7336028888b668484abd48b8d2448dc168c6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/e8e474be5facc60629a08adbcd9d73c35148f7f3.jpg", - "iconName": "SSG 08 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_MP9", - "achieved": 1, - "unlocktime": 1680501851, - "name": "KILL_ENEMY_MP9", - "defaultvalue": 0, - "displayName": "MP9 Expert", - "hidden": 0, - "description": "Kill 100 enemies with the MP9", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/90ad5f5a2c540995f1b6436bd03609ad42c29904.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/b692f67c0fab35be6ad9d49474a6eecf4f786e6a.jpg", - "iconName": "MP9 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_MAG7", - "achieved": 1, - "unlocktime": 1627582340, - "name": "KILL_ENEMY_MAG7", - "defaultvalue": 0, - "displayName": "MAG-7 Expert", - "hidden": 0, - "description": "Kill 50 enemies with the MAG-7", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/43a157088b353f1347364fa0dcbb73fca36bc8ec.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3a90b24066b3e62f9fb59d8584acf69ae45c99b1.jpg", - "iconName": "MAG-7 Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_SAWEDOFF", - "achieved": 1, - "unlocktime": 1627434280, - "name": "KILL_ENEMY_SAWEDOFF", - "defaultvalue": 0, - "displayName": "Sawed-Off Expert", - "hidden": 0, - "description": "Kill 50 enemies with the Sawed-Off", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/3f5eba75bc35416bda2aade3b717206b68e341f2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/4ba6e95affe6c23df0c24a8e8f455ed1c969b864.jpg", - "iconName": "Sawed-Off Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "KILL_ENEMY_GALILAR", - "achieved": 1, - "unlocktime": 1664927023, - "name": "KILL_ENEMY_GALILAR", - "defaultvalue": 0, - "displayName": "Galil AR Expert", - "hidden": 0, - "description": "Kill 250 enemies with the Galil AR", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/a3a32715a970dd3a8c174bc57ee1b2204d9d29b1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/61139f5e158c8af4592118802ad1ceb74cd40b57.jpg", - "iconName": "Galil AR Expert", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4" - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "TheLovers", - "achieved": 1, - "unlocktime": 1607706771, - "name": "TheLovers", - "defaultvalue": 0, - "displayName": "The Lovers", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/25bab7e2288262ad801664e62f241e2839edb457.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Lovers", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "TheHermit", - "achieved": 1, - "unlocktime": 1663738211, - "name": "TheHermit", - "defaultvalue": 0, - "displayName": "The Hermit", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/d1e79618b612be87bff4f5c70b1e825e37b05540.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/35a05a2c50d604f54724d65b7fdf6f9ee71fe88c.jpg", - "iconName": "The Hermit", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "TheWheelOfFortune", - "achieved": 1, - "unlocktime": 1663828218, - "name": "TheWheelOfFortune", - "defaultvalue": 0, - "displayName": "The Wheel of Fortune", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/61c7ccea74b66ef3f5d51c078d900d930346e74a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Wheel of Fortune", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "TheHightPriestess", - "achieved": 1, - "unlocktime": 1664235184, - "name": "TheHightPriestess", - "defaultvalue": 0, - "displayName": "The High Priestess", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/8f5eacf50eb2ad11fe9dbd1d3a98c306d54ff545.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The High Priestess", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "TheWorld", - "achieved": 1, - "unlocktime": 1664248117, - "name": "TheWorld", - "defaultvalue": 0, - "displayName": "The World", - "hidden": 0, - "description": "Complete the main storyline.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/25c57ecea783efc3f9d04eec43401264ed5eb9b2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The World", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "GunKata", - "achieved": 1, - "unlocktime": 1663636900, - "name": "GunKata", - "defaultvalue": 0, - "displayName": "Gun Fu", - "hidden": 0, - "description": "Kill or incapacitate 3 enemies in quick succession with a revolver or pistol in close combat.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/96b9d0c95bc80867a61a2870c6ddec9ab424f728.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "Gun Fu", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "MasterRunner", - "achieved": 1, - "unlocktime": 1663819262, - "name": "MasterRunner", - "defaultvalue": 0, - "displayName": "Christmas Tree Attack", - "hidden": 0, - "description": "Complete a Breach Protocol with a minimum of 3 daemons uploaded.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/8af08786073d0d2ba2374f00eb6bd876c593891e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "Christmas Tree Attack", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "Roleplayer", - "achieved": 1, - "unlocktime": 1607719788, - "name": "Roleplayer", - "defaultvalue": 0, - "displayName": "Stanislavski's Method", - "hidden": 0, - "description": "Use a dialogue option related to V's life path 10 times.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/943a38cb96238b7b020672cf360d9e763dcf6feb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "Stanislavski's Method", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "TrueSoldier", - "achieved": 1, - "unlocktime": 1664210266, - "name": "TrueSoldier", - "defaultvalue": 0, - "displayName": "True Soldier", - "hidden": 0, - "description": "Kill or incapacitate 300 enemies using ranged weapons.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/2f63e6b9c0774f8f63b9f053ba9ec145e90c678c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "True Soldier", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "Denied", - "achieved": 1, - "unlocktime": 1607567266, - "name": "Denied", - "defaultvalue": 0, - "displayName": "Right Back At Ya", - "hidden": 0, - "description": "Kill or incapacitate an enemy who threw a grenade at you.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/33a8a122a08532ec727598142e6b5689ae7eed8b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "Right Back At Ya", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38" - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549" - }, - { - "apiname": "ACH_4", - "achieved": 1, - "unlocktime": 1571865005, - "name": "ACH_4", - "defaultvalue": 0, - "displayName": "Ikora's Protégé", - "hidden": 0, - "description": "Acquire each Warlock subclass.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/a00b8c7394b8af482a2d3fea70e152310d6d8a2f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ab2fc8852927248c06e068acc79bb669651447be.jpg", - "iconName": "Ikora's Protégé", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549" - }, - { - "apiname": "ACH_7", - "achieved": 1, - "unlocktime": 1571871913, - "name": "ACH_7", - "defaultvalue": 0, - "displayName": "The People's Hero", - "hidden": 0, - "description": "Complete a Heroic public event.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/4f1d1d43b60c087bf99bba3061b375fe0f327be7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/588006e6fbef7995fb390c29e9798a8a8f97de66.jpg", - "iconName": "The People's Hero", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549" - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe" - }, - { - "apiname": "エースプレイヤー", - "achieved": 1, - "unlocktime": 1690680618, - "name": "エースプレイヤー", - "defaultvalue": 0, - "displayName": "Ace Pilot", - "hidden": 0, - "description": "Get MVP in a Casual or Ranked Match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Ace Pilot", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe" - }, - { - "apiname": "チャレンジャー", - "achieved": 1, - "unlocktime": 1690758415, - "name": "チャレンジャー", - "defaultvalue": 0, - "displayName": "Duelist", - "hidden": 0, - "description": "Join 10 casual or ranked matches and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Duelist", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe" - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca" - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "NEW_ACHIEVEMENT_3_16", - "achieved": 1, - "unlocktime": 1654130637, - "name": "NEW_ACHIEVEMENT_3_16", - "defaultvalue": 0, - "displayName": "\"Need a Weapon?\"", - "hidden": 0, - "description": "Try out a new weapon customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "\"Need a Weapon?\"", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "NEW_ACHIEVEMENT_3_20", - "achieved": 1, - "unlocktime": 1654133352, - "name": "NEW_ACHIEVEMENT_3_20", - "defaultvalue": 0, - "displayName": "Humble Beginnings", - "hidden": 0, - "description": "Complete one level in a Battle Pass.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/88136bc7244bf35c50dc0779413c7b11953a7032.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/fb3808343958b30bae95cceff8d5850e8230cacd.jpg", - "iconName": "Humble Beginnings", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "NEW_ACHIEVEMENT_3_22", - "achieved": 1, - "unlocktime": 1637302438, - "name": "NEW_ACHIEVEMENT_3_22", - "defaultvalue": 0, - "displayName": "Clocking In", - "hidden": 0, - "description": "Complete a Daily Challenge.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/88136bc7244bf35c50dc0779413c7b11953a7032.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/fb3808343958b30bae95cceff8d5850e8230cacd.jpg", - "iconName": "Clocking In", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "NEW_ACHIEVEMENT_3_23", - "achieved": 1, - "unlocktime": 1654130545, - "name": "NEW_ACHIEVEMENT_3_23", - "defaultvalue": 0, - "displayName": "We Have a Job For You", - "hidden": 0, - "description": "Complete a Weekly Challenge.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/88136bc7244bf35c50dc0779413c7b11953a7032.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/fb3808343958b30bae95cceff8d5850e8230cacd.jpg", - "iconName": "We Have a Job For You", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "NEW_ACHIEVEMENT_3_25", - "achieved": 1, - "unlocktime": 1654133345, - "name": "NEW_ACHIEVEMENT_3_25", - "defaultvalue": 0, - "displayName": "You're Up, Rook'", - "hidden": 0, - "description": "Play a Ranked Match.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/d353de98434bb8120d95a836da7c438043dc97f1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/3f68fd31824525fe542f13dd1f2b6bc960aacc04.jpg", - "iconName": "You're Up, Rook'", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "NEW_ACHIEVEMENT_4_6", - "achieved": 1, - "unlocktime": 1637303158, - "name": "NEW_ACHIEVEMENT_4_6", - "defaultvalue": 0, - "displayName": "Peak Performance", - "hidden": 0, - "description": "Earn 2,000 score in a matchmade game.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/483c8c2701b79a8d86755603bc467acf0053ba5d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/d1dfdbd1f26bead14400e91b851cc07c10314e06.jpg", - "iconName": "Peak Performance", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821" - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_5", - "achieved": 1, - "unlocktime": 1676240134, - "name": "PFA_5", - "defaultvalue": 0, - "displayName": "The Wise Owl", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/7984463bf6739db83e7df933a923eb07833b5c5f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/a7b413303a36f40109f1499ff1ac1cbc8d887663.jpg", - "iconName": "The Wise Owl", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_6", - "achieved": 1, - "unlocktime": 1676094172, - "name": "PFA_6", - "defaultvalue": 0, - "displayName": "First Class Student", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/00ed9983fddb95930e090930c9e324089f189fc6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/e466750e42bc7c80d28db7b64c434f25b71182db.jpg", - "iconName": "First Class Student", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_7", - "achieved": 1, - "unlocktime": 1676132894, - "name": "PFA_7", - "defaultvalue": 0, - "displayName": "Troll with the Punches", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/5c9e26c4941ae4fc98c6eaf3c023e3a18dc2df51.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/70b3c64e9777c9e92c2f142c588fbb06f0866047.jpg", - "iconName": "Troll with the Punches", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_8", - "achieved": 1, - "unlocktime": 1676273043, - "name": "PFA_8", - "defaultvalue": 0, - "displayName": "That's a Keeper", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/862757b287f9430989c4c5f27e71b0053966f3b3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/47adf0df129b5f89653bb0dca1e20b02128ba988.jpg", - "iconName": "That's a Keeper", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_23", - "achieved": 1, - "unlocktime": 1676152232, - "name": "PFA_23", - "defaultvalue": 0, - "displayName": "A Keen Sense of Spell", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/c54dcf12698edd975e71c525185854c635f60941.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/d3fd39cd6d573ed5d9e102fcf042c00e003c462d.jpg", - "iconName": "A Keen Sense of Spell", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_30", - "achieved": 1, - "unlocktime": 1676240335, - "name": "PFA_30", - "defaultvalue": 0, - "displayName": "A Talent for Spending", - "hidden": 0, - "description": "Spend 5 Talent Points", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/175cc1a73ae03d7bb6d5153467d8012eabaac2aa.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/3ede5cd4d4e8e217a239bbd4ce0078862730597f.jpg", - "iconName": "A Talent for Spending", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "PFA_35", - "achieved": 1, - "unlocktime": 1676266823, - "name": "PFA_35", - "defaultvalue": 0, - "displayName": "Followed the Butterflies", - "hidden": 0, - "description": "Follow butterflies to a treasure", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/7c843a190fcde960f01f411423468e3ab88944f5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/22b6e534eac3b5e9363fb56e137245c5abe3657a.jpg", - "iconName": "Followed the Butterflies", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59" - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70" - }, - { - "apiname": "kz14", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz14", - "defaultvalue": 0, - "displayName": "[Monster] I'm Okay! ( I )", - "hidden": 0, - "description": "Complete Monster Mission Without Being Knocked Out", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e81fe02c42631472edf15e2f275431a4383a0c51.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/3b0ab4fa2dfec4a998c4095267dcc26bbc9d1fb4.jpg", - "iconName": "[Monster] I'm Okay! ( I )", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70" - }, - { - "apiname": "kz43", - "achieved": 1, - "unlocktime": 1557426448, - "name": "kz43", - "defaultvalue": 0, - "displayName": "[Affinity] First Meeting - Lire Eryuell", - "hidden": 0, - "description": "Become Someone She's Met Before with Lire Eryuell", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/253c656b0d46582ad40d6e441d08a91c9da2d097.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/92007e83e570ee999c2012e8288e5a79d16cd500.jpg", - "iconName": "[Affinity] First Meeting - Lire Eryuell", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70" - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030001", - "achieved": 1, - "unlocktime": 1644418438, - "name": "1030001", - "defaultvalue": 0, - "displayName": "Adventurer of Yudia", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Yudia", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/59872cd827805847ad982454c27a1c005765d8f1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e231c057a6d27fb577b6631d403fc4f8c0f9b5e4.jpg", - "iconName": "Adventurer of Yudia", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030002", - "achieved": 1, - "unlocktime": 1644437677, - "name": "1030002", - "defaultvalue": 0, - "displayName": "Adventurer of West Luterra", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: West Luterra", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/80d9722359a3da4671e812e0af59a7aedcafbd11.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/96aa61df95adac6292ca6dc22b604aad210187f0.jpg", - "iconName": "Adventurer of West Luterra", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030003", - "achieved": 1, - "unlocktime": 1644694127, - "name": "1030003", - "defaultvalue": 0, - "displayName": "Adventurer of East Luterra", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: East Luterra", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ce5b0087307fda123c114ec80acc997c6c5e33a0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/cfa2b613816431506a8a94d02531d77627701d68.jpg", - "iconName": "Adventurer of East Luterra", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030005", - "achieved": 1, - "unlocktime": 1644741382, - "name": "1030005", - "defaultvalue": 0, - "displayName": "Adventurer of Anikka", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Anikka", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c99f013fcb6030dd76d37bc29b58710c43d38de7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/f51d5485761c91778ea8d19a9567dbe23c2c99b4.jpg", - "iconName": "Adventurer of Anikka", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030006", - "achieved": 1, - "unlocktime": 1646012535, - "name": "1030006", - "defaultvalue": 0, - "displayName": "Adventurer of Arthetine", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Arthetine", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/6c6c800b717fd3ad0c7db0f709865a517ffa4564.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/cb2340b31d8ec41e53bc64db7052c635f417467d.jpg", - "iconName": "Adventurer of Arthetine", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030007", - "achieved": 1, - "unlocktime": 1646104181, - "name": "1030007", - "defaultvalue": 0, - "displayName": "Adventurer of North Vern", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: North Vern", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/7a90cd6e5002cf275e9b9f30fd70d7ca3f039f30.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/279daea5fda7ffcb8cfc0ada353f00f7dd5bc2b4.jpg", - "iconName": "Adventurer of North Vern", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030004", - "achieved": 1, - "unlocktime": 1644732903, - "name": "1030004", - "defaultvalue": 0, - "displayName": "Adventurer of Tortoyk", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Tortoyk", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c25421de7525dd8f03cfe466bc57846af187d2a4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2502044ddcc86600d9061ac18bb456ad64c53e1f.jpg", - "iconName": "Adventurer of Tortoyk", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030008", - "achieved": 1, - "unlocktime": 1646114034, - "name": "1030008", - "defaultvalue": 0, - "displayName": "Adventurer of Shushire", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Shushire", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/923f6f5538594b18282bf7763a936ba9bf8d6a58.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e857c2a15dc98a0d6ca54aecb3a69a46e22ab39d.jpg", - "iconName": "Adventurer of Shushire", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030012", - "achieved": 1, - "unlocktime": 1646342135, - "name": "1030012", - "defaultvalue": 0, - "displayName": "Adventurer of Rohendel", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Rohendel", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/8dfe21a234d444644520189130280ee1227edd17.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/71d13eb3be6818f35ae32878dcd063d201d8689a.jpg", - "iconName": "Adventurer of Rohendel", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1030013", - "achieved": 1, - "unlocktime": 1647361479, - "name": "1030013", - "defaultvalue": 0, - "displayName": "Adventurer of Yorn", - "hidden": 0, - "description": "Complete 10% of Adventurer's Tome: Yorn", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/23a7e09870715be2e05a0e197c78a88564ef6c90.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/32bf23c595769b0d5a91b49c0184f50cd47bfacc.jpg", - "iconName": "Adventurer of Yorn", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4010003", - "achieved": 1, - "unlocktime": 1644350019, - "name": "4010003", - "defaultvalue": 0, - "displayName": "Basic Training", - "hidden": 0, - "description": "Perform 100 basic attacks", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a1cf993c44232629f90c2c3c2f6b23fd377f09b9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/56a134ba4e8ceaa23a4bf5c8299bef640008d6cb.jpg", - "iconName": "Basic Training", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4010020", - "achieved": 1, - "unlocktime": 1648372617, - "name": "4010020", - "defaultvalue": 0, - "displayName": "M-M-M-Monster Kill!", - "hidden": 0, - "description": "Defeat 120,000 monsters", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5e752e6719fcc2be4223c3c50826a1b191d05bdb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ec042ebc54d8636a7a264836bc6bbc6abdf6c1df.jpg", - "iconName": "M-M-M-Monster Kill!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4010021", - "achieved": 1, - "unlocktime": 1644732132, - "name": "4010021", - "defaultvalue": 0, - "displayName": "Elite? As If", - "hidden": 0, - "description": "Defeat 20 Elite monsters", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/fa242e169a1af83f5b173936231482d2a8aa8402.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/00f07d0390194ebf2381a6d73cbfc4ed8180ca2b.jpg", - "iconName": "Elite? As If", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4020003", - "achieved": 1, - "unlocktime": 1646155701, - "name": "4020003", - "defaultvalue": 0, - "displayName": "Unleash the Power Within", - "hidden": 0, - "description": "Use 10 Awakening Skills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/388c23d5e2aaf0a3f831b7ba82a5b7ae64c8dbc5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/7135ca78c2ea0229aab13b1f01fa712540777459.jpg", - "iconName": "Unleash the Power Within", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4020000", - "achieved": 1, - "unlocktime": 1644372353, - "name": "4020000", - "defaultvalue": 0, - "displayName": "Skill Research", - "hidden": 0, - "description": "Apply 10 skill level changes", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/1cf122a36e0545dd1f7d0654cf12c3779148e4e9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c7d5d6a6e1137883f910b95ea1688d5694e8e978.jpg", - "iconName": "Skill Research", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3030001", - "achieved": 1, - "unlocktime": 1644781489, - "name": "3030001", - "defaultvalue": 0, - "displayName": "Map Trader", - "hidden": 0, - "description": "Trade a map for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/dc7be74df9160688e7a986ea3964628b790b1b38.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65f87beea29959bbfc53540c5f39c9de27fe9293.jpg", - "iconName": "Map Trader", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3030002", - "achieved": 1, - "unlocktime": 1644781489, - "name": "3030002", - "defaultvalue": 0, - "displayName": "Geography Nerd", - "hidden": 0, - "description": "Trade 10 maps", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e40d0bd667ae5df28db6dbb88e1c7dcf977b3875.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/bd6dabfdb67ae3516bc2779955f9ffd727b139cb.jpg", - "iconName": "Geography Nerd", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020009", - "achieved": 1, - "unlocktime": 1646535835, - "name": "3020009", - "defaultvalue": 0, - "displayName": "Creating a Legend", - "hidden": 0, - "description": "Get a Legendary item by crafting", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/22adad04a7fdf651e1a017a19e3c98d201bcc69c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c3471a9c9aa0cb643faf4a915d4cfae14e8af93e.jpg", - "iconName": "Creating a Legend", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020037", - "achieved": 1, - "unlocktime": 1646121877, - "name": "3020037", - "defaultvalue": 0, - "displayName": "For the Most Powerful Weapon Possible", - "hidden": 0, - "description": "Try Honing 10 times\t", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ced2967b0bf4a8b97720dbd526b45fe23c77f585.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a04ad11a2e290df4ca8c20f261edad6914191db2.jpg", - "iconName": "For the Most Powerful Weapon Possible", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "6010008", - "achieved": 1, - "unlocktime": 1647589941, - "name": "6010008", - "defaultvalue": 0, - "displayName": "Exploration: Cube", - "hidden": 0, - "description": "Collect a Diamond Chest from the Cube (normal)", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/319fcf5e67bff487432db0294e04932bace38863.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/49dd8e99620905e3794b66ba880e7f238f4d0dee.jpg", - "iconName": "Exploration: Cube", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020051", - "achieved": 1, - "unlocktime": 1646119510, - "name": "3020051", - "defaultvalue": 0, - "displayName": "Gear of My Dreams", - "hidden": 0, - "description": "Reach Item Level 302", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/41ad83f74805b6256e2adbfeeee0d6af996912e9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ea8ee222ba93b14701e1a6e9e56a37f5954bf8b6.jpg", - "iconName": "Gear of My Dreams", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020054", - "achieved": 1, - "unlocktime": 1647529268, - "name": "3020054", - "defaultvalue": 0, - "displayName": "Superb Gear", - "hidden": 0, - "description": "Reach item level 1300", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/8ea53af21fc58f4ed4ef73bf4d1433d1a4dc85e4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a8160b8582eceb8cd2a4e2d9074d557fd8fa0f07.jpg", - "iconName": "Superb Gear", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3060001", - "achieved": 1, - "unlocktime": 1644522688, - "name": "3060001", - "defaultvalue": 0, - "displayName": "What's This Stone For?", - "hidden": 0, - "description": "Equip an Ability Stone", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/8faecef7a2fa9dd269f840eb436ef7bb080bcd8e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c6537597fe72dc104599be896222aae1a84cd70c.jpg", - "iconName": "What's This Stone For?", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "6040000", - "achieved": 1, - "unlocktime": 1646153562, - "name": "6040000", - "defaultvalue": 0, - "displayName": "Legendary Hunter", - "hidden": 0, - "description": "Clear 3 Guardian Raids", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b83de033f69e32d3f4056c9370cf5ba288e960ea.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2346729036f3407b9e059efaa234cdec40ef087d.jpg", - "iconName": "Legendary Hunter", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "6040003", - "achieved": 1, - "unlocktime": 1647450123, - "name": "6040003", - "defaultvalue": 0, - "displayName": "I Hit Hard", - "hidden": 0, - "description": "Clear 1 Guardian Raid by singlehandedly inflicting at least 50% of the damage it takes to clear", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/1af14ce06b8ab168b4db8729906ed0c939590b2e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d12cd3254989a3126f81f20007a712334bbf45e4.jpg", - "iconName": "I Hit Hard", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1010001", - "achieved": 1, - "unlocktime": 1646406603, - "name": "1010001", - "defaultvalue": 0, - "displayName": "Look at the Time", - "hidden": 0, - "description": "Play for 50 hours in total", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/59941fe39c93f07ae675f3c6333b47bfe1dec4cb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/cae9592547b4f37901d57ef04321e185ccc95791.jpg", - "iconName": "Look at the Time", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1010002", - "achieved": 1, - "unlocktime": 1644347131, - "name": "1010002", - "defaultvalue": 0, - "displayName": "A Leading Life", - "hidden": 0, - "description": "Progress to an Advanced Class", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d4b29533c35708415be43be10e1aa30e0ba72afa.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b60956891ae2bef3bf8362f66b9cb349276c550d.jpg", - "iconName": "A Leading Life", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1010003", - "achieved": 1, - "unlocktime": 1644419011, - "name": "1010003", - "defaultvalue": 0, - "displayName": "Pathfinder", - "hidden": 0, - "description": "Activate 10 Triports", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e68d90d97ea207aa229ff53acedad0065f5aef13.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b4126867b20264dc0299a524dc38df6387efa610.jpg", - "iconName": "Pathfinder", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1010004", - "achieved": 1, - "unlocktime": 1644477471, - "name": "1010004", - "defaultvalue": 0, - "displayName": "Use My Nickname", - "hidden": 0, - "description": "Collect 10 or more titles", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/709ca00519b21baf3ae24d62c2148c63ae79c803.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d2d4ee178c9669dd79c095fb65e1f3df22ff304f.jpg", - "iconName": "Use My Nickname", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1010005", - "achieved": 1, - "unlocktime": 1646932946, - "name": "1010005", - "defaultvalue": 0, - "displayName": "Where Mokokos Come From", - "hidden": 0, - "description": "Pick One Mokoko Seed", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4ae8e8ff7557d1adeefd953d547519d1f6597e63.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/397d67c87431b3f947166f5a7ff1cf5295f58678.jpg", - "iconName": "Where Mokokos Come From", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1050007", - "achieved": 1, - "unlocktime": 1644437965, - "name": "1050007", - "defaultvalue": 0, - "displayName": "Surprise Me", - "hidden": 0, - "description": "Complete 10 Sudden Quests", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/709a73d5e0efd23cecce17f4527763fad9c3b03f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4ad364200ea30ab6513f2916e22369137f2e0188.jpg", - "iconName": "Surprise Me", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "2010001", - "achieved": 1, - "unlocktime": 1644625724, - "name": "2010001", - "defaultvalue": 0, - "displayName": "Mastery", - "hidden": 0, - "description": "Switch to Skill Tree Tier 3", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/620bad1b1613adf4692826e4abc4893a16494321.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/856fb6dead2d2556d9558aed8773c78e6108d51b.jpg", - "iconName": "Mastery", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "2030008", - "achieved": 1, - "unlocktime": 1644477651, - "name": "2030008", - "defaultvalue": 0, - "displayName": "Voice of Arkesia", - "hidden": 0, - "description": "Play an instrument for an Affinity NPC", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/dcda7daf2089ac557472ade5f4e9268bf855cde5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b9ec9ce281d3ab21466ae151b2ffd6036f814f8d.jpg", - "iconName": "Voice of Arkesia", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020007", - "achieved": 1, - "unlocktime": 1646536444, - "name": "3020007", - "defaultvalue": 0, - "displayName": "Struggling Economy", - "hidden": 0, - "description": "Spend 10,000 Silver repairing gear", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/6299599c054104df4e237d5ddcab64201892dca4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/f63ced70c7052a28e1f43057e39d4cb2114ccd0e.jpg", - "iconName": "Struggling Economy", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020012", - "achieved": 1, - "unlocktime": 1646237501, - "name": "3020012", - "defaultvalue": 0, - "displayName": "Broken-Down Legend", - "hidden": 0, - "description": "Successfully dismantle 1 Legendary or better item", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/13eaa7d62c325f3bc257346b79f29c300519c230.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e22df14a05e5bbaed885d66889e46946ef346118.jpg", - "iconName": "Broken-Down Legend", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3020046", - "achieved": 1, - "unlocktime": 1648422592, - "name": "3020046", - "defaultvalue": 0, - "displayName": "So Lux!", - "hidden": 0, - "description": "Fuse Gems into Lv. 5 or above once", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4f6d7888e029b8e4096a693c2d1e0865db16b5ba.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/1201ecf37a1bc0a0ea588567e9e34ddc1358a14f.jpg", - "iconName": "So Lux!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3030006", - "achieved": 1, - "unlocktime": 1646329394, - "name": "3030006", - "defaultvalue": 0, - "displayName": "Vendor on the Move", - "hidden": 0, - "description": "Find the wandering merchant", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5ce17081ca8ecff2076a49bf0fb67a565370637e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/3c12aeddd35c42b381c09a4ee9240c6665ba7b7c.jpg", - "iconName": "Vendor on the Move", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3030009", - "achieved": 1, - "unlocktime": 1646603382, - "name": "3030009", - "defaultvalue": 0, - "displayName": "Not All Who Wander Are Lost", - "hidden": 0, - "description": "Make an exchange with a Wandering Merchant", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c500dd5aa6056562a317c0dcb06767361298b83c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d6e0ada06bf6c9b19b97db9ca30cbd211159e521.jpg", - "iconName": "Not All Who Wander Are Lost", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3030013", - "achieved": 1, - "unlocktime": 1644522919, - "name": "3030013", - "defaultvalue": 0, - "displayName": "Inventory Clearance", - "hidden": 0, - "description": "Sell 100 items", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/64acbe8f322486c1d2e9368855bccac80296d526.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b70c25fd257cdf8ff3dd67c640e68970bad84be0.jpg", - "iconName": "Inventory Clearance", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3050000", - "achieved": 1, - "unlocktime": 1644518033, - "name": "3050000", - "defaultvalue": 0, - "displayName": "Scoring Sheet Music", - "hidden": 0, - "description": "Learn 3 pieces of sheet music", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/3204efed0f34075312b4dc7f0868b7406323f5be.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/01040dca2a7c5b20b60925abbb89c936de3f730a.jpg", - "iconName": "Scoring Sheet Music", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "3060000", - "achieved": 1, - "unlocktime": 1644522541, - "name": "3060000", - "defaultvalue": 0, - "displayName": "Master Jeweler", - "hidden": 0, - "description": "Successfully facet 5 times", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/fea2c24847e6d0e63a9d1ab03f39b3769f4ff418.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/4252a42c0f04d37ab5b7751c1386f505b34b95cf.jpg", - "iconName": "Master Jeweler", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4010000", - "achieved": 1, - "unlocktime": 1646626138, - "name": "4010000", - "defaultvalue": 0, - "displayName": "Cold as the Ground", - "hidden": 0, - "description": "Resurrect after being dead for 4 minutes", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a584ae0907849c5df5560a2dc24bc4b7ad15d53b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ccb92bde7dfe10c3bbb2a850761d10646ff83256.jpg", - "iconName": "Cold as the Ground", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "6070001", - "achieved": 1, - "unlocktime": 1644437677, - "name": "6070001", - "defaultvalue": 0, - "displayName": "Something Buried", - "hidden": 0, - "description": "Obtain 5 treasure maps", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a6950683f8885a26523ebc0e4fae7aef24ba2a45.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/035089db02f8a978f39abb225860426ad50fe336.jpg", - "iconName": "Something Buried", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "8010001", - "achieved": 1, - "unlocktime": 1644419104, - "name": "8010001", - "defaultvalue": 0, - "displayName": "Card Collector", - "hidden": 0, - "description": "Put 5 cards in your catalog", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/176e73c8161e40c17d959419c31a91767dd3f2ec.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b12ad87fd8ddfa542f7d87539a9c0703e0764550.jpg", - "iconName": "Card Collector", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4030000", - "achieved": 1, - "unlocktime": 1647220959, - "name": "4030000", - "defaultvalue": 0, - "displayName": "I'm All You Need", - "hidden": 0, - "description": "Inflict at least 10,000 damage in a single battle", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2531db37277b34be59096ae1631ead87f2f3368b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/bf464239ce37089d2e3ed8a38a1520ad77341ff1.jpg", - "iconName": "I'm All You Need", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4030022", - "achieved": 1, - "unlocktime": 1647591797, - "name": "4030022", - "defaultvalue": 0, - "displayName": "Carnage", - "hidden": 0, - "description": "Win in Team Deathmatch by at least 10 more kills than your opponent", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5a61b680d9fccb3e9ee43afdb9f70cad2bc6b193.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/140c2c993329f9394b5725fb3c1aab83544adacf.jpg", - "iconName": "Carnage", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4040001", - "achieved": 1, - "unlocktime": 1644475748, - "name": "4040001", - "defaultvalue": 0, - "displayName": "Duel Victory", - "hidden": 0, - "description": "Win 1 duel", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2209168f8fd2f2035767fff52f37e4ed4189bf1a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/927a529611aad693942c3349e9c02ef3d6101d36.jpg", - "iconName": "Duel Victory", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "7010000", - "achieved": 1, - "unlocktime": 1644717773, - "name": "7010000", - "defaultvalue": 0, - "displayName": "Maiden voyage", - "hidden": 0, - "description": "Make your maiden voyage on the Sea of Gienna", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/759e4e1a773c05fc88e8bb34ecd0f45cf8f5bd1e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/6c0bb65697f27d2e4670b1e55f9c8b383d38cdf6.jpg", - "iconName": "Maiden voyage", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "7010001", - "achieved": 1, - "unlocktime": 1644718139, - "name": "7010001", - "defaultvalue": 0, - "displayName": "Docked", - "hidden": 0, - "description": "Enter a port", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/3379d6f4705d2197a9eb526382a889162cf436c6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/baf74cfdcf5a7ecbe5a27b17b27ba1c5370f3415.jpg", - "iconName": "Docked", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "7060000", - "achieved": 1, - "unlocktime": 1646099797, - "name": "7060000", - "defaultvalue": 0, - "displayName": "Stars across the Ocean", - "hidden": 0, - "description": "Find an island", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e6d7f82825cf9c1bbf80103c533c9b1eb96e8d77.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/c57f8c76517cf184ace42eeeeff82989d23cd8d9.jpg", - "iconName": "Stars across the Ocean", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040005", - "achieved": 1, - "unlocktime": 1644347551, - "name": "1040005", - "defaultvalue": 0, - "displayName": "Priest Named Armen", - "hidden": 0, - "description": "Meet a companion on your quest to find the Ark", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/117150b6bfe956b253eb7e2dbcf8762f73034996.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/778f2be25a00d4f9f6f38ef133dd047e3e05eec5.jpg", - "iconName": "Priest Named Armen", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040011", - "achieved": 1, - "unlocktime": 1644438146, - "name": "1040011", - "defaultvalue": 0, - "displayName": "What Truly Shines", - "hidden": 0, - "description": "Complete Crown of Lakebar quest in West Luterra", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d539707db0a2e152129fede3f160a43735cebc55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ef74c7447082a17a2855c097b7f8a55fb73ff324.jpg", - "iconName": "What Truly Shines", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040014", - "achieved": 1, - "unlocktime": 1644477470, - "name": "1040014", - "defaultvalue": 0, - "displayName": "Reclaim the Throne", - "hidden": 0, - "description": "West Luterra: Stop Scherrit's plan", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/a0f95ad2122f6e26e166d9f52313f04332d93c2b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/568fa97ad8b94be6d6919cb0e85603960804faad.jpg", - "iconName": "Reclaim the Throne", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040018", - "achieved": 1, - "unlocktime": 1644690491, - "name": "1040018", - "defaultvalue": 0, - "displayName": "Successor of Fate", - "hidden": 0, - "description": "Obtain your first Ark", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5e476ef8d81054b67ab359859612770cfd557e4f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e4a5619fdb84c26a0ad7666144410b7c5219e61f.jpg", - "iconName": "Successor of Fate", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040025", - "achieved": 1, - "unlocktime": 1644737774, - "name": "1040025", - "defaultvalue": 0, - "displayName": "Protected by the Last Giant", - "hidden": 0, - "description": "Complete Peace of Mind quest in Tortoyk", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/780588380b0c41837bb4835e311cf3d5e3fc73d7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e4883d1ee37f5d182f9967d4f52f539461abb344.jpg", - "iconName": "Protected by the Last Giant", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040028", - "achieved": 1, - "unlocktime": 1644778661, - "name": "1040028", - "defaultvalue": 0, - "displayName": "Clash of Tiger and Dragon - the First Sword of Changhun", - "hidden": 0, - "description": "Win the Anikka Tournament", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/912e405871707c908e55b534992d6c96f0540e29.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/ae2d26861e8319ec6f2e7730035d60e4c0cdac82.jpg", - "iconName": "Clash of Tiger and Dragon - the First Sword of Changhun", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040033", - "achieved": 1, - "unlocktime": 1646017218, - "name": "1040033", - "defaultvalue": 0, - "displayName": "The Heart Keeps on Beating", - "hidden": 0, - "description": "Complete the Heart of Sceptrum quest in Arthetine", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65e94735399d701b4fcaa02dcfb8b64476d7f03d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/b5e325c6e3b98d2b1e4220d2a8ac1eafb49fbe51.jpg", - "iconName": "The Heart Keeps on Beating", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040035", - "achieved": 1, - "unlocktime": 1646707454, - "name": "1040035", - "defaultvalue": 0, - "displayName": "Gorgon Slayer", - "hidden": 0, - "description": "Complete To the Nest quest in North Vern", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/e30017275b0fb0e6af8f20cbf36d6c266892be47.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/f0480ac8db033ceeef401dbc745838d375648cfa.jpg", - "iconName": "Gorgon Slayer", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "1040040", - "achieved": 1, - "unlocktime": 1646115903, - "name": "1040040", - "defaultvalue": 0, - "displayName": "Hail, Daybreakers!", - "hidden": 0, - "description": "Kill Vrad", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/2b5969e16012ef52c1228288dabbbd2fc8c011d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/40b04f1f9a9b31771e1d531ae145def7d77dffdc.jpg", - "iconName": "Hail, Daybreakers!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "4010011", - "achieved": 1, - "unlocktime": 1646112700, - "name": "4010011", - "defaultvalue": 0, - "displayName": "Rise Up", - "hidden": 0, - "description": "Attack an enemy while disguised as a prisoner", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/5267a1449b1ca7229f5eccea7cb53845d83d26e7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/d7ebf4f90ca0ae98da20458e0421ea9bfd1383bd.jpg", - "iconName": "Rise Up", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "2010008", - "achieved": 1, - "unlocktime": 1648317978, - "name": "2010008", - "defaultvalue": 0, - "displayName": "Fighting Spirit", - "hidden": 0, - "description": "Participate in a Guild PvP match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/9108169a77174c1a75047893e330ae30cb049400.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/fc5287f347891196df80bbe21603f8c30e0b8af8.jpg", - "iconName": "Fighting Spirit", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8" - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28" - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_winmatch2", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch2", - "defaultvalue": 0, - "displayName": "Sergeant", - "hidden": 0, - "description": "Win 10 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/b5ef9569fd4e0eebfd981d36345a2912efa42939.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/e289e5d222e3cffbc228f97561da3130e48bf3c8.jpg", - "iconName": "Sergeant", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_winmatch3", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch3", - "defaultvalue": 0, - "displayName": "Captain", - "hidden": 0, - "description": "Win 50 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/e76ea95e77a31434c2f0f4abfdf685e436ec7a2d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/59391fc3d5c2ab20fbfc37cc7da8067cda55a0d4.jpg", - "iconName": "Captain", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_winmatch4", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch4", - "defaultvalue": 0, - "displayName": "Colonel", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/af3524a273c3c7b675fbc5be7c7456888644d924.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/feae60a0d76af6079370f98da62d571088aa7531.jpg", - "iconName": "Colonel", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_finalshot1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_finalshot1", - "defaultvalue": 0, - "displayName": "Commendation", - "hidden": 0, - "description": "Perform 10 kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/24f2f369c28fecc8bb058fc187cc111ae4926b53.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/cf7336ffd0a2698f3d4ca7d55665c6621a91788b.jpg", - "iconName": "Commendation", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_finalshot2", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_finalshot2", - "defaultvalue": 0, - "displayName": "Stars and Stripes", - "hidden": 0, - "description": "Perform 100 kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/2e1b1ff0b61b6e949ebdd39edf560ba03374f4e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/b50df875085b7c49d008b2915eb24ca915aa3007.jpg", - "iconName": "Stars and Stripes", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_finalshot3", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_finalshot3", - "defaultvalue": 0, - "displayName": "Legion", - "hidden": 0, - "description": "Perform 500 kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/ae97f61820a96db2f05ff9b20a4070c0b4defd70.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/98ddcdab1962c5e166d3908a81f2bf4914ba3bb0.jpg", - "iconName": "Legion", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_finalshot4", - "achieved": 1, - "unlocktime": 1526707014, - "name": "mcvs_finalshot4", - "defaultvalue": 0, - "displayName": "Distinguished Service", - "hidden": 0, - "description": "Perform 2,000 kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/da91dd426754aa90725c19097568f74de138bbf5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/c0ad9fbcc8115b2095d00780d2b2fd65a3d061de.jpg", - "iconName": "Distinguished Service", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_finalshot5", - "achieved": 1, - "unlocktime": 1526707014, - "name": "mcvs_finalshot5", - "defaultvalue": 0, - "displayName": "Above and Beyond", - "hidden": 0, - "description": "Perform 5,000 kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/277ce2ecefb7e5a02b555bbd189f451768168d46.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/1d68f8bd8ee58fe46c72348b7efa7d45828bad0c.jpg", - "iconName": "Above and Beyond", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_opencrate1", - "achieved": 1, - "unlocktime": 1526706843, - "name": "mcvs_opencrate1", - "defaultvalue": 0, - "displayName": "Army Spoils", - "hidden": 0, - "description": "Open 5 Multiplayer Victory Crates", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/0e24047cdbd925ebfb4e7798b9ec4b7eed88dee9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/76fd06bf5a4fda13b6acddbb30db9c257f5cbaa3.jpg", - "iconName": "Army Spoils", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_reachbronze", - "achieved": 1, - "unlocktime": 1526706497, - "name": "mcvs_reachbronze", - "defaultvalue": 0, - "displayName": "Bronze League", - "hidden": 0, - "description": "Reach the BRONZE LEAGUE", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/5f64c60344fdf5feedb2a41180c002eae1b77a26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/adcd0e7f272990f561bdd6e1e2c5ab829f46def5.jpg", - "iconName": "Bronze League", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_reachsilver", - "achieved": 1, - "unlocktime": 1526709125, - "name": "mcvs_reachsilver", - "defaultvalue": 0, - "displayName": "Silver Star", - "hidden": 0, - "description": "Reach the SILVER LEAGUE", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/d2cb78974bae5614f3e3c17174d2f5b36d43aa18.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/956248eb2c201a5cb090d47e3b3d976f13a16b03.jpg", - "iconName": "Silver Star", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_reachgold", - "achieved": 1, - "unlocktime": 1526765809, - "name": "mcvs_reachgold", - "defaultvalue": 0, - "displayName": "Midas Deathtouch", - "hidden": 0, - "description": "Reach the GOLD LEAGUE", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/9c0caef24e468f6d8f3a9fe9db2d7bed5eaae5a6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/7f3ac5f3a68d4fa9c48c96df3aa15e05ebf8662c.jpg", - "iconName": "Midas Deathtouch", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "mcvs_winmatch5", - "achieved": 1, - "unlocktime": 1526707014, - "name": "mcvs_winmatch5", - "defaultvalue": 0, - "displayName": "General", - "hidden": 0, - "description": "Win 500 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/43b10939c0fe0c4e4198e0460e6fd56e36dcdddb.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/ec33c9fce5b4c290d15fb0c398df29400aa29326.jpg", - "iconName": "General", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb" - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83" - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" - }, - { - "apiname": "GOAL_ID_1228", - "achieved": 1, - "unlocktime": 1491925375, - "name": "GOAL_ID_1228", - "defaultvalue": 0, - "displayName": "Untouched", - "hidden": 0, - "description": "Win a match where the enemy team scored no points.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/23d85cdd0dbc93fc02dfc6cf245f844e622cda00.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/7274c95efe91ae9ae4741769911597193ab1a37f.jpg", - "iconName": "Untouched", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" - }, - { - "apiname": "GOAL_ID_1340", - "achieved": 1, - "unlocktime": 1491925375, - "name": "GOAL_ID_1340", - "defaultvalue": 0, - "displayName": "Counter-Air Defense", - "hidden": 0, - "description": "Kill a player in the air who is over 100 units above the ground.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/ad093dad4f891e11ade6e574eb7be2f100b8fcf6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/326f6443ed3d9368dc1379239d8971f961968902.jpg", - "iconName": "Counter-Air Defense", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" - }, - { - "apiname": "GOAL_ID_1250", - "achieved": 1, - "unlocktime": 1491926086, - "name": "GOAL_ID_1250", - "defaultvalue": 0, - "displayName": "Give 110 Percent", - "hidden": 0, - "description": "Get a killing blow after the round has ended.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/38b9d311fbfbd797b58ff59a039b6320b78e60ed.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8f6fd6d5208328b5f3244b780a57bfb506daea83.jpg", - "iconName": "Give 110 Percent", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e" - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" - }, - { - "apiname": "ACHIVE018", - "achieved": 1, - "unlocktime": 1541679189, - "name": "ACHIVE018", - "defaultvalue": 0, - "displayName": "Blood on My Hands", - "hidden": 0, - "description": "Kill a player by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/a8b5bd3a756e47bb3f75942d6eaab7a3a1125b81.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/662f4dd80856d1bb573ce8b94346eeb881baefde.jpg", - "iconName": "Blood on My Hands", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" - }, - { - "apiname": "ACHIVE020", - "achieved": 1, - "unlocktime": 1627627910, - "name": "ACHIVE020", - "defaultvalue": 0, - "displayName": "Killing Spree", - "hidden": 0, - "description": "Kill at least 4 players in a single match.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/3a0cf87d38da2bb779867cf8bded8ce452528772.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/c975abfb42cb55cd8f0e3004ed856e9e6a601a0b.jpg", - "iconName": "Killing Spree", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" - }, - { - "apiname": "ACHIVE034", - "achieved": 1, - "unlocktime": 1543643164, - "name": "ACHIVE034", - "defaultvalue": 0, - "displayName": "You Complete Me", - "hidden": 0, - "description": "Wear the outfit of a dead player.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/e736b97161e2fa32552ef09f283acfed7c545967.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/2d4b0c3b0a1cef007e3b987e7778416ee4ba4e0b.jpg", - "iconName": "You Complete Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" - }, - { - "apiname": "ACHIVE036", - "achieved": 1, - "unlocktime": 1543643503, - "name": "ACHIVE036", - "defaultvalue": 0, - "displayName": "Health Junkie", - "hidden": 0, - "description": "Charge your boost gauge to the max with energy drink and painkiller overdose.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/b3dcc43eb2b404f201972b863a606947dcb8151e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/8ea390d35efb34ea5188edc697eb99ca9a3cd411.jpg", - "iconName": "Health Junkie", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d" - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c" - }, - { - "apiname": "qc_first_taste", - "achieved": 1, - "unlocktime": 1541363947, - "name": "qc_first_taste", - "defaultvalue": 0, - "displayName": "First Taste", - "hidden": 0, - "description": "Complete 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/e8d503bd102c93cc1ce20c19a9b508c8f83f745d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/43d3fcbef6319cc2a58b8d2b9ab82d16bf4ffdeb.jpg", - "iconName": "First Taste", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c" - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_2", - "achieved": 1, - "unlocktime": 1548558374, - "name": "NEW_ACHIEVEMENT_1_2", - "defaultvalue": 0, - "displayName": "Path to the Goddess", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/a5d811701a15e70663870ba8090ba3edd839c2db.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/344901183389ff857a45107de3db2392a78c54df.jpg", - "iconName": "Path to the Goddess", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_10", - "achieved": 1, - "unlocktime": 1548552154, - "name": "NEW_ACHIEVEMENT_1_10", - "defaultvalue": 0, - "displayName": "The Basics of Survival", - "hidden": 0, - "description": "Combine two items together.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/d2d4e533f6e7a3cfb8542de5861ff63a60ca7bb6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/bfd40eddd6e65342e2e6dc4f6e2560c7da82bf93.jpg", - "iconName": "The Basics of Survival", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_11", - "achieved": 1, - "unlocktime": 1548554021, - "name": "NEW_ACHIEVEMENT_1_11", - "defaultvalue": 0, - "displayName": "Hip to Add Squares", - "hidden": 0, - "description": "Increase your inventory slots.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/bdfb992554bb57f830f2e43e26abd3d12f9446b7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/349f8fda66b0c0da8408af3217349175694c6701.jpg", - "iconName": "Hip to Add Squares", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_12", - "achieved": 1, - "unlocktime": 1548553367, - "name": "NEW_ACHIEVEMENT_1_12", - "defaultvalue": 0, - "displayName": "Customizer", - "hidden": 0, - "description": "Customize a weapon.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/7d9dc81dd117b596a8ec59ea4effd8b3f2e513b0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/ac81d1aac560967fa91f6ecde8c6bb642481ca4f.jpg", - "iconName": "Customizer", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_13", - "achieved": 1, - "unlocktime": 1548552676, - "name": "NEW_ACHIEVEMENT_1_13", - "defaultvalue": 0, - "displayName": "Don't Need No Stinkin' Gun", - "hidden": 0, - "description": "Defeat an enemy with a knife.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/7468ff9d6c6df2343d3d0b8f8c3344520c98d97c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/5109ef152d19b00fa88fbeb388b4e8f7580330d7.jpg", - "iconName": "Don't Need No Stinkin' Gun", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_14", - "achieved": 1, - "unlocktime": 1548552900, - "name": "NEW_ACHIEVEMENT_1_14", - "defaultvalue": 0, - "displayName": "Eat This!", - "hidden": 0, - "description": "Counterattack with a sub-weapon.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/bbd4b9a77110bb46a086094efd26e0f1ba264b35.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/097e7946db247778282a711f9a57d3425f9c0b7e.jpg", - "iconName": "Eat This!", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_15", - "achieved": 1, - "unlocktime": 1548553251, - "name": "NEW_ACHIEVEMENT_1_15", - "defaultvalue": 0, - "displayName": "That'll Hold 'Em", - "hidden": 0, - "description": "Use Wooden Boards to board up a window.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/d7570d2b0804260afde59a5e004b1ab94dcb711f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/00656d288d73778ddebd815daae2788afed1d492.jpg", - "iconName": "That'll Hold 'Em", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_16", - "achieved": 1, - "unlocktime": 1548562574, - "name": "NEW_ACHIEVEMENT_1_16", - "defaultvalue": 0, - "displayName": "Vermin Extermination", - "hidden": 0, - "description": "Destroy a Mr. Raccoon.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/548c76314fd3d707f1ca32857115eec89d4e4c90.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/66adfa87b4ffbcd3f4d6a6a425399d9f08545e15.jpg", - "iconName": "Vermin Extermination", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_17", - "achieved": 1, - "unlocktime": 1548553732, - "name": "NEW_ACHIEVEMENT_1_17", - "defaultvalue": 0, - "displayName": "A Vault-like Mind", - "hidden": 0, - "description": "Open a portable safe.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/ded65e5f81af37b77079efc0f8ec2f44be2082c2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/a0c881a8a273caa266584ebc3975489731240066.jpg", - "iconName": "A Vault-like Mind", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_18", - "achieved": 1, - "unlocktime": 1548552798, - "name": "NEW_ACHIEVEMENT_1_18", - "defaultvalue": 0, - "displayName": "First Break-In", - "hidden": 0, - "description": "Open a dial safe.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/be77cb4504a04bf791bca1d7c3582467cdd3f406.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/18e5df7c9912c633d8924b3715f96e60fdc32686.jpg", - "iconName": "First Break-In", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_19", - "achieved": 1, - "unlocktime": 1561562619, - "name": "NEW_ACHIEVEMENT_1_19", - "defaultvalue": 0, - "displayName": "Bon Appétit", - "hidden": 0, - "description": "Shoot the grenade you fed to an enemy.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/c731f2e9235b77b2ec34f5e4fc885b3ee7f716c2.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/1ff1d42c3309c53047a08350ed5ad23916e994d1.jpg", - "iconName": "Bon Appétit", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1547246271, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "10 minutes played", - "hidden": 0, - "description": "10 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/fd750f79e4365f8275e4f0ca480552f143ccc379.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/676e3da70fa8b19dc23adbb392e209ca65563a79.jpg", - "iconName": "10 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_2", - "achieved": 1, - "unlocktime": 1547246571, - "name": "NEW_ACHIEVEMENT_1_2", - "defaultvalue": 0, - "displayName": "15 minutes played", - "hidden": 0, - "description": "15 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7e89eed05d67542b89304c208d48f984bdcb4a63.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/6f00679acbe83ce61ffe8f3a36e847f678e17ec5.jpg", - "iconName": "15 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_3", - "achieved": 1, - "unlocktime": 1547246871, - "name": "NEW_ACHIEVEMENT_1_3", - "defaultvalue": 0, - "displayName": "20 minutes played", - "hidden": 0, - "description": "20 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/d5c1138234abefb3b8a6edb4c1a935e73ef3bf97.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/caf7e318f2cad785736eae68ac9f3bfcbc89d704.jpg", - "iconName": "20 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_4", - "achieved": 1, - "unlocktime": 1547247171, - "name": "NEW_ACHIEVEMENT_1_4", - "defaultvalue": 0, - "displayName": "25 minutes played", - "hidden": 0, - "description": "25 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/a0587557b709a95236dd63ed57d8a5f52e80ac06.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/9345574bdb50678536fee70281f50b34e4c02d03.jpg", - "iconName": "25 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" - }, - { - "apiname": "NEW_ACHIEVEMENT_1_5", - "achieved": 1, - "unlocktime": 1547247471, - "name": "NEW_ACHIEVEMENT_1_5", - "defaultvalue": 0, - "displayName": "30 minutes played", - "hidden": 0, - "description": "30 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/dc98510f759230b836c1d7ebbec502f1814b2c3d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/d7506d76dc9ed6b8dcb5df6f15879138faccc7f0.jpg", - "iconName": "30 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad" - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "2", - "achieved": 1, - "unlocktime": 1620406122, - "name": "2", - "defaultvalue": 0, - "displayName": "Four Lords", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/861c475a6195deaef2ea39be24c1cc691d027ece.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/77af01750896351615749300261533c376cb8247.jpg", - "iconName": "Four Lords", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "3", - "achieved": 1, - "unlocktime": 1620416716, - "name": "3", - "defaultvalue": 0, - "displayName": "That Sucked!", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/7fb0ee27e9f91c419488b1474638ef459674ea56.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/faa9972fca0e8068acb42b895a1c78e97dd9f91c.jpg", - "iconName": "That Sucked!", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "4", - "achieved": 1, - "unlocktime": 1620427187, - "name": "4", - "defaultvalue": 0, - "displayName": "Got No Strings", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/3ae1681f0157984b3e1a22bc8f6ae12ed34542f5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0010b1220db8840558616cd7ce4a7acfd5a3602f.jpg", - "iconName": "Got No Strings", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "5", - "achieved": 1, - "unlocktime": 1620432625, - "name": "5", - "defaultvalue": 0, - "displayName": "Fish Out of Water", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ffa2426fc1a2917a430e15b4aa5a9ba1349d7d28.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ce1b16ebd8d323b36cae719c19178bcc551bb825.jpg", - "iconName": "Fish Out of Water", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "6", - "achieved": 1, - "unlocktime": 1620582847, - "name": "6", - "defaultvalue": 0, - "displayName": "Up Urs!", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/86555f104c68140c13f13a9caa4d189f877b250f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/b737b1741920b0634adc438c93e8c13d84f2803e.jpg", - "iconName": "Up Urs!", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "7", - "achieved": 1, - "unlocktime": 1620583438, - "name": "7", - "defaultvalue": 0, - "displayName": "Temporary Measures", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/2d2a1ea487ee5a326aabf345530ebf7e2df9f743.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/8eb45c9178ace6bf4f4e6e3f002227d7ce4d8882.jpg", - "iconName": "Temporary Measures", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "8", - "achieved": 1, - "unlocktime": 1620591709, - "name": "8", - "defaultvalue": 0, - "displayName": "Iron Giant Down", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/c861009d6166f43601a497d58d963fea9387b726.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/034cead1e5c710d54ca9c62d331295e26d0792a8.jpg", - "iconName": "Iron Giant Down", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "9", - "achieved": 1, - "unlocktime": 1620592508, - "name": "9", - "defaultvalue": 0, - "displayName": "The Root of the Matter", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/87c40d74ffdc0c90f1245b17ab955b5ff54b4687.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0bca31fd2955786daec415b6e7205821eb2f6fa3.jpg", - "iconName": "The Root of the Matter", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "10", - "achieved": 1, - "unlocktime": 1620595894, - "name": "10", - "defaultvalue": 0, - "displayName": "Great Dad", - "hidden": 0, - "description": "Finish the story on at least Casual difficulty.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/f55383e473949217b007915db9a26f4d152b0358.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/14ea12e7a1ec9b2fafd130e8c37705a5971c0f95.jpg", - "iconName": "Great Dad", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "11", - "achieved": 1, - "unlocktime": 1620595895, - "name": "11", - "defaultvalue": 0, - "displayName": "Best Dad Ever", - "hidden": 0, - "description": "Finish the story on at least Standard difficulty.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/045fae28c36e04b092e52f527b3f14a9ec373d27.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/f450203ae7d6269858ca566603a90a6b9a7384a1.jpg", - "iconName": "Best Dad Ever", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "14", - "achieved": 1, - "unlocktime": 1620403938, - "name": "14", - "defaultvalue": 0, - "displayName": "Crafter", - "hidden": 0, - "description": "Craft an item in the Crafting menu.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/d50d359b3c82008cffc0ec67c5bfd93d5e8ecfe9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/269d67fcec14745d4be01f8a0a35cced0c976c62.jpg", - "iconName": "Crafter", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "15", - "achieved": 1, - "unlocktime": 1620406348, - "name": "15", - "defaultvalue": 0, - "displayName": "Patron", - "hidden": 0, - "description": "Purchase something from the Duke in the story.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/9f2965c22ea8f0605c9da8b8c82e8c4913542d1c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ea7abf273b64c777875a072c3faaa53f7e45da24.jpg", - "iconName": "Patron", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "16", - "achieved": 1, - "unlocktime": 1620406894, - "name": "16", - "defaultvalue": 0, - "displayName": "Petty Thief", - "hidden": 0, - "description": "Unlock a simple lock with a lockpick.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/6cb2bba6afef0e6d4765e5dd44b61a18bc3a0543.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/7a1959268c41aa5b128bedf28689c6f77532c544.jpg", - "iconName": "Petty Thief", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "17", - "achieved": 1, - "unlocktime": 1620427187, - "name": "17", - "defaultvalue": 0, - "displayName": "Repairer", - "hidden": 0, - "description": "Combine a treasure into its complete form.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/9a413a8d24fa16caddfba507eeca00d9e7d52e07.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/58eff0d2972d225255224accb7404227dd8f919c.jpg", - "iconName": "Repairer", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "18", - "achieved": 1, - "unlocktime": 1620417035, - "name": "18", - "defaultvalue": 0, - "displayName": "Hunter", - "hidden": 0, - "description": "Hunt an animal during the story.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/29d2dedac95a882a0ce3716315154d6f78b79a44.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/e2cd66303551b2f351c648150b4c6395853a0e37.jpg", - "iconName": "Hunter", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "19", - "achieved": 1, - "unlocktime": 1620413378, - "name": "19", - "defaultvalue": 0, - "displayName": "Get the Ball Rolling", - "hidden": 0, - "description": "Solve a Labyrinth.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0db0c99cd2615c88e9a8b23c864e9db07442aa97.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/37bbf9524e947355bf91826a09e4db3008593e07.jpg", - "iconName": "Get the Ball Rolling", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "25", - "achieved": 1, - "unlocktime": 1620437650, - "name": "25", - "defaultvalue": 0, - "displayName": "Push Comes to Shove", - "hidden": 0, - "description": "Push away an enemy after guarding in the story.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/e4f1bdc9264b0033f5327b8fbbc1e121d9c6fb53.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/3251b40175801b204549acdb1f36646974d89ba0.jpg", - "iconName": "Push Comes to Shove", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "26", - "achieved": 1, - "unlocktime": 1620433200, - "name": "26", - "defaultvalue": 0, - "displayName": "Trick Shot", - "hidden": 0, - "description": "Defeat an enemy from long range with the sniper rifle in the story.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/15c742441280690ad5566687bebe3cb00795221b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/a461ad8d1733923f8a525e7af2836fc7477ff246.jpg", - "iconName": "Trick Shot", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "27", - "achieved": 1, - "unlocktime": 1620403778, - "name": "27", - "defaultvalue": 0, - "displayName": "Strategist", - "hidden": 0, - "description": "Defeat at least three enemies with one attack in the story.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/96a5bba0bfe330484a169a5f3e8eda4d4f932b7c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/dce1e948b4b2b53bba3837e9a439c31184828c26.jpg", - "iconName": "Strategist", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "28", - "achieved": 1, - "unlocktime": 1620436532, - "name": "28", - "defaultvalue": 0, - "displayName": "Medium Rare", - "hidden": 0, - "description": "Set fire to a Moroaică in the story.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/e7ea26c4606216f8ca9faf69b3842a5b134bd411.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/2272aae75a00972dc38ac0dbdb312af3e0b211fc.jpg", - "iconName": "Medium Rare", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "34", - "achieved": 1, - "unlocktime": 1620591709, - "name": "34", - "defaultvalue": 0, - "displayName": "Mapmatician", - "hidden": 0, - "description": "Complete the village map.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/d6ef77996e743362dc77cf44f938d0872473d7a5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/ae8f35770222900ab5ab8e00a50c221cbc785978.jpg", - "iconName": "Mapmatician", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "35", - "achieved": 1, - "unlocktime": 1620404270, - "name": "35", - "defaultvalue": 0, - "displayName": "Cynic", - "hidden": 0, - "description": "Destroy a Goat of Warding.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/41b7c178aa485f0c0bb696db24650460e40d7265.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/16bd8cd23d6fe38f0cd95875d6ee9ffe69a24d44.jpg", - "iconName": "Cynic", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "37", - "achieved": 1, - "unlocktime": 1620407832, - "name": "37", - "defaultvalue": 0, - "displayName": "Gunsmith", - "hidden": 0, - "description": "Equip a gun with a customizable part.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/80ca8e0fa323d3c3cef0c30ef1df047c167fa8d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/1bf2bde31cae6247a9217c6772c35d1e6ac5c6c5.jpg", - "iconName": "Gunsmith", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645" - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_03", - "achieved": 1, - "unlocktime": 1627495065, - "name": "Goal_ID_03", - "defaultvalue": 0, - "displayName": "Ambush", - "hidden": 0, - "description": "Down an enemy without taking return damage", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/2537a3aea1f44577ea0fb19d9e6bf5d111722910.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/13731a74e0642b698e08ffba8acd622d23b7cd7e.jpg", - "iconName": "Ambush", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_04", - "achieved": 1, - "unlocktime": 1627495236, - "name": "Goal_ID_04", - "defaultvalue": 0, - "displayName": "Decimated", - "hidden": 0, - "description": "Down 10 enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/1fca082170f9fcd39dd0790f064357153e865037.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/c7b909fd6e3ce0aeee6a257f161c648bac9b1888.jpg", - "iconName": "Decimated", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_06", - "achieved": 1, - "unlocktime": 1627495099, - "name": "Goal_ID_06", - "defaultvalue": 0, - "displayName": "Fours A Party", - "hidden": 0, - "description": "Down 4 enemies in one round", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/05909f510329d353c80e45604c697e6c4337ec17.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/c9b2b463f1a99659e9f9effbbb2d5c26ee32d722.jpg", - "iconName": "Fours A Party", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_07", - "achieved": 1, - "unlocktime": 1627495510, - "name": "Goal_ID_07", - "defaultvalue": 0, - "displayName": "Good Company", - "hidden": 0, - "description": "Win 8 matches with 8 different Rogues", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/349a945e83211ab4f900fbb7e76de3ee30e9a6d8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/f479958824cff1ccf4aadfa562415fb76c5023da.jpg", - "iconName": "Good Company", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_08", - "achieved": 1, - "unlocktime": 1627497665, - "name": "Goal_ID_08", - "defaultvalue": 0, - "displayName": "Grenadier", - "hidden": 0, - "description": "Deal 1,000 damage with gadgets", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/d7cc5b1cf837ec62d781f5c91a45f289d6c27666.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/ec956e508be3357146222bd876e6685a4fdf0887.jpg", - "iconName": "Grenadier", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_09", - "achieved": 1, - "unlocktime": 1627495196, - "name": "Goal_ID_09", - "defaultvalue": 0, - "displayName": "Gunsmith", - "hidden": 0, - "description": "Fully upgrade a primary weapon", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/d4c2144a6dbfe0d6ead5c31daf45d2e2b9b1415b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/eff0bbd2a8967378588d02f3a0e5eead854b5c18.jpg", - "iconName": "Gunsmith", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_10", - "achieved": 1, - "unlocktime": 1627495291, - "name": "Goal_ID_10", - "defaultvalue": 0, - "displayName": "Hard Carry", - "hidden": 0, - "description": "Down 20 enemies in a single match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/9b4366a8dbff385788e9a68c05ef3926f0840774.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/184f3adb69fefbbc9a14e19a1a931136e491be73.jpg", - "iconName": "Hard Carry", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_11", - "achieved": 1, - "unlocktime": 1627495508, - "name": "Goal_ID_11", - "defaultvalue": 0, - "displayName": "Headhunter", - "hidden": 0, - "description": "Deal a total of 10,000 damage to players via headshots", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/eb081a1dfc451ba1baf60b5b9de52bbe7309c9ab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/38c7db8972b2251b3996473952ca8bea79c70f5d.jpg", - "iconName": "Headhunter", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_12", - "achieved": 1, - "unlocktime": 1627496800, - "name": "Goal_ID_12", - "defaultvalue": 0, - "displayName": "Moneybags", - "hidden": 0, - "description": "Accrue a total of $70,000 in a single match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/8fc23a807ccc70afeec326817fee2adbda22e163.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/1ec0e7313eaedcea3b107891e197ced272d1b63f.jpg", - "iconName": "Moneybags", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_13", - "achieved": 1, - "unlocktime": 1627496673, - "name": "Goal_ID_13", - "defaultvalue": 0, - "displayName": "No Respect", - "hidden": 0, - "description": "Down an enemy with a gadget while looking away from them", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/697a2b1f4b53cda3de765a347410886de0265762.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/db2f6ac3c9e471bc6f86b5d5cf5b6b2bb9a8c4d1.jpg", - "iconName": "No Respect", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_14", - "achieved": 1, - "unlocktime": 1627495157, - "name": "Goal_ID_14", - "defaultvalue": 0, - "displayName": "Not Even Close", - "hidden": 0, - "description": "Down an enemy while you have less than 10% health", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/b5a55863f9e8943d73f599e620d235df5d108dd3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/d1cbe0024e290f9832f198bf12c4cfa4b03af132.jpg", - "iconName": "Not Even Close", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_15", - "achieved": 1, - "unlocktime": 1627495331, - "name": "Goal_ID_15", - "defaultvalue": 0, - "displayName": "Perky", - "hidden": 0, - "description": "Purchase 3 perks in a single match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/ddb0f1c7a1cc18030c891fc9bde9a6ccdac8ea09.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/bf28dc2170af50db68407ddc74bdbb2a2d36e2f7.jpg", - "iconName": "Perky", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_16", - "achieved": 1, - "unlocktime": 1627497994, - "name": "Goal_ID_16", - "defaultvalue": 0, - "displayName": "Scavenger", - "hidden": 0, - "description": "Pick up another player's weapon and down an enemy with it", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/b16ed3c5a35537af3f112174bdf2eccc943fc31a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/e8cf82421fbf1c05c1e30b7856d5edc91dc2eaf7.jpg", - "iconName": "Scavenger", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_18", - "achieved": 1, - "unlocktime": 1627494903, - "name": "Goal_ID_18", - "defaultvalue": 0, - "displayName": "Unflappable", - "hidden": 0, - "description": "Complete the tutorial", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/5db47e59c558e227d241acee0b8cf0602842bc87.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/187a45735f19a15c017d82e010ffc66265bff1c6.jpg", - "iconName": "Unflappable", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "Goal_ID_19", - "achieved": 1, - "unlocktime": 1627495932, - "name": "Goal_ID_19", - "defaultvalue": 0, - "displayName": "Zeal", - "hidden": 0, - "description": "Down an enemy with a melee weapon", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/8f2eca4543cd9018c5517276749dbb1d68af900e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/7473b10d3732e86dc8b967a09d7f56ac13a9bc94.jpg", - "iconName": "Zeal", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1" - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "6", - "achieved": 1, - "unlocktime": 1629999830, - "name": "6", - "defaultvalue": 0, - "displayName": "Killing Spree", - "hidden": 0, - "description": "Get 5 kills without dying", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/a24c9bfaec4b8df31f2917799891b427d83bb289.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7e8cc370d7ac48ffad34cbd0357bbbbe4efbf872.jpg", - "iconName": "Killing Spree", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "7", - "achieved": 1, - "unlocktime": 1629999831, - "name": "7", - "defaultvalue": 0, - "displayName": "Killection Agency", - "hidden": 0, - "description": "Get 10 kills without dying", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/9d09fb1bd7f4ab48003bfe17f72da95aeb99fe89.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/dea4096c9de3ab14c7152fd6eae5ed976f258c41.jpg", - "iconName": "Killection Agency", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "8", - "achieved": 1, - "unlocktime": 1630000503, - "name": "8", - "defaultvalue": 0, - "displayName": "Fragtastic", - "hidden": 0, - "description": "Get 15 kills without dying", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/758d4667d5f0f01feee73d6af6697c6104af8cab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/5ec0637b76d1fbb0a1c953acdafd4ffabb673168.jpg", - "iconName": "Fragtastic", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "10", - "achieved": 1, - "unlocktime": 1630083670, - "name": "10", - "defaultvalue": 0, - "displayName": "Back-2-Back", - "hidden": 0, - "description": "Get 25 double kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/623bc779040f3523a25a191b58676ce16bdb88fe.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/398317407c61ee6b99011c74a37ce9982bdf8768.jpg", - "iconName": "Back-2-Back", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "12", - "achieved": 1, - "unlocktime": 1630000503, - "name": "12", - "defaultvalue": 0, - "displayName": "Unstoppable", - "hidden": 0, - "description": "Get a quad kill", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/f8e0e3e14b73d1c1d0e55a40b69aee00a1515cbd.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/bb0ac50b85d6e4cc45f0d3617505722a41fda191.jpg", - "iconName": "Unstoppable", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "13", - "achieved": 1, - "unlocktime": 1630002714, - "name": "13", - "defaultvalue": 0, - "displayName": "Headhunter", - "hidden": 0, - "description": "Get 50 headshot kills", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/427a9145b60a886f6742220bf8b43d1bdbe9f990.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/250169ae1c59fb5f939d3390353b157d44ec18d0.jpg", - "iconName": "Headhunter", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "23", - "achieved": 1, - "unlocktime": 1630001683, - "name": "23", - "defaultvalue": 0, - "displayName": "Dangerous", - "hidden": 0, - "description": "Deal 10,000 damage to enemies", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/f249c0d98a1950902ac35403f4c03bfcc595271e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/00c6384960d4795511f2b8fde6e55879af3967b8.jpg", - "iconName": "Dangerous", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f" - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_2", - "achieved": 1, - "unlocktime": 1686452108, - "name": "ACHIEVEMENT_2", - "defaultvalue": 0, - "displayName": "So This Is the Battle Hub...", - "hidden": 0, - "description": "Ah, yes. Welcome to the Battle Hub. I do not know what you seek, but please, enjoy yourself. That is the purpose for which it was built, after all.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/d8556a8160da2bf0d8607032d89963875b208ee3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/fa5c374d64de2ca412030af77861b5d789347703.jpg", - "iconName": "So This Is the Battle Hub...", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_3", - "achieved": 1, - "unlocktime": 1686452312, - "name": "ACHIEVEMENT_3", - "defaultvalue": 0, - "displayName": "First Encounters", - "hidden": 0, - "description": "Start by fighting a match in the Battle Hub. It doesn't matter if you win or lose. What matters is challenging yourself to take that first step.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/198f78e507e128a30bed781a6d46a806d3914c67.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b414161e1112dad8ea85595108284c1eb509f239.jpg", - "iconName": "First Encounters", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_27", - "achieved": 1, - "unlocktime": 1686447740, - "name": "ACHIEVEMENT_27", - "defaultvalue": 0, - "displayName": "My Title, My Life", - "hidden": 0, - "description": "Earned any titles for your efforts yet? Me? Pfft. I don't need a title. I'm Jamie freakin' Siu!", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/0ea31f649ed4db04e0869390fc8038e936e40944.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/1168dfdea4b8024cc6b2b80e07aea91c3a74c82e.jpg", - "iconName": "My Title, My Life", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_29", - "achieved": 1, - "unlocktime": 1686450886, - "name": "ACHIEVEMENT_29", - "defaultvalue": 0, - "displayName": "Fashion Leader", - "hidden": 0, - "description": "Clothing allows us to express ourselves. Know who else never changes their clothes? Animals. Change your outfit. Please.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/af2277a63fb0aa795e60a480a42a321e280c7a89.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b8d4ee0fb8ec12de6be3960b93396d2c308e4652.jpg", - "iconName": "Fashion Leader", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_35", - "achieved": 1, - "unlocktime": 1686447766, - "name": "ACHIEVEMENT_35", - "defaultvalue": 0, - "displayName": "Leaving the Nest", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/e846657465466eb560951885e9c9547d824d7ac4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/5ee7b1e3ed7d5d81e49ab39580250db9887cc421.jpg", - "iconName": "Leaving the Nest", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_37", - "achieved": 1, - "unlocktime": 1686451886, - "name": "ACHIEVEMENT_37", - "defaultvalue": 0, - "displayName": "Actions Speak Louder", - "hidden": 0, - "description": "Something in the way while you're walking through the city? Here's an easy solution: send it flyin' with a Master Action! Mm-mm-mmm... It's the little pleasures in life.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/0e4febd01f1ff012703d1e2cae4e43a3582220f8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b3b7a085bc66bc2a3c9778bcd2f5b6d088e647d6.jpg", - "iconName": "Actions Speak Louder", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACHIEVEMENT_43", - "achieved": 1, - "unlocktime": 1686447025, - "name": "ACHIEVEMENT_43", - "defaultvalue": 0, - "displayName": "Taking Initiative", - "hidden": 0, - "description": "You want to learn street fighting fundamentals? Well, too bad, 'cause I'm not in the mood to take on any students. Go hit the Tutorials, kid.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/7f8428ebba5ef2a6df4d90d1029a905ad7434a0d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/8ddac428e518864687c3cc158d4a45962dd97c55.jpg", - "iconName": "Taking Initiative", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d" - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60" - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_32", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_32", - "defaultvalue": 0, - "displayName": "Nestegg", - "hidden": 0, - "description": "Earn 10,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/eb100688bff0270ab51577d5f5bdbd17d687e992.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/8fd80ada476f4fbc782db2899949f58959f0c314.jpg", - "iconName": "Nestegg", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_33", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_33", - "defaultvalue": 0, - "displayName": "Where Credit is Due", - "hidden": 0, - "description": "Earn 100,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/2dde0edbe3354f9f2ce4bbadd7224a1dec83820b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a9119c2673ae99ab0ac0175d544642cf9a9d605e.jpg", - "iconName": "Where Credit is Due", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_34", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_34", - "defaultvalue": 0, - "displayName": "Money is Power", - "hidden": 0, - "description": "Earn 1,000,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a2ff3eb728bd34edc087c26108e8a91e22dd8f16.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/06980a7f80a695414e7b210fd7d04635f51e6b95.jpg", - "iconName": "Money is Power", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_49", - "achieved": 1, - "unlocktime": 1541874712, - "name": "ACHIEVEMENT_49", - "defaultvalue": 0, - "displayName": "The Right Tool for the Job", - "hidden": 0, - "description": "Obtain 5 Warframes.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5fe2f929ae00f0f1e4ac1723838d20b2d5a35f18.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/74bbb9f5b621744900678c421bac3d1b208bdf64.jpg", - "iconName": "The Right Tool for the Job", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_57", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_57", - "defaultvalue": 0, - "displayName": "Hooked", - "hidden": 0, - "description": "Play for 2 hours.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/16558dc785148d1a08f2ba2b57d4d5981f0a81ea.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/cb5f24ccff2aa473cdcbccda068e8359257b4040.jpg", - "iconName": "Hooked", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_58", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_58", - "defaultvalue": 0, - "displayName": "It Keeps Getting Better", - "hidden": 0, - "description": "Play for 10 hours.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/1ce369cff21de3a90f1ed2427b7b8fd6421ac01c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/0e5b24709ca6fe1dfbe7747a1f82967f1c1404d6.jpg", - "iconName": "It Keeps Getting Better", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_60", - "achieved": 1, - "unlocktime": 1541874660, - "name": "ACHIEVEMENT_60", - "defaultvalue": 0, - "displayName": "Initiate", - "hidden": 0, - "description": "Achieve the rank of Initiate.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5696dd384e9386b601425a9415130a71fc8f59ac.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c4e2d3366a6e58ee17b0e3414f45c101f74f2ed7.jpg", - "iconName": "Initiate", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_61", - "achieved": 1, - "unlocktime": 1541874660, - "name": "ACHIEVEMENT_61", - "defaultvalue": 0, - "displayName": "Silver Initiate", - "hidden": 0, - "description": "Achieve the rank of Silver Initiate.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/ffa4d2f0a2609f81174e29e2df438e952bff8dd8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/05da5b280021b8f8bb247e9af5067c58443bacc5.jpg", - "iconName": "Silver Initiate", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_62", - "achieved": 1, - "unlocktime": 1541874660, - "name": "ACHIEVEMENT_62", - "defaultvalue": 0, - "displayName": "Gold Initiate", - "hidden": 0, - "description": "Achieve the rank of Gold Initiate.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/da619d561c76e3cc8c12481d6fcbd282ed72ea66.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/1c9a09b4278199d3786d6334b53b9c6736f264d1.jpg", - "iconName": "Gold Initiate", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_63", - "achieved": 1, - "unlocktime": 1541874660, - "name": "ACHIEVEMENT_63", - "defaultvalue": 0, - "displayName": "Novice", - "hidden": 0, - "description": "Achieve the rank of Novice.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/e2a56659b5f67082b98f38cbc4d814b698d8581a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5a72810746ce6a5c72818a659727e7c7b362b2bc.jpg", - "iconName": "Novice", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_64", - "achieved": 1, - "unlocktime": 1541874660, - "name": "ACHIEVEMENT_64", - "defaultvalue": 0, - "displayName": "Silver Novice", - "hidden": 0, - "description": "Achieve the rank of Silver Novice.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/b7e1d5adf78fad96993cf32ad821dd7ba7afa67a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/d83fcd3be717ad44b77678a3af5124a360414bf2.jpg", - "iconName": "Silver Novice", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_96", - "achieved": 1, - "unlocktime": 1484635851, - "name": "ACHIEVEMENT_96", - "defaultvalue": 0, - "displayName": "All for One", - "hidden": 0, - "description": "Revive an ally.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5eaab8e4ee04a7220b6910cb5ef7e8f0d99a7762.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/101512a6dfc625df8e6c8c4eb03ca5a683885874.jpg", - "iconName": "All for One", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_97", - "achieved": 1, - "unlocktime": 1484635852, - "name": "ACHIEVEMENT_97", - "defaultvalue": 0, - "displayName": "Healer", - "hidden": 0, - "description": "Revive 10 allies.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/5e63c962d05ccc6de4ed183c30ff702ade0b7053.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/8df79404201badd3bf305fb9174cd075223130c6.jpg", - "iconName": "Healer", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_98", - "achieved": 1, - "unlocktime": 1484635852, - "name": "ACHIEVEMENT_98", - "defaultvalue": 0, - "displayName": "Field Medic", - "hidden": 0, - "description": "Revive 100 allies.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/ab9d8ceb5f17f1329d50c00180fd5d49e739df21.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c4ec60546e1fe4096d69cc547f46bd8bb6647bcf.jpg", - "iconName": "Field Medic", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_126", - "achieved": 1, - "unlocktime": 1484635852, - "name": "ACHIEVEMENT_126", - "defaultvalue": 0, - "displayName": "Agent", - "hidden": 0, - "description": "Solve a Cipher.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/226b26ce53d72d00fe20f60c8860e0d1ba7687c8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/fa11850aa54af2e6ff4a23382c47272052e252ad.jpg", - "iconName": "Agent", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_127", - "achieved": 1, - "unlocktime": 1484635852, - "name": "ACHIEVEMENT_127", - "defaultvalue": 0, - "displayName": "Special Agent", - "hidden": 0, - "description": "Solve 10 Ciphers.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/d8882c2a0acd8ea3ffc11cd7441044f67344f054.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/d8380dd94482c256d53b1bd766ddffd3cb5ccfb7.jpg", - "iconName": "Special Agent", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACHIEVEMENT_128", - "achieved": 1, - "unlocktime": 1484635852, - "name": "ACHIEVEMENT_128", - "defaultvalue": 0, - "displayName": "Operative", - "hidden": 0, - "description": "Solve 100 Ciphers.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/df065e84f3d9165a3858b5c9a6bc735bf7b8450c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/9a411bb9a92a0404c550660e93f84a587b33aa20.jpg", - "iconName": "Operative", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa" - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740" - }, - { - "apiname": "ACH_FORT_VICTORY_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_FORT_VICTORY_SCOUT", - "defaultvalue": 0, - "displayName": "Fort Victory", - "hidden": 0, - "description": "Successfully defend or conquer a Fortress", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/19638d5a925b79ec5ece5345d7d3484d516f732f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Fort Victory", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740" - }, - { - "apiname": "ACH_MAGGON_STATION_DEFENSE_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MAGGON_STATION_DEFENSE_SCOUT", - "defaultvalue": 0, - "displayName": "Maggon Station Defense", - "hidden": 0, - "description": "Successfully defend Maggon Station", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/4941883e3bbf557594a212126a8fb072637fd5dd.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Maggon Station Defense", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740" - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" - }, - { - "apiname": "War07", - "achieved": 1, - "unlocktime": 1675375625, - "name": "War07", - "defaultvalue": 0, - "displayName": "New Warlander", - "hidden": 0, - "description": "Create a character.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/4315b1fa3735667ebe3e40396edb23b6fcbb41a8.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "New Warlander", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" - }, - { - "apiname": "War08", - "achieved": 1, - "unlocktime": 1675375610, - "name": "War08", - "defaultvalue": 0, - "displayName": "Stronger than Yesterday", - "hidden": 0, - "description": "Edit your equipment.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/9ef0c4b1c1488a2ef680c3e8f486dcb8eafa24d5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "Stronger than Yesterday", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" - }, - { - "apiname": "War09", - "achieved": 1, - "unlocktime": 1675378512, - "name": "War09", - "defaultvalue": 0, - "displayName": "The Final Spark", - "hidden": 0, - "description": "Win a Battle by destroying the enemy Core.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/33e8c73cf25268042ad5447267915eec53e2a7da.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "The Final Spark", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" - }, - { - "apiname": "War11", - "achieved": 1, - "unlocktime": 1675377714, - "name": "War11", - "defaultvalue": 0, - "displayName": "Land Dyed Red", - "hidden": 0, - "description": "Deal a totall of 10,000 damage.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/8892001c5611239773213d35abee3cbb1c7c8661.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "Land Dyed Red", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c" - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f" - }, - { - "apiname": "jp.konami.masterduel.ach.003", - "achieved": 1, - "unlocktime": 1653324555, - "name": "jp.konami.masterduel.ach.003", - "defaultvalue": 0, - "displayName": "Master of Special Summoning", - "hidden": 0, - "description": "Special Summon a total of 50 or more monsters in Ranked/Event Duels", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Master of Special Summoning", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f" - }, - { - "apiname": "jp.konami.masterduel.ach.006", - "achieved": 1, - "unlocktime": 1653324555, - "name": "jp.konami.masterduel.ach.006", - "defaultvalue": 0, - "displayName": "Beginner No More", - "hidden": 0, - "description": "Duel in Standard 30 times or more in Ranked Duels", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Beginner No More", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f" - } - ] -} diff --git a/public/summary_achievements_mock.json b/public/summary_achievements_mock.json deleted file mode 100644 index 558c858c0..000000000 --- a/public/summary_achievements_mock.json +++ /dev/null @@ -1,814 +0,0 @@ -[ - { - "apiname": "WIN_BOMB_PLANT", - "achieved": 1, - "unlocktime": 1490273819, - "name": "WIN_BOMB_PLANT", - "defaultvalue": 0, - "displayName": "Someone Set Up Us The Bomb", - "hidden": 0, - "description": "Win a round by planting a bomb", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/9f60ea3c56b4ab248ab598bbd62568b953116301.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/730/978bdbc78917f57180549c864a9c7dcc1711dfec.jpg", - "iconName": "Someone Set Up Us The Bomb", - "gameId": 730, - "gameName": "Counter-Strike: Global Offensive", - "gameIconURL": "69f7ebe2735c366c65c0b33dae00e12dc40edbe4", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACHIEVEMENT_31", - "achieved": 1, - "unlocktime": 1484637768, - "name": "ACHIEVEMENT_31", - "defaultvalue": 0, - "displayName": "Payday", - "hidden": 0, - "description": "Earn 1,000 Credits.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/a469c01f97d32e38003c64a787bd6ac1eef0cbd9.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/230410/c06452a0d6189244b9cdfcc8237a1b325019ba90.jpg", - "iconName": "Payday", - "gameId": 230410, - "gameName": "Warframe", - "gameIconURL": "22064646470f4c53388ba87774c7ac10f0a91ffa", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACH_MATCHES_SCOUT", - "achieved": 1, - "unlocktime": 1489966357, - "name": "ACH_MATCHES_SCOUT", - "defaultvalue": 0, - "displayName": "Scout", - "hidden": 0, - "description": "Complete one match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/ce0d9ff5c31cf0de770d7614fec20f604d67d29d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/375230/56ad58bf3c8d9f41d6c96d0bf68444c1887d21cf.jpg", - "iconName": "Scout", - "gameId": 375230, - "gameName": "Warhammer 40,000: Eternal Crusade", - "gameIconURL": "dcda2a72282ae7a28004962fe3059f23ab902740", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "GOAL_ID_1215", - "achieved": 1, - "unlocktime": 1491925374, - "name": "GOAL_ID_1215", - "defaultvalue": 0, - "displayName": "Survivor", - "hidden": 0, - "description": "Survive more than 50 battles with less than 10% health.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/26fa2e9a80299549fd053f2ce2e1fa454a79e8a3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/444090/8eb0cf2e2932a1f17e72fd82d4df086d4255e748.jpg", - "iconName": "Survivor", - "gameId": 444090, - "gameName": "Paladins", - "gameIconURL": "1565119c17f532338a0645b98e69e1fc1df0c29e", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "Quest_39", - "achieved": 1, - "unlocktime": 1654040623, - "name": "Quest_39", - "defaultvalue": 0, - "displayName": "Ranked Winner", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/70f4013d2a60f9d10958dc3d4ccef449c7515e32.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/489520/d54c5b22184fe04cb189648237fbb6e1cb6ec520.jpg", - "iconName": "Ranked Winner", - "gameId": 489520, - "gameName": "Minion Masters", - "gameIconURL": "ad87d123224d786a413a6021ddaf9257e26c0a28", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false - }, - { - "apiname": "GLOBAL_GNOME_ALONE", - "achieved": 1, - "unlocktime": 1669600143, - "name": "GLOBAL_GNOME_ALONE", - "defaultvalue": 0, - "displayName": "Gnome Alone", - "hidden": 0, - "description": "If you are reading this achievement, Gabe Newell has successfully launched Gnome Chompski into space. If you did not also receive the achievement 'Manufacturing Ascent', Newell has abandoned his plans to shoot Noam Chomsky into space.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/4e86a3e6272002037694ded4c3af1af6d59eb2c7.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/546560/3ea8b7ec21b953a173cefc0cea78fbedebca1058.jpg", - "iconName": "Gnome Alone", - "gameId": 546560, - "gameName": "Half-Life: Alyx", - "gameIconURL": "225032ac2ad1aca8f5fd98baa2b9daf1eebea5ca", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false - }, - { - "apiname": "A001_NewBeginning", - "achieved": 1, - "unlocktime": 1557640287, - "name": "A001_NewBeginning", - "defaultvalue": 0, - "displayName": "New Beginning", - "hidden": 0, - "description": "Create call sign name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/9960d9323ec51b7e9b8d9086ccbfded2ebe4fd5b.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/550650/5246844e85838d71b16dd7191064a7868b3b39e4.jpg", - "iconName": "New Beginning", - "gameId": 550650, - "gameName": "Black Squad", - "gameIconURL": "213a736d8c5b75998b671de25e6621d1e7bc122a", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACHIVE017", - "achieved": 1, - "unlocktime": 1627627907, - "name": "ACHIVE017", - "defaultvalue": 0, - "displayName": "Devil Inside Me", - "hidden": 0, - "description": "Kill 10 players by any means.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/93eb1c6d27ef3363b3eeeee8a4ef5976cf9516b6.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/578080/0ad7dc224920b0c20994b61c77230230959e80ed.jpg", - "iconName": "Devil Inside Me", - "gameId": 578080, - "gameName": "PUBG: BATTLEGROUNDS", - "gameIconURL": "609f27278aa70697c13bf99f32c5a0248c381f9d", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "qc_victory", - "achieved": 1, - "unlocktime": 1541363946, - "name": "qc_victory", - "defaultvalue": 0, - "displayName": "Victory", - "hidden": 0, - "description": "Win 1 match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/38af22682ad8a578113a3f5d4f26e4fa05f262af.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/611500/2ddf90191b29940b3f7e2580863b17c11457c659.jpg", - "iconName": "Victory", - "gameId": 611500, - "gameName": "Quake Champions", - "gameIconURL": "539032fb1e8b41d0a48ff11bf63bfe7918ace24c", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1629999830, - "name": "1", - "defaultvalue": 0, - "displayName": "So it begins... ", - "hidden": 0, - "description": "Complete a match", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/7078b067cc3675e72464423ec13bdb136e48d5e3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/677620/8f6e6402fbb508242fefc7540a0236e79208ac53.jpg", - "iconName": "So it begins... ", - "gameId": 677620, - "gameName": "Splitgate", - "gameIconURL": "03e452b180ff77986c3957819bde4c69448a2d0f", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ach_story_1", - "achieved": 1, - "unlocktime": 1617342580, - "name": "ach_story_1", - "defaultvalue": 0, - "displayName": "Awoken to a Nightmare", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/3f9ed21ce6467888bc4b72d948096c0e14f53b86.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/680420/e5ad13eb4966367c74e86d3c3f9573cefeebad9d.jpg", - "iconName": "Awoken to a Nightmare", - "gameId": 680420, - "gameName": "OUTRIDERS", - "gameIconURL": "35088a2e2cbca86852288051fb34eac760577f83", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "LIFE_TRAVEL_1_1", - "achieved": 1, - "unlocktime": 1528117267, - "name": "LIFE_TRAVEL_1_1", - "defaultvalue": 0, - "displayName": "Woah. This Place is Huge!", - "hidden": 0, - "description": "Entered a big city", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/34e73908b5bfff3dc2987e281734660cf03b21e1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/681660/9ca26d2695b9cc3d332618cc47baa1500f91e326.jpg", - "iconName": "Woah. This Place is Huge!", - "gameId": 681660, - "gameName": "Bless Online", - "gameIconURL": "9dc17a36db36a4994933e169d868817bd7e9b2c7", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "founder_achievement", - "achieved": 1, - "unlocktime": 1595000551, - "name": "founder_achievement", - "defaultvalue": 0, - "displayName": "Founder", - "hidden": 0, - "description": "Aim Lab Founder", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/8d753512e8a958e2725a69b5b823c00cad0fceef.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/714010/936ca407dd5b223be31ae010b32eec08987ef3c6.jpg", - "iconName": "Founder", - "gameId": 714010, - "gameName": "Aimlabs", - "gameIconURL": "15347de11efc127539c388e585af9e92d10d5189", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "mcvs_winmatch1", - "achieved": 1, - "unlocktime": 1526706559, - "name": "mcvs_winmatch1", - "defaultvalue": 0, - "displayName": "Private", - "hidden": 0, - "description": "Win 3 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/3abe5d496fdb272d58666299b9279d9c3cc1faa1.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/723780/48b5e14679309c6d685ec0a985633ba5626ca91b.jpg", - "iconName": "Private", - "gameId": 723780, - "gameName": "Modern Combat Versus", - "gameIconURL": "943d0ba62609ff0afeccc22863402b5c68e1cfdb", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACH_ENTER_ELYSIUM", - "achieved": 1, - "unlocktime": 1653184380, - "name": "ACH_ENTER_ELYSIUM", - "defaultvalue": 0, - "displayName": "Welcome to the Masquerade", - "hidden": 0, - "description": "Visit the Elysium for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/fe18a0c857e550ef16dc54b8f3551d71967c718f.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/760160/2906f98d4ec02194a06f435ab580d2c55d2a05b0.jpg", - "iconName": "Welcome to the Masquerade", - "gameId": 760160, - "gameName": "Vampire: The Masquerade - Bloodhunt", - "gameIconURL": "08e7dfced6c1d534ec5d580a3a177427c7250a60", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "achieved": 1, - "unlocktime": 1628474277, - "name": "ACHIEVEMENT_CASTLE_OF_DOUBT", - "defaultvalue": 0, - "displayName": "Castle of Doubt", - "hidden": 0, - "description": "Lose an unfinished Castle that is at least 95% complete.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/904a7a952309aacaf63168d1c018f8f6dd814926.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813780/212553af5507838878a54d03a1282303c532d3ce.jpg", - "iconName": "Castle of Doubt", - "gameId": 813780, - "gameName": "Age of Empires II: Definitive Edition", - "gameIconURL": "e2b5a7beb58136b892e517cb93ae08b36065363c", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": false - }, - { - "apiname": "GOAL_ID_1604", - "achieved": 1, - "unlocktime": 1540770708, - "name": "GOAL_ID_1604", - "defaultvalue": 0, - "displayName": "Novice Assassin", - "hidden": 0, - "description": "Eliminate an enemy player as an Assassin.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/d90943ec4e92e8778e59102046d5c8eafdafc9d3.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/813820/daded4fdfb8cc49be448760a7b0a6d3ee435c8c3.jpg", - "iconName": "Novice Assassin", - "gameId": 813820, - "gameName": "Realm Royale Reforged", - "gameIconURL": "068664cf452a9f2388cf1ccf1f239fc967ff9629", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "kz1", - "achieved": 1, - "unlocktime": 1557462038, - "name": "kz1", - "defaultvalue": 0, - "displayName": "[Monster] Exciting First Mission", - "hidden": 0, - "description": "Complete Monster Mission 1 Time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/e8d4e32f103188bf0509d8aac3f57ec8ebae795c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/844870/1c0122fb8288bcf9992c69f393bf8394371b6eec.jpg", - "iconName": "[Monster] Exciting First Mission", - "gameId": 844870, - "gameName": "KurtzPel", - "gameIconURL": "2947d156a2633c9a5c092d2a14890bc56a342b70", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "Goal_ID_01", - "achieved": 1, - "unlocktime": 1627496905, - "name": "Goal_ID_01", - "defaultvalue": 0, - "displayName": "All I Do Is Win", - "hidden": 0, - "description": "Win 100 matches", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/60ed182075d160afcafb007dc7e726e120bb89b4.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/872200/0fc4164907dac1d44312ae7401cce452e04339da.jpg", - "iconName": "All I Do Is Win", - "gameId": 872200, - "gameName": "Rogue Company", - "gameIconURL": "ec36ff029402b9cf4e1f7829f293fd12a71e6ce1", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "NEW_ACHIEVEMENT_1_1", - "achieved": 1, - "unlocktime": 1548420881, - "name": "NEW_ACHIEVEMENT_1_1", - "defaultvalue": 0, - "displayName": "Welcome to the City of the Dead", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/61eab059da93026fdff6dd4597ee87c5939f0929.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/883710/16cfc49d01344913528c25ea11df2bfcd1b1f1cf.jpg", - "iconName": "Welcome to the City of the Dead", - "gameId": 883710, - "gameName": "Resident Evil 2", - "gameIconURL": "86ef2fdebeced746313994ccf2d7afb1f2887bf0", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "NEW_ACHIEVEMENT_1_0", - "achieved": 1, - "unlocktime": 1547245970, - "name": "NEW_ACHIEVEMENT_1_0", - "defaultvalue": 0, - "displayName": "5 minutes played", - "hidden": 0, - "description": "5 minutes played", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/7a8bdb09c5346e3ef17940e2d528c84846e476c5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/961440/8444ce377b218e872972dde583c793d263cf88db.jpg", - "iconName": "5 minutes played", - "gameId": 961440, - "gameName": "Resident Evil 2 \"1-Shot Demo\"", - "gameIconURL": "280cc7bf9e12785e84dc84b9db2c6e44adfa2aad", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "PFA_1", - "achieved": 1, - "unlocktime": 1676092491, - "name": "PFA_1", - "defaultvalue": 0, - "displayName": "The Sort Who Makes an Entrance", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/f0abf5a97d54b4206b2162f3bac502db8af8df55.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/990080/01530fe535f658fbefc11a8198a3ef05aa809445.jpg", - "iconName": "The Sort Who Makes an Entrance", - "gameId": 990080, - "gameName": "Hogwarts Legacy", - "gameIconURL": "a9ecb94f249768d0ee5ccecbffe8d8c06d9bed59", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACH_1", - "achieved": 1, - "unlocktime": 1571866035, - "name": "ACH_1", - "defaultvalue": 0, - "displayName": "Long and Winding Road", - "hidden": 0, - "description": "Reach level 20.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/18c2c6e05659aed26cd374da8a75b722121b37f0.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1085660/ece00c6cd0cfbee772799f908b46953d3e276b04.jpg", - "iconName": "Long and Winding Road", - "gameId": 1085660, - "gameName": "Destiny 2", - "gameIconURL": "fce050d63f0a2f8eb51b603c7f30bfca2a301549", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "TheFool", - "achieved": 1, - "unlocktime": 1607567313, - "name": "TheFool", - "defaultvalue": 0, - "displayName": "The Fool", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/7975d6e5d790b88f030195e3b1a38e49a5de1c8d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1091500/961e51e8bd9e1ec292687055b6d1a4486b0e124d.jpg", - "iconName": "The Fool", - "gameId": 1091500, - "gameName": "Cyberpunk 2077", - "gameIconURL": "15ba5f5437473a1b4d628b3b87223e84f4cfdf38", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACH_READY_TO_BECOME_AG", - "achieved": 1, - "unlocktime": 1655762412, - "name": "ACH_READY_TO_BECOME_AG", - "defaultvalue": 0, - "displayName": "Ready to become an Aimbeast?", - "hidden": 0, - "description": "Start Aimbeast for the first time", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/7569d6ce63419bc88b12621d571c1514c7c8efab.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1100990/66092fa6955a07134becee299aa032b04bd51712.jpg", - "iconName": "Ready to become an Aimbeast?", - "gameId": 1100990, - "gameName": "Aimbeast", - "gameIconURL": "d5291ebcf5991fab2d04a51dfa1f1a2ac1c94c4e", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "FISFORFAILURE", - "achieved": 1, - "unlocktime": 1628475706, - "name": "FISFORFAILURE", - "defaultvalue": 0, - "displayName": "F is for Failure", - "hidden": 0, - "description": "Fail a test", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/5bc461ed709c969ba6db6def2ac3f852f53b1f26.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1126320/ebcebd9880dc6a418c58cc8d1c8434418139ce10.jpg", - "iconName": "F is for Failure", - "gameId": 1126320, - "gameName": "Being a DIK", - "gameIconURL": "803bc76fc71f3d3a488fc351bef58a840ee4bd1e", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true - }, - { - "apiname": "1", - "achieved": 1, - "unlocktime": 1620404061, - "name": "1", - "defaultvalue": 0, - "displayName": "Not Lycan This...", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/0a43734f46efde66cbc51f29907961517d1be66a.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1196590/781eecc76fe6aa2a027b77d1abaeefca983406aa.jpg", - "iconName": "Not Lycan This...", - "gameId": 1196590, - "gameName": "Resident Evil Village", - "gameIconURL": "d97fb0681f9517c65a9d7ba9dd7e63f775375645", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "NEW_ACHIEVEMENT_3_15", - "achieved": 1, - "unlocktime": 1654130612, - "name": "NEW_ACHIEVEMENT_3_15", - "defaultvalue": 0, - "displayName": "Passion for Fashion", - "hidden": 0, - "description": "Wear a new armor customization item.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/f9fce869caacedb02e9ef87fa7a0b642ba99552c.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1240440/ca2de4957e68dba7afab36a519d706ecd400ec24.jpg", - "iconName": "Passion for Fashion", - "gameId": 1240440, - "gameName": "Halo Infinite", - "gameIconURL": "ec684b943169d675439f6cdf64fa2f2aa90d9821", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACHIEVEMENT_1", - "achieved": 1, - "unlocktime": 1686447606, - "name": "ACHIEVEMENT_1", - "defaultvalue": 0, - "displayName": "Get Your Game Face On!", - "hidden": 0, - "description": "Where's your face, dingus? Get your butt to the avatar creator and sort yourself out! Crying shame we can't fix that attitude of yours while we're at it.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/b2c3883e2cfd25d9477c7681714288cac23d4f76.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1364780/6d16128522dfe28c9f3cf8481ef8f2bb7e87312c.jpg", - "iconName": "Get Your Game Face On!", - "gameId": 1364780, - "gameName": "Street Fighter™ 6", - "gameIconURL": "5e1421a150aaded0c7c175bc6f6843eab9a4d27d", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "jp.konami.masterduel.ach.001", - "achieved": 1, - "unlocktime": 1653104296, - "name": "jp.konami.masterduel.ach.001", - "defaultvalue": 0, - "displayName": "Welcome to MASTER DUEL", - "hidden": 0, - "description": "Register your player name", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/1eda4055bf77c7820f98ebc0ec3440e6e1ef25e5.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1449850/cfc8e8dbc8621116fadc92c655dc7a473ce0dccd.jpg", - "iconName": "Welcome to MASTER DUEL", - "gameId": 1449850, - "gameName": "Yu-Gi-Oh! Master Duel", - "gameIconURL": "2cd45ee5b6c31445216a980cf40fdb10a1587b7f", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "A001_", - "achieved": 1, - "unlocktime": 1642288026, - "name": "A001_", - "defaultvalue": 0, - "displayName": "Empires Will Rise", - "hidden": 0, - "description": "Construct your first Landmark.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/a51c21d6563c95bcbdf21d1c5252ed45802ce01d.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1466860/9226e65627194674670fe0994d7ed3c28542bc01.jpg", - "iconName": "Empires Will Rise", - "gameId": 1466860, - "gameName": "Age of Empires IV: Anniversary Edition", - "gameIconURL": "503acf3ef0503e24af6b5336012a1f585a2f955e", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "2010007", - "achieved": 1, - "unlocktime": 1644521999, - "name": "2010007", - "defaultvalue": 0, - "displayName": "We're All Buddies!", - "hidden": 0, - "description": "Join a guild", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/af9260ce7a39935091ebe004f383286334b7ca50.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1599340/65d43e52f7e2af73b64568673f3318857a843a25.jpg", - "iconName": "We're All Buddies!", - "gameId": 1599340, - "gameName": "Lost Ark", - "gameIconURL": "4e4ef2862189e1f1d3052125fb1ed6cb42bcaaf8", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": true, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "War06", - "achieved": 1, - "unlocktime": 1675375599, - "name": "War06", - "defaultvalue": 0, - "displayName": "First Steps", - "hidden": 0, - "description": "Equip the character with a rank 1 title.", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/0aefc3cc2545d1d8c4c80b1c2627f36610483a25.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1675900/2067f0cdf03d11dd1c0f67f2d034a4d47c638cbe.jpg", - "iconName": "First Steps", - "gameId": 1675900, - "gameName": "Warlander", - "gameIconURL": "9bc63957995b5210dea55b07db9053005719926c", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": true, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "クインティプルキル", - "achieved": 1, - "unlocktime": 1690680618, - "name": "クインティプルキル", - "defaultvalue": 0, - "displayName": "Rush Attack", - "hidden": 0, - "description": "Get a 5 player kill streak and reach (Casual/Ranked) Match Results", - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/57ee25881ea77780fd39295c346771fda79c277e.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1816670/680bd1f5270c9f1f64b02b5894d7b4edc34a6750.jpg", - "iconName": "Rush Attack", - "gameId": 1816670, - "gameName": "GUNDAM EVOLUTION", - "gameIconURL": "4fb2015d970fe8faebecc10e249a9a1922afddfe", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - }, - { - "apiname": "ACH16", - "achieved": 1, - "unlocktime": 1692933429, - "name": "ACH16", - "defaultvalue": 0, - "displayName": "Illegal Entry", - "hidden": 1, - "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/523bae84ba45daf8ffae96994e92180cfc35c620.jpg", - "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1888160/0f03af31b1fbf593e40e4f368d5bf72b3dd141c7.jpg", - "iconName": "Illegal Entry", - "gameId": 1888160, - "gameName": "ARMORED CORE™ VI FIRES OF RUBICON™", - "gameIconURL": "961383bce3239632856e2e58dbf5d1893f05d808", - "totalAchievements": 0, - "mintedAchievements": 0, - "mintableAchievements": 0, - "isNewAchievement": false, - "isMinted": false, - "totalAchievementsCount": null, - "mintableAchievementsCount": null, - "mintedAchievementsCount": null - } -] From 8924ddc9b4feab0f7dad4ad94911f9e68457eebd Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 09:07:30 -0600 Subject: [PATCH 044/106] chore: update api commit --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 58b7db8e0..408592e51 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 58b7db8e0d7d4b670615ae03ec507baf88782115 +Subproject commit 408592e51a33e9fa754363febc4b577547dbe296 From 49585b3091b82ec8c98021ac6c30213a467d99b4 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 09:16:48 -0600 Subject: [PATCH 045/106] feat: hide achievements nav behind feature flag --- .../Sidebar/components/SidebarLinks/index.tsx | 38 ++++++++++++------- src/frontend/screens/Achievements/index.tsx | 2 +- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx index dc4eabbb5..4023b8470 100644 --- a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx +++ b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx @@ -12,6 +12,7 @@ import storeAuthState from 'frontend/state/storeAuthState' export default observer(function SidebarLinks() { const location = useLocation() as { pathname: string } + const [showAchievements, setShowAchievements] = useState(false) const { activeController, handleExternalLinkDialog } = useContext(ContextProvider) @@ -22,6 +23,13 @@ export default observer(function SidebarLinks() { useEffect(() => { window.api.isFullscreen().then((res) => setIsFullscreen(res)) + + const shouldShowAchievements = async () => { + const shouldShow = await window.api.shouldShowAchievements() + setShowAchievements(shouldShow) + } + + shouldShowAchievements() }, []) async function handleRefresh() { @@ -82,20 +90,22 @@ export default observer(function SidebarLinks() {
-
- - classNames('Sidebar__item', { - active: isActive || location.pathname.includes('achievements') - }) - } - end - to={'/achievements'} - onClick={async () => handleRefresh()} - > - - -
+ {showAchievements && ( +
+ + classNames('Sidebar__item', { + active: isActive || location.pathname.includes('achievements') + }) + } + end + to={'/achievements'} + onClick={async () => handleRefresh()} + > + + +
+ )}
diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 3fadb894e..794e7aac0 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -113,7 +113,7 @@ export default React.memo(function Achievements(): JSX.Element { if (activeFilter === 'MINTED') return 'minted' return 'all' }, [activeFilter]) - console.log(achievementsData, 'dats') + return ( <> Date: Wed, 18 Oct 2023 09:45:25 -0600 Subject: [PATCH 046/106] chore: clean up code --- src/backend/hyperplay-achievements | 2 +- .../GameAchievementDetails/index.tsx | 67 +++++-------- .../MintAchievementsContext/index.tsx | 4 +- src/frontend/screens/Achievements/index.tsx | 97 +++++++++---------- 4 files changed, 74 insertions(+), 96 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 408592e51..7cdaca84b 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 408592e51a33e9fa754363febc4b577547dbe296 +Subproject commit 7cdaca84b11628e07c013a7d4168b5b08a807e9e diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 716a00010..d5bf7406d 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,5 +1,5 @@ import { GameAchievements } from '@hyperplay/ui' -import { Achievement, SummaryAchievement } from 'common/types' +import { Achievement, AchievementSort, SummaryAchievement } from 'common/types' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' @@ -39,6 +39,21 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { } = useMintAchievements() const { store, playerStoreId } = useAchievementStore() + const fetchAchievements = useCallback( + async ({ page, sort }: { page: number; sort?: AchievementSort }) => { + return window.api.getIndividualAchievements({ + gameId: Number(id), + store, + sort: sort ?? selectedSort.value, + page, + pageSize, + playerStoreId, + playerAddress: walletStore.address + }) + }, + [store, selectedSort, playerStoreId, walletStore.address, id] + ) + useEffect(() => { const getAchievements = async () => { const { data } = await window.api.getSummaryAchievements({ @@ -52,15 +67,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }) setSummaryAchievement(data[0]) - const achievements = await window.api.getIndividualAchievements({ - gameId: Number(id), - store, - sort: selectedSort.value, - page: 1, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const achievements = await fetchAchievements({ page: 1 }) setAchievementData(achievements) const stats = await window.api.getAchievementsStats({ @@ -77,29 +84,13 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const handleNextPage = useCallback(async () => { const nextPage = achievementsData.currentPage + 1 - const achievements = await window.api.getIndividualAchievements({ - gameId: Number(id), - store, - sort: selectedSort.value, - page: nextPage, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const achievements = await fetchAchievements({ page: nextPage }) setAchievementData(achievements) }, [achievementsData, selectedSort]) const handlePrevPage = useCallback(async () => { const prevPage = achievementsData.currentPage - 1 - const achievements = await window.api.getIndividualAchievements({ - gameId: Number(id), - store, - sort: selectedSort.value, - page: prevPage, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const achievements = await fetchAchievements({ page: prevPage }) setAchievementData(achievements) }, [achievementsData, selectedSort]) @@ -122,9 +113,8 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { mintedAchievementsCount={summaryAchievement.mintedAchievementCount} totalAchievementsCount={summaryAchievement.totalAchievementCount} mintableAchievementsCount={summaryAchievement.mintableAchievementsCount} - achievements={achievementsData.data.map((achievement, index) => ({ - // TODO: remove when there is a real id - id: `${index}`, + achievements={achievementsData.data.map((achievement) => ({ + id: achievement.id, title: achievement.displayName, description: achievement.description, image: achievement.icon, @@ -139,16 +129,11 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { ) if (chosenItem) { - const { data, totalPages, currentPage } = - await window.api.getIndividualAchievements({ - gameId: Number(id), - store, - sort: chosenItem.value, - page: 1, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const { data, totalPages, currentPage } = await fetchAchievements({ + page: 1, + sort: chosenItem.value + }) + setSelectedSort(chosenItem) setAchievementData({ currentPage, totalPages, data }) } diff --git a/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx index b70bc5c74..bc98ec247 100644 --- a/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx +++ b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx @@ -8,8 +8,8 @@ import React, { } from 'react' interface MintAchievementsType { - achievementsToBeMinted: string[] // Define the type of your context value - achievementsToBeUpdated: string[] // Define the type of your context value + achievementsToBeMinted: string[] + achievementsToBeUpdated: string[] toggleAchievementToBeMinted: (id: string) => void toggleAchievementToBeUpdated: (id: string) => void handleMint: () => void diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 794e7aac0..681ba52bf 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -43,6 +43,29 @@ export default React.memo(function Achievements(): JSX.Element { toggleAchievementToBeUpdated } = useMintAchievements() + const fetchAchievements = useCallback( + async ({ + page, + sort, + filter + }: { + page: number + sort?: AchievementSort + filter?: AchievementFilter + }) => { + return window.api.getSummaryAchievements({ + store, + filter: filter ?? activeFilter, + sort: sort ?? selectedSort.value, + page, + pageSize, + playerStoreId, + playerAddress: walletStore.address + }) + }, + [store, activeFilter, selectedSort, playerStoreId, walletStore.address] + ) + useEffect(() => { const getAchievements = async () => { window.api.syncAchievements({ @@ -50,16 +73,9 @@ export default React.memo(function Achievements(): JSX.Element { playerStoreId, playerAddress: walletStore.address }) - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store, - filter: activeFilter, - sort: selectedSort.value, - page: 1, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const { data, totalPages, currentPage } = await fetchAchievements({ + page: 1 + }) setAchievementData({ currentPage, totalPages, games: data }) @@ -76,31 +92,19 @@ export default React.memo(function Achievements(): JSX.Element { const handleNextPage = useCallback(async () => { const nextPage = achievementsData.currentPage + 1 - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store, - filter: activeFilter, - sort: selectedSort.value, - page: nextPage, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const { data, totalPages, currentPage } = await fetchAchievements({ + page: nextPage + }) + setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData, activeFilter, selectedSort]) const handlePrevPage = useCallback(async () => { const prevPage = achievementsData.currentPage - 1 - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store, - filter: activeFilter, - sort: selectedSort.value, - page: prevPage, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const { data, totalPages, currentPage } = await fetchAchievements({ + page: prevPage + }) + setAchievementData({ currentPage, totalPages, games: data }) }, [achievementsData, activeFilter, selectedSort]) @@ -108,7 +112,7 @@ export default React.memo(function Achievements(): JSX.Element { return isLoading || !walletStore.isConnected }, [isLoading, walletStore.isConnected]) - const filter = useMemo(() => { + const filterMap = useMemo(() => { if (activeFilter === 'NEW') return 'new' if (activeFilter === 'MINTED') return 'minted' return 'all' @@ -171,16 +175,10 @@ export default React.memo(function Achievements(): JSX.Element { ) if (chosenItem) { - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store, - filter: activeFilter, - sort: chosenItem.value, - page: 1, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const { data, totalPages, currentPage } = await fetchAchievements( + { page: 1, sort: chosenItem.value } + ) + setSelectedSort(chosenItem) setAchievementData({ currentPage, totalPages, games: data }) } @@ -193,22 +191,17 @@ export default React.memo(function Achievements(): JSX.Element { handlePrevPage }} filterProps={{ - activeFilter: filter, + activeFilter: filterMap, setActiveFilter: async (filter) => { let newFilter = 'ALL' as AchievementFilter if (filter === 'new') newFilter = 'NEW' if (filter === 'minted') newFilter = 'MINTED' - const { data, totalPages, currentPage } = - await window.api.getSummaryAchievements({ - store, - filter: newFilter, - sort: selectedSort.value, - page: 1, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) + const { data, totalPages, currentPage } = await fetchAchievements({ + page: 1, + filter: newFilter + }) + setActiveFilter(newFilter) setAchievementData({ currentPage, totalPages, games: data }) } From a949ed70a0ef120d5044842ca1e178875706f667 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 15:17:07 -0600 Subject: [PATCH 047/106] feat: show stores active and disabled --- .../AchievementsStats.tsx | 0 .../AchievementsLayout/AchievmentStores.tsx | 39 +++++++++++++++++++ .../AchievementsLayout/index.module.css | 4 ++ .../Achievements/AchievementsLayout/index.tsx | 24 ++---------- 4 files changed, 47 insertions(+), 20 deletions(-) rename src/frontend/screens/Achievements/{components => AchievementsLayout}/AchievementsStats.tsx (100%) create mode 100644 src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx diff --git a/src/frontend/screens/Achievements/components/AchievementsStats.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx similarity index 100% rename from src/frontend/screens/Achievements/components/AchievementsStats.tsx rename to src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx new file mode 100644 index 000000000..d45c904e5 --- /dev/null +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -0,0 +1,39 @@ +import React from 'react' + +import { StoreRow, Images } from '@hyperplay/ui' +import { Flex } from '@mantine/core' + +import styles from './index.module.css' +import { useAchievementStore } from '../AchievementStoreContext' +import classNames from 'classnames' + +export const AchievementStores = () => { + const { store } = useAchievementStore() + + return ( +
+
My Stores
+ +
+ + + +
+
+ + + +
+
+ +

Link Store

+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css index a17702c3f..a9e25fd70 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css @@ -20,3 +20,7 @@ .fullHeight { height: 100%; } + +.notActive { + opacity: 0.5; +} diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 5ab73627d..96095f4f0 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -1,14 +1,15 @@ import React, { PropsWithChildren } from 'react' -import { Background, StoreRow, Images } from '@hyperplay/ui' +import { Background } from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' import { MintAchievementsProvider } from '../MintAchievementsContext' -import { AchievementsStats } from '../components/AchievementsStats' +import { AchievementsStats } from './AchievementsStats' import useSettingsContext from 'frontend/hooks/useSettingsContext' import SettingsContext from 'frontend/screens/Settings/SettingsContext' import { AchievementStoreProvider } from '../AchievementStoreContext' +import { AchievementStores } from './AchievmentStores' export default React.memo(function AchievementsLayout({ children @@ -37,24 +38,7 @@ export default React.memo(function AchievementsLayout({ className={`${styles.fullHeight}`} > -
-
My Stores
- - - - - - - - -

Link Store

-
-
-
+ From e3c894dac7d981af7d0715c156ac4cd549da1e33 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Wed, 18 Oct 2023 15:32:11 -0600 Subject: [PATCH 048/106] feat: allow user to click and change selected store --- .../Achievements/AchievementStoreContext/index.tsx | 14 +++++++++----- .../AchievementsLayout/AchievmentStores.tsx | 14 ++++++++++---- src/frontend/screens/Achievements/index.tsx | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx index 00ee04649..f9e634680 100644 --- a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx +++ b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx @@ -1,16 +1,18 @@ import useSetting from 'frontend/hooks/useSetting' -import React, { createContext, useContext, ReactNode, useMemo } from 'react' +import React, { createContext, useContext, ReactNode, useMemo, useState } from 'react' import { AchievementStore as StoreType } from '../../../../common/types' interface AchievementStoreType { store: StoreType playerStoreId: string + setStore: React.Dispatch> } const AchievementStore = createContext({ store: 'STEAM', - playerStoreId: '' + playerStoreId: '', + setStore: () => { console.log('not nested in achievement context') } }) interface AchievementStoreProviderProps { @@ -20,14 +22,16 @@ interface AchievementStoreProviderProps { const AchievementStoreProvider: React.FC = ({ children }) => { + const [store, setStore] = useState('STEAM') const [steamId] = useSetting('steamId', '') const value = useMemo(() => { return { - store: 'STEAM' as StoreType, - playerStoreId: steamId + store, + playerStoreId: store === 'STEAM' ? steamId : '', + setStore } - }, [steamId]) + }, [steamId, store]) return ( diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index d45c904e5..5263d000f 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -8,7 +8,7 @@ import { useAchievementStore } from '../AchievementStoreContext' import classNames from 'classnames' export const AchievementStores = () => { - const { store } = useAchievementStore() + const { store, setStore } = useAchievementStore() return (
@@ -20,17 +20,23 @@ export const AchievementStores = () => { >
- +
- +
-

Link Store

+
diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 681ba52bf..aec607cec 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -88,7 +88,7 @@ export default React.memo(function Achievements(): JSX.Element { } getAchievements() - }, []) + }, [store, playerStoreId, walletStore.address]) const handleNextPage = useCallback(async () => { const nextPage = achievementsData.currentPage + 1 From 947c0f28a5ca6becc12bd52c2d57c1ee549b9f21 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 19 Oct 2023 10:29:49 -0600 Subject: [PATCH 049/106] feat: use real data for stats --- src/backend/hyperplay-achievements | 2 +- .../AchievementStoreContext/index.tsx | 12 ++++- .../AchievementsLayout/AchievementsStats.tsx | 8 +-- .../AchievementsLayout/AchievmentStores.tsx | 52 ++++++++++++++----- 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 7cdaca84b..558ebec17 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 7cdaca84b11628e07c013a7d4168b5b08a807e9e +Subproject commit 558ebec17e658c31452930994e0a75fa8e1d3d23 diff --git a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx index f9e634680..b082bbe1a 100644 --- a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx +++ b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx @@ -1,5 +1,11 @@ import useSetting from 'frontend/hooks/useSetting' -import React, { createContext, useContext, ReactNode, useMemo, useState } from 'react' +import React, { + createContext, + useContext, + ReactNode, + useMemo, + useState +} from 'react' import { AchievementStore as StoreType } from '../../../../common/types' @@ -12,7 +18,9 @@ interface AchievementStoreType { const AchievementStore = createContext({ store: 'STEAM', playerStoreId: '', - setStore: () => { console.log('not nested in achievement context') } + setStore: () => { + console.log('not nested in achievement context') + } }) interface AchievementStoreProviderProps { diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx index d0b415313..b235fce1f 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx @@ -5,8 +5,8 @@ import { useAchievementStore } from '../AchievementStoreContext' export const AchievementsStats = () => { const [stats, setStats] = useState({ - totalNewAchievements: 0, - totalMintedAchievements: 0, + newAchievements: 0, + mintedAchievements: 0, totalAchievements: 0, totalGames: 0, numFreeMints: 0 @@ -28,8 +28,8 @@ export const AchievementsStats = () => { return ( ) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 5263d000f..4a3291841 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' import { StoreRow, Images } from '@hyperplay/ui' import { Flex } from '@mantine/core' @@ -6,34 +6,58 @@ import { Flex } from '@mantine/core' import styles from './index.module.css' import { useAchievementStore } from '../AchievementStoreContext' import classNames from 'classnames' +import walletStore from 'frontend/store/WalletStore' export const AchievementStores = () => { - const { store, setStore } = useAchievementStore() + const { store, setStore, playerStoreId } = useAchievementStore() + const [totalGames, setTotalGames] = useState(0) + + useEffect(() => { + const getStats = async () => { + const stats = await window.api.getAchievementsStats({ + store, + playerStoreId, + playerAddress: walletStore.address + }) + setTotalGames(stats.totalGames) + } + getStats() + }, []) + + const activeSecondaryText = `${totalGames} Games` + const isSteam = store === 'STEAM' + const isHyperplay = store === 'HYPERPLAY' + const isEpic = store === 'EPIC' return (
My Stores
- -
- + +
+
-
- +
+
-
- +
+ @@ -42,4 +66,4 @@ export const AchievementStores = () => {
) -} \ No newline at end of file +} From aa5d397a3b656fde2b44086712535c18437925e3 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 19 Oct 2023 10:45:20 -0600 Subject: [PATCH 050/106] chore: share stats through store provider --- .../AchievementStoreContext/index.tsx | 53 +++++++++++++++++-- .../AchievementsLayout/AchievementsStats.tsx | 32 +++-------- .../AchievementsLayout/AchievmentStores.tsx | 18 +------ .../GameAchievementDetails/index.tsx | 14 ++--- src/frontend/screens/Achievements/index.tsx | 12 +---- 5 files changed, 61 insertions(+), 68 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx index b082bbe1a..918004eeb 100644 --- a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx +++ b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx @@ -4,15 +4,22 @@ import React, { useContext, ReactNode, useMemo, - useState + useState, + useEffect } from 'react' import { AchievementStore as StoreType } from '../../../../common/types' +import walletStore from 'frontend/store/WalletStore' interface AchievementStoreType { store: StoreType playerStoreId: string setStore: React.Dispatch> + newAchievements: number + mintedAchievements: number + totalAchievements: number + totalGames: number + numFreeMints: number } const AchievementStore = createContext({ @@ -20,7 +27,12 @@ const AchievementStore = createContext({ playerStoreId: '', setStore: () => { console.log('not nested in achievement context') - } + }, + newAchievements: 0, + mintedAchievements: 0, + totalAchievements: 0, + totalGames: 0, + numFreeMints: 0 }) interface AchievementStoreProviderProps { @@ -31,15 +43,46 @@ const AchievementStoreProvider: React.FC = ({ children }) => { const [store, setStore] = useState('STEAM') + const [stats, setStats] = useState({ + newAchievements: 0, + mintedAchievements: 0, + totalAchievements: 0, + totalGames: 0, + numFreeMints: 0 + }) const [steamId] = useSetting('steamId', '') + const playerStoreId = useMemo(() => { + return store === 'STEAM' ? steamId : '' + }, [store, steamId]) + + useEffect(() => { + const getAchievements = async () => { + window.api.syncAchievements({ + store, + playerStoreId, + playerAddress: walletStore.address + }) + + const stats = await window.api.getAchievementsStats({ + store, + playerStoreId, + playerAddress: walletStore.address + }) + setStats(stats) + } + + getAchievements() + }, [store, playerStoreId, walletStore.address]) + const value = useMemo(() => { return { store, - playerStoreId: store === 'STEAM' ? steamId : '', - setStore + playerStoreId, + setStore, + ...stats } - }, [steamId, store]) + }, [steamId, store, stats, playerStoreId]) return ( diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx index b235fce1f..b2071ee0a 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx @@ -1,36 +1,16 @@ import { AchievementsInfo } from '@hyperplay/ui' -import React, { useEffect, useState } from 'react' -import walletStore from 'frontend/store/WalletStore' +import React from 'react' import { useAchievementStore } from '../AchievementStoreContext' export const AchievementsStats = () => { - const [stats, setStats] = useState({ - newAchievements: 0, - mintedAchievements: 0, - totalAchievements: 0, - totalGames: 0, - numFreeMints: 0 - }) - const { store, playerStoreId } = useAchievementStore() - - useEffect(() => { - const getStats = async () => { - const stats = await window.api.getAchievementsStats({ - store, - playerStoreId, - playerAddress: walletStore.address - }) - setStats(stats) - } - - getStats() - }, []) + const { newAchievements, mintedAchievements, totalAchievements, totalGames } = + useAchievementStore() return ( ) } diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 4a3291841..c157b6714 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React from 'react' import { StoreRow, Images } from '@hyperplay/ui' import { Flex } from '@mantine/core' @@ -6,23 +6,9 @@ import { Flex } from '@mantine/core' import styles from './index.module.css' import { useAchievementStore } from '../AchievementStoreContext' import classNames from 'classnames' -import walletStore from 'frontend/store/WalletStore' export const AchievementStores = () => { - const { store, setStore, playerStoreId } = useAchievementStore() - const [totalGames, setTotalGames] = useState(0) - - useEffect(() => { - const getStats = async () => { - const stats = await window.api.getAchievementsStats({ - store, - playerStoreId, - playerAddress: walletStore.address - }) - setTotalGames(stats.totalGames) - } - getStats() - }, []) + const { store, setStore, totalGames } = useAchievementStore() const activeSecondaryText = `${totalGames} Games` const isSteam = store === 'STEAM' diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index d5bf7406d..9f5c831de 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -29,7 +29,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { }>({ data: [], currentPage: 0, totalPages: 0 }) const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) - const [freeMints, setFreeMints] = useState(0) + const { achievementsToBeMinted, isLoading, @@ -37,7 +37,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { handleUpdate, achievementsToBeUpdated } = useMintAchievements() - const { store, playerStoreId } = useAchievementStore() + const { store, playerStoreId, numFreeMints } = useAchievementStore() const fetchAchievements = useCallback( async ({ page, sort }: { page: number; sort?: AchievementSort }) => { @@ -69,14 +69,6 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const achievements = await fetchAchievements({ page: 1 }) setAchievementData(achievements) - - const stats = await window.api.getAchievementsStats({ - store, - playerStoreId, - playerAddress: walletStore.address - }) - - setFreeMints(stats.numFreeMints) } getAchievements() @@ -103,7 +95,7 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { return ( ({ currentPage: 0, totalPages: 0, games: [] }) - const [freeMints, setFreeMints] = useState(0) - const { store, playerStoreId } = useAchievementStore() + const { store, playerStoreId, numFreeMints } = useAchievementStore() const { achievementsToBeMinted, @@ -78,13 +77,6 @@ export default React.memo(function Achievements(): JSX.Element { }) setAchievementData({ currentPage, totalPages, games: data }) - - const stats = await window.api.getAchievementsStats({ - store, - playerStoreId, - playerAddress: walletStore.address - }) - setFreeMints(stats.numFreeMints) } getAchievements() @@ -217,7 +209,7 @@ export default React.memo(function Achievements(): JSX.Element { totalToUpdate: achievementsToBeUpdated.length }} achievementNavProps={{ - freeMints, + freeMints: numFreeMints, basketAmount: achievementsToBeMinted.length + achievementsToBeUpdated.length }} From d79f1d25ab8245085c8963bf835f4aee26bd8501 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 19 Oct 2023 12:19:23 -0600 Subject: [PATCH 051/106] chore: only sync in store --- src/frontend/screens/Achievements/index.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index a3daa4bcb..4381734f2 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -67,11 +67,6 @@ export default React.memo(function Achievements(): JSX.Element { useEffect(() => { const getAchievements = async () => { - window.api.syncAchievements({ - store, - playerStoreId, - playerAddress: walletStore.address - }) const { data, totalPages, currentPage } = await fetchAchievements({ page: 1 }) From c4f49ae296745cf0f19e292f0a9e51bf1ab02804 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Thu, 19 Oct 2023 12:33:00 -0600 Subject: [PATCH 052/106] chore: update api commit --- src/backend/hyperplay-achievements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index 558ebec17..e9fb4bbcd 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit 558ebec17e658c31452930994e0a75fa8e1d3d23 +Subproject commit e9fb4bbcdaceacba7c143e3dbc645b8b62ce1262 From bac2cfb8f638e7bec1685eab42ba12e236a50208 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 09:04:09 -0600 Subject: [PATCH 053/106] chore: update types --- src/backend/hyperplay-achievements | 2 +- src/backend/logger/logger.ts | 3 ++- src/common/typedefs/ipcBridge.d.ts | 6 ++---- src/common/types.ts | 8 -------- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index e9fb4bbcd..d79eb2d17 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit e9fb4bbcdaceacba7c143e3dbc645b8b62ce1262 +Subproject commit d79eb2d17171db6053a2181f9c1b327ab2ddce44 diff --git a/src/backend/logger/logger.ts b/src/backend/logger/logger.ts index ab7f6b701..96e5ac02d 100644 --- a/src/backend/logger/logger.ts +++ b/src/backend/logger/logger.ts @@ -31,7 +31,8 @@ export enum LogPrefix { DownloadManager = 'DownloadManager', ExtraGameInfo = 'ExtraGameInfo', HyperPlay = 'HyperPlay', - Sideload = 'Sideload' + Sideload = 'Sideload', + Achievements = 'Achievements' } export const RunnerToLogPrefixMap = { diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index 64fc3d3c1..a74050905 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -217,10 +217,8 @@ interface HyperPlayAsyncIPCFunctions { currentPage: number totalPages: number }> - getAchievementsStats: ( - options: GetAchievementsStatsOptions - ) => Promise - syncAchievements: (options: SyncAchievementsOptions) => Promise + getAchievementsStats: (options: PlayerOptions) => Promise + syncAchievements: (options: PlayerOptions) => Promise checkHyperPlayAccessCode: ( channelId: number, accessCode: string diff --git a/src/common/types.ts b/src/common/types.ts index feddcc80b..2b8dcf1e5 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -828,17 +828,10 @@ export type AchievementFilter = 'ALL' | 'NEW' | 'MINTED' export interface PlayerOptions { playerStoreId: string playerAddress: string -} -export interface GetAchievementsStatsOptions extends PlayerOptions { - store: AchievementStore -} - -export interface SyncAchievementsOptions extends PlayerOptions { store: AchievementStore } export interface GetAchievementsOptions extends PlayerOptions { - store: AchievementStore filter: AchievementFilter sort: AchievementSort page: number @@ -850,7 +843,6 @@ export interface GetIndividualAchievementsOptions extends PlayerOptions { sort: AchievementSort page: number pageSize: number - store: AchievementStore } export interface AchievementsStats { newAchievements: number From c81f606ae231445c8754d63f2ae4e6653327deca Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 09:04:38 -0600 Subject: [PATCH 054/106] feat: update store row to have refresh button --- .../AchievementStoreContext/index.tsx | 24 ++++++++----- .../AchievementsLayout/AchievmentStores.tsx | 35 +++++-------------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx index 918004eeb..3b65c1772 100644 --- a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx +++ b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx @@ -5,7 +5,8 @@ import React, { ReactNode, useMemo, useState, - useEffect + useEffect, + useCallback } from 'react' import { AchievementStore as StoreType } from '../../../../common/types' @@ -20,6 +21,7 @@ interface AchievementStoreType { totalAchievements: number totalGames: number numFreeMints: number + syncAchievements: (store: StoreType) => void } const AchievementStore = createContext({ @@ -32,7 +34,8 @@ const AchievementStore = createContext({ mintedAchievements: 0, totalAchievements: 0, totalGames: 0, - numFreeMints: 0 + numFreeMints: 0, + syncAchievements: () => { return } }) interface AchievementStoreProviderProps { @@ -56,13 +59,17 @@ const AchievementStoreProvider: React.FC = ({ return store === 'STEAM' ? steamId : '' }, [store, steamId]) + const syncAchievements = useCallback((store: StoreType) => { + window.api.syncAchievements({ + store, + playerStoreId, + playerAddress: walletStore.address + }) + }, [playerStoreId, walletStore.address]) + useEffect(() => { const getAchievements = async () => { - window.api.syncAchievements({ - store, - playerStoreId, - playerAddress: walletStore.address - }) + syncAchievements(store) const stats = await window.api.getAchievementsStats({ store, @@ -80,9 +87,10 @@ const AchievementStoreProvider: React.FC = ({ store, playerStoreId, setStore, + syncAchievements, ...stats } - }, [steamId, store, stats, playerStoreId]) + }, [steamId, store, stats, playerStoreId, syncAchievements]) return ( diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index c157b6714..f1dd9a046 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -8,45 +8,28 @@ import { useAchievementStore } from '../AchievementStoreContext' import classNames from 'classnames' export const AchievementStores = () => { - const { store, setStore, totalGames } = useAchievementStore() + const { store, setStore, totalGames, syncAchievements } = useAchievementStore() const activeSecondaryText = `${totalGames} Games` const isSteam = store === 'STEAM' - const isHyperplay = store === 'HYPERPLAY' - const isEpic = store === 'EPIC' return (
My Stores
-
- - - -
- - -
-
- - +
+ + +
From c6536aaaae313b12e59926bb60d4badf497d1f25 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 09:05:32 -0600 Subject: [PATCH 055/106] fix: prettier --- .../AchievementStoreContext/index.tsx | 21 ++++++++++++------- .../AchievementsLayout/AchievmentStores.tsx | 9 ++++++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx index 3b65c1772..3c6fb01c6 100644 --- a/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx +++ b/src/frontend/screens/Achievements/AchievementStoreContext/index.tsx @@ -35,7 +35,9 @@ const AchievementStore = createContext({ totalAchievements: 0, totalGames: 0, numFreeMints: 0, - syncAchievements: () => { return } + syncAchievements: () => { + return + } }) interface AchievementStoreProviderProps { @@ -59,13 +61,16 @@ const AchievementStoreProvider: React.FC = ({ return store === 'STEAM' ? steamId : '' }, [store, steamId]) - const syncAchievements = useCallback((store: StoreType) => { - window.api.syncAchievements({ - store, - playerStoreId, - playerAddress: walletStore.address - }) - }, [playerStoreId, walletStore.address]) + const syncAchievements = useCallback( + (store: StoreType) => { + window.api.syncAchievements({ + store, + playerStoreId, + playerAddress: walletStore.address + }) + }, + [playerStoreId, walletStore.address] + ) useEffect(() => { const getAchievements = async () => { diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index f1dd9a046..e88d857d7 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -8,7 +8,8 @@ import { useAchievementStore } from '../AchievementStoreContext' import classNames from 'classnames' export const AchievementStores = () => { - const { store, setStore, totalGames, syncAchievements } = useAchievementStore() + const { store, setStore, totalGames, syncAchievements } = + useAchievementStore() const activeSecondaryText = `${totalGames} Games` const isSteam = store === 'STEAM' @@ -23,7 +24,11 @@ export const AchievementStores = () => { secondaryText={isSteam ? activeSecondaryText : '0 Games'} >
-
) -} +}) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 96095f4f0..34a1451e7 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -4,11 +4,9 @@ import { Background } from '@hyperplay/ui' import { Flex, Grid } from '@mantine/core' import styles from './index.module.css' -import { MintAchievementsProvider } from '../MintAchievementsContext' import { AchievementsStats } from './AchievementsStats' import useSettingsContext from 'frontend/hooks/useSettingsContext' import SettingsContext from 'frontend/screens/Settings/SettingsContext' -import { AchievementStoreProvider } from '../AchievementStoreContext' import { AchievementStores } from './AchievmentStores' export default React.memo(function AchievementsLayout({ @@ -26,28 +24,24 @@ export default React.memo(function AchievementsLayout({ return ( - - - -
- - - - - - - - - {children} - - -
-
-
+ +
+ + + + + + + + + {children} + + +
) }) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 9f5c831de..0fdc9474f 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -3,10 +3,11 @@ import { Achievement, AchievementSort, SummaryAchievement } from 'common/types' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' -import { useMintAchievements } from '../MintAchievementsContext' import walletStore from 'frontend/store/WalletStore' import { useTranslation } from 'react-i18next' -import { useAchievementStore } from '../AchievementStoreContext' +import { observer } from 'mobx-react-lite' +import AchievementStoreState from 'frontend/state/AchievementStoreState' +import MintAchievementsState from 'frontend/state/MintAchievementsState' const pageSize = 6 @@ -17,7 +18,7 @@ function isTimestampInPast(unixTimestamp: number) { return timestampInMilliseconds < currentTime } -export default React.memo(function GameAchievementDetails(): JSX.Element { +export default observer(function GameAchievementDetails(): JSX.Element { const { t } = useTranslation() const { id } = useParams() const [summaryAchievement, setSummaryAchievement] = @@ -30,14 +31,15 @@ export default React.memo(function GameAchievementDetails(): JSX.Element { const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) - const { - achievementsToBeMinted, - isLoading, - handleMint, - handleUpdate, - achievementsToBeUpdated - } = useMintAchievements() - const { store, playerStoreId, numFreeMints } = useAchievementStore() + const achievementsToBeMinted = MintAchievementsState.achievementsToBeMinted + const isLoading = MintAchievementsState.isLoading + const handleMint = MintAchievementsState.handleMint + const handleUpdate = MintAchievementsState.handleUpdate + const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated + + const store = AchievementStoreState.store + const playerStoreId = AchievementStoreState.playerStoreId + const numFreeMints = AchievementStoreState.numFreeMints const fetchAchievements = useCallback( async ({ page, sort }: { page: number; sort?: AchievementSort }) => { diff --git a/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx b/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx deleted file mode 100644 index bc98ec247..000000000 --- a/src/frontend/screens/Achievements/MintAchievementsContext/index.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import React, { - createContext, - useContext, - ReactNode, - useState, - useMemo, - useCallback -} from 'react' - -interface MintAchievementsType { - achievementsToBeMinted: string[] - achievementsToBeUpdated: string[] - toggleAchievementToBeMinted: (id: string) => void - toggleAchievementToBeUpdated: (id: string) => void - handleMint: () => void - handleUpdate: () => void - isLoading: boolean -} - -const MintAchievements = createContext( - undefined -) - -interface MintAchievementsProviderProps { - children: ReactNode -} - -const MintAchievementsProvider: React.FC = ({ - children -}) => { - const [achievementsToBeMinted, setAchievementsToBeMinted] = useState< - string[] - >([]) - const [achievementsToBeUpdated, setAchievementsToBeUpdated] = useState< - string[] - >([]) - const [isLoading, setIsLoading] = useState(false) - - const toggleAchievementToBeMinted = useCallback( - (id: string) => { - if (achievementsToBeMinted.includes(id)) { - setAchievementsToBeMinted((state) => - state.filter((item) => item !== id) - ) - } else { - setAchievementsToBeMinted((state) => [...state, id]) - } - }, - [achievementsToBeMinted] - ) - - const toggleAchievementToBeUpdated = useCallback( - (id: string) => { - if (achievementsToBeUpdated.includes(id)) { - setAchievementsToBeUpdated((state) => - state.filter((item) => item !== id) - ) - } else { - setAchievementsToBeUpdated((state) => [...state, id]) - } - }, - [achievementsToBeUpdated] - ) - - const handleMint = useCallback(() => { - setIsLoading(true) - setTimeout(() => { - setIsLoading(false) - setAchievementsToBeMinted([]) - }, 3000) - }, [achievementsToBeMinted]) - - const handleUpdate = useCallback(() => { - setIsLoading(true) - setTimeout(() => { - setIsLoading(false) - setAchievementsToBeUpdated([]) - }, 3000) - }, [achievementsToBeUpdated]) - - const value = useMemo(() => { - return { - achievementsToBeMinted, - toggleAchievementToBeMinted, - handleMint, - isLoading, - toggleAchievementToBeUpdated, - handleUpdate, - achievementsToBeUpdated - } - }, [ - achievementsToBeMinted, - toggleAchievementToBeMinted, - handleMint, - isLoading, - toggleAchievementToBeUpdated, - handleUpdate, - achievementsToBeUpdated - ]) - - return ( - - {children} - - ) -} - -const useMintAchievements = () => { - const context = useContext(MintAchievements) - - if (context === undefined) { - throw new Error( - 'useMintAchievements must be used within a MintAchievementsProvider' - ) - } - - return context -} - -export { MintAchievementsProvider, useMintAchievements } diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 4381734f2..50f500ed0 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -9,9 +9,10 @@ import { } from 'common/types' import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' -import { useMintAchievements } from './MintAchievementsContext' import { useTranslation } from 'react-i18next' -import { useAchievementStore } from './AchievementStoreContext' +import { observer } from 'mobx-react-lite' +import AchievementStoreState from 'frontend/state/AchievementStoreState' +import MintAchievementsState from 'frontend/state/MintAchievementsState' const pageSize = 12 export const achievementsSortOptions = [ @@ -19,7 +20,7 @@ export const achievementsSortOptions = [ { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } ] as { text: string; value: AchievementSort }[] -export default React.memo(function Achievements(): JSX.Element { +export default observer(function Achievements(): JSX.Element { const { t } = useTranslation() const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) @@ -30,17 +31,19 @@ export default React.memo(function Achievements(): JSX.Element { games: SummaryAchievement[] }>({ currentPage: 0, totalPages: 0, games: [] }) - const { store, playerStoreId, numFreeMints } = useAchievementStore() + const store = AchievementStoreState.store + const playerStoreId = AchievementStoreState.playerStoreId + const numFreeMints = AchievementStoreState.numFreeMints - const { - achievementsToBeMinted, - toggleAchievementToBeMinted, - isLoading, - handleMint, - handleUpdate, - achievementsToBeUpdated, - toggleAchievementToBeUpdated - } = useMintAchievements() + const achievementsToBeMinted = MintAchievementsState.achievementsToBeMinted + const toggleAchievementToBeMinted = + MintAchievementsState.toggleAchievementToBeMinted + const isLoading = MintAchievementsState.isLoading + const handleMint = MintAchievementsState.handleMint + const handleUpdate = MintAchievementsState.handleUpdate + const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated + const toggleAchievementToBeUpdated = + MintAchievementsState.toggleAchievementToBeUpdated const fetchAchievements = useCallback( async ({ @@ -195,12 +198,12 @@ export default React.memo(function Achievements(): JSX.Element { }} mintButtonProps={{ onClick: handleMint, - disabled: achievementsToBeMinted.length === 0 ?? isDisabled, + disabled: isDisabled || achievementsToBeMinted.length === 0, totalToMint: achievementsToBeMinted.length }} updateButtonProps={{ onClick: handleUpdate, - disabled: achievementsToBeUpdated.length === 0 ?? isDisabled, + disabled: isDisabled || achievementsToBeUpdated.length === 0, totalToUpdate: achievementsToBeUpdated.length }} achievementNavProps={{ diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementStoreState.ts new file mode 100644 index 000000000..1b4a3310c --- /dev/null +++ b/src/frontend/state/AchievementStoreState.ts @@ -0,0 +1,57 @@ +import { makeAutoObservable } from 'mobx' +import walletStore from 'frontend/store/WalletStore' +import type { AchievementStore, AchievementsStats } from 'common/types' + +class AchievementStoreState { + store = 'STEAM' as AchievementStore + playerStoreId = '76561199276514967' + newAchievements = 0 + totalAchievements = 0 + totalGames = 0 + mintedAchievements = 0 + numFreeMints = 0 + + constructor() { + makeAutoObservable(this) + } + + init() { + this.syncAchievements(this.store) + } + + getAchievementsStats = () => { + window.api + .getAchievementsStats({ + store: this.store, + playerStoreId: this.playerStoreId, + playerAddress: walletStore.address + }) + .then(this.setStats.bind(this)) + } + + syncAchievements = (store: AchievementStore) => { + window.api.syncAchievements({ + store, + playerStoreId: this.playerStoreId, + playerAddress: walletStore.address + }) + } + + setStats = (state: AchievementsStats) => { + this.newAchievements = state.newAchievements + this.totalAchievements = state.totalAchievements + this.totalGames = state.totalGames + this.mintedAchievements = state.mintedAchievements + this.numFreeMints = state.numFreeMints + } + + setStore = (store: AchievementStore) => { + this.store = store + } + + setPlayerStoreId = (playerStoreId: string) => { + this.playerStoreId = playerStoreId + } +} + +export default new AchievementStoreState() diff --git a/src/frontend/state/MintAchievementsState.ts b/src/frontend/state/MintAchievementsState.ts new file mode 100644 index 000000000..180955a92 --- /dev/null +++ b/src/frontend/state/MintAchievementsState.ts @@ -0,0 +1,49 @@ +import { makeAutoObservable } from 'mobx' + +class MintAchievementsState { + achievementsToBeMinted = [] as string[] + achievementsToBeUpdated = [] as string[] + isLoading = false + + constructor() { + makeAutoObservable(this) + } + + toggleAchievementToBeMinted = (id: string) => { + if (this.achievementsToBeMinted.includes(id)) { + this.achievementsToBeMinted = this.achievementsToBeMinted.filter( + (item) => item !== id + ) + } else { + this.achievementsToBeMinted = [...this.achievementsToBeMinted, id] + } + } + + toggleAchievementToBeUpdated = (id: string) => { + if (this.achievementsToBeUpdated.includes(id)) { + this.achievementsToBeUpdated = this.achievementsToBeUpdated.filter( + (item) => item !== id + ) + } else { + this.achievementsToBeUpdated = [...this.achievementsToBeUpdated, id] + } + } + + handleMint = () => { + this.isLoading = true + setTimeout(() => { + this.isLoading = false + this.achievementsToBeMinted = [] + }, 3000) + } + + handleUpdate = () => { + this.isLoading = true + setTimeout(() => { + this.isLoading = false + this.achievementsToBeUpdated = [] + }, 3000) + } +} + +export default new MintAchievementsState() From 8882abc558c059e97e44c99e49c7f4dff48cf0ed Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 14:15:28 -0600 Subject: [PATCH 057/106] chore: pull getSummaryAchievements into state --- src/frontend/screens/Achievements/index.tsx | 79 ++++----------------- src/frontend/state/AchievementStoreState.ts | 38 +++++++++- 2 files changed, 50 insertions(+), 67 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 50f500ed0..8ecc97047 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,11 +1,10 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import walletStore from 'frontend/store/WalletStore' import { AchievementCard, AchievementSummaryTable } from '@hyperplay/ui' import { AchievementFilter, AchievementSort, - SummaryAchievement } from 'common/types' import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' @@ -25,11 +24,6 @@ export default observer(function Achievements(): JSX.Element { const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) const [activeFilter, setActiveFilter] = useState('ALL') - const [achievementsData, setAchievementData] = useState<{ - currentPage: number - totalPages: number - games: SummaryAchievement[] - }>({ currentPage: 0, totalPages: 0, games: [] }) const store = AchievementStoreState.store const playerStoreId = AchievementStoreState.playerStoreId @@ -44,63 +38,23 @@ export default observer(function Achievements(): JSX.Element { const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated const toggleAchievementToBeUpdated = MintAchievementsState.toggleAchievementToBeUpdated - - const fetchAchievements = useCallback( - async ({ - page, - sort, - filter - }: { - page: number - sort?: AchievementSort - filter?: AchievementFilter - }) => { - return window.api.getSummaryAchievements({ - store, - filter: filter ?? activeFilter, - sort: sort ?? selectedSort.value, - page, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) - }, - [store, activeFilter, selectedSort, playerStoreId, walletStore.address] - ) + const achievementsData = AchievementStoreState.summaryAchievements useEffect(() => { - const getAchievements = async () => { - const { data, totalPages, currentPage } = await fetchAchievements({ - page: 1 - }) - - setAchievementData({ currentPage, totalPages, games: data }) - } - - getAchievements() + AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, filter: activeFilter, sort: selectedSort.value }) }, [store, playerStoreId, walletStore.address]) - const handleNextPage = useCallback(async () => { + const handleNextPage = () => { const nextPage = achievementsData.currentPage + 1 - const { data, totalPages, currentPage } = await fetchAchievements({ - page: nextPage - }) - - setAchievementData({ currentPage, totalPages, games: data }) - }, [achievementsData, activeFilter, selectedSort]) + AchievementStoreState.getSummaryAchievements({ page: nextPage, pageSize, filter: activeFilter, sort: selectedSort.value }) + } - const handlePrevPage = useCallback(async () => { + const handlePrevPage = () => { const prevPage = achievementsData.currentPage - 1 - const { data, totalPages, currentPage } = await fetchAchievements({ - page: prevPage - }) - - setAchievementData({ currentPage, totalPages, games: data }) - }, [achievementsData, activeFilter, selectedSort]) + AchievementStoreState.getSummaryAchievements({ page: prevPage, pageSize, filter: activeFilter, sort: selectedSort.value }) + } - const isDisabled = useMemo(() => { - return isLoading || !walletStore.isConnected - }, [isLoading, walletStore.isConnected]) + const isDisabled = isLoading || !walletStore.isConnected const filterMap = useMemo(() => { if (activeFilter === 'NEW') return 'new' @@ -111,7 +65,7 @@ export default observer(function Achievements(): JSX.Element { return ( <> { + games={achievementsData.data.map((game) => { const id = String(game.gameId) const isUpdate = game.isNewAchievement && game.mintedAchievementCount > 0 @@ -165,12 +119,9 @@ export default observer(function Achievements(): JSX.Element { ) if (chosenItem) { - const { data, totalPages, currentPage } = await fetchAchievements( - { page: 1, sort: chosenItem.value } - ) + AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, filter: activeFilter, sort: chosenItem.value }) setSelectedSort(chosenItem) - setAchievementData({ currentPage, totalPages, games: data }) } } }} @@ -187,13 +138,9 @@ export default observer(function Achievements(): JSX.Element { if (filter === 'new') newFilter = 'NEW' if (filter === 'minted') newFilter = 'MINTED' - const { data, totalPages, currentPage } = await fetchAchievements({ - page: 1, - filter: newFilter - }) + AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, filter: newFilter, sort: selectedSort.value }) setActiveFilter(newFilter) - setAchievementData({ currentPage, totalPages, games: data }) } }} mintButtonProps={{ diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementStoreState.ts index 1b4a3310c..a0f870247 100644 --- a/src/frontend/state/AchievementStoreState.ts +++ b/src/frontend/state/AchievementStoreState.ts @@ -1,15 +1,28 @@ import { makeAutoObservable } from 'mobx' import walletStore from 'frontend/store/WalletStore' -import type { AchievementStore, AchievementsStats } from 'common/types' +import type { + AchievementFilter, + AchievementSort, + AchievementStore, + AchievementsStats, + SummaryAchievement +} from 'common/types' class AchievementStoreState { store = 'STEAM' as AchievementStore playerStoreId = '76561199276514967' + // Stats newAchievements = 0 totalAchievements = 0 totalGames = 0 mintedAchievements = 0 numFreeMints = 0 + // Summary Achievements + summaryAchievements = { + data: [] as SummaryAchievement[], + totalPages: 0, + currentPage: 0 + } constructor() { makeAutoObservable(this) @@ -29,6 +42,29 @@ class AchievementStoreState { .then(this.setStats.bind(this)) } + getSummaryAchievements = async ({ + page, + pageSize, + filter, + sort + }: { + page: number + pageSize: number + filter: AchievementFilter + sort: AchievementSort + }) => { + const summaryAchievements = await window.api.getSummaryAchievements({ + store: this.store, + filter, + sort, + page, + pageSize, + playerStoreId: this.playerStoreId, + playerAddress: walletStore.address + }) + this.summaryAchievements = summaryAchievements + } + syncAchievements = (store: AchievementStore) => { window.api.syncAchievements({ store, From 511754ae19e515c3aef20d45673fdd8ceb5937c4 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 14:39:01 -0600 Subject: [PATCH 058/106] chore: pull out getIndividualAchievements into mobx class --- .../GameAchievementDetails/index.tsx | 82 ++++--------------- src/frontend/state/AchievementStoreState.ts | 31 +++++++ 2 files changed, 49 insertions(+), 64 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 0fdc9474f..755278395 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,6 +1,5 @@ import { GameAchievements } from '@hyperplay/ui' -import { Achievement, AchievementSort, SummaryAchievement } from 'common/types' -import React, { useCallback, useEffect, useMemo, useState } from 'react' +import React, { useEffect, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' import walletStore from 'frontend/store/WalletStore' @@ -21,13 +20,6 @@ function isTimestampInPast(unixTimestamp: number) { export default observer(function GameAchievementDetails(): JSX.Element { const { t } = useTranslation() const { id } = useParams() - const [summaryAchievement, setSummaryAchievement] = - useState() - const [achievementsData, setAchievementData] = useState<{ - data: Achievement[] - currentPage: number - totalPages: number - }>({ data: [], currentPage: 0, totalPages: 0 }) const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) @@ -37,60 +29,26 @@ export default observer(function GameAchievementDetails(): JSX.Element { const handleUpdate = MintAchievementsState.handleUpdate const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated - const store = AchievementStoreState.store - const playerStoreId = AchievementStoreState.playerStoreId const numFreeMints = AchievementStoreState.numFreeMints - - const fetchAchievements = useCallback( - async ({ page, sort }: { page: number; sort?: AchievementSort }) => { - return window.api.getIndividualAchievements({ - gameId: Number(id), - store, - sort: sort ?? selectedSort.value, - page, - pageSize, - playerStoreId, - playerAddress: walletStore.address - }) - }, - [store, selectedSort, playerStoreId, walletStore.address, id] - ) + const individualAchievements = AchievementStoreState.individualAchievements + const summaryAchievement = AchievementStoreState.summaryAchievements.data[0] useEffect(() => { - const getAchievements = async () => { - const { data } = await window.api.getSummaryAchievements({ - store, - filter: 'ALL', - sort: 'ALPHA_A_TO_Z', - page: 1, - pageSize: 1, - playerStoreId, - playerAddress: walletStore.address - }) - setSummaryAchievement(data[0]) - - const achievements = await fetchAchievements({ page: 1 }) - setAchievementData(achievements) - } - - getAchievements() + AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, sort: selectedSort.value, filter: 'ALL' }) + AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: 1, pageSize, sort: selectedSort.value }) }, []) - const handleNextPage = useCallback(async () => { - const nextPage = achievementsData.currentPage + 1 - const achievements = await fetchAchievements({ page: nextPage }) - setAchievementData(achievements) - }, [achievementsData, selectedSort]) + const handleNextPage = () => { + const nextPage = individualAchievements.currentPage + 1 + AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: nextPage, pageSize, sort: selectedSort.value }) + } - const handlePrevPage = useCallback(async () => { - const prevPage = achievementsData.currentPage - 1 - const achievements = await fetchAchievements({ page: prevPage }) - setAchievementData(achievements) - }, [achievementsData, selectedSort]) + const handlePrevPage = () => { + const prevPage = individualAchievements.currentPage - 1 + AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: prevPage, pageSize, sort: selectedSort.value }) + } - const isDisabled = useMemo(() => { - return isLoading || !walletStore.isConnected - }, [isLoading, walletStore.isConnected]) + const isDisabled = isLoading || !walletStore.isConnected if (!summaryAchievement) return <> @@ -107,7 +65,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { mintedAchievementsCount={summaryAchievement.mintedAchievementCount} totalAchievementsCount={summaryAchievement.totalAchievementCount} mintableAchievementsCount={summaryAchievement.mintableAchievementsCount} - achievements={achievementsData.data.map((achievement) => ({ + achievements={individualAchievements.data.map((achievement) => ({ id: achievement.id, title: achievement.displayName, description: achievement.description, @@ -123,19 +81,15 @@ export default observer(function GameAchievementDetails(): JSX.Element { ) if (chosenItem) { - const { data, totalPages, currentPage } = await fetchAchievements({ - page: 1, - sort: chosenItem.value - }) + AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: 1, pageSize, sort: chosenItem.value }) setSelectedSort(chosenItem) - setAchievementData({ currentPage, totalPages, data }) } } }} paginationProps={{ - currentPage: achievementsData.currentPage, - totalPages: achievementsData.totalPages, + currentPage: individualAchievements.currentPage, + totalPages: individualAchievements.totalPages, handleNextPage, handlePrevPage }} diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementStoreState.ts index a0f870247..0e64b4e55 100644 --- a/src/frontend/state/AchievementStoreState.ts +++ b/src/frontend/state/AchievementStoreState.ts @@ -1,6 +1,7 @@ import { makeAutoObservable } from 'mobx' import walletStore from 'frontend/store/WalletStore' import type { + Achievement, AchievementFilter, AchievementSort, AchievementStore, @@ -23,6 +24,12 @@ class AchievementStoreState { totalPages: 0, currentPage: 0 } + // Individual Achievements + individualAchievements = { + data: [] as Achievement[], + totalPages: 0, + currentPage: 0 + } constructor() { makeAutoObservable(this) @@ -42,6 +49,29 @@ class AchievementStoreState { .then(this.setStats.bind(this)) } + getIndividualAchievements = async ({ + gameId, + page, + pageSize, + sort + }: { + gameId: string + page: number + pageSize: number + sort: AchievementSort + }) => { + const individualAchievements = await window.api.getIndividualAchievements({ + gameId: Number(gameId), + store: this.store, + sort, + page, + pageSize, + playerStoreId: this.playerStoreId, + playerAddress: walletStore.address + }) + this.individualAchievements = individualAchievements + } + getSummaryAchievements = async ({ page, pageSize, @@ -62,6 +92,7 @@ class AchievementStoreState { playerStoreId: this.playerStoreId, playerAddress: walletStore.address }) + this.summaryAchievements = summaryAchievements } From 0fc8b674124d6dcbb672590492125b60525a5e15 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 14:39:43 -0600 Subject: [PATCH 059/106] fix: prettier --- .../GameAchievementDetails/index.tsx | 35 +++++++++++++--- src/frontend/screens/Achievements/index.tsx | 40 ++++++++++++++----- 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 755278395..dfbad44d9 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -34,18 +34,38 @@ export default observer(function GameAchievementDetails(): JSX.Element { const summaryAchievement = AchievementStoreState.summaryAchievements.data[0] useEffect(() => { - AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, sort: selectedSort.value, filter: 'ALL' }) - AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: 1, pageSize, sort: selectedSort.value }) + AchievementStoreState.getSummaryAchievements({ + page: 1, + pageSize, + sort: selectedSort.value, + filter: 'ALL' + }) + AchievementStoreState.getIndividualAchievements({ + gameId: id as string, + page: 1, + pageSize, + sort: selectedSort.value + }) }, []) const handleNextPage = () => { const nextPage = individualAchievements.currentPage + 1 - AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: nextPage, pageSize, sort: selectedSort.value }) + AchievementStoreState.getIndividualAchievements({ + gameId: id as string, + page: nextPage, + pageSize, + sort: selectedSort.value + }) } const handlePrevPage = () => { const prevPage = individualAchievements.currentPage - 1 - AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: prevPage, pageSize, sort: selectedSort.value }) + AchievementStoreState.getIndividualAchievements({ + gameId: id as string, + page: prevPage, + pageSize, + sort: selectedSort.value + }) } const isDisabled = isLoading || !walletStore.isConnected @@ -81,7 +101,12 @@ export default observer(function GameAchievementDetails(): JSX.Element { ) if (chosenItem) { - AchievementStoreState.getIndividualAchievements({ gameId: id as string, page: 1, pageSize, sort: chosenItem.value }) + AchievementStoreState.getIndividualAchievements({ + gameId: id as string, + page: 1, + pageSize, + sort: chosenItem.value + }) setSelectedSort(chosenItem) } diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 8ecc97047..5bb6391b3 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -2,10 +2,7 @@ import React, { useEffect, useMemo, useState } from 'react' import walletStore from 'frontend/store/WalletStore' import { AchievementCard, AchievementSummaryTable } from '@hyperplay/ui' -import { - AchievementFilter, - AchievementSort, -} from 'common/types' +import { AchievementFilter, AchievementSort } from 'common/types' import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' import { useTranslation } from 'react-i18next' @@ -41,17 +38,32 @@ export default observer(function Achievements(): JSX.Element { const achievementsData = AchievementStoreState.summaryAchievements useEffect(() => { - AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, filter: activeFilter, sort: selectedSort.value }) + AchievementStoreState.getSummaryAchievements({ + page: 1, + pageSize, + filter: activeFilter, + sort: selectedSort.value + }) }, [store, playerStoreId, walletStore.address]) const handleNextPage = () => { const nextPage = achievementsData.currentPage + 1 - AchievementStoreState.getSummaryAchievements({ page: nextPage, pageSize, filter: activeFilter, sort: selectedSort.value }) + AchievementStoreState.getSummaryAchievements({ + page: nextPage, + pageSize, + filter: activeFilter, + sort: selectedSort.value + }) } const handlePrevPage = () => { const prevPage = achievementsData.currentPage - 1 - AchievementStoreState.getSummaryAchievements({ page: prevPage, pageSize, filter: activeFilter, sort: selectedSort.value }) + AchievementStoreState.getSummaryAchievements({ + page: prevPage, + pageSize, + filter: activeFilter, + sort: selectedSort.value + }) } const isDisabled = isLoading || !walletStore.isConnected @@ -119,7 +131,12 @@ export default observer(function Achievements(): JSX.Element { ) if (chosenItem) { - AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, filter: activeFilter, sort: chosenItem.value }) + AchievementStoreState.getSummaryAchievements({ + page: 1, + pageSize, + filter: activeFilter, + sort: chosenItem.value + }) setSelectedSort(chosenItem) } @@ -138,7 +155,12 @@ export default observer(function Achievements(): JSX.Element { if (filter === 'new') newFilter = 'NEW' if (filter === 'minted') newFilter = 'MINTED' - AchievementStoreState.getSummaryAchievements({ page: 1, pageSize, filter: newFilter, sort: selectedSort.value }) + AchievementStoreState.getSummaryAchievements({ + page: 1, + pageSize, + filter: newFilter, + sort: selectedSort.value + }) setActiveFilter(newFilter) } From ad510396e916a8dd4acae7f73828f5df8d9c766e Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 15:26:15 -0600 Subject: [PATCH 060/106] chore: move showAchievements into mobx class --- .../UI/Sidebar/components/SidebarLinks/index.tsx | 11 ++--------- src/frontend/screens/Settings/index.tsx | 12 ++++++++---- src/frontend/state/AchievementStoreState.ts | 5 +++++ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx index 4023b8470..443386902 100644 --- a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx +++ b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx @@ -9,10 +9,10 @@ import { Images } from '@hyperplay/ui' import libraryState from 'frontend/state/libraryState' import { observer } from 'mobx-react-lite' import storeAuthState from 'frontend/state/storeAuthState' +import AchievementStoreState from 'frontend/state/AchievementStoreState' export default observer(function SidebarLinks() { const location = useLocation() as { pathname: string } - const [showAchievements, setShowAchievements] = useState(false) const { activeController, handleExternalLinkDialog } = useContext(ContextProvider) @@ -23,13 +23,6 @@ export default observer(function SidebarLinks() { useEffect(() => { window.api.isFullscreen().then((res) => setIsFullscreen(res)) - - const shouldShowAchievements = async () => { - const shouldShow = await window.api.shouldShowAchievements() - setShowAchievements(shouldShow) - } - - shouldShowAchievements() }, []) async function handleRefresh() { @@ -90,7 +83,7 @@ export default observer(function SidebarLinks() {
- {showAchievements && ( + {AchievementStoreState.showAchievements && (
diff --git a/src/frontend/screens/Settings/index.tsx b/src/frontend/screens/Settings/index.tsx index 36b7da183..591e5fb28 100644 --- a/src/frontend/screens/Settings/index.tsx +++ b/src/frontend/screens/Settings/index.tsx @@ -19,6 +19,8 @@ import Accessibility from '../Accessibility' import WineManager from '../WineManager' import ContextProvider from 'frontend/state/ContextProvider' import AccountSettings from './sections/AccountSettings' +import { observer } from 'mobx-react-lite' +import AchievementStoreState from 'frontend/state/AchievementStoreState' export const defaultWineVersion: WineInstallation = { bin: '/usr/bin/wine', @@ -159,9 +161,11 @@ function Settings() { - - - + {AchievementStoreState.showAchievements && ( + + + + )} {!isWin ? ( @@ -176,4 +180,4 @@ function Settings() { ) } -export default React.memo(Settings) +export default observer(Settings) diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementStoreState.ts index 0e64b4e55..c8082984d 100644 --- a/src/frontend/state/AchievementStoreState.ts +++ b/src/frontend/state/AchievementStoreState.ts @@ -30,6 +30,8 @@ class AchievementStoreState { totalPages: 0, currentPage: 0 } + // Achievements Feature Flag + showAchievements = false constructor() { makeAutoObservable(this) @@ -37,6 +39,9 @@ class AchievementStoreState { init() { this.syncAchievements(this.store) + window.api + .shouldShowAchievements() + .then((res) => (this.showAchievements = res)) } getAchievementsStats = () => { From c6a23299b8750012072828bc2ca28196d7f5d07a Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 15:43:46 -0600 Subject: [PATCH 061/106] chore: update to hyperplay ui 0.1.32 --- package.json | 4 ++-- .../AchievementsLayout/AchievmentStores.tsx | 1 + src/frontend/state/AchievementStoreState.ts | 1 - yarn.lock | 15 ++++----------- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index c4e9df30e..9a933c3de 100644 --- a/package.json +++ b/package.json @@ -156,7 +156,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.27", + "@hyperplay/ui": "^0.1.32", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", @@ -353,4 +353,4 @@ "vite>esbuild": true } } -} +} \ No newline at end of file diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 0eb54136b..70839bcad 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -23,6 +23,7 @@ export const AchievementStores = observer(() => { useEffect(() => { setPlayerStoreId(steamId) getAchievementsStats() + syncAchievements('STEAM') }, [steamId]) const activeSecondaryText = `${totalGames} Games` diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementStoreState.ts index c8082984d..7a38ac9f0 100644 --- a/src/frontend/state/AchievementStoreState.ts +++ b/src/frontend/state/AchievementStoreState.ts @@ -38,7 +38,6 @@ class AchievementStoreState { } init() { - this.syncAchievements(this.store) window.api .shouldShowAchievements() .then((res) => (this.showAchievements = res)) diff --git a/yarn.lock b/yarn.lock index f521ba6f4..9d3123a02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1668,17 +1668,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/chains@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" - integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== - dependencies: - axios "^1.4.0" - -"@hyperplay/ui@^0.1.27": - version "0.1.27" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.27.tgz#f7bd511ca6cbd946c117fd1ed59446e988aff726" - integrity sha512-rCkFP2L/+P5IhlMsaEOCxedgOjQ9Mk+8YZ2GUjQeeNpyMezQLMFRVOzHP59EEc0BjX2uE2zvEr7H15vMifCSDQ== +"@hyperplay/ui@^0.1.32": + version "0.1.32" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.32.tgz#f06b84ace3c159c89478bdb16b6b7d8cb9ef90ec" + integrity sha512-v5APsXJEvn/Pyw5GJiNKPW2gPJPrxWykg4QcgyLlsFhMHHleshoqoAWW5Xm7wlc8m7fHWfiFlqW9ZG8AfrSTGg== "@ioredis/commands@^1.1.1": version "1.2.0" From 95f77e555884693d0e6ada4387597bbbc41836f9 Mon Sep 17 00:00:00 2001 From: Andrew James Date: Tue, 31 Oct 2023 15:47:58 -0600 Subject: [PATCH 062/106] feat: refetch stats and achievements when wallet connects --- .../Achievements/AchievementsLayout/AchievmentStores.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 70839bcad..894ad6878 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -9,6 +9,7 @@ import classNames from 'classnames' import { observer } from 'mobx-react-lite' import AchievementStoreState from 'frontend/state/AchievementStoreState' import useSetting from 'frontend/hooks/useSetting' +import walletStore from 'frontend/store/WalletStore' export const AchievementStores = observer(() => { const [steamId] = useSetting('steamId', '') @@ -24,7 +25,7 @@ export const AchievementStores = observer(() => { setPlayerStoreId(steamId) getAchievementsStats() syncAchievements('STEAM') - }, [steamId]) + }, [steamId, walletStore.address]) const activeSecondaryText = `${totalGames} Games` const isSteam = store === 'STEAM' From 290229e27a08bb719348ec9fafa3472c27f68298 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:21:45 -0800 Subject: [PATCH 063/106] update ext helper to main --- src/backend/hyperplay-extension-helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/hyperplay-extension-helper b/src/backend/hyperplay-extension-helper index 6b3686c39..145a7687a 160000 --- a/src/backend/hyperplay-extension-helper +++ b/src/backend/hyperplay-extension-helper @@ -1 +1 @@ -Subproject commit 6b3686c394d1f3db615c9f8cf63a5d8e85b133a5 +Subproject commit 145a7687a1039d7c5f00ff3d728e2a5402ec651c From 881c7e715b2d08ef2643c31f9bfc9208ed2f2883 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:27:12 -0800 Subject: [PATCH 064/106] fix translations --- public/locales/en/gamepage.json | 445 +++-- public/locales/en/translation.json | 1662 +++++++++-------- .../GameAchievementDetails/index.tsx | 4 +- src/frontend/screens/Achievements/index.tsx | 7 +- .../screens/Settings/components/SteamId.tsx | 2 +- .../sections/AccountSettings/index.tsx | 2 +- 6 files changed, 1066 insertions(+), 1056 deletions(-) diff --git a/public/locales/en/gamepage.json b/public/locales/en/gamepage.json index cb8e5fab5..5a5471ee3 100644 --- a/public/locales/en/gamepage.json +++ b/public/locales/en/gamepage.json @@ -1,223 +1,222 @@ -{ - "box": { - "change": { - "message": "This will change the install location of this game, are you sure?", - "path": "Choose a new install path", - "title": "Change Games Install Path" - }, - "choose": "Choose", - "importpath": "Choose Game Folder to import", - "move": { - "message": "This can take a long time, are you sure?", - "path": "Choose where you want to move", - "title": "Move Game Installation" - }, - "no": "NO", - "ok": "OK", - "repair": { - "message": "Do you want to try to repair this game? This can take a long time.", - "title": "Verify and Repair" - }, - "runexe": { - "title": "Select EXE to Run" - }, - "select": { - "button": "Select" - }, - "sideload": { - "exe": "Select Executable" - }, - "stopInstall": { - "keepFilesMessage": "Check here if you want to keep the download files after canceling.", - "keepInstalling": "Keep Installing", - "message": "Do you wish to KEEP downloaded files?", - "title": "Do you want to cancel the download?" - }, - "uninstall": { - "checkbox": "Remove prefix: {{prefix}}{{newLine}}Note: This can't be undone and will also remove not backed up save files.", - "dlc": "Do you want to Uninstall this DLC?", - "message": "Do you want to uninstall this game?", - "prefix_warning": "The Wine prefix for this game is the default prefix. If you really want to delete it, you have to do it manually.", - "settingcheckbox": "Erase settings and remove log{{newLine}}Note: This can't be undone. Any modified settings will be forgotten and log will be deleted.", - "title": "Uninstall" - }, - "update": { - "message": "This game has an update, apply update now?", - "message-cancel": "It is not possible to play this game without updating", - "title": "Game Needs Update" - }, - "wineprefix": "Select WinePrefix Folder", - "yes": "YES", - "yesCancel": "Yes, cancel" - }, - "button": { - "cancel": "Pause/Cancel", - "continue": "Continue Download", - "details": "Details", - "favorites": "Favorite", - "finish": "Finish", - "force_update": "Force Update if Available", - "force-innstall": "Force Install", - "hide_game": "Hide Game", - "import": "Import Game", - "install": "Install", - "no-path-selected": "No path selected", - "queue": { - "cancel": "Cancel Download", - "continue": "Continue Download", - "remove": "Remove from Queue" - }, - "remove_from_library": "Remove", - "remove_from_recent": "Remove From Recent", - "run-exe-first": "Run Installer First", - "running-setup": "Running Setup", - "sideload": { - "edit": "Edit App/Game" - }, - "unfavorites": "Unfavorite", - "unhide_game": "Unhide Game", - "uninstall": "Uninstall", - "update": "Update" - }, - "cloud_save_unsupported": "Unsupported", - "disabled": "Disabled", - "dlc": { - "installDlcs": "Install all DLCs" - }, - "enabled": "Enabled", - "game": { - "dlcs": "DLCs", - "downloadSize": "Download Size", - "firstPlayed": "First Played", - "getting-download-size": "Getting download size", - "getting-install-size": "Getting install size", - "installSize": "Install Size", - "language": "Language", - "lastPlayed": "Last Played", - "neverPlayed": "Never", - "platform": "Select Platform", - "requirements": "System Requirements", - "selectChannelName": "Select Channel Name", - "totalPlayed": "Time Played" - }, - "gamecard": { - "moving": "Moving", - "repairing": "Repairing" - }, - "generic": { - "error": "Unknown error", - "noDescription": "No description available" - }, - "hyperplay": { - "gamecard": { - "extracting": "Extracting...", - "installing": "Downloading...", - "paused": "Paused" - } - }, - "info": { - "canRunOffline": "Online Required", - "installedPlatform": "Installed Platform", - "path": "Install Path", - "size": "Size", - "syncsaves": "Sync Saves", - "version": "Version", - "web3-supported": "Has Web3 features" - }, - "install": { - "disk-space-left": "Space Available", - "not-enough-disk-space": "Not enough disk space", - "path": "Select Install Path", - "path-not-writtable": "Warning: path might not be writable.", - "space-after-install": "After Install", - "wineprefix": "WinePrefix", - "wineversion": "Wine version" - }, - "label": { - "playing": { - "start": "Play", - "stop": "Playing (Stop)" - }, - "saves": { - "syncing": "Syncing Saves" - } - }, - "launch": { - "options": "Launch Options..." - }, - "not_logged_in": { - "amazon": "You are not logged in with an Amazon account in Hyperplay. Don't use the store page to login, click the following button instead:", - "epic": "You are not logged in with an Epic account in HyperPlay. Don't use the store page to login, click the following button instead:", - "gog": "You are not logged in with a GOG account in HyperPlay. Don't use the store page to login, click the following button instead:", - "login": "Log in", - "title": "You are NOT logged in" - }, - "report_problem": "Report a problem running this game", - "setting": { - "use-default-wine-settings": "Use Default Compatibility Settings", - "winecrossoverbottle": "CrossOver Bottle" - }, - "sideload": { - "field": { - "title": "Title" - }, - "info": { - "broser": "BrowserURL", - "exe": "Select Executable", - "image": "App Image", - "supports-web3": "This Games has Web3 Features", - "title": "Game/App Title" - }, - "placeholder": { - "image": "Paste an Image URL here", - "title": "Add a title to your Game/App", - "url": "Paste the Game URL here" - } - }, - "specs": { - "minimum": "Minimum", - "recommended": "Recommended" - }, - "status": { - "clickToUpdate": "Click to Update", - "downloading": "Downloading", - "extracting": "Extracting", - "gameNotAvailable": "Game not available", - "gog-goodie": "This game doesn't appear to be installable. Check downloadable content on https://gog.com/account", - "goodie": "Not installable", - "hasUpdates": "New Version Available!", - "installed": "Installed", - "installing": "Installing", - "moving": "Moving Installation, please wait", - "moving-files": "Moving file '{{file}}': {{percent}} ", - "notinstalled": "This game is not installed", - "notSupported": "Not supported", - "notSupportedGame": "Not Supported", - "paused": "Paused", - "playing": "Playing", - "preparing": "Preparing Download, please wait", - "processing": "Processing files, please wait", - "queued": "Queued", - "reparing": "Repairing Game, please wait", - "syncingSaves": "Syncing Saves", - "this-game-uses-third-party": "This game uses third party launcher and it is not supported yet", - "totalDownloaded": "Total Downloaded", - "uninstalling": "Uninstalling", - "updating": "Updating Game" - }, - "submenu": { - "addShortcut": "Add shortcut", - "addToSteam": "Add to Steam", - "change": "Change install path", - "disableEosOverlay": "Disable Epic Overlay", - "enableEosOverlay": "Enable Epic Overlay", - "extraInfo": "Extra Info", - "move": "Move Game", - "protondb": "Check Compatibility", - "removeFromSteam": "Remove from Steam", - "removeShortcut": "Remove shortcuts", - "settings": "Settings", - "store": "Store Page", - "verify": "Verify and Repair" - } -} +{ + "box": { + "change": { + "message": "This will change the install location of this game, are you sure?", + "path": "Choose a new install path", + "title": "Change Games Install Path" + }, + "choose": "Choose", + "importpath": "Choose Game Folder to import", + "move": { + "message": "This can take a long time, are you sure?", + "path": "Choose where you want to move", + "title": "Move Game Installation" + }, + "no": "NO", + "ok": "OK", + "repair": { + "message": "Do you want to try to repair this game? This can take a long time.", + "title": "Verify and Repair" + }, + "runexe": { + "title": "Select EXE to Run" + }, + "select": { + "button": "Select" + }, + "sideload": { + "exe": "Select Executable" + }, + "stopInstall": { + "keepFilesMessage": "Check here if you want to keep the download files after canceling.", + "keepInstalling": "Keep Installing", + "message": "Do you wish to KEEP downloaded files?", + "title": "Do you want to cancel the download?" + }, + "uninstall": { + "checkbox": "Remove prefix: {{prefix}}{{newLine}}Note: This can't be undone and will also remove not backed up save files.", + "dlc": "Do you want to Uninstall this DLC?", + "message": "Do you want to uninstall this game?", + "prefix_warning": "The Wine prefix for this game is the default prefix. If you really want to delete it, you have to do it manually.", + "settingcheckbox": "Erase settings and remove log{{newLine}}Note: This can't be undone. Any modified settings will be forgotten and log will be deleted.", + "title": "Uninstall" + }, + "update": { + "message": "This game has an update, apply update now?", + "message-cancel": "It is not possible to play this game without updating", + "title": "Game Needs Update" + }, + "wineprefix": "Select WinePrefix Folder", + "yes": "YES", + "yesCancel": "Yes, cancel" + }, + "button": { + "cancel": "Pause/Cancel", + "continue": "Continue Download", + "details": "Details", + "favorites": "Favorite", + "finish": "Finish", + "force_update": "Force Update if Available", + "force-innstall": "Force Install", + "hide_game": "Hide Game", + "import": "Import Game", + "install": "Install", + "no-path-selected": "No path selected", + "queue": { + "cancel": "Cancel Download", + "continue": "Continue Download", + "remove": "Remove from Queue" + }, + "remove_from_library": "Remove", + "remove_from_recent": "Remove From Recent", + "run-exe-first": "Run Installer First", + "running-setup": "Running Setup", + "sideload": { + "edit": "Edit App/Game" + }, + "unfavorites": "Unfavorite", + "unhide_game": "Unhide Game", + "uninstall": "Uninstall", + "update": "Update" + }, + "cloud_save_unsupported": "Unsupported", + "disabled": "Disabled", + "dlc": { + "installDlcs": "Install all DLCs" + }, + "enabled": "Enabled", + "game": { + "dlcs": "DLCs", + "downloadSize": "Download Size", + "firstPlayed": "First Played", + "getting-download-size": "Getting download size", + "getting-install-size": "Getting install size", + "installSize": "Install Size", + "language": "Language", + "lastPlayed": "Last Played", + "neverPlayed": "Never", + "platform": "Select Platform", + "requirements": "System Requirements", + "selectChannelName": "Select Channel Name", + "totalPlayed": "Time Played" + }, + "gamecard": { + "moving": "Moving", + "repairing": "Repairing" + }, + "generic": { + "error": "Unknown error", + "noDescription": "No description available" + }, + "hyperplay": { + "gamecard": { + "extracting": "Extracting...", + "installing": "Downloading...", + "paused": "Paused" + } + }, + "info": { + "canRunOffline": "Online Required", + "installedPlatform": "Installed Platform", + "path": "Install Path", + "size": "Size", + "syncsaves": "Sync Saves", + "version": "Version", + "web3-supported": "Has Web3 features" + }, + "install": { + "disk-space-left": "Space Available", + "not-enough-disk-space": "Not enough disk space", + "path": "Select Install Path", + "path-not-writtable": "Warning: path might not be writable.", + "space-after-install": "After Install", + "wineprefix": "WinePrefix", + "wineversion": "Wine version" + }, + "label": { + "playing": { + "start": "Play", + "stop": "Playing (Stop)", + "update": "Update" + }, + "saves": { + "syncing": "Syncing Saves" + } + }, + "launch": { + "options": "Launch Options..." + }, + "not_logged_in": { + "amazon": "You are not logged in with an Amazon account in Hyperplay. Don't use the store page to login, click the following button instead:", + "epic": "You are not logged in with an Epic account in HyperPlay. Don't use the store page to login, click the following button instead:", + "gog": "You are not logged in with a GOG account in HyperPlay. Don't use the store page to login, click the following button instead:", + "login": "Log in", + "title": "You are NOT logged in" + }, + "report_problem": "Report a problem running this game", + "setting": { + "use-default-wine-settings": "Use Default Compatibility Settings", + "winecrossoverbottle": "CrossOver Bottle" + }, + "sideload": { + "field": { + "title": "Title" + }, + "info": { + "broser": "BrowserURL", + "exe": "Select Executable", + "image": "App Image", + "supports-web3": "This Games has Web3 Features", + "title": "Game/App Title" + }, + "placeholder": { + "image": "Paste an Image URL here", + "title": "Add a title to your Game/App", + "url": "Paste the Game URL here" + } + }, + "specs": { + "minimum": "Minimum", + "recommended": "Recommended" + }, + "status": { + "downloading": "Downloading", + "extracting": "Extracting", + "gameNotAvailable": "Game not available", + "gog-goodie": "This game doesn't appear to be installable. Check downloadable content on https://gog.com/account", + "goodie": "Not installable", + "installed": "Installed", + "installing": "Installing", + "moving": "Moving Installation, please wait", + "moving-files": "Moving file '{{file}}': {{percent}} ", + "notinstalled": "This game is not installed", + "notSupported": "Not supported", + "notSupportedGame": "Not Supported", + "paused": "Paused", + "playing": "Playing", + "preparing": "Preparing Download, please wait", + "processing": "Processing files, please wait", + "queued": "Queued", + "reparing": "Repairing Game, please wait", + "syncingSaves": "Syncing Saves", + "this-game-uses-third-party": "This game uses third party launcher and it is not supported yet", + "totalDownloaded": "Total Downloaded", + "uninstalling": "Uninstalling", + "updating": "Updating Game" + }, + "submenu": { + "addShortcut": "Add shortcut", + "addToSteam": "Add to Steam", + "change": "Change install path", + "disableEosOverlay": "Disable Epic Overlay", + "enableEosOverlay": "Enable Epic Overlay", + "extraInfo": "Extra Info", + "move": "Move Game", + "protondb": "Check Compatibility", + "removeFromSteam": "Remove from Steam", + "removeShortcut": "Remove shortcuts", + "settings": "Settings", + "store": "Store Page", + "verify": "Verify and Repair" + } +} diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 93e74a2cb..3d5fba607 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,827 +1,835 @@ -{ - "accessibility": { - "actions_font_family_no_default": "Actions Font Family (Default: ", - "all_tiles_in_color": "Show all game tiles in color", - "content_font_family_no_default": "Content Font Family (Default: ", - "fonts": "Fonts", - "title": "Accessibility", - "zoom": "Zoom" - }, - "accounts": "accounts", - "add_game": "Add Game", - "All": "All", - "ALL": "ALL", - "amazon": "", - "Amazon": "Amazon", - "Amazon Games": "Amazon Games", - "analytics": "Analytics", - "anticheat": { - "anticheats": "Anticheats", - "may_not_work": "It may not work due to denied or broken anticheat support.", - "reference": "Reference", - "source": "Source", - "status": "Status", - "title": "This game includes anticheat software" - }, - "box": { - "cache-cleared": { - "message": "HyperPlay cache cleared.", - "title": "Cache cleared" - }, - "choose": "Choose", - "choose-egs-prefix": "Choose Prefix where EGS is installed", - "choose-gogdl-binary": "Select GOGDL Binary (needs restart)", - "choose-legendary-binary": "Select Legendary binary", - "customWine": "Select the Wine or Proton binary", - "default-install-path": "Choose Default Install Path", - "default-steam-path": "Steam path.", - "dontShowAgain": "Don't show again", - "downloadNow": "Download now", - "error": { - "add": { - "steam": { - "body": "Adding {{game}} to Steam failed with:{{newLine}} {{error}}", - "title": "Adding Error" - } - }, - "credentials": { - "message": "Your credentials have expired, please log out and log in again." - }, - "cx-bottle-not-found": { - "message": "The CrossOver bottle \"{{bottle_name}}\" does not exist, can't launch!", - "title": "CrossOver bottle not found" - }, - "diskspace": { - "message": "Not enough available disk space", - "title": "No Space" - }, - "dxvk": { - "message": "Error installing DXVK/VKD3D! Please check your connection!", - "title": "DXVK/VKD3D error" - }, - "folder-not-found": { - "title": "Game folder appears to be deleted, do you want to remove the game from the installed list?" - }, - "generic": { - "message": "", - "title": "Select EXE to Run" - }, - "launchAborted": "Launch aborted", - "moving": "Error Moving Game {{error}}", - "title": "Error", - "ubisoft-connect": { - "message": "Installation of Ubisoft Connect in the game prefix failed. Check our wiki page at https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/wiki/How-to-install-Ubisoft-Connect-on-Linux-and-Mac to install it maunally.", - "title": "Ubisoft Connect" - }, - "update": { - "message": "Something went wrong with the update! Please manually uninstall and reinstall HyperPlay.", - "title": "Update Error" - }, - "winetricks": { - "message": "Winetricks returned the following error during execution:{{newLine}}{{error}}", - "title": "Winetricks error" - } - }, - "info": { - "update": { - "changelog": "Open changelog", - "detail": "Do you want to download the update in the background?", - "message": "There is a new Version available!", - "message-finished": "Do you want to restart HyperPlay now?", - "title": "HyperPlay Games Launcher", - "title-finished": "Update Finished" - } - }, - "no": "NO", - "ok": "OK", - "protocol": { - "install": { - "not_installed": "Currently not installed. Install it?" - } - }, - "quit": { - "message": "There are pending operations, are you sure?", - "title": "Exit" - }, - "reset-app": { - "question": { - "message": "Are you sure you want to reset HyperPlay? This will remove all Settings and Caching but won't remove your Installed games or your Epic credentials. Portable versions (AppImage, WinPortable, ...) of HyperPlay needs to be restarted manually afterwards.", - "title": "Reset HyperPlay" - } - }, - "runexe": { - "title": "Select EXE to Run" - }, - "select": { - "button": "Select", - "exe": "Select EXE" - }, - "shortcuts": { - "message": "Shortcuts were created on Desktop and Start Menu", - "message-mac": "Shortcuts were created on the Applications folder", - "message-remove": "Shortcuts were removed from Desktop and Start Menu", - "message-remove-mac": "Shortcuts were removed from the Applications folder", - "title": "Shortcuts" - }, - "sync": { - "button": "Choose", - "error": "Invalid Path", - "title": "Choose the saves directory" - }, - "vcruntime": { - "install": { - "message": "The download links for the Visual C++ Runtimes have been opened. Please install both the x86 and x64 versions." - }, - "notfound": { - "message": "The Microsoft Visual C++ Runtimes are not installed, which are required by some games", - "title": "VCRuntime not installed" - } - }, - "warning": { - "epic": { - "import": "Epic Servers are having major outage right now, the game cannot be imported!", - "install": "Epic Servers are having major outage right now, the game cannot be installed!", - "update": "Epic Servers are having major outage right now, the game cannot be updated!" - }, - "title": "Warning", - "wine-change": { - "message": "We could not find the selected wine version to launch this title ({{selectedWine}}). {{newline}} We found another one, do you want to continue launching using {{foundWine}} ?", - "title": "Wine not found!" - } - }, - "wineprefix": "Choose Wine Prefix Folder", - "yes": "YES" - }, - "button": { - "cancel": "Cancel", - "continue": "Continue", - "download": "Download", - "go_to_library": "Go to Library", - "sync": "Sync", - "syncing": "Syncing", - "unsync": "Unsync" - }, - "controller": { - "hints": { - "back": "Back", - "backspace": "Backspace", - "close_dialog": "Close dialog", - "close_keyboard": "Close keyboard", - "close_options": "Close Options", - "game_details": "Game details", - "game_settings": "Game settings", - "install_game": "Install game", - "move_cursor": "Move cursor", - "open_virtual_keyboard": "Open virtual keyboard", - "options": "Options", - "play_game": "Play game", - "scroll": "Scroll", - "select": "Select", - "space": "Space", - "update_game": "Update game" - } - }, - "dlc": { - "actions": "Actions", - "installDlcs": "Install all DLCs", - "noDlcFound": "No DLCs found", - "size": "Size", - "title": "Title" - }, - "dlcs": { - "label": "Select DLCs to install:" - }, - "download-manager": { - "ETA": "Estimated Time", - "install-type": { - "install": "Install", - "update": "Update" - }, - "label": { - "disk": "Disk", - "speed": "Download" - }, - "queue": { - "end-time": "Finished at", - "queue-time": "Added at", - "start-time": "Started at", - "type": "Type" - }, - "title": "Downloads" - }, - "epic": { - "offline-notification-body": "Online services may not work fully as Epic Games servers are offline!", - "offline-notification-title": "offline" - }, - "Epic Games": "Epic Games", - "error": "Error", - "exit_game": "Exit Game", - "externalLink": { - "dontAskAgain": "Don't ask again", - "warning": "You are about to open an external link." - }, - "favourites": "Favourites", - "game": { - "status": "Status", - "store": "Store", - "title": "Game Title" - }, - "gameRelease": { - "alpha": "Alpha", - "beta": "Beta", - "demo": "Demo", - "main": "Main", - "prototype": "Prototype" - }, - "generic": { - "error": { - "component": "No Games found - Try to logout and login again or one of the options bellow" - }, - "library": { - "refresh": "Refresh Library" - } - }, - "globalSettings": "Global Settings", - "GOG": "GOG", - "header": { - "show_available_games": "Show non-available games", - "show_hidden": "Show Hidden", - "store": "Filter Store" - }, - "help": { - "amdfsr": "AMD's FSR helps boost framerate by upscaling lower resolutions in Fullscreen Mode. Image quality increases from 5 to 1 at the cost of a slight performance hit. Enabling may improve performance.", - "custom_themes_path": "Do not use CSS files from untrusted sources. When in doubt, ask for a review in our Discord channel.", - "custom_themes_wiki": "Check the Wiki for more details on adding custom themes. Click here.", - "disable_logs": "Toggle this checkbox ON to disable most of the writes to log files (critical information is always logged). Make sure to turn OFF this setting before reporting any issue.", - "dxvk": "DXVK is a Vulkan-based translational layer for DirectX 9, 10 and 11 games. Enabling may improve compatibility. Might cause issues especially for older DirectX games.", - "dxvkfpslimit": "Sets a frame rate cap for DXVK games", - "dxvknvapi": "DXVK-NVAPI is an implementation of NVAPI built on top of DXVK and the linux native NVAPI, it allows for the usage of DLSS on Nvidia GPUs.", - "esync": "Esync aims to reduce wineserver overhead in CPU-intensive games. Enabling may improve performance.", - "fsync": "Fsync aims to reduce wineserver overhead in CPU-intensive games. Enabling may improve performance on supported Linux kernels.", - "game_language": { - "fallback": "Leave blank to use HyperPlay's language.", - "in_game_config": "Not all games support this configuration, some have in-game language setting.", - "valid_codes": "Valid language codes are game-dependant." - }, - "gamemode": "Feral GameMode applies automatic and temporary tweaks to the system when running games. Enabling may improve performance.", - "general": "Sync with EGL if you have a working installation of the Epic Games Launcher elsewhere and want to import your games to avoid downloading them again.", - "mangohud": "MangoHUD is an overlay that displays and monitors FPS, temperatures, CPU/GPU load and other system resources.", - "other": { - "part4": "Use the ", - "part5": "Game Arguments", - "part6": " to be called after the launch command, for instance: ", - "part7": " to skip the launcher in some games, etc." - }, - "preferSystemLibs": "Custom Wine versions (Wine-GE, Wine-Lutris) are shipped with their library dependencies. By enabling this option, these shipped libraries will be ignored and Wine will load system libraries instead. Warning! Issues may occur if dependencies are not met.", - "primerun": "Use dedicated graphics card to render game on multi-GPU systems. Only needed on gaming laptops or desktops that use a headless GPU for rendering (NVIDIA Optimus, AMD CrossFire)", - "steam_path": { - "info": "This path lets HyperPlay determine what version of Proton Steam uses, for adding non-Steam games to Steam." - }, - "steamruntime": "Custom libraries provided by Steam to help run Linux and Windows (Proton) games. Enabling might improve compatibility.", - "sync": { - "part1": "HyperPlay tries to guess the right save folder and this will work on the majority of cases. In case the folder is wrong, use the override box to change it.", - "part2": "In case you change the prefix folder for Wine or Proton, you will need to check the path again since Proton uses a different prefix (/pfx) and username (steamuser). So you can simple erase the current path get out of the sync settings page and get back again for HyperPlay to guess the folder one more time with the right prefix.", - "part3": "Manual Sync: Choose Download to download the games saves stored on the Cloud. Upload to upload the local ones to the cloud. Force Download and Force Upload will ignore the version that is locally or on the cloud.", - "part4": "Sync Saves Automatically will sync the saves every time you Start a Game and after finishing playing." - }, - "vkd3d": "VKD3D is a Vulkan-based translational layer for DirectX 12 games. Enabling may improve compatibility significantly. Has no effect on older DirectX games.", - "wine": { - "part1": "HyperPlay searches for versions of Wine, Proton, and CrossOver in the following folders:", - "part2": "For other places, use a symbolic link to one of these folders" - } - }, - "hyperplay": { - "accesscodes": { - "error": { - "validation": "Access code is invalid" - }, - "success": { - "validation": "Success! Access code is valid" - } - }, - "analyticsOff": "Analytics is turned off", - "analyticsOn": "Analytics is turned on", - "browserImport": { - "appId": "App Id", - "profile": "Profile" - }, - "buttons": { - "agree": "I agree", - "noThanks": "No Thanks" - }, - "changeWallet": "Change wallet", - "copyUrl": "Copy URL", - "currentWallet": "Current wallet", - "discordApp": "Discord", - "folder": "Folder", - "misc": "Never", - "onboarding": { - "analytics": { - "anonymized": "Send anonymized click & game interaction;", - "body": "HyperPlay would like to gather usage data to better understand how our users interact with the application. This information helps us understand how you use the app and lets us make HyperPlay even better for you.", - "hyperplayWill": "HyperPlay will:", - "neverCollectIP": " collect your full IP address;", - "neverCollectPersonal": " collect keys, addresses, balances, hashes, or any personal information;", - "neverSellData": " sell data for profit. Ever!", - "optOut": "Always allow you to opt-out via Settings;", - "privacyCaption": "This data is aggregated and is therefore anonymous for the purposes of General Data Protection Regulation (EU) 2016/679. For more information in relation to our privacy practices, please see our ", - "privacyPolicyHere": "Privacy Policy here.", - "title": "Help Us improve HyperPlay!" - }, - "connectAgain": "Connect again", - "connectionCanceled": { - "description": "Please confirm the connection request on your mobile wallet to proceed.", - "title": "Connection canceled!" - }, - "connectionConnected": { - "description": "Your wallet is connected. You are ready to game.", - "title": "Wallet connected!" - }, - "terms": "Terms of Service.", - "walletSelection": { - "pleaseConnect": "Please connect your wallet, or download the Metamask mobile-app to get\n started:", - "screens": { - "import": { - "cantFindProfile": "Can't find your browser profile?", - "createNewWallet": "Create new MM extension wallet", - "details": "By importing, your MetaMask installation and settings will be imported into HyperPlay.", - "title": "Select the browser to import from", - "useRecoveryPhrase": "Access with secret recovery phrase" - }, - "info": { - "createWalletCTA": "Create a wallet", - "createWalletDescription": "Click in “Create a wallet” below if you do not have a wallet or want to create a new one:", - "digitalAssets": { - "details": "Wallets are used to send, receive, store, and display digital assets like tokens and NFTs.", - "title": "A Home for your Digital Assets" - }, - "login": { - "details": "An alternative to creating new accounts and passwords on every website, just connect your wallet instead.", - "title": "A New Way to Log In" - }, - "skip": "Skip for now", - "title": "What is a wallet?" - }, - "scan": { - "details": "Create an encrypted communication channel. Your keys will never be shared with HyperPlay.", - "dontHaveWallet": "Don’t have a wallet?", - "getMetamask": "Get MetaMask", - "title": "Scan QR with ", - "updateWarning": "Having issues? Make sure MetaMask is up to date." - } - }, - "title": "Wallet Connections" - }, - "welcome": { - "text": { - "bugs": "Please note that HyperPlay is a public alpha. Many features are still\n in development, and there will be bugs.", - "communityCTA_1": "We'd love your feedback and to have you join us in our", - "communityCTA_2": "community. Together, let's shape the future of gaming!", - "construction": "HyperPlay is under construction.", - "description": "HyperPlay is a game launcher and game store aggregator from the\n future. With HyperPlay, you can carry your wallet, tokens, and assets\n into every game. HyperPlay supports the entire library of the Epic\n Store, GOG, and our own HyperPlay store. By using HyperPlay, you agree\n to our" - }, - "title": "Welcome to HyperPlay Early Access!" - } - }, - "otp": "One Time Passcode", - "publicAlpha": "Public Alpha", - "turnAnalyticsOff": "Turn off", - "turnAnalyticsOn": "Turn on", - "viewFullscreen": "View fullscreen", - "viewItem": "View {{item}}", - "viewPortfolio": "View portfolio", - "wallet": { - "connected": "Connected", - "notConnected": "Not connected" - } - }, - "HyperPlay": "", - "hyperplayOverlay": { - "chainRequest": { - "CONFIRMED": "Custom network added", - "FAILED": "Custom network canceled", - "INITIATED": "Custom network request" - }, - "closeOverlay": "Press {{overlayKeyMod}} + X to close the overlay", - "description": { - "CONFIRMED": "The transaction was successfully confirmed!", - "FAILED": "The transaction was canceled or not submitted, please try again", - "INITIATED": "A wallet confirmation is pending in your mobile wallet", - "PENDING": "Waiting for blockchain confirmation. We'll let you know when it's confirmed" - }, - "extensionNotification": { - "DESCRIPTION": "Press {{overlayKeyMod}} + X to see this transaction", - "TITLE": "Transaction requested" - }, - "greeting": { - "description": "HyperPlay Overlay is ready! Press {{overlayKeyMod}} + X to show or hide it.", - "title": "HyperPlay Overlay" - }, - "signatureRequest": { - "CONFIRMED": "Signature submitted", - "FAILED": "Signature interrupted", - "INITIATED": "Signature request pending" - }, - "txnRequest": { - "CONFIRMED": "Transaction confirmed", - "FAILED": "Transaction interrupted", - "INITIATED": "Transaction request pending", - "PENDING": "Transaction submitted" - }, - "walletWatch": { - "CONFIRMED": "Custom token added", - "FAILED": "Custom token request canceled", - "INITIATED": "Add custom token request pending" - } - }, - "info": { - "hyperplay": { - "version": "HyperPlay Version" - }, - "save-sync": { - "searching": "Trying to detect the correct save folder (click to cancel)" - }, - "settings": "Settings are saved automatically", - "version": "Wine Version" - }, - "infobox": { - "help": "Help", - "requirements": "System Requirements", - "warning": "Warning", - "wine-path": "Wine Path", - "wine-path-invalid": "Wine Path is invalid, please select another one.", - "wine-path-none-found": "No Wine version was found, download one from the Compatibility Manager", - "wine-prefix": { - "title": "Wine Prefix" - }, - "wine-repfix": { - "message": "Wine uses what is called a WINEPREFIX to encapsulate Windows applications. This prefix contains the Wine configuration files and a reproduction of the file hierarchy of C: (the main disk on a Windows OS). In this reproduction of the C: drive, your game save files and dependencies installed via winetricks are stored." - } - }, - "library": { - "alphabeticalAZ": "Alphabetical A-Z", - "alphabeticalZA": "Alphabetical Z-A", - "label": "Library", - "refresh": "Refresh", - "sortByStatus": "Sort by Status" - }, - "loading": { - "default": "Loading", - "website": "Loading Website" - }, - "login": { - "alternative_method": "Alternative Login Method", - "amazon": "Amazon Login", - "epic": "Epic Games Login", - "gog": "GOG Login", - "message": "Login with your platform. You can login to more than one platform at the same time." - }, - "message": { - "sync": "Sync Complete", - "unsync": "Unsync Complete" - }, - "notify": { - "error": { - "move": "Error Moving the Game", - "reparing": "Error Repairing" - }, - "finished": { - "add": { - "steam": { - "corrupt": "{{game}} could not be added to all found Steam users. See logs for more info. A restart of Steam is required for changes to take effect.", - "success": "{{game}} was successfully added to Steam. A restart of Steam is required for changes to take effect.", - "title": "Added to Steam" - } - }, - "remove": { - "steam": { - "corrupt": "{{game}} could not be removed from all found Steam users. See logs for more info. A restart of Steam is required for changes to take effect.", - "success": "{{game}} was successfully removed from Steam. A restart of Steam is required for changes to take effect.", - "title": "Removed from Steam" - } - }, - "reparing": "Finished Repairing" - }, - "install": { - "canceled": "Installation Canceled", - "error": "Installation Failed", - "finished": "Installation Finished", - "imported": "Game Imported", - "paused": "Installation Paused", - "startInstall": "Installation Started", - "stopped": "Installation stopped" - }, - "moved": "Finished Moving", - "moving": "Moving Game", - "refresh": { - "error": "Couldn't fetch releases from upstream, maybe because of Github API restrictions! Try again later." - }, - "uninstalled": "Uninstalled", - "update": { - "canceled": "Update Canceled", - "finished": "Update Finished", - "paused": "Update Paused", - "started": "Update Started", - "stopped": "Update stopped" - } - }, - "offline-message": { - "hint": "We are checking the connectivity against:{{newline}}github.com,{{newline}}gog.com,{{newline}}store.epicgames.com and{{newline}}cloudflare-dns.com", - "ignore": "Ignore", - "offline": "Offline", - "offline-retry-in": "Offline. Retrying in {{seconds}} seconds.", - "retrying": "Retrying" - }, - "Open": "", - "options": { - "advanced": { - "key": "Variable Name", - "placeHolderKey": "NAME", - "placeHolderValue": "E.g.: Path/To/ExtraFiles", - "title": "Environment Variables", - "value": "Value" - }, - "env_variables": { - "error": { - "empty_key": "Variable names can't be empty", - "equal_sign_in_key": "Variable names can't contain the \"=\" sign", - "space_in_key": "Variable names can't contain spaces" - }, - "example": "Do NOT include the \"=\" sign, e.g: for a setting like \"MY_FLAG=123\", set MY_FLAG in NAME and 123 in VALUE.", - "info": "Set environment variables to append to the command." - }, - "gameargs": { - "placeholder": "Put here the Launcher Arguments", - "title": "Game Arguments (To run after the command):" - }, - "quote-args-with-spaces": "Warning: Make sure to quote args with spaces! E.g.: \"path/with spaces/\"", - "wrapper": { - "args": "Arguments", - "arguments_example": "Arguments example: --arg; --extra-file=\"file-path/ with/spaces\"", - "exe": "Wrapper", - "placeHolderKey": "New Wrapper", - "placeHolderValue": "Wrapper Arguments", - "title": "Wrapper command:" - } - }, - "other": { - "gogdl-version": "GOGDL Version: ", - "legendary-version": "Legendary Version: ", - "weblate": "Help Translate HyperPlay." - }, - "Other": "Other", - "overlay": { - "EXTERNAL_WALLET_CONNECTED": "You are connected to HyperPlay with an external wallet. \n \n To approve transactions in the HyperPlay overlay, you will need to connect to HyperPlay with the MetaMask Extension." - }, - "placeholder": { - "alt-gogdl-bin": "Using built-in GOGDL binary...", - "alt-legendary-bin": "Using built-in Legendary binary...", - "custom_themes_path": "Select the path to look for custom CSS files", - "dxvkfpsvalue": "Positive integer value (e.g. 30, 60, ...)", - "egs-prefix": "Prefix where EGS is installed", - "prefered_language": "2-char code (i.e.: \"en\" or \"fr\")" - }, - "please-wait": "Please wait...", - "progress": "Progress", - "queue": { - "label": { - "canceled": "Canceled", - "clear": "Clear List", - "downloading": "Downloading", - "empty": "Nothing to download", - "finished": "Completed", - "pause": "Pause download", - "queued": "Queued", - "remove": "Remove from Downloads", - "resume": "Resume download" - } - }, - "Recent": "Played Recently", - "search": "Search for Games", - "setting": { - "adddesktopshortcuts": "Add desktop shortcuts automatically", - "addgamestoapplications": "Add games to Applications automatically", - "addgamestostartmenu": "Add games to start menu automatically", - "addgamestosteam": "Add games to Steam automatically", - "alt-gogdl-bin": "Choose an Alternative GOGDL Binary to use", - "alt-legendary-bin": "Choose an Alternative Legendary Binary", - "autodxvk": "Auto Install/Update DXVK on Prefix", - "autodxvknvapi": "Auto Install/Update DXVK-NVAPI on Prefix", - "autosync": "Autosync Saves", - "autoUpdateGames": "Automatically update games", - "autovkd3d": "Auto Install/Update VKD3D on Prefix", - "change-target-exe": "Select an alternative EXE to run", - "checkForUpdatesOnStartup": "Check for HyperPlay Updates on Startup", - "crossover-version": "Crossover/Wine Version", - "custom_themes_path": "Custom Themes Path", - "customWineProton": "Custom Wine/Proton Paths", - "darktray": "Use Dark Tray Icon", - "default-install-path": "Default Installation Path", - "default-steam-path": "Default Steam path", - "defaultWinePrefix": "Set Folder for new Wine Prefixes", - "disable_controller": "Disable Hyperplay navigation using controller", - "disable_logs": "Disable Logs", - "discordRPC": "Enable Discord Rich Presence", - "download-no-https": "Download games without HTTPS (useful for CDNs e.g. LanCache)", - "dxvkfpslimit": "Limit FPS (DX9, 10 and 11)", - "egs-sync": "Sync with Installed Epic Games", - "enableFSRHack": "Enable FSR Hack (Wine version needs to support it)", - "eosOverlay": { - "cancelInstall": "Cancel", - "checkForUpdates": "Check for updates", - "checkingForUpdates": "Checking for updates...", - "currentVersion": "Current Version: {{version}}", - "disable": "Disable", - "enable": "Enable", - "install": "Install", - "installed": "The Epic Overlay is installed", - "installing": "The Epic Overlay is being installed...", - "latestVersion": "Latest Version: {{version}}", - "notInstalled": "The Epic Overlay is not installed", - "notInstalledMsg": "The Epic Overlay is not installed. Do you want to install it now?", - "notInstalledTitle": "Overlay not installed", - "remove": "Uninstall", - "removeConfirm": "Are you sure you want to uninstall the Epic Overlay?", - "removeConfirmTitle": "Confirm overlay removal", - "updateNow": "Update", - "updating": "Updating..." - }, - "esync": "Enable Esync", - "exit-to-tray": "Exit to System Tray", - "experimental_features": { - "enableNewShinyFeature": "New shiny feature" - }, - "FsrSharpnessStrenght": "FSR Sharpness Strength", - "fsync": "Enable Fsync", - "gamemode": "Use GameMode (Feral Game Mode needs to be installed)", - "ignoreGameUpdates": "Ignore game updates", - "language": "Choose Language", - "library_top_option": { - "disabled": "Disabled", - "favourites": "Favourite Games", - "recently_played": "Recently Played Games", - "recently_played_installed": "Recently Played Games (Only Installed)" - }, - "library_top_section": "Library Top Section", - "log": { - "copy-to-clipboard": "Copy log content to clipboard", - "current-log": "Current Log", - "instructions_title": "How to report a problem?", - "instructions-part-01": "If you encounter any issues while using HyperPlay, we have two designated areas to report your issues in our Discord Server. If you're a player, please report any problems by visiting the player-support-forum. If you are a game dev, please report any problems by visiting the dev-support-forum.", - "instructions-part-02": "To help us diagnose and fix the problem as quickly as possible, please provide as much information as possible, including a copy of your logs. Our support team will monitor both channels and do their best to respond to your issue as quickly as possible. Thank you for your patience and understanding while we work to resolve any problems you may encounter.", - "last-log": "Last Log", - "no-file": "No log file found", - "show-in-folder": "Show log file in folder" - }, - "mangohud": "Enable Mangohud (Mangohud needs to be installed)", - "manualsync": { - "download": "Download", - "forcedownload": "Force Download", - "forceupload": "Force Upload", - "sync": "Sync", - "syncing": "Syncing", - "title": "Manual Sync Saves", - "upload": "Upload" - }, - "maxRecentGames": "Played Recently to Show", - "maxworkers": "Maximum Number of Workers when downloading", - "minimize-on-launch": "Minimize HyperPlay After Game Launch", - "offlinemode": "Run Game Offline", - "prefered_language": "Prefered Language (Language Code)", - "preferSystemLibs": "Prefer system libraries", - "primerun": { - "confirmation": { - "message": "Only one graphics card was detected in this system. Please note that this option is intended for multi-GPU systems with headless GPUs (like laptops). On single-GPU systems, the GPU is automatically used & enabling this option can cause issues. Do you really want to enable this option?", - "title": "Only 1 GPU detected" - }, - "description": "Use Dedicated Graphics Card" - }, - "runexe": { - "message": "Drag and Drop Files here", - "title": "Run EXE on Prefix" - }, - "savefolder": { - "not-found": "Save folder not found, please select it manually (click to retry)", - "placeholder": "Select the exact save games folder", - "warning": "Please check twice if the path is correct (click to retry)" - }, - "select_theme": "Select Theme", - "showfps": "Show FPS (DX9, 10 and 11)", - "showMetalOverlay": "Show Stats Overlay", - "start-in-tray": "Start Minimized", - "steamruntime": "Use Steam Runtime", - "winecrossoverbottle": "CrossOver Bottle", - "wineprefix": "WinePrefix folder", - "wineversion": "Wine Version" - }, - "settings": { - "battlEyeRuntime": { - "installing": "Installing BattlEye Runtime...", - "name": "BattlEye AntiCheat Runtime" - }, - "clear-cache": "Clear HyperPlay Cache", - "copiedToClipboard": "Copied to Clipboard!", - "copyToClipboard": "Copy All Settings to Clipboard", - "default_hint": "Changes in this section only apply as default values when installing games. If you want to change the settings of an already installed game, use the Settings button in the game page.", - "eacRuntime": { - "gameModeRequired": { - "message": "GameMode is required for the EAC runtime to work on Flatpak. Do you want to enable it now?", - "title": "GameMode required" - }, - "installing": "Installing EAC Runtime...", - "name": "EasyAntiCheat Runtime" - }, - "experimental_features": { - "title": "Experimental Features" - }, - "gameMode": { - "eacRuntimeEnabled": { - "message": "The EAC runtime is enabled, which won't function correctly without GameMode. Do you want to disable the EAC Runtime and GameMode?", - "title": "EAC runtime enabled" - } - }, - "gamesSettings": "Games Settings", - "log": { - "long-log-hint": "Log truncated, last 1000 lines are shown!" - }, - "navbar": { - "advanced": "Advanced", - "general": "General", - "log": "Log", - "other": "Other", - "sync": "Cloud Saves Sync" - }, - "open-config-file": "Open Config File", - "reset-hyperplay": "Reset HyperPlay", - "saves": { - "warning": "Cloud Saves feature is in Beta, please backup your saves before syncing (in case something goes wrong)" - }, - "wine": { - "manager": { - "title": "" - } - } - }, - "Settings": "Settings", - "sideload": { - "warningMessage": "Side-loading a game is a feature intended for developers and experienced power users. Side-loading an installer that contains malware could compromise your computer and lead to theft of funds.", - "warningTitle": "Important" - }, - "status": { - "installing": "Installing", - "logging": "Logging In...", - "preparing_login": "Preparing Login... ", - "processing": "Processing files, please wait" - }, - "store": "Epic Store", - "title": { - "allGames": "All Games" - }, - "toolbox": { - "settings": { - "default-wineprefix": "Select the default prefix folder for new configs", - "wineprefix": "Select a Folder for new Wine Prefixes" - } - }, - "tooltip": { - "addpath": "Add New Path", - "removepath": "Remove Path" - }, - "tray": { - "about": "About", - "quit": "Quit", - "reload": "Reload", - "show": "Show" - }, - "two_col_table": { - "save_hint": "Changes in this table are not saved automatically. Click the + button" - }, - "userselector": { - "logging_out": "Logging out", - "logout": "Log out", - "logout_confirmation": "Are you sure you want to log out?", - "manageaccounts": "Manage Accounts", - "quit": "Quit" - }, - "webview": { - "controls": { - "back": "Go back", - "forward": "Go forward", - "openInBrowser": "Open in browser", - "reload": "Reload page" - } - }, - "wiki_info": { - "not_found": "We couldn't find extra information." - }, - "wine": { - "actions": "Action", - "manager": { - "not-found": "No Wine versions found. Please click the refresh icon to try again.", - "title": "Compatibility Layer ", - "unzipping": "Unzipping" - }, - "release": "Release Date", - "size": "Size" - } -} +{ + "accessibility": { + "actions_font_family_no_default": "Actions Font Family (Default: ", + "all_tiles_in_color": "Show all game tiles in color", + "content_font_family_no_default": "Content Font Family (Default: ", + "fonts": "Fonts", + "title": "Accessibility", + "zoom": "Zoom" + }, + "accounts": "accounts", + "achievements": { + "progress": { + "minted": "on chain", + "notMinted": "off chain" + } + }, + "add_game": "Add Game", + "All": "All", + "ALL": "ALL", + "amazon": "", + "Amazon": "Amazon", + "Amazon Games": "Amazon Games", + "analytics": "Analytics", + "anticheat": { + "anticheats": "Anticheats", + "may_not_work": "It may not work due to denied or broken anticheat support.", + "reference": "Reference", + "source": "Source", + "status": "Status", + "title": "This game includes anticheat software" + }, + "box": { + "cache-cleared": { + "message": "HyperPlay cache cleared.", + "title": "Cache cleared" + }, + "choose": "Choose", + "choose-egs-prefix": "Choose Prefix where EGS is installed", + "choose-gogdl-binary": "Select GOGDL Binary (needs restart)", + "choose-legendary-binary": "Select Legendary binary", + "customWine": "Select the Wine or Proton binary", + "default-install-path": "Choose Default Install Path", + "default-steam-path": "Steam path.", + "dontShowAgain": "Don't show again", + "downloadNow": "Download now", + "error": { + "add": { + "steam": { + "body": "Adding {{game}} to Steam failed with:{{newLine}} {{error}}", + "title": "Adding Error" + } + }, + "credentials": { + "message": "Your credentials have expired, please log out and log in again." + }, + "cx-bottle-not-found": { + "message": "The CrossOver bottle \"{{bottle_name}}\" does not exist, can't launch!", + "title": "CrossOver bottle not found" + }, + "diskspace": { + "message": "Not enough available disk space", + "title": "No Space" + }, + "dxvk": { + "message": "Error installing DXVK/VKD3D! Please check your connection!", + "title": "DXVK/VKD3D error" + }, + "folder-not-found": { + "title": "Game folder appears to be deleted, do you want to remove the game from the installed list?" + }, + "generic": { + "message": "", + "title": "Select EXE to Run" + }, + "launchAborted": "Launch aborted", + "moving": "Error Moving Game {{error}}", + "title": "Error", + "ubisoft-connect": { + "message": "Installation of Ubisoft Connect in the game prefix failed. Check our wiki page at https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/wiki/How-to-install-Ubisoft-Connect-on-Linux-and-Mac to install it maunally.", + "title": "Ubisoft Connect" + }, + "update": { + "message": "Something went wrong with the update! Please manually uninstall and reinstall HyperPlay.", + "title": "Update Error" + }, + "winetricks": { + "message": "Winetricks returned the following error during execution:{{newLine}}{{error}}", + "title": "Winetricks error" + } + }, + "info": { + "update": { + "changelog": "Open changelog", + "detail": "Do you want to download the update in the background?", + "message": "There is a new Version available!", + "message-finished": "Do you want to restart HyperPlay now?", + "title": "HyperPlay Games Launcher", + "title-finished": "Update Finished" + } + }, + "no": "NO", + "ok": "OK", + "protocol": { + "install": { + "not_installed": "Currently not installed. Install it?" + } + }, + "quit": { + "message": "There are pending operations, are you sure?", + "title": "Exit" + }, + "reset-app": { + "question": { + "message": "Are you sure you want to reset HyperPlay? This will remove all Settings and Caching but won't remove your Installed games or your Epic credentials. Portable versions (AppImage, WinPortable, ...) of HyperPlay needs to be restarted manually afterwards.", + "title": "Reset HyperPlay" + } + }, + "runexe": { + "title": "Select EXE to Run" + }, + "select": { + "button": "Select", + "exe": "Select EXE" + }, + "shortcuts": { + "message": "Shortcuts were created on Desktop and Start Menu", + "message-mac": "Shortcuts were created on the Applications folder", + "message-remove": "Shortcuts were removed from Desktop and Start Menu", + "message-remove-mac": "Shortcuts were removed from the Applications folder", + "title": "Shortcuts" + }, + "sync": { + "button": "Choose", + "error": "Invalid Path", + "title": "Choose the saves directory" + }, + "vcruntime": { + "install": { + "message": "The download links for the Visual C++ Runtimes have been opened. Please install both the x86 and x64 versions." + }, + "notfound": { + "message": "The Microsoft Visual C++ Runtimes are not installed, which are required by some games", + "title": "VCRuntime not installed" + } + }, + "warning": { + "epic": { + "import": "Epic Servers are having major outage right now, the game cannot be imported!", + "install": "Epic Servers are having major outage right now, the game cannot be installed!", + "update": "Epic Servers are having major outage right now, the game cannot be updated!" + }, + "title": "Warning", + "wine-change": { + "message": "We could not find the selected wine version to launch this title ({{selectedWine}}). {{newline}} We found another one, do you want to continue launching using {{foundWine}} ?", + "title": "Wine not found!" + } + }, + "wineprefix": "Choose Wine Prefix Folder", + "yes": "YES" + }, + "button": { + "cancel": "Cancel", + "continue": "Continue", + "download": "Download", + "go_to_library": "Go to Library", + "sync": "Sync", + "syncing": "Syncing", + "unsync": "Unsync" + }, + "controller": { + "hints": { + "back": "Back", + "backspace": "Backspace", + "close_dialog": "Close dialog", + "close_keyboard": "Close keyboard", + "close_options": "Close Options", + "game_details": "Game details", + "game_settings": "Game settings", + "install_game": "Install game", + "move_cursor": "Move cursor", + "open_virtual_keyboard": "Open virtual keyboard", + "options": "Options", + "play_game": "Play game", + "scroll": "Scroll", + "select": "Select", + "space": "Space", + "update_game": "Update game" + } + }, + "dlc": { + "actions": "Actions", + "installDlcs": "Install all DLCs", + "noDlcFound": "No DLCs found", + "size": "Size", + "title": "Title" + }, + "dlcs": { + "label": "Select DLCs to install:" + }, + "download-manager": { + "ETA": "Estimated Time", + "install-type": { + "install": "Install", + "update": "Update" + }, + "label": { + "disk": "Disk", + "speed": "Download" + }, + "queue": { + "end-time": "Finished at", + "queue-time": "Added at", + "start-time": "Started at", + "type": "Type" + }, + "title": "Downloads" + }, + "epic": { + "offline-notification-body": "Online services may not work fully as Epic Games servers are offline!", + "offline-notification-title": "offline" + }, + "Epic Games": "Epic Games", + "error": "Error", + "exit_game": "Exit Game", + "externalLink": { + "dontAskAgain": "Don't ask again", + "warning": "You are about to open an external link." + }, + "favourites": "Favourites", + "game": { + "status": "Status", + "store": "Store", + "title": "Game Title" + }, + "gameRelease": { + "alpha": "Alpha", + "beta": "Beta", + "demo": "Demo", + "main": "Main", + "prototype": "Prototype" + }, + "generic": { + "error": { + "component": "No Games found - Try to logout and login again or one of the options bellow" + }, + "library": { + "refresh": "Refresh Library" + } + }, + "globalSettings": "Global Settings", + "GOG": "GOG", + "header": { + "show_available_games": "Show non-available games", + "show_hidden": "Show Hidden", + "store": "Filter Store" + }, + "help": { + "amdfsr": "AMD's FSR helps boost framerate by upscaling lower resolutions in Fullscreen Mode. Image quality increases from 5 to 1 at the cost of a slight performance hit. Enabling may improve performance.", + "custom_themes_path": "Do not use CSS files from untrusted sources. When in doubt, ask for a review in our Discord channel.", + "custom_themes_wiki": "Check the Wiki for more details on adding custom themes. Click here.", + "disable_logs": "Toggle this checkbox ON to disable most of the writes to log files (critical information is always logged). Make sure to turn OFF this setting before reporting any issue.", + "dxvk": "DXVK is a Vulkan-based translational layer for DirectX 9, 10 and 11 games. Enabling may improve compatibility. Might cause issues especially for older DirectX games.", + "dxvkfpslimit": "Sets a frame rate cap for DXVK games", + "dxvknvapi": "DXVK-NVAPI is an implementation of NVAPI built on top of DXVK and the linux native NVAPI, it allows for the usage of DLSS on Nvidia GPUs.", + "esync": "Esync aims to reduce wineserver overhead in CPU-intensive games. Enabling may improve performance.", + "fsync": "Fsync aims to reduce wineserver overhead in CPU-intensive games. Enabling may improve performance on supported Linux kernels.", + "game_language": { + "fallback": "Leave blank to use HyperPlay's language.", + "in_game_config": "Not all games support this configuration, some have in-game language setting.", + "valid_codes": "Valid language codes are game-dependant." + }, + "gamemode": "Feral GameMode applies automatic and temporary tweaks to the system when running games. Enabling may improve performance.", + "general": "Sync with EGL if you have a working installation of the Epic Games Launcher elsewhere and want to import your games to avoid downloading them again.", + "mangohud": "MangoHUD is an overlay that displays and monitors FPS, temperatures, CPU/GPU load and other system resources.", + "other": { + "part4": "Use the ", + "part5": "Game Arguments", + "part6": " to be called after the launch command, for instance: ", + "part7": " to skip the launcher in some games, etc." + }, + "preferSystemLibs": "Custom Wine versions (Wine-GE, Wine-Lutris) are shipped with their library dependencies. By enabling this option, these shipped libraries will be ignored and Wine will load system libraries instead. Warning! Issues may occur if dependencies are not met.", + "primerun": "Use dedicated graphics card to render game on multi-GPU systems. Only needed on gaming laptops or desktops that use a headless GPU for rendering (NVIDIA Optimus, AMD CrossFire)", + "steam_path": { + "info": "This path lets HyperPlay determine what version of Proton Steam uses, for adding non-Steam games to Steam." + }, + "steamruntime": "Custom libraries provided by Steam to help run Linux and Windows (Proton) games. Enabling might improve compatibility.", + "sync": { + "part1": "HyperPlay tries to guess the right save folder and this will work on the majority of cases. In case the folder is wrong, use the override box to change it.", + "part2": "In case you change the prefix folder for Wine or Proton, you will need to check the path again since Proton uses a different prefix (/pfx) and username (steamuser). So you can simple erase the current path get out of the sync settings page and get back again for HyperPlay to guess the folder one more time with the right prefix.", + "part3": "Manual Sync: Choose Download to download the games saves stored on the Cloud. Upload to upload the local ones to the cloud. Force Download and Force Upload will ignore the version that is locally or on the cloud.", + "part4": "Sync Saves Automatically will sync the saves every time you Start a Game and after finishing playing." + }, + "vkd3d": "VKD3D is a Vulkan-based translational layer for DirectX 12 games. Enabling may improve compatibility significantly. Has no effect on older DirectX games.", + "wine": { + "part1": "HyperPlay searches for versions of Wine, Proton, and CrossOver in the following folders:", + "part2": "For other places, use a symbolic link to one of these folders" + } + }, + "hyperplay": { + "accesscodes": { + "error": { + "validation": "Access code is invalid" + }, + "success": { + "validation": "Success! Access code is valid" + } + }, + "analyticsOff": "Analytics is turned off", + "analyticsOn": "Analytics is turned on", + "browserImport": { + "appId": "App Id", + "profile": "Profile" + }, + "buttons": { + "agree": "I agree", + "noThanks": "No Thanks" + }, + "changeWallet": "Change wallet", + "copyUrl": "Copy URL", + "currentWallet": "Current wallet", + "discordApp": "Discord", + "folder": "Folder", + "misc": "Never", + "onboarding": { + "analytics": { + "anonymized": "Send anonymized click & game interaction;", + "body": "HyperPlay would like to gather usage data to better understand how our users interact with the application. This information helps us understand how you use the app and lets us make HyperPlay even better for you.", + "hyperplayWill": "HyperPlay will:", + "neverCollectIP": " collect your full IP address;", + "neverCollectPersonal": " collect keys, addresses, balances, hashes, or any personal information;", + "neverSellData": " sell data for profit. Ever!", + "optOut": "Always allow you to opt-out via Settings;", + "privacyCaption": "This data is aggregated and is therefore anonymous for the purposes of General Data Protection Regulation (EU) 2016/679. For more information in relation to our privacy practices, please see our ", + "privacyPolicyHere": "Privacy Policy here.", + "title": "Help Us improve HyperPlay!" + }, + "connectAgain": "Connect again", + "connectionCanceled": { + "description": "Please confirm the connection request on your mobile wallet to proceed.", + "title": "Connection canceled!" + }, + "connectionConnected": { + "description": "Your wallet is connected. You are ready to game.", + "title": "Wallet connected!" + }, + "terms": "Terms of Service.", + "walletSelection": { + "pleaseConnect": "Please connect your wallet, or download the Metamask mobile-app to get\n started:", + "screens": { + "import": { + "cantFindProfile": "Can't find your browser profile?", + "createNewWallet": "Create new MM extension wallet", + "details": "By importing, your MetaMask installation and settings will be imported into HyperPlay.", + "title": "Select the browser to import from", + "useRecoveryPhrase": "Access with secret recovery phrase" + }, + "info": { + "createWalletCTA": "Create a wallet", + "createWalletDescription": "Click in “Create a wallet” below if you do not have a wallet or want to create a new one:", + "digitalAssets": { + "details": "Wallets are used to send, receive, store, and display digital assets like tokens and NFTs.", + "title": "A Home for your Digital Assets" + }, + "login": { + "details": "An alternative to creating new accounts and passwords on every website, just connect your wallet instead.", + "title": "A New Way to Log In" + }, + "skip": "Skip for now", + "title": "What is a wallet?" + }, + "scan": { + "details": "Create an encrypted communication channel. Your keys will never be shared with HyperPlay.", + "dontHaveWallet": "Don’t have a wallet?", + "getMetamask": "Get MetaMask", + "title": "Scan QR with ", + "updateWarning": "Having issues? Make sure MetaMask is up to date." + } + }, + "title": "Wallet Connections" + }, + "welcome": { + "text": { + "bugs": "Please note that HyperPlay is a public alpha. Many features are still\n in development, and there will be bugs.", + "communityCTA_1": "We'd love your feedback and to have you join us in our", + "communityCTA_2": "community. Together, let's shape the future of gaming!", + "construction": "HyperPlay is under construction.", + "description": "HyperPlay is a game launcher and game store aggregator from the\n future. With HyperPlay, you can carry your wallet, tokens, and assets\n into every game. HyperPlay supports the entire library of the Epic\n Store, GOG, and our own HyperPlay store. By using HyperPlay, you agree\n to our" + }, + "title": "Welcome to HyperPlay Early Access!" + } + }, + "otp": "One Time Passcode", + "publicAlpha": "Public Alpha", + "turnAnalyticsOff": "Turn off", + "turnAnalyticsOn": "Turn on", + "viewFullscreen": "View fullscreen", + "viewItem": "View {{item}}", + "viewPortfolio": "View portfolio", + "wallet": { + "connected": "Connected", + "notConnected": "Not connected" + } + }, + "HyperPlay": "", + "hyperplayOverlay": { + "chainRequest": { + "CONFIRMED": "Custom network added", + "FAILED": "Custom network canceled", + "INITIATED": "Custom network request" + }, + "closeOverlay": "Press {{overlayKeyMod}} + X to close the overlay", + "description": { + "CONFIRMED": "The transaction was successfully confirmed!", + "FAILED": "The transaction was canceled or not submitted, please try again", + "INITIATED": "A wallet confirmation is pending in your mobile wallet", + "PENDING": "Waiting for blockchain confirmation. We'll let you know when it's confirmed" + }, + "extensionNotification": { + "DESCRIPTION": "Press {{overlayKeyMod}} + X to see this transaction", + "TITLE": "Transaction requested" + }, + "greeting": { + "description": "HyperPlay Overlay is ready! Press {{overlayKeyMod}} + X to show or hide it.", + "title": "HyperPlay Overlay" + }, + "signatureRequest": { + "CONFIRMED": "Signature submitted", + "FAILED": "Signature interrupted", + "INITIATED": "Signature request pending" + }, + "txnRequest": { + "CONFIRMED": "Transaction confirmed", + "FAILED": "Transaction interrupted", + "INITIATED": "Transaction request pending", + "PENDING": "Transaction submitted" + }, + "walletWatch": { + "CONFIRMED": "Custom token added", + "FAILED": "Custom token request canceled", + "INITIATED": "Add custom token request pending" + } + }, + "info": { + "hyperplay": { + "version": "HyperPlay Version" + }, + "save-sync": { + "searching": "Trying to detect the correct save folder (click to cancel)" + }, + "settings": "Settings are saved automatically", + "version": "Wine Version" + }, + "infobox": { + "help": "Help", + "requirements": "System Requirements", + "warning": "Warning", + "wine-path": "Wine Path", + "wine-path-invalid": "Wine Path is invalid, please select another one.", + "wine-path-none-found": "No Wine version was found, download one from the Compatibility Manager", + "wine-prefix": { + "title": "Wine Prefix" + }, + "wine-repfix": { + "message": "Wine uses what is called a WINEPREFIX to encapsulate Windows applications. This prefix contains the Wine configuration files and a reproduction of the file hierarchy of C: (the main disk on a Windows OS). In this reproduction of the C: drive, your game save files and dependencies installed via winetricks are stored." + } + }, + "library": { + "alphabeticalAZ": "Alphabetical A-Z", + "alphabeticalZA": "Alphabetical Z-A", + "label": "Library", + "refresh": "Refresh", + "sortByStatus": "Sort by Status" + }, + "loading": { + "default": "Loading", + "website": "Loading Website" + }, + "login": { + "alternative_method": "Alternative Login Method", + "amazon": "Amazon Login", + "epic": "Epic Games Login", + "gog": "GOG Login", + "message": "Login with your platform. You can login to more than one platform at the same time." + }, + "message": { + "sync": "Sync Complete", + "unsync": "Unsync Complete" + }, + "notify": { + "error": { + "move": "Error Moving the Game", + "reparing": "Error Repairing" + }, + "finished": { + "add": { + "steam": { + "corrupt": "{{game}} could not be added to all found Steam users. See logs for more info. A restart of Steam is required for changes to take effect.", + "success": "{{game}} was successfully added to Steam. A restart of Steam is required for changes to take effect.", + "title": "Added to Steam" + } + }, + "remove": { + "steam": { + "corrupt": "{{game}} could not be removed from all found Steam users. See logs for more info. A restart of Steam is required for changes to take effect.", + "success": "{{game}} was successfully removed from Steam. A restart of Steam is required for changes to take effect.", + "title": "Removed from Steam" + } + }, + "reparing": "Finished Repairing" + }, + "install": { + "canceled": "Installation Canceled", + "error": "Installation Failed", + "finished": "Installation Finished", + "imported": "Game Imported", + "paused": "Installation Paused", + "startInstall": "Installation Started", + "stopped": "Installation stopped" + }, + "moved": "Finished Moving", + "moving": "Moving Game", + "refresh": { + "error": "Couldn't fetch releases from upstream, maybe because of Github API restrictions! Try again later." + }, + "uninstalled": "Uninstalled", + "update": { + "canceled": "Update Canceled", + "finished": "Update Finished", + "paused": "Update Paused", + "started": "Update Started", + "stopped": "Update stopped" + } + }, + "offline-message": { + "hint": "We are checking the connectivity against:{{newline}}github.com,{{newline}}gog.com,{{newline}}store.epicgames.com and{{newline}}cloudflare-dns.com", + "ignore": "Ignore", + "offline": "Offline", + "offline-retry-in": "Offline. Retrying in {{seconds}} seconds.", + "retrying": "Retrying" + }, + "Open": "", + "options": { + "advanced": { + "key": "Variable Name", + "placeHolderKey": "NAME", + "placeHolderValue": "E.g.: Path/To/ExtraFiles", + "title": "Environment Variables", + "value": "Value" + }, + "env_variables": { + "error": { + "empty_key": "Variable names can't be empty", + "equal_sign_in_key": "Variable names can't contain the \"=\" sign", + "space_in_key": "Variable names can't contain spaces" + }, + "example": "Do NOT include the \"=\" sign, e.g: for a setting like \"MY_FLAG=123\", set MY_FLAG in NAME and 123 in VALUE.", + "info": "Set environment variables to append to the command." + }, + "gameargs": { + "placeholder": "Put here the Launcher Arguments", + "title": "Game Arguments (To run after the command):" + }, + "quote-args-with-spaces": "Warning: Make sure to quote args with spaces! E.g.: \"path/with spaces/\"", + "wrapper": { + "args": "Arguments", + "arguments_example": "Arguments example: --arg; --extra-file=\"file-path/ with/spaces\"", + "exe": "Wrapper", + "placeHolderKey": "New Wrapper", + "placeHolderValue": "Wrapper Arguments", + "title": "Wrapper command:" + } + }, + "other": { + "gogdl-version": "GOGDL Version: ", + "legendary-version": "Legendary Version: ", + "weblate": "Help Translate HyperPlay." + }, + "Other": "Other", + "overlay": { + "EXTERNAL_WALLET_CONNECTED": "You are connected to HyperPlay with an external wallet. \n \n To approve transactions in the HyperPlay overlay, you will need to connect to HyperPlay with the MetaMask Extension." + }, + "placeholder": { + "alt-gogdl-bin": "Using built-in GOGDL binary...", + "alt-legendary-bin": "Using built-in Legendary binary...", + "custom_themes_path": "Select the path to look for custom CSS files", + "dxvkfpsvalue": "Positive integer value (e.g. 30, 60, ...)", + "egs-prefix": "Prefix where EGS is installed", + "prefered_language": "2-char code (i.e.: \"en\" or \"fr\")" + }, + "please-wait": "Please wait...", + "progress": "Progress", + "queue": { + "label": { + "canceled": "Canceled", + "clear": "Clear List", + "downloading": "Downloading", + "empty": "Nothing to download", + "finished": "Completed", + "pause": "Pause download", + "queued": "Queued", + "remove": "Remove from Downloads", + "resume": "Resume download" + } + }, + "Recent": "Played Recently", + "search": "Search for Games", + "setting": { + "adddesktopshortcuts": "Add desktop shortcuts automatically", + "addgamestoapplications": "Add games to Applications automatically", + "addgamestostartmenu": "Add games to start menu automatically", + "addgamestosteam": "Add games to Steam automatically", + "alt-gogdl-bin": "Choose an Alternative GOGDL Binary to use", + "alt-legendary-bin": "Choose an Alternative Legendary Binary", + "autodxvk": "Auto Install/Update DXVK on Prefix", + "autodxvknvapi": "Auto Install/Update DXVK-NVAPI on Prefix", + "autosync": "Autosync Saves", + "autoUpdateGames": "Automatically update games", + "autovkd3d": "Auto Install/Update VKD3D on Prefix", + "change-target-exe": "Select an alternative EXE to run", + "checkForUpdatesOnStartup": "Check for HyperPlay Updates on Startup", + "crossover-version": "Crossover/Wine Version", + "custom_themes_path": "Custom Themes Path", + "customWineProton": "Custom Wine/Proton Paths", + "darktray": "Use Dark Tray Icon", + "default-install-path": "Default Installation Path", + "default-steam-path": "Default Steam path", + "defaultWinePrefix": "Set Folder for new Wine Prefixes", + "disable_controller": "Disable Hyperplay navigation using controller", + "disable_logs": "Disable Logs", + "discordRPC": "Enable Discord Rich Presence", + "download-no-https": "Download games without HTTPS (useful for CDNs e.g. LanCache)", + "dxvkfpslimit": "Limit FPS (DX9, 10 and 11)", + "egs-sync": "Sync with Installed Epic Games", + "enableFSRHack": "Enable FSR Hack (Wine version needs to support it)", + "eosOverlay": { + "cancelInstall": "Cancel", + "checkForUpdates": "Check for updates", + "checkingForUpdates": "Checking for updates...", + "currentVersion": "Current Version: {{version}}", + "disable": "Disable", + "enable": "Enable", + "install": "Install", + "installed": "The Epic Overlay is installed", + "installing": "The Epic Overlay is being installed...", + "latestVersion": "Latest Version: {{version}}", + "notInstalled": "The Epic Overlay is not installed", + "notInstalledMsg": "The Epic Overlay is not installed. Do you want to install it now?", + "notInstalledTitle": "Overlay not installed", + "remove": "Uninstall", + "removeConfirm": "Are you sure you want to uninstall the Epic Overlay?", + "removeConfirmTitle": "Confirm overlay removal", + "updateNow": "Update", + "updating": "Updating..." + }, + "esync": "Enable Esync", + "exit-to-tray": "Exit to System Tray", + "experimental_features": { + "enableNewShinyFeature": "New shiny feature" + }, + "FsrSharpnessStrenght": "FSR Sharpness Strength", + "fsync": "Enable Fsync", + "gamemode": "Use GameMode (Feral Game Mode needs to be installed)", + "ignoreGameUpdates": "Ignore game updates", + "language": "Choose Language", + "library_top_option": { + "disabled": "Disabled", + "favourites": "Favourite Games", + "recently_played": "Recently Played Games", + "recently_played_installed": "Recently Played Games (Only Installed)" + }, + "library_top_section": "Library Top Section", + "log": { + "copy-to-clipboard": "Copy log content to clipboard", + "current-log": "Current Log", + "instructions_title": "How to report a problem?", + "instructions-part-01": "If you encounter any issues while using HyperPlay, we have two designated areas to report your issues in our Discord Server. If you're a player, please report any problems by visiting the player-support-forum. If you are a game dev, please report any problems by visiting the dev-support-forum.", + "instructions-part-02": "To help us diagnose and fix the problem as quickly as possible, please provide as much information as possible, including a copy of your logs. Our support team will monitor both channels and do their best to respond to your issue as quickly as possible. Thank you for your patience and understanding while we work to resolve any problems you may encounter.", + "last-log": "Last Log", + "no-file": "No log file found", + "show-in-folder": "Show log file in folder" + }, + "mangohud": "Enable Mangohud (Mangohud needs to be installed)", + "manualsync": { + "download": "Download", + "forcedownload": "Force Download", + "forceupload": "Force Upload", + "sync": "Sync", + "syncing": "Syncing", + "title": "Manual Sync Saves", + "upload": "Upload" + }, + "maxRecentGames": "Played Recently to Show", + "maxworkers": "Maximum Number of Workers when downloading", + "minimize-on-launch": "Minimize HyperPlay After Game Launch", + "offlinemode": "Run Game Offline", + "prefered_language": "Prefered Language (Language Code)", + "preferSystemLibs": "Prefer system libraries", + "primerun": { + "confirmation": { + "message": "Only one graphics card was detected in this system. Please note that this option is intended for multi-GPU systems with headless GPUs (like laptops). On single-GPU systems, the GPU is automatically used & enabling this option can cause issues. Do you really want to enable this option?", + "title": "Only 1 GPU detected" + }, + "description": "Use Dedicated Graphics Card" + }, + "runexe": { + "message": "Drag and Drop Files here", + "title": "Run EXE on Prefix" + }, + "savefolder": { + "not-found": "Save folder not found, please select it manually (click to retry)", + "placeholder": "Select the exact save games folder", + "warning": "Please check twice if the path is correct (click to retry)" + }, + "select_theme": "Select Theme", + "showfps": "Show FPS (DX9, 10 and 11)", + "showMetalOverlay": "Show Stats Overlay", + "start-in-tray": "Start Minimized", + "steamId": "Steam ID", + "steamruntime": "Use Steam Runtime", + "winecrossoverbottle": "CrossOver Bottle", + "wineprefix": "WinePrefix folder", + "wineversion": "Wine Version" + }, + "settings": { + "battlEyeRuntime": { + "installing": "Installing BattlEye Runtime...", + "name": "BattlEye AntiCheat Runtime" + }, + "clear-cache": "Clear HyperPlay Cache", + "copiedToClipboard": "Copied to Clipboard!", + "copyToClipboard": "Copy All Settings to Clipboard", + "default_hint": "Changes in this section only apply as default values when installing games. If you want to change the settings of an already installed game, use the Settings button in the game page.", + "eacRuntime": { + "gameModeRequired": { + "message": "GameMode is required for the EAC runtime to work on Flatpak. Do you want to enable it now?", + "title": "GameMode required" + }, + "installing": "Installing EAC Runtime...", + "name": "EasyAntiCheat Runtime" + }, + "experimental_features": { + "title": "Experimental Features" + }, + "gameMode": { + "eacRuntimeEnabled": { + "message": "The EAC runtime is enabled, which won't function correctly without GameMode. Do you want to disable the EAC Runtime and GameMode?", + "title": "EAC runtime enabled" + } + }, + "gamesSettings": "Games Settings", + "log": { + "long-log-hint": "Log truncated, last 1000 lines are shown!" + }, + "navbar": { + "accounts": "Accounts", + "advanced": "Advanced", + "general": "General", + "log": "Log", + "other": "Other", + "sync": "Cloud Saves Sync" + }, + "open-config-file": "Open Config File", + "reset-hyperplay": "Reset HyperPlay", + "saves": { + "warning": "Cloud Saves feature is in Beta, please backup your saves before syncing (in case something goes wrong)" + }, + "wine": { + "manager": { + "title": "" + } + } + }, + "Settings": "Settings", + "sideload": { + "warningMessage": "Side-loading a game is a feature intended for developers and experienced power users. Side-loading an installer that contains malware could compromise your computer and lead to theft of funds.", + "warningTitle": "Important" + }, + "status": { + "installing": "Installing", + "logging": "Logging In...", + "preparing_login": "Preparing Login... ", + "processing": "Processing files, please wait" + }, + "store": "Epic Store", + "title": { + "allGames": "All Games" + }, + "toolbox": { + "settings": { + "default-wineprefix": "Select the default prefix folder for new configs", + "wineprefix": "Select a Folder for new Wine Prefixes" + } + }, + "tooltip": { + "addpath": "Add New Path", + "removepath": "Remove Path" + }, + "tray": { + "about": "About", + "quit": "Quit", + "reload": "Reload", + "show": "Show" + }, + "two_col_table": { + "save_hint": "Changes in this table are not saved automatically. Click the + button" + }, + "userselector": { + "logging_out": "Logging out", + "logout": "Log out", + "logout_confirmation": "Are you sure you want to log out?", + "manageaccounts": "Manage Accounts", + "quit": "Quit" + }, + "webview": { + "controls": { + "back": "Go back", + "forward": "Go forward", + "openInBrowser": "Open in browser", + "reload": "Reload page" + } + }, + "wiki_info": { + "not_found": "We couldn't find extra information." + }, + "wine": { + "actions": "Action", + "manager": { + "not-found": "No Wine versions found. Please click the refresh icon to try again.", + "title": "Compatibility Layer ", + "unzipping": "Unzipping" + }, + "release": "Release Date", + "size": "Size" + } +} diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index dfbad44d9..5017aa73c 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -130,8 +130,8 @@ export default observer(function GameAchievementDetails(): JSX.Element { }} progressKeyProps={{ i18n: { - mintedLabel: t('achievements.progress.minted'), - notMintedLabel: t('achievements.progress.notMinted') + mintedLabel: t('achievements.progress.minted', 'on chain'), + notMintedLabel: t('achievements.progress.notMinted', 'off chain') } }} /> diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 5bb6391b3..e8d4dd609 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -114,8 +114,11 @@ export default observer(function Achievements(): JSX.Element { }} progressKeyProps={{ i18n: { - mintedLabel: t('achievements.progress.minted'), - notMintedLabel: t('achievements.progress.notMinted') + mintedLabel: t('achievements.progress.minted', 'on chain'), + notMintedLabel: t( + 'achievements.progress.notMinted', + 'off chain' + ) } }} /> diff --git a/src/frontend/screens/Settings/components/SteamId.tsx b/src/frontend/screens/Settings/components/SteamId.tsx index 0019d6816..e34947da9 100644 --- a/src/frontend/screens/Settings/components/SteamId.tsx +++ b/src/frontend/screens/Settings/components/SteamId.tsx @@ -15,7 +15,7 @@ const SteamId = () => { return ( setInstallPath(event.target.value)} diff --git a/src/frontend/screens/Settings/sections/AccountSettings/index.tsx b/src/frontend/screens/Settings/sections/AccountSettings/index.tsx index 4f953d97f..d239031a8 100644 --- a/src/frontend/screens/Settings/sections/AccountSettings/index.tsx +++ b/src/frontend/screens/Settings/sections/AccountSettings/index.tsx @@ -8,7 +8,7 @@ export default function AccountSettings() { return ( <>
- {t('settings.navbar.accounts')} + {t('settings.navbar.accounts', 'Accounts')}
From fdff19723cbc3c5cb7bad98a0da6ff8f31201f93 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:30:51 -0800 Subject: [PATCH 065/106] fix merge errors --- .../AchievementsLayout/AchievmentStores.tsx | 4 ++-- .../Achievements/GameAchievementDetails/index.tsx | 4 ++-- src/frontend/screens/Achievements/index.tsx | 8 ++++---- src/frontend/screens/Settings/index.tsx | 1 - src/frontend/state/AchievementStoreState.ts | 10 +++++----- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 894ad6878..4d0c8ac2d 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -9,7 +9,7 @@ import classNames from 'classnames' import { observer } from 'mobx-react-lite' import AchievementStoreState from 'frontend/state/AchievementStoreState' import useSetting from 'frontend/hooks/useSetting' -import walletStore from 'frontend/store/WalletStore' +import walletState from 'frontend/state/WalletState' export const AchievementStores = observer(() => { const [steamId] = useSetting('steamId', '') @@ -25,7 +25,7 @@ export const AchievementStores = observer(() => { setPlayerStoreId(steamId) getAchievementsStats() syncAchievements('STEAM') - }, [steamId, walletStore.address]) + }, [steamId, walletState.address]) const activeSecondaryText = `${totalGames} Games` const isSteam = store === 'STEAM' diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 5017aa73c..29bf2c01f 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -2,7 +2,7 @@ import { GameAchievements } from '@hyperplay/ui' import React, { useEffect, useState } from 'react' import { useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' -import walletStore from 'frontend/store/WalletStore' +import walletState from 'frontend/state/WalletState' import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' import AchievementStoreState from 'frontend/state/AchievementStoreState' @@ -68,7 +68,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { }) } - const isDisabled = isLoading || !walletStore.isConnected + const isDisabled = isLoading || !walletState.isConnected if (!summaryAchievement) return <> diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index e8d4dd609..802b49c95 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useMemo, useState } from 'react' -import walletStore from 'frontend/store/WalletStore' +import walletState from 'frontend/state/WalletState' import { AchievementCard, AchievementSummaryTable } from '@hyperplay/ui' import { AchievementFilter, AchievementSort } from 'common/types' @@ -44,7 +44,7 @@ export default observer(function Achievements(): JSX.Element { filter: activeFilter, sort: selectedSort.value }) - }, [store, playerStoreId, walletStore.address]) + }, [store, playerStoreId, walletState.address]) const handleNextPage = () => { const nextPage = achievementsData.currentPage + 1 @@ -66,7 +66,7 @@ export default observer(function Achievements(): JSX.Element { }) } - const isDisabled = isLoading || !walletStore.isConnected + const isDisabled = isLoading || !walletState.isConnected const filterMap = useMemo(() => { if (activeFilter === 'NEW') return 'new' @@ -81,7 +81,7 @@ export default observer(function Achievements(): JSX.Element { const id = String(game.gameId) const isUpdate = game.isNewAchievement && game.mintedAchievementCount > 0 - const state = !walletStore.isConnected + const state = !walletState.isConnected ? 'disabled' : achievementsToBeMinted.includes(id) || achievementsToBeUpdated.includes(id) diff --git a/src/frontend/screens/Settings/index.tsx b/src/frontend/screens/Settings/index.tsx index cc7db1962..526d4b620 100644 --- a/src/frontend/screens/Settings/index.tsx +++ b/src/frontend/screens/Settings/index.tsx @@ -17,7 +17,6 @@ import useSettingsContext from 'frontend/hooks/useSettingsContext' import { Tabs } from '@hyperplay/ui' import Accessibility from '../Accessibility' import WineManager from '../WineManager' -import ContextProvider from 'frontend/state/ContextProvider' import AccountSettings from './sections/AccountSettings' import { observer } from 'mobx-react-lite' import AchievementStoreState from 'frontend/state/AchievementStoreState' diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementStoreState.ts index 7a38ac9f0..ff9688b41 100644 --- a/src/frontend/state/AchievementStoreState.ts +++ b/src/frontend/state/AchievementStoreState.ts @@ -1,5 +1,5 @@ import { makeAutoObservable } from 'mobx' -import walletStore from 'frontend/store/WalletStore' +import walletState from 'frontend/state/WalletState' import type { Achievement, AchievementFilter, @@ -48,7 +48,7 @@ class AchievementStoreState { .getAchievementsStats({ store: this.store, playerStoreId: this.playerStoreId, - playerAddress: walletStore.address + playerAddress: walletState.address }) .then(this.setStats.bind(this)) } @@ -71,7 +71,7 @@ class AchievementStoreState { page, pageSize, playerStoreId: this.playerStoreId, - playerAddress: walletStore.address + playerAddress: walletState.address }) this.individualAchievements = individualAchievements } @@ -94,7 +94,7 @@ class AchievementStoreState { page, pageSize, playerStoreId: this.playerStoreId, - playerAddress: walletStore.address + playerAddress: walletState.address }) this.summaryAchievements = summaryAchievements @@ -104,7 +104,7 @@ class AchievementStoreState { window.api.syncAchievements({ store, playerStoreId: this.playerStoreId, - playerAddress: walletStore.address + playerAddress: walletState.address }) } From 57c23549b17b3d0d57071df78286655bcb2b5167 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:40:33 -0800 Subject: [PATCH 066/106] prettier --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4a677ad9b..b180efa8e 100644 --- a/package.json +++ b/package.json @@ -358,4 +358,4 @@ "postinstall-postinstall": true } } -} \ No newline at end of file +} From 13f7c91903d5dff52ef77262ec6dd96faef46ab4 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:25:32 -0800 Subject: [PATCH 067/106] rename achievementstorestate --- .../Sidebar/components/SidebarLinks/index.tsx | 4 ++-- .../AchievementsLayout/AchievementsStats.tsx | 10 +++++----- .../AchievementsLayout/AchievmentStores.tsx | 14 +++++++------- .../GameAchievementDetails/index.tsx | 18 +++++++++--------- src/frontend/screens/Achievements/index.tsx | 3 ++- src/frontend/screens/Settings/index.tsx | 4 ++-- ...vementStoreState.ts => AchievementState.ts} | 4 ++-- 7 files changed, 29 insertions(+), 28 deletions(-) rename src/frontend/state/{AchievementStoreState.ts => AchievementState.ts} (97%) diff --git a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx index 443386902..e81a19374 100644 --- a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx +++ b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx @@ -9,7 +9,7 @@ import { Images } from '@hyperplay/ui' import libraryState from 'frontend/state/libraryState' import { observer } from 'mobx-react-lite' import storeAuthState from 'frontend/state/storeAuthState' -import AchievementStoreState from 'frontend/state/AchievementStoreState' +import AchievementState from 'frontend/state/AchievementState' export default observer(function SidebarLinks() { const location = useLocation() as { pathname: string } @@ -83,7 +83,7 @@ export default observer(function SidebarLinks() {
- {AchievementStoreState.showAchievements && ( + {AchievementState.showAchievements && (
diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx index c7399c6b4..bc33be792 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx @@ -1,13 +1,13 @@ import { AchievementsInfo } from '@hyperplay/ui' import React from 'react' import { observer } from 'mobx-react-lite' -import AchievementStoreState from 'frontend/state/AchievementStoreState' +import AchievementState from 'frontend/state/AchievementState' export const AchievementsStats = observer(() => { - const newAchievements = AchievementStoreState.newAchievements - const mintedAchievements = AchievementStoreState.mintedAchievements - const totalAchievements = AchievementStoreState.totalAchievements - const totalGames = AchievementStoreState.totalGames + const newAchievements = AchievementState.newAchievements + const mintedAchievements = AchievementState.mintedAchievements + const totalAchievements = AchievementState.totalAchievements + const totalGames = AchievementState.totalGames return ( { const [steamId] = useSetting('steamId', '') - const store = AchievementStoreState.store - const totalGames = AchievementStoreState.totalGames - const setStore = AchievementStoreState.setStore - const syncAchievements = AchievementStoreState.syncAchievements - const setPlayerStoreId = AchievementStoreState.setPlayerStoreId - const getAchievementsStats = AchievementStoreState.getAchievementsStats + const store = AchievementState.store + const totalGames = AchievementState.totalGames + const setStore = AchievementState.setStore + const syncAchievements = AchievementState.syncAchievements + const setPlayerStoreId = AchievementState.setPlayerStoreId + const getAchievementsStats = AchievementState.getAchievementsStats useEffect(() => { setPlayerStoreId(steamId) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 29bf2c01f..30666002b 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -5,7 +5,7 @@ import { achievementsSortOptions } from '..' import walletState from 'frontend/state/WalletState' import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' -import AchievementStoreState from 'frontend/state/AchievementStoreState' +import AchievementState from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' const pageSize = 6 @@ -29,18 +29,18 @@ export default observer(function GameAchievementDetails(): JSX.Element { const handleUpdate = MintAchievementsState.handleUpdate const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated - const numFreeMints = AchievementStoreState.numFreeMints - const individualAchievements = AchievementStoreState.individualAchievements - const summaryAchievement = AchievementStoreState.summaryAchievements.data[0] + const numFreeMints = AchievementState.numFreeMints + const individualAchievements = AchievementState.individualAchievements + const summaryAchievement = AchievementState.summaryAchievements.data[0] useEffect(() => { - AchievementStoreState.getSummaryAchievements({ + AchievementState.getSummaryAchievements({ page: 1, pageSize, sort: selectedSort.value, filter: 'ALL' }) - AchievementStoreState.getIndividualAchievements({ + AchievementState.getIndividualAchievements({ gameId: id as string, page: 1, pageSize, @@ -50,7 +50,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { const handleNextPage = () => { const nextPage = individualAchievements.currentPage + 1 - AchievementStoreState.getIndividualAchievements({ + AchievementState.getIndividualAchievements({ gameId: id as string, page: nextPage, pageSize, @@ -60,7 +60,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { const handlePrevPage = () => { const prevPage = individualAchievements.currentPage - 1 - AchievementStoreState.getIndividualAchievements({ + AchievementState.getIndividualAchievements({ gameId: id as string, page: prevPage, pageSize, @@ -101,7 +101,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { ) if (chosenItem) { - AchievementStoreState.getIndividualAchievements({ + AchievementState.getIndividualAchievements({ gameId: id as string, page: 1, pageSize, diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 802b49c95..e272ecba4 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -7,7 +7,7 @@ import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' -import AchievementStoreState from 'frontend/state/AchievementStoreState' +import AchievementStoreState from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' const pageSize = 12 @@ -93,6 +93,7 @@ export default observer(function Achievements(): JSX.Element { return ( - {AchievementStoreState.showAchievements && ( + {AchievementState.showAchievements && ( diff --git a/src/frontend/state/AchievementStoreState.ts b/src/frontend/state/AchievementState.ts similarity index 97% rename from src/frontend/state/AchievementStoreState.ts rename to src/frontend/state/AchievementState.ts index ff9688b41..477bb4b7f 100644 --- a/src/frontend/state/AchievementStoreState.ts +++ b/src/frontend/state/AchievementState.ts @@ -9,7 +9,7 @@ import type { SummaryAchievement } from 'common/types' -class AchievementStoreState { +class AchievementState { store = 'STEAM' as AchievementStore playerStoreId = '76561199276514967' // Stats @@ -125,4 +125,4 @@ class AchievementStoreState { } } -export default new AchievementStoreState() +export default new AchievementState() From 43e5ae8c68a57535562a084017e62afe6631689e Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 22 Nov 2023 01:28:24 -0800 Subject: [PATCH 068/106] fix layout and increase page size --- src/backend/hyperplay-achievements | 2 +- .../Achievements/AchievementsLayout/AchievmentStores.tsx | 2 +- .../Achievements/AchievementsLayout/index.module.css | 7 ++++++- .../screens/Achievements/AchievementsLayout/index.tsx | 2 +- src/frontend/screens/Achievements/index.tsx | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index d79eb2d17..da5228c55 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit d79eb2d17171db6053a2181f9c1b327ab2ddce44 +Subproject commit da5228c55764392b3a1df64e1d36d5a8cccd7406 diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index aacd7e09a..2ae526a54 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -31,7 +31,7 @@ export const AchievementStores = observer(() => { const isSteam = store === 'STEAM' return ( -
+
My Stores
diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css index a9e25fd70..90a353783 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css @@ -9,6 +9,7 @@ border-radius: var(--space-md); background: var(--color-neutral-800); padding: var(--space-2lg); + flex: 1; } .storeTitle { @@ -18,9 +19,13 @@ } .fullHeight { - height: 100%; + max-height: 100%; } .notActive { opacity: 0.5; } + +.statsAndStoresContainer { + height: 100%; +} diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 34a1451e7..f7f3fe0bb 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -31,7 +31,7 @@ export default React.memo(function AchievementsLayout({ diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index e272ecba4..bc5a5fbd7 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -10,7 +10,7 @@ import { observer } from 'mobx-react-lite' import AchievementStoreState from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' -const pageSize = 12 +const pageSize = 100 export const achievementsSortOptions = [ { text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } From 651c696fe9ef1f3560819f4688f3a2ff4ccbaf2f Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 22 Nov 2023 16:34:52 -0800 Subject: [PATCH 069/106] back button individual game achievements page --- .../GameAchievementDetails/index.tsx | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 30666002b..a7833d876 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,6 +1,6 @@ import { GameAchievements } from '@hyperplay/ui' import React, { useEffect, useState } from 'react' -import { useParams } from 'react-router-dom' +import { useNavigate, useParams } from 'react-router-dom' import { achievementsSortOptions } from '..' import walletState from 'frontend/state/WalletState' import { useTranslation } from 'react-i18next' @@ -32,6 +32,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { const numFreeMints = AchievementState.numFreeMints const individualAchievements = AchievementState.individualAchievements const summaryAchievement = AchievementState.summaryAchievements.data[0] + const navigate = useNavigate() useEffect(() => { AchievementState.getSummaryAchievements({ @@ -48,24 +49,8 @@ export default observer(function GameAchievementDetails(): JSX.Element { }) }, []) - const handleNextPage = () => { - const nextPage = individualAchievements.currentPage + 1 - AchievementState.getIndividualAchievements({ - gameId: id as string, - page: nextPage, - pageSize, - sort: selectedSort.value - }) - } - const handlePrevPage = () => { - const prevPage = individualAchievements.currentPage - 1 - AchievementState.getIndividualAchievements({ - gameId: id as string, - page: prevPage, - pageSize, - sort: selectedSort.value - }) + navigate('/achievements') } const isDisabled = isLoading || !walletState.isConnected @@ -115,7 +100,6 @@ export default observer(function GameAchievementDetails(): JSX.Element { paginationProps={{ currentPage: individualAchievements.currentPage, totalPages: individualAchievements.totalPages, - handleNextPage, handlePrevPage }} mintButtonProps={{ From 5bae2cdbb4eee660347526b8b3752a28813747be Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:23:50 -0800 Subject: [PATCH 070/106] fix height no achievements --- .../screens/Achievements/AchievementsLayout/index.module.css | 5 +++++ .../screens/Achievements/AchievementsLayout/index.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css index 90a353783..1080b8869 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css @@ -29,3 +29,8 @@ .statsAndStoresContainer { height: 100%; } + +.achievementsContainer { + flex: 1; + max-height: 100%; +} diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index f7f3fe0bb..875acda23 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -25,7 +25,7 @@ export default React.memo(function AchievementsLayout({ return ( -
+
Date: Thu, 30 Nov 2023 00:36:42 -0800 Subject: [PATCH 071/106] add infinite scroll and fetch for summaries --- package.json | 1 - src/backend/hyperplay-achievements | 2 +- src/common/typedefs/ipcBridge.d.ts | 1 - src/common/types.ts | 2 +- .../GameAchievementDetails/index.tsx | 29 ++- src/frontend/screens/Achievements/index.tsx | 213 +++++++----------- src/frontend/state/AchievementState.ts | 157 ++++++++++--- yarn.lock | 5 - 8 files changed, 228 insertions(+), 182 deletions(-) diff --git a/package.json b/package.json index b180efa8e..604483363 100644 --- a/package.json +++ b/package.json @@ -156,7 +156,6 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", - "@hyperplay/ui": "^0.1.32", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", diff --git a/src/backend/hyperplay-achievements b/src/backend/hyperplay-achievements index da5228c55..40b507d5f 160000 --- a/src/backend/hyperplay-achievements +++ b/src/backend/hyperplay-achievements @@ -1 +1 @@ -Subproject commit da5228c55764392b3a1df64e1d36d5a8cccd7406 +Subproject commit 40b507d5f6e2f6e28cbede130f005a671c63e185 diff --git a/src/common/typedefs/ipcBridge.d.ts b/src/common/typedefs/ipcBridge.d.ts index d403a1c3b..8dae4a014 100644 --- a/src/common/typedefs/ipcBridge.d.ts +++ b/src/common/typedefs/ipcBridge.d.ts @@ -220,7 +220,6 @@ interface HyperPlayAsyncIPCFunctions { appIsInLibrary: (appName: string, runner: Runner) => Promise getSummaryAchievements: (options: GetAchievementsOptions) => Promise<{ data: SummaryAchievement[] - currentPage: number totalPages: number }> getIndividualAchievements: ( diff --git a/src/common/types.ts b/src/common/types.ts index 04a0d89c4..263ff930b 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -837,7 +837,7 @@ export interface GetAchievementsOptions extends PlayerOptions { filter: AchievementFilter sort: AchievementSort page: number - pageSize: number + pageSize?: number } export interface GetIndividualAchievementsOptions extends PlayerOptions { diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index a7833d876..c783d2922 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,11 +1,12 @@ import { GameAchievements } from '@hyperplay/ui' import React, { useEffect, useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' -import { achievementsSortOptions } from '..' import walletState from 'frontend/state/WalletState' import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' -import AchievementState from 'frontend/state/AchievementState' +import AchievementState, { + ACHIVEMENT_SORT_OPTIONS +} from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' const pageSize = 6 @@ -21,7 +22,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { const { t } = useTranslation() const { id } = useParams() - const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) + const [selectedSort, setSelectedSort] = useState(ACHIVEMENT_SORT_OPTIONS[0]) const achievementsToBeMinted = MintAchievementsState.achievementsToBeMinted const isLoading = MintAchievementsState.isLoading @@ -31,16 +32,11 @@ export default observer(function GameAchievementDetails(): JSX.Element { const numFreeMints = AchievementState.numFreeMints const individualAchievements = AchievementState.individualAchievements - const summaryAchievement = AchievementState.summaryAchievements.data[0] + // TODO: get the game id from the path param and find it in achievement state summaries + const summaryAchievement = AchievementState.summaryAchievementsToDisplay![0] const navigate = useNavigate() useEffect(() => { - AchievementState.getSummaryAchievements({ - page: 1, - pageSize, - sort: selectedSort.value, - filter: 'ALL' - }) AchievementState.getIndividualAchievements({ gameId: id as string, page: 1, @@ -78,10 +74,10 @@ export default observer(function GameAchievementDetails(): JSX.Element { isLocked: !isTimestampInPast(achievement.unlocktime) }))} sortProps={{ - options: achievementsSortOptions, + options: ACHIVEMENT_SORT_OPTIONS, selected: selectedSort, onItemChange: async (sortOption) => { - const chosenItem = achievementsSortOptions.find( + const chosenItem = ACHIVEMENT_SORT_OPTIONS.find( (option) => option.text === sortOption.text ) @@ -98,9 +94,12 @@ export default observer(function GameAchievementDetails(): JSX.Element { } }} paginationProps={{ - currentPage: individualAchievements.currentPage, - totalPages: individualAchievements.totalPages, - handlePrevPage + currentPage: 0, + totalPages: 0, + handlePrevPage, + handleNextPage: () => { + console.log('next page') + } }} mintButtonProps={{ onClick: handleMint, diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index bc5a5fbd7..b886f4e86 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -1,30 +1,19 @@ -import React, { useEffect, useMemo, useState } from 'react' +import React from 'react' import walletState from 'frontend/state/WalletState' - import { AchievementCard, AchievementSummaryTable } from '@hyperplay/ui' -import { AchievementFilter, AchievementSort } from 'common/types' import { NavLink } from 'react-router-dom' import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/components/StatusIcon' import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' -import AchievementStoreState from 'frontend/state/AchievementState' +import AchievementState, { + ACHIVEMENT_SORT_OPTIONS +} from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' -const pageSize = 100 -export const achievementsSortOptions = [ - { text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, - { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } -] as { text: string; value: AchievementSort }[] - export default observer(function Achievements(): JSX.Element { const { t } = useTranslation() - const [selectedSort, setSelectedSort] = useState(achievementsSortOptions[0]) - const [activeFilter, setActiveFilter] = useState('ALL') - - const store = AchievementStoreState.store - const playerStoreId = AchievementStoreState.playerStoreId - const numFreeMints = AchievementStoreState.numFreeMints + const numFreeMints = AchievementState.numFreeMints const achievementsToBeMinted = MintAchievementsState.achievementsToBeMinted const toggleAchievementToBeMinted = @@ -35,138 +24,101 @@ export default observer(function Achievements(): JSX.Element { const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated const toggleAchievementToBeUpdated = MintAchievementsState.toggleAchievementToBeUpdated - const achievementsData = AchievementStoreState.summaryAchievements - - useEffect(() => { - AchievementStoreState.getSummaryAchievements({ - page: 1, - pageSize, - filter: activeFilter, - sort: selectedSort.value - }) - }, [store, playerStoreId, walletState.address]) - - const handleNextPage = () => { - const nextPage = achievementsData.currentPage + 1 - AchievementStoreState.getSummaryAchievements({ - page: nextPage, - pageSize, - filter: activeFilter, - sort: selectedSort.value - }) - } - - const handlePrevPage = () => { - const prevPage = achievementsData.currentPage - 1 - AchievementStoreState.getSummaryAchievements({ - page: prevPage, - pageSize, - filter: activeFilter, - sort: selectedSort.value - }) - } const isDisabled = isLoading || !walletState.isConnected - const filterMap = useMemo(() => { - if (activeFilter === 'NEW') return 'new' - if (activeFilter === 'MINTED') return 'minted' - return 'all' - }, [activeFilter]) + if (AchievementState.summaryAchievementsToDisplay === undefined) { + AchievementState.fetchMoreSummaryAchievements() + } return ( <> { - const id = String(game.gameId) - const isUpdate = - game.isNewAchievement && game.mintedAchievementCount > 0 - const state = !walletState.isConnected - ? 'disabled' - : achievementsToBeMinted.includes(id) || - achievementsToBeUpdated.includes(id) - ? 'active' - : isUpdate - ? 'update' - : 'default' - - return ( - - { - e.preventDefault() - if (isUpdate) { - toggleAchievementToBeUpdated(id) - } else { - toggleAchievementToBeMinted(id) - } - }, - disabled: isDisabled - }} - progressKeyProps={{ - i18n: { - mintedLabel: t('achievements.progress.minted', 'on chain'), - notMintedLabel: t( - 'achievements.progress.notMinted', - 'off chain' - ) - } - }} - /> - - ) - })} + games={ + AchievementState.summaryAchievementsToDisplay + ? AchievementState.summaryAchievementsToDisplay.map((game) => { + const id = String(game.gameId) + const isUpdate = + game.isNewAchievement && game.mintedAchievementCount > 0 + const state = !walletState.isConnected + ? 'disabled' + : achievementsToBeMinted.includes(id) || + achievementsToBeUpdated.includes(id) + ? 'active' + : isUpdate + ? 'update' + : 'default' + + return ( + + { + e.preventDefault() + if (isUpdate) { + toggleAchievementToBeUpdated(id) + } else { + toggleAchievementToBeMinted(id) + } + }, + disabled: isDisabled + }} + progressKeyProps={{ + i18n: { + mintedLabel: t( + 'achievements.progress.minted', + 'on chain' + ), + notMintedLabel: t( + 'achievements.progress.notMinted', + 'off chain' + ) + } + }} + /> + + ) + }) + : [] + } sortProps={{ - options: achievementsSortOptions, - selected: selectedSort, + options: ACHIVEMENT_SORT_OPTIONS, + selected: AchievementState.currentSort, onItemChange: async (sortOption) => { - const chosenItem = achievementsSortOptions.find( + const chosenItem = ACHIVEMENT_SORT_OPTIONS.find( (option) => option.text === sortOption.text ) if (chosenItem) { - AchievementStoreState.getSummaryAchievements({ - page: 1, - pageSize, - filter: activeFilter, - sort: chosenItem.value - }) - - setSelectedSort(chosenItem) + AchievementState.setSort(chosenItem) } } }} paginationProps={{ - currentPage: achievementsData.currentPage, - totalPages: achievementsData.totalPages, - handleNextPage, - handlePrevPage + currentPage: 0, + totalPages: 0, + handleNextPage: () => { + console.log('handling next page') + }, + handlePrevPage: () => { + console.log('handling previous page') + } }} filterProps={{ - activeFilter: filterMap, - setActiveFilter: async (filter) => { - let newFilter = 'ALL' as AchievementFilter - if (filter === 'new') newFilter = 'NEW' - if (filter === 'minted') newFilter = 'MINTED' - - AchievementStoreState.getSummaryAchievements({ - page: 1, - pageSize, - filter: newFilter, - sort: selectedSort.value - }) - - setActiveFilter(newFilter) + activeFilter: AchievementState.filterDisplayName, + setActiveFilter: async (filterDisplayName) => { + const filter = + AchievementState.getFilterNameFromDisplayName(filterDisplayName) + AchievementState.setFilter(filter) } }} mintButtonProps={{ @@ -184,6 +136,9 @@ export default observer(function Achievements(): JSX.Element { basketAmount: achievementsToBeMinted.length + achievementsToBeUpdated.length }} + fetchNextPage={() => { + AchievementState.fetchMoreSummaryAchievements() + }} /> ) diff --git a/src/frontend/state/AchievementState.ts b/src/frontend/state/AchievementState.ts index 477bb4b7f..7a36b7384 100644 --- a/src/frontend/state/AchievementState.ts +++ b/src/frontend/state/AchievementState.ts @@ -9,30 +9,54 @@ import type { SummaryAchievement } from 'common/types' +interface AchievementData { + data: SummaryAchievement[] + pagesFetched: number + totalPages: number +} + +interface AchievementRequestKey { + filter: AchievementFilter + sort: AchievementSort +} + +interface AchievementSortOption { + text: string + value: AchievementSort +} + +export const ACHIVEMENT_SORT_OPTIONS = [ + { text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, + { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } +] as AchievementSortOption[] + class AchievementState { store = 'STEAM' as AchievementStore - playerStoreId = '76561199276514967' + playerStoreId = '' + // Stats newAchievements = 0 totalAchievements = 0 totalGames = 0 mintedAchievements = 0 numFreeMints = 0 + // Summary Achievements - summaryAchievements = { - data: [] as SummaryAchievement[], - totalPages: 0, - currentPage: 0 - } + summaryAchievements = new Map() + currentFilter: AchievementFilter = 'ALL' + currentSort: AchievementSortOption = ACHIVEMENT_SORT_OPTIONS[0] + // Individual Achievements individualAchievements = { data: [] as Achievement[], - totalPages: 0, - currentPage: 0 + totalPages: 0 } + // Achievements Feature Flag showAchievements = false + fetching = false + constructor() { makeAutoObservable(this) } @@ -76,31 +100,92 @@ class AchievementState { this.individualAchievements = individualAchievements } - getSummaryAchievements = async ({ - page, - pageSize, - filter, - sort - }: { - page: number - pageSize: number - filter: AchievementFilter - sort: AchievementSort - }) => { - const summaryAchievements = await window.api.getSummaryAchievements({ - store: this.store, - filter, - sort, - page, - pageSize, - playerStoreId: this.playerStoreId, - playerAddress: walletState.address - }) + async fetchMoreSummaryAchievements() { + if (this.fetching) { + return + } + if (!this.playerStoreId) { + console.error('player store id is not set!') + return + } + this.fetching = true + const pagesFetched = this.currentSummaryAchievements?.pagesFetched + const totalPages = this.currentSummaryAchievements?.totalPages + const alreadyFetchedAllPages = + pagesFetched !== undefined && + totalPages !== undefined && + pagesFetched >= totalPages + if (alreadyFetchedAllPages) { + this.fetching = false + return + } + const requestKey: AchievementRequestKey = { + filter: this.currentFilter, + sort: this.currentSort.value + } + + const nextPageOfSummaryAchievements = + await window.api.getSummaryAchievements({ + store: this.store, + filter: requestKey.filter, + sort: requestKey.sort, + // api is one indexed not zero indexed + page: pagesFetched ? pagesFetched + 1 : 1, + playerStoreId: this.playerStoreId, + playerAddress: walletState.address + }) + + const valRef = this.summaryAchievements.get(JSON.stringify(requestKey)) + + if (valRef !== undefined) { + valRef.data = valRef.data.concat(nextPageOfSummaryAchievements.data) + valRef.pagesFetched += 1 + } else { + this.summaryAchievements.set(JSON.stringify(requestKey), { + data: nextPageOfSummaryAchievements.data, + pagesFetched: 1, + totalPages: nextPageOfSummaryAchievements.totalPages + }) + } + this.fetching = false + } - this.summaryAchievements = summaryAchievements + get currentSummaryAchievements() { + const key = { + filter: this.currentFilter, + sort: this.currentSort.value + } + return this.summaryAchievements.get(JSON.stringify(key)) + } + + get summaryAchievementsToDisplay() { + return this.currentSummaryAchievements?.data + } + + /** + * Fetch for current key if no game summaries have been fetched + */ + initGameSummaryKey() { + if (this.summaryAchievementsToDisplay === undefined) { + this.fetchMoreSummaryAchievements() + } + } + + setFilter(filter: AchievementFilter) { + this.currentFilter = filter + this.initGameSummaryKey() + } + + setSort(sort: AchievementSortOption) { + this.currentSort = sort + this.initGameSummaryKey() } syncAchievements = (store: AchievementStore) => { + if (!this.playerStoreId) { + console.error('player store id is not set!') + return + } window.api.syncAchievements({ store, playerStoreId: this.playerStoreId, @@ -123,6 +208,20 @@ class AchievementState { setPlayerStoreId = (playerStoreId: string) => { this.playerStoreId = playerStoreId } + + get filterDisplayName() { + const activeFilter = this.currentFilter + if (activeFilter === 'NEW') return 'new' + if (activeFilter === 'MINTED') return 'minted' + return 'all' + } + + getFilterNameFromDisplayName(displayName: string) { + let newFilter = 'ALL' as AchievementFilter + if (displayName === 'new') newFilter = 'NEW' + if (displayName === 'minted') newFilter = 'MINTED' + return newFilter + } } export default new AchievementState() diff --git a/yarn.lock b/yarn.lock index b8ffd55fc..95d92a670 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1668,11 +1668,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/ui@^0.1.32": - version "0.1.32" - resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.32.tgz#f06b84ace3c159c89478bdb16b6b7d8cb9ef90ec" - integrity sha512-v5APsXJEvn/Pyw5GJiNKPW2gPJPrxWykg4QcgyLlsFhMHHleshoqoAWW5Xm7wlc8m7fHWfiFlqW9ZG8AfrSTGg== - "@ioredis/commands@^1.1.1": version "1.2.0" resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" From eb65726d4199da91e0fff3d6d932bd6343912aba Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:32:05 -0800 Subject: [PATCH 072/106] add refresh animation --- .../AchievementsLayout/AchievmentStores.tsx | 10 ++++++++-- .../AchievementsLayout/index.module.css | 13 +++++++++++++ src/frontend/state/AchievementState.ts | 13 ++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 2ae526a54..cadd79006 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -47,8 +47,14 @@ export const AchievementStores = observer(() => { > {isSteam ? : } -
diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css index 1080b8869..adc1477c9 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css @@ -34,3 +34,16 @@ flex: 1; max-height: 100%; } + +.refreshing { + animation: refreshing 1.5s infinite; +} + +@keyframes refreshing { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/frontend/state/AchievementState.ts b/src/frontend/state/AchievementState.ts index 7a36b7384..d2a87f0b4 100644 --- a/src/frontend/state/AchievementState.ts +++ b/src/frontend/state/AchievementState.ts @@ -57,6 +57,8 @@ class AchievementState { fetching = false + syncing = false + constructor() { makeAutoObservable(this) } @@ -181,16 +183,21 @@ class AchievementState { this.initGameSummaryKey() } - syncAchievements = (store: AchievementStore) => { + async syncAchievements(store: AchievementStore) { if (!this.playerStoreId) { - console.error('player store id is not set!') + console.error('Player store id is not set!') + return + } + if (this.syncing) { return } - window.api.syncAchievements({ + this.syncing = true + await window.api.syncAchievements({ store, playerStoreId: this.playerStoreId, playerAddress: walletState.address }) + this.syncing = false } setStats = (state: AchievementsStats) => { From 37062c2c22c95dcb6935c21e6376afb3e3b26a5c Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:46:42 -0800 Subject: [PATCH 073/106] add store key, fix individual achievements page fetching --- .../components/UI/UpdateComponent/index.css | 2 +- .../GameAchievementDetails/index.tsx | 42 +++--- src/frontend/screens/Achievements/index.tsx | 6 +- src/frontend/state/AchievementState.ts | 139 +++++++++++++----- 4 files changed, 132 insertions(+), 57 deletions(-) diff --git a/src/frontend/components/UI/UpdateComponent/index.css b/src/frontend/components/UI/UpdateComponent/index.css index 8f39703e6..68250f8bf 100644 --- a/src/frontend/components/UI/UpdateComponent/index.css +++ b/src/frontend/components/UI/UpdateComponent/index.css @@ -3,7 +3,7 @@ height: 100%; font-size: var(--text-xl); color: var(--text-default); - background-color: var(--app-background); + background-color: transparent; } .UpdateComponent--topLevel { diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index c783d2922..02e1ebc27 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,13 +1,14 @@ import { GameAchievements } from '@hyperplay/ui' -import React, { useEffect, useState } from 'react' +import React, { useEffect } from 'react' import { useNavigate, useParams } from 'react-router-dom' import walletState from 'frontend/state/WalletState' import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' import AchievementState, { - ACHIVEMENT_SORT_OPTIONS + ACHIEVEMENT_SORT_OPTIONS } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' +import Loading from 'frontend/screens/Loading' const pageSize = 6 @@ -22,8 +23,6 @@ export default observer(function GameAchievementDetails(): JSX.Element { const { t } = useTranslation() const { id } = useParams() - const [selectedSort, setSelectedSort] = useState(ACHIVEMENT_SORT_OPTIONS[0]) - const achievementsToBeMinted = MintAchievementsState.achievementsToBeMinted const isLoading = MintAchievementsState.isLoading const handleMint = MintAchievementsState.handleMint @@ -31,20 +30,23 @@ export default observer(function GameAchievementDetails(): JSX.Element { const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated const numFreeMints = AchievementState.numFreeMints - const individualAchievements = AchievementState.individualAchievements - // TODO: get the game id from the path param and find it in achievement state summaries - const summaryAchievement = AchievementState.summaryAchievementsToDisplay![0] - const navigate = useNavigate() + const individualAchievements = AchievementState.individualAchievementsForGame( + id ?? '0' + ) + + const summaryAchievement = AchievementState.getSummaryAchievement( + id as string + ) useEffect(() => { - AchievementState.getIndividualAchievements({ + AchievementState.fetchIndividualAchievements({ gameId: id as string, page: 1, - pageSize, - sort: selectedSort.value + pageSize }) }, []) + const navigate = useNavigate() const handlePrevPage = () => { navigate('/achievements') } @@ -53,7 +55,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { if (!summaryAchievement) return <> - return ( + return individualAchievements !== undefined ? ( { - const chosenItem = ACHIVEMENT_SORT_OPTIONS.find( + const chosenItem = ACHIEVEMENT_SORT_OPTIONS.find( (option) => option.text === sortOption.text ) if (chosenItem) { - AchievementState.getIndividualAchievements({ + AchievementState.currentIndividualSort = chosenItem + AchievementState.fetchIndividualAchievements({ gameId: id as string, page: 1, - pageSize, - sort: chosenItem.value + pageSize }) - - setSelectedSort(chosenItem) } } }} @@ -118,5 +118,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { } }} /> + ) : ( + ) }) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index b886f4e86..6401d0983 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -6,7 +6,7 @@ import { StatusIconState } from '@hyperplay/ui/dist/components/AchievementCard/c import { useTranslation } from 'react-i18next' import { observer } from 'mobx-react-lite' import AchievementState, { - ACHIVEMENT_SORT_OPTIONS + ACHIEVEMENT_SORT_OPTIONS } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' @@ -91,10 +91,10 @@ export default observer(function Achievements(): JSX.Element { : [] } sortProps={{ - options: ACHIVEMENT_SORT_OPTIONS, + options: ACHIEVEMENT_SORT_OPTIONS, selected: AchievementState.currentSort, onItemChange: async (sortOption) => { - const chosenItem = ACHIVEMENT_SORT_OPTIONS.find( + const chosenItem = ACHIEVEMENT_SORT_OPTIONS.find( (option) => option.text === sortOption.text ) diff --git a/src/frontend/state/AchievementState.ts b/src/frontend/state/AchievementState.ts index d2a87f0b4..0838f0f7d 100644 --- a/src/frontend/state/AchievementState.ts +++ b/src/frontend/state/AchievementState.ts @@ -1,4 +1,4 @@ -import { makeAutoObservable } from 'mobx' +import { makeAutoObservable, runInAction } from 'mobx' import walletState from 'frontend/state/WalletState' import type { Achievement, @@ -18,6 +18,7 @@ interface AchievementData { interface AchievementRequestKey { filter: AchievementFilter sort: AchievementSort + store: AchievementStore } interface AchievementSortOption { @@ -25,7 +26,17 @@ interface AchievementSortOption { value: AchievementSort } -export const ACHIVEMENT_SORT_OPTIONS = [ +interface IndividualAchievementKey { + gameId: string + sort: AchievementSort + store: AchievementStore +} + +interface IndividualAchievementData { + data: Achievement[] +} + +export const ACHIEVEMENT_SORT_OPTIONS = [ { text: 'Alphabetically (ASC)', value: 'ALPHA_A_TO_Z' }, { text: 'Alphabetically (DES)', value: 'ALPHA_Z_TO_A' } ] as AchievementSortOption[] @@ -44,13 +55,12 @@ class AchievementState { // Summary Achievements summaryAchievements = new Map() currentFilter: AchievementFilter = 'ALL' - currentSort: AchievementSortOption = ACHIVEMENT_SORT_OPTIONS[0] + currentSort: AchievementSortOption = ACHIEVEMENT_SORT_OPTIONS[0] + currentStore: AchievementStore = 'STEAM' // Individual Achievements - individualAchievements = { - data: [] as Achievement[], - totalPages: 0 - } + individualAchievements = new Map() + currentIndividualSort: AchievementSortOption = ACHIEVEMENT_SORT_OPTIONS[0] // Achievements Feature Flag showAchievements = false @@ -60,7 +70,15 @@ class AchievementState { syncing = false constructor() { - makeAutoObservable(this) + makeAutoObservable( + this, + {}, + { + deep: true, + proxy: false, + name: 'AchievementState' + } + ) } init() { @@ -79,30 +97,54 @@ class AchievementState { .then(this.setStats.bind(this)) } - getIndividualAchievements = async ({ + individualAchievementsKey(gameId: string) { + const key: IndividualAchievementKey = { + gameId, + store: this.currentStore, + sort: this.currentIndividualSort.value + } + const keyString = JSON.stringify(key) + return keyString + } + + async fetchIndividualAchievements({ gameId, page, - pageSize, - sort + pageSize }: { gameId: string page: number pageSize: number - sort: AchievementSort - }) => { + }) { + const keyString = this.individualAchievementsKey(gameId) + + /** + * Check cache for hit + */ + if (this.individualAchievements.has(keyString)) { + return this.individualAchievements.get(keyString)?.data + } + const individualAchievements = await window.api.getIndividualAchievements({ gameId: Number(gameId), store: this.store, - sort, + sort: this.currentIndividualSort.value, page, pageSize, playerStoreId: this.playerStoreId, playerAddress: walletState.address }) - this.individualAchievements = individualAchievements + + this.individualAchievements.set(keyString, individualAchievements) + return individualAchievements.data + } + + individualAchievementsForGame(gameId: string) { + const keyString = this.individualAchievementsKey(gameId) + return this.individualAchievements.get(keyString) } - async fetchMoreSummaryAchievements() { + fetchMoreSummaryAchievements = async () => { if (this.fetching) { return } @@ -110,7 +152,7 @@ class AchievementState { console.error('player store id is not set!') return } - this.fetching = true + this.setFetching(true) const pagesFetched = this.currentSummaryAchievements?.pagesFetched const totalPages = this.currentSummaryAchievements?.totalPages const alreadyFetchedAllPages = @@ -118,13 +160,10 @@ class AchievementState { totalPages !== undefined && pagesFetched >= totalPages if (alreadyFetchedAllPages) { - this.fetching = false + this.setFetching(false) return } - const requestKey: AchievementRequestKey = { - filter: this.currentFilter, - sort: this.currentSort.value - } + const requestKey = this.currentSummaryKey const nextPageOfSummaryAchievements = await window.api.getSummaryAchievements({ @@ -149,14 +188,29 @@ class AchievementState { totalPages: nextPageOfSummaryAchievements.totalPages }) } - this.fetching = false + this.setFetching(false) } - get currentSummaryAchievements() { - const key = { + /** + * Necessary since strict-mode is enabled in mobx + */ + setFetching = (val: boolean) => { + runInAction(() => { + this.fetching = val + }) + } + + private get currentSummaryKey() { + const requestKey: AchievementRequestKey = { filter: this.currentFilter, - sort: this.currentSort.value + sort: this.currentSort.value, + store: this.currentStore } + return requestKey + } + + get currentSummaryAchievements() { + const key = this.currentSummaryKey return this.summaryAchievements.get(JSON.stringify(key)) } @@ -183,7 +237,7 @@ class AchievementState { this.initGameSummaryKey() } - async syncAchievements(store: AchievementStore) { + syncAchievements = async (store: AchievementStore) => { if (!this.playerStoreId) { console.error('Player store id is not set!') return @@ -191,13 +245,26 @@ class AchievementState { if (this.syncing) { return } - this.syncing = true - await window.api.syncAchievements({ - store, - playerStoreId: this.playerStoreId, - playerAddress: walletState.address + this.setSyncing(true) + try { + await window.api.syncAchievements({ + store, + playerStoreId: this.playerStoreId, + playerAddress: walletState.address + }) + } catch (err) { + console.error(err) + } + this.setSyncing(false) + } + + /** + * Necessary since strict-mode is enabled in mobx + */ + setSyncing = (val: boolean) => { + runInAction(() => { + this.syncing = val }) - this.syncing = false } setStats = (state: AchievementsStats) => { @@ -229,6 +296,12 @@ class AchievementState { if (displayName === 'minted') newFilter = 'MINTED' return newFilter } + + getSummaryAchievement(id: string) { + return this.summaryAchievementsToDisplay?.find( + (val) => val.gameId.toString() === id + ) + } } export default new AchievementState() From 019ce8c64e3f1953871bc102db98c9186b289314 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:30:39 -0800 Subject: [PATCH 074/106] disable eye for single store --- .../AchievementsLayout/AchievmentStores.tsx | 16 +++++++++------- src/frontend/state/AchievementState.ts | 5 +++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index cadd79006..ef003a1d9 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -40,13 +40,15 @@ export const AchievementStores = observer(() => { secondaryText={isSteam ? activeSecondaryText : '0 Games'} >
- + {AchievementState.storesEnabled.length > 1 ? ( + + ) : null}
diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 02e1ebc27..2e6a6b8ec 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -8,7 +8,6 @@ import AchievementState, { ACHIEVEMENT_SORT_OPTIONS } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' -import Loading from 'frontend/screens/Loading' const pageSize = 6 @@ -55,7 +54,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { if (!summaryAchievement) return <> - return individualAchievements !== undefined ? ( + return ( ({ + achievements={individualAchievements?.data.map((achievement) => ({ id: achievement.id, title: achievement.displayName, description: achievement.description, @@ -117,8 +116,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { notMintedLabel: t('achievements.progress.notMinted', 'off chain') } }} + loadingAchievements={individualAchievements === undefined} /> - ) : ( - ) }) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 6401d0983..689c7aaf7 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -139,6 +139,9 @@ export default observer(function Achievements(): JSX.Element { fetchNextPage={() => { AchievementState.fetchMoreSummaryAchievements() }} + isPageLoading={ + AchievementState.summaryAchievementsToDisplay === undefined + } /> ) From 6fe6b8cc1def91bc3ed63b3b08608e557330e2d0 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Fri, 1 Dec 2023 17:47:37 -0800 Subject: [PATCH 076/106] hide minted tab if none minted --- src/frontend/screens/Achievements/index.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 689c7aaf7..256f7332c 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -31,6 +31,14 @@ export default observer(function Achievements(): JSX.Element { AchievementState.fetchMoreSummaryAchievements() } + const tabs = [ + { value: 'all', label: 'All' }, + { value: 'new', label: 'New' } + ] + if (AchievementState.mintedAchievements > 0) { + tabs.push({ value: 'minted', label: 'Minted' }) + } + return ( <> { console.log('handling next page') }, @@ -142,6 +148,7 @@ export default observer(function Achievements(): JSX.Element { isPageLoading={ AchievementState.summaryAchievementsToDisplay === undefined } + tabs={tabs} /> ) From 26a91a2be6d204a9f35e960a4b04bfd612a5a08f Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 4 Dec 2023 14:48:59 -0800 Subject: [PATCH 077/106] add syncing ui indicator --- .../AchievementsLayout/AchievmentStores.tsx | 29 +++++++++++++++---- .../AchievementsLayout/index.module.css | 7 +++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 4485561a5..03b7160c1 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react' -import { StoreRow, Images } from '@hyperplay/ui' +import { StoreRow, Images, Button } from '@hyperplay/ui' import { Flex } from '@mantine/core' import styles from './index.module.css' @@ -10,9 +10,11 @@ import { observer } from 'mobx-react-lite' import AchievementState from 'frontend/state/AchievementState' import useSetting from 'frontend/hooks/useSetting' import walletState from 'frontend/state/WalletState' +import { useTranslation } from 'react-i18next' export const AchievementStores = observer(() => { const [steamId] = useSetting('steamId', '') + const { t } = useTranslation() const store = AchievementState.store const totalGames = AchievementState.totalGames @@ -49,11 +51,26 @@ export const AchievementStores = observer(() => { {isSteam ? : } ) : null} - + {AchievementState.syncing ? ( +
+
+ {t('hyperplay.syncing', 'Syncing...')} +
+ +
+ ) : ( + + )}
diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css index adc1477c9..57c004df4 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.module.css +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.module.css @@ -47,3 +47,10 @@ transform: rotate(360deg); } } + +.syncingContainer { + display: flex; + flex-direction: row; + gap: var(--space-sm); + align-items: center; +} From 97154625848097a9ff9a65d895417a55bd3d1374 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:10:45 -0800 Subject: [PATCH 078/106] add no achievements message --- src/frontend/screens/Achievements/index.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 256f7332c..0c6bf762c 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -146,9 +146,17 @@ export default observer(function Achievements(): JSX.Element { AchievementState.fetchMoreSummaryAchievements() }} isPageLoading={ - AchievementState.summaryAchievementsToDisplay === undefined + AchievementState.summaryAchievementsToDisplay === undefined && + AchievementState.fetching } tabs={tabs} + messageModalProps={{ + title: t('hyperplay.achievements.noAchievements.oops', 'Oops!'), + message: t( + 'hyperplay.achievements.noAchievements.doubleCheckMessage', + `It looks like we couldn't find any games in your Steam account at the moment. Just a quick reminder to double-check that your game details are set to public. This way, we can access your achievements and provide you with the best experience.` + ) + }} /> ) From 057f37352fcb52a73248ea1afa1d3b458ad93f68 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:58:01 -0800 Subject: [PATCH 079/106] update props for new achievements ui components --- .../Achievements/GameAchievementDetails/index.tsx | 15 ++++++++++++--- src/frontend/screens/Achievements/index.tsx | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 2e6a6b8ec..af4de85ba 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -58,7 +58,17 @@ export default observer(function GameAchievementDetails(): JSX.Element { { console.log('next page') @@ -117,6 +125,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { } }} loadingAchievements={individualAchievements === undefined} + gameCardImage={summaryAchievement.gameImageURL} /> ) }) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 0c6bf762c..5d6436c6e 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -157,6 +157,7 @@ export default observer(function Achievements(): JSX.Element { `It looks like we couldn't find any games in your Steam account at the moment. Just a quick reminder to double-check that your game details are set to public. This way, we can access your achievements and provide you with the best experience.` ) }} + gamesAdded={[]} /> ) From 3eee56f8a55e95f6c11452bcfda1568b79934f28 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:56:48 -0800 Subject: [PATCH 080/106] preload images --- src/frontend/screens/Achievements/index.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 5d6436c6e..5c51a4d8e 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -39,9 +39,15 @@ export default observer(function Achievements(): JSX.Element { tabs.push({ value: 'minted', label: 'Minted' }) } + const imagesToPreload = + AchievementState?.summaryAchievementsToDisplay?.map( + (game) => game.gameImageURL + ) ?? [] + return ( <> { @@ -140,7 +146,8 @@ export default observer(function Achievements(): JSX.Element { achievementNavProps={{ freeMints: numFreeMints, basketAmount: - achievementsToBeMinted.length + achievementsToBeUpdated.length + achievementsToBeMinted.length + achievementsToBeUpdated.length, + gamesAdded: [] }} fetchNextPage={() => { AchievementState.fetchMoreSummaryAchievements() @@ -157,7 +164,6 @@ export default observer(function Achievements(): JSX.Element { `It looks like we couldn't find any games in your Steam account at the moment. Just a quick reminder to double-check that your game details are set to public. This way, we can access your achievements and provide you with the best experience.` ) }} - gamesAdded={[]} /> ) From dc3da59dd92bd18e418aa291a39316e6eb28895c Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:48:23 -0800 Subject: [PATCH 081/106] update mint achievement state --- src/frontend/state/MintAchievementsState.ts | 22 ++++++++++----------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/frontend/state/MintAchievementsState.ts b/src/frontend/state/MintAchievementsState.ts index 180955a92..fbe3759a6 100644 --- a/src/frontend/state/MintAchievementsState.ts +++ b/src/frontend/state/MintAchievementsState.ts @@ -1,4 +1,4 @@ -import { makeAutoObservable } from 'mobx' +import { makeAutoObservable, runInAction } from 'mobx' class MintAchievementsState { achievementsToBeMinted = [] as string[] @@ -29,21 +29,19 @@ class MintAchievementsState { } } - handleMint = () => { + testLoad = (ms: number) => { this.isLoading = true setTimeout(() => { - this.isLoading = false - this.achievementsToBeMinted = [] - }, 3000) + runInAction(() => { + this.isLoading = false + this.achievementsToBeMinted = [] + }) + }, ms) } - handleUpdate = () => { - this.isLoading = true - setTimeout(() => { - this.isLoading = false - this.achievementsToBeUpdated = [] - }, 3000) - } + handleMint = () => this.testLoad(3000) + + handleUpdate = () => this.testLoad(3000) } export default new MintAchievementsState() From 11e1184071b5c6b13506e48c47e947dff74cfdda Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:51:39 -0800 Subject: [PATCH 082/106] replace all in setter --- .../screens/Settings/components/SteamId.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/frontend/screens/Settings/components/SteamId.tsx b/src/frontend/screens/Settings/components/SteamId.tsx index e34947da9..f3d6269f9 100644 --- a/src/frontend/screens/Settings/components/SteamId.tsx +++ b/src/frontend/screens/Settings/components/SteamId.tsx @@ -4,11 +4,15 @@ import useSetting from 'frontend/hooks/useSetting' import { configStore } from 'frontend/helpers/electronStores' import { TextInput } from '@hyperplay/ui' +/** + * Used only for testing. + * TODO: replace with auth system session's steam id + */ const SteamId = () => { const { t } = useTranslation() const [steamId, setSteamId] = useSetting('steamId', '') - function setInstallPath(path: string) { + function setSteamIdWrapper(path: string) { setSteamId(path) configStore.set('settings.steamId', path) } @@ -16,9 +20,12 @@ const SteamId = () => { return ( setInstallPath(event.target.value)} + /* eslint-disable-next-line */ + onChange={(event: any) => + setSteamIdWrapper(event.target.value?.replaceAll("'", '')) + } /> ) } From 051be8184e4892d7ccb0c60854ddc6dbb896f903 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:54:27 -0800 Subject: [PATCH 083/106] move timestamp check to helpers --- src/frontend/helpers/achievementUtils.ts | 6 ++++++ .../Achievements/GameAchievementDetails/index.tsx | 10 ++-------- 2 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 src/frontend/helpers/achievementUtils.ts diff --git a/src/frontend/helpers/achievementUtils.ts b/src/frontend/helpers/achievementUtils.ts new file mode 100644 index 000000000..c5cc5d14d --- /dev/null +++ b/src/frontend/helpers/achievementUtils.ts @@ -0,0 +1,6 @@ +export function isTimestampInPast(unixTimestamp: number) { + const currentTime = new Date().getTime() + const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds + + return timestampInMilliseconds < currentTime +} diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index af4de85ba..148cd3750 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -8,15 +8,9 @@ import AchievementState, { ACHIEVEMENT_SORT_OPTIONS } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' +import { isTimestampInPast } from 'frontend/helpers/achievementUtils' -const pageSize = 6 - -function isTimestampInPast(unixTimestamp: number) { - const currentTime = new Date().getTime() - const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds - - return timestampInMilliseconds < currentTime -} +const pageSize = 100 export default observer(function GameAchievementDetails(): JSX.Element { const { t } = useTranslation() From 80ed46bca01b7ce66056a22462ab9f8329608b6f Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:56:30 -0800 Subject: [PATCH 084/106] use deconstructor to init --- .../Achievements/GameAchievementDetails/index.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 148cd3750..254e4f768 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -16,11 +16,13 @@ export default observer(function GameAchievementDetails(): JSX.Element { const { t } = useTranslation() const { id } = useParams() - const achievementsToBeMinted = MintAchievementsState.achievementsToBeMinted - const isLoading = MintAchievementsState.isLoading - const handleMint = MintAchievementsState.handleMint - const handleUpdate = MintAchievementsState.handleUpdate - const achievementsToBeUpdated = MintAchievementsState.achievementsToBeUpdated + const { + achievementsToBeMinted, + achievementsToBeUpdated, + isLoading, + handleMint, + handleUpdate + } = MintAchievementsState const numFreeMints = AchievementState.numFreeMints const individualAchievements = AchievementState.individualAchievementsForGame( From 0d2e6e54216221c06691981796bc17fcf4086103 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:59:42 -0800 Subject: [PATCH 085/106] move sort updated fxn up --- .../GameAchievementDetails/index.tsx | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 254e4f768..1dc608bbb 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -1,4 +1,4 @@ -import { GameAchievements } from '@hyperplay/ui' +import { GameAchievements, DropdownItemType } from '@hyperplay/ui' import React, { useEffect } from 'react' import { useNavigate, useParams } from 'react-router-dom' import walletState from 'frontend/state/WalletState' @@ -50,6 +50,21 @@ export default observer(function GameAchievementDetails(): JSX.Element { if (!summaryAchievement) return <> + async function sortUpdated(sortOption: DropdownItemType) { + const chosenItem = ACHIEVEMENT_SORT_OPTIONS.find( + (option) => option.text === sortOption.text + ) + + if (chosenItem) { + AchievementState.currentIndividualSort = chosenItem + AchievementState.fetchIndividualAchievements({ + gameId: id as string, + page: 1, + pageSize + }) + } + } + return ( { - const chosenItem = ACHIEVEMENT_SORT_OPTIONS.find( - (option) => option.text === sortOption.text - ) - - if (chosenItem) { - AchievementState.currentIndividualSort = chosenItem - AchievementState.fetchIndividualAchievements({ - gameId: id as string, - page: 1, - pageSize - }) - } - } + onItemChange: sortUpdated }} paginationProps={{ handlePrevPage, From a661b7902549db51108efe13fd8f87a56d071b75 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 22:00:59 -0800 Subject: [PATCH 086/106] use deconstructor for achievement stores --- .../AchievementsLayout/AchievmentStores.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx index 03b7160c1..1d72f6e76 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx @@ -16,12 +16,14 @@ export const AchievementStores = observer(() => { const [steamId] = useSetting('steamId', '') const { t } = useTranslation() - const store = AchievementState.store - const totalGames = AchievementState.totalGames - const setStore = AchievementState.setStore - const syncAchievements = AchievementState.syncAchievements - const setPlayerStoreId = AchievementState.setPlayerStoreId - const getAchievementsStats = AchievementState.getAchievementsStats + const { + store, + totalGames, + setStore, + syncAchievements, + setPlayerStoreId, + getAchievementsStats + } = AchievementState useEffect(() => { setPlayerStoreId(steamId) From d7ee1417f08c93ee0cb1cf36c9668d75071d9551 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 22:03:11 -0800 Subject: [PATCH 087/106] fix spelling of achievement stores --- .../{AchievmentStores.tsx => AchievementStores.tsx} | 0 src/frontend/screens/Achievements/AchievementsLayout/index.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/frontend/screens/Achievements/AchievementsLayout/{AchievmentStores.tsx => AchievementStores.tsx} (100%) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementStores.tsx similarity index 100% rename from src/frontend/screens/Achievements/AchievementsLayout/AchievmentStores.tsx rename to src/frontend/screens/Achievements/AchievementsLayout/AchievementStores.tsx diff --git a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx index 875acda23..5350ecea1 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/index.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/index.tsx @@ -7,7 +7,7 @@ import styles from './index.module.css' import { AchievementsStats } from './AchievementsStats' import useSettingsContext from 'frontend/hooks/useSettingsContext' import SettingsContext from 'frontend/screens/Settings/SettingsContext' -import { AchievementStores } from './AchievmentStores' +import { AchievementStores } from './AchievementStores' export default React.memo(function AchievementsLayout({ children From 7a8c9f7c4ff45f1cead04eca031a4cd6ae21acd4 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 22:05:43 -0800 Subject: [PATCH 088/106] move sync handler --- .../Achievements/AchievementsLayout/AchievementStores.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievementStores.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementStores.tsx index 1d72f6e76..e124c5419 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievementStores.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievementStores.tsx @@ -34,6 +34,10 @@ export const AchievementStores = observer(() => { const activeSecondaryText = `${totalGames} Games` const isSteam = store === 'STEAM' + async function handleSyncClicked() { + syncAchievements('STEAM') + } + return (
My Stores
@@ -68,7 +72,7 @@ export const AchievementStores = observer(() => { From 645353d42b8723de554f5eec4062c9db781597fa Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Tue, 5 Dec 2023 22:05:52 -0800 Subject: [PATCH 089/106] use obj deconstructor --- .../Achievements/AchievementsLayout/AchievementsStats.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx index bc33be792..cb915fcd8 100644 --- a/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx +++ b/src/frontend/screens/Achievements/AchievementsLayout/AchievementsStats.tsx @@ -4,10 +4,8 @@ import { observer } from 'mobx-react-lite' import AchievementState from 'frontend/state/AchievementState' export const AchievementsStats = observer(() => { - const newAchievements = AchievementState.newAchievements - const mintedAchievements = AchievementState.mintedAchievements - const totalAchievements = AchievementState.totalAchievements - const totalGames = AchievementState.totalGames + const { newAchievements, mintedAchievements, totalAchievements, totalGames } = + AchievementState return ( Date: Tue, 5 Dec 2023 22:08:11 -0800 Subject: [PATCH 090/106] revert loading bg color --- src/frontend/components/UI/UpdateComponent/index.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/components/UI/UpdateComponent/index.css b/src/frontend/components/UI/UpdateComponent/index.css index 68250f8bf..8f39703e6 100644 --- a/src/frontend/components/UI/UpdateComponent/index.css +++ b/src/frontend/components/UI/UpdateComponent/index.css @@ -3,7 +3,7 @@ height: 100%; font-size: var(--text-xl); color: var(--text-default); - background-color: transparent; + background-color: var(--app-background); } .UpdateComponent--topLevel { From ed48a01cd1d37d12b307d14f044ff4e1f4197a58 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:07:59 -0800 Subject: [PATCH 091/106] add hp ui --- package.json | 1 + yarn.lock | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/package.json b/package.json index 604483363..66e847279 100644 --- a/package.json +++ b/package.json @@ -156,6 +156,7 @@ "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", + "@hyperplay/ui": "^0.1.38", "@mantine/carousel": "^6.0.19", "@mantine/core": "^6.0.19", "@mantine/hooks": "^6.0.19", diff --git a/yarn.lock b/yarn.lock index 95d92a670..9ad7c5215 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1614,6 +1614,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== +"@fortawesome/fontawesome-common-types@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz#fdb1ec4952b689f5f7aa0bffe46180bb35490032" + integrity sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A== + "@fortawesome/fontawesome-svg-core@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1621,6 +1626,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/fontawesome-svg-core@^6.4.0": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz#9d56d46bddad78a7ebb2043a97957039fcebcf0a" + integrity sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.1" + "@fortawesome/free-brands-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" @@ -1635,6 +1647,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-regular-svg-icons@^6.4.0": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz#c98a91d2c9137ed54a7aa2362a916f46503e0627" + integrity sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.1" + "@fortawesome/free-solid-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz#8dcde48109354fd7a5ece8ea48d678bb91d4b5f0" @@ -1642,6 +1661,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" +"@fortawesome/free-solid-svg-icons@^6.4.0": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz#737b8d787debe88b400ab7528f47be333031274a" + integrity sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.1" + "@fortawesome/react-fontawesome@^0.1.18": version "0.1.19" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz#2b36917578596f31934e71f92b7cf9c425fd06e4" @@ -1649,6 +1675,13 @@ dependencies: prop-types "^15.8.1" +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1668,6 +1701,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@hyperplay/chains@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" + integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== + dependencies: + axios "^1.4.0" + +"@hyperplay/ui@^0.1.38": + version "0.1.38" + resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.38.tgz#f1e0308a7e827055afeb3912a5e4450b9dedc47c" + integrity sha512-0IdbKKik4mtmD08PrScrCOg7d5qbd1kX8cE1Nq8sc3bCgtdAl7FNlhaI+FWeV/zwI74cvkDBDUATgl7IE/6teQ== + "@ioredis/commands@^1.1.1": version "1.2.0" resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" @@ -4639,6 +4684,15 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.4.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" From 335b4179597e37b3733dd1a8733a52c89a2ecb7c Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:13:33 -0800 Subject: [PATCH 092/106] fix ui merge issues --- .../GameAchievementDetails/index.tsx | 37 ++++++++++--------- src/frontend/screens/Achievements/index.tsx | 3 +- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 1dc608bbb..1dd63505c 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -72,29 +72,32 @@ export default observer(function GameAchievementDetails(): JSX.Element { basketAmount: achievementsToBeMinted.length, showGameAddButton: false, gamesAdded: [], - addThisGameText: t( - 'hyperplay.achievements.addThisGame', - 'Add this game' - ), - gamesToMintLabelText: t( - 'hyperplay.achievements.gamesToMint', - 'Games to mint' - ) + i18n: { + addThisGameText: t( + 'hyperplay.achievements.addThisGame', + 'Add this game' + ), + gamesToMintLabelText: t( + 'hyperplay.achievements.gamesToMint', + 'Games to mint' + ) + } }} game={{ - title: summaryAchievement.gameName, - tags: summaryAchievement.tags ?? [] + title: summaryAchievement.gameName }} mintedAchievementsCount={summaryAchievement.mintedAchievementCount} totalAchievementsCount={summaryAchievement.totalAchievementCount} mintableAchievementsCount={summaryAchievement.mintableAchievementsCount} - achievements={individualAchievements?.data.map((achievement) => ({ - id: achievement.id, - title: achievement.displayName, - description: achievement.description, - image: achievement.icon, - isLocked: !isTimestampInPast(achievement.unlocktime) - }))} + achievements={ + individualAchievements?.data.map((achievement) => ({ + id: achievement.id, + title: achievement.displayName, + description: achievement.description, + image: achievement.icon, + isLocked: !isTimestampInPast(achievement.unlocktime) + })) ?? [] + } sortProps={{ options: ACHIEVEMENT_SORT_OPTIONS, selected: AchievementState.currentIndividualSort, diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 5c51a4d8e..ef41751f3 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -147,7 +147,8 @@ export default observer(function Achievements(): JSX.Element { freeMints: numFreeMints, basketAmount: achievementsToBeMinted.length + achievementsToBeUpdated.length, - gamesAdded: [] + gamesAdded: [], + showGameAddButton: false }} fetchNextPage={() => { AchievementState.fetchMoreSummaryAchievements() From 06d40a4413de98dde9b5004a5d1b26e421bcdd67 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:25:39 -0800 Subject: [PATCH 093/106] update submodules --- src/backend/hyperplay-extension-helper | 2 +- src/backend/hyperplay-overlay | 2 +- src/backend/hyperplay-proxy-server | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/hyperplay-extension-helper b/src/backend/hyperplay-extension-helper index 145a7687a..22f573d4d 160000 --- a/src/backend/hyperplay-extension-helper +++ b/src/backend/hyperplay-extension-helper @@ -1 +1 @@ -Subproject commit 145a7687a1039d7c5f00ff3d728e2a5402ec651c +Subproject commit 22f573d4d38ca0ddceef8459b87c846ffce0e8a8 diff --git a/src/backend/hyperplay-overlay b/src/backend/hyperplay-overlay index 233d5b59b..7f807db24 160000 --- a/src/backend/hyperplay-overlay +++ b/src/backend/hyperplay-overlay @@ -1 +1 @@ -Subproject commit 233d5b59b84996717947bce4db7cdc74be6b4b69 +Subproject commit 7f807db248812159416c49e950dbeda3f3290ac4 diff --git a/src/backend/hyperplay-proxy-server b/src/backend/hyperplay-proxy-server index ea1cd6849..1c8f1a296 160000 --- a/src/backend/hyperplay-proxy-server +++ b/src/backend/hyperplay-proxy-server @@ -1 +1 @@ -Subproject commit ea1cd6849fbcb2576d5761872c000916c7314be5 +Subproject commit 1c8f1a2962f1c4c0f43a9af6cd81774db6df2669 From a7d1a9bef7bae2adb8ca2a6e7c283e2a72be7367 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:25:44 -0800 Subject: [PATCH 094/106] update translations --- public/locales/en/gamepage.json | 9 --------- public/locales/en/translation.json | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/public/locales/en/gamepage.json b/public/locales/en/gamepage.json index 6a331b0cf..a1f49e066 100644 --- a/public/locales/en/gamepage.json +++ b/public/locales/en/gamepage.json @@ -108,13 +108,6 @@ "error": "Unknown error", "noDescription": "No description available" }, - "hyperplay": { - "gamecard": { - "extracting": "Extracting...", - "installing": "Downloading...", - "paused": "Paused" - } - }, "info": { "canRunOffline": "Online Required", "installedPlatform": "Installed Platform", @@ -180,7 +173,6 @@ "recommended": "Recommended" }, "status": { - "clickToUpdate": "Click to Update", "downloading": "Downloading", "extracting": { "cancel": "Cancel Extraction", @@ -189,7 +181,6 @@ "gameNotAvailable": "Game not available", "gog-goodie": "This game doesn't appear to be installable. Check downloadable content on https://gog.com/account", "goodie": "Not installable", - "hasUpdates": "New Version Available!", "installed": "Installed", "installing": "Installing", "moving": "Moving Installation, please wait", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 4bddb38a3..5cf86b433 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -8,6 +8,12 @@ "zoom": "Zoom" }, "accounts": "accounts", + "achievements": { + "progress": { + "minted": "on chain", + "notMinted": "off chain" + } + }, "add_game": "Add Game", "All": "All", "ALL": "ALL", @@ -299,6 +305,14 @@ "validation": "Success! Access code is valid" } }, + "achievements": { + "addThisGame": "Add this game", + "gamesToMint": "Games to mint", + "noAchievements": { + "doubleCheckMessage": "It looks like we couldn't find any games in your Steam account at the moment. Just a quick reminder to double-check that your game details are set to public. This way, we can access your achievements and provide you with the best experience.", + "oops": "Oops!" + } + }, "analyticsOff": "Analytics is turned off", "analyticsOn": "Analytics is turned on", "browserImport": { @@ -392,6 +406,8 @@ }, "otp": "One Time Passcode", "publicAlpha": "Public Alpha", + "Sync": "Sync", + "syncing": "Syncing...", "turnAnalyticsOff": "Turn off", "turnAnalyticsOn": "Turn on", "viewFullscreen": "View fullscreen", @@ -716,6 +732,7 @@ "showfps": "Show FPS (DX9, 10 and 11)", "showMetalOverlay": "Show Stats Overlay", "start-in-tray": "Start Minimized", + "steamId": "Steam ID", "steamruntime": "Use Steam Runtime", "winecrossoverbottle": "CrossOver Bottle", "wineprefix": "WinePrefix folder", @@ -752,6 +769,7 @@ "long-log-hint": "Log truncated, last 1000 lines are shown!" }, "navbar": { + "accounts": "Accounts", "advanced": "Advanced", "general": "General", "log": "Log", From 300cbce45b0fa06b7f77dc0f3d2df0f3a238a4c7 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Wed, 6 Dec 2023 17:37:38 -0800 Subject: [PATCH 095/106] prettier --- src/frontend/helpers/achievementUtils.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontend/helpers/achievementUtils.ts b/src/frontend/helpers/achievementUtils.ts index c5cc5d14d..5000f9c79 100644 --- a/src/frontend/helpers/achievementUtils.ts +++ b/src/frontend/helpers/achievementUtils.ts @@ -1,6 +1,6 @@ -export function isTimestampInPast(unixTimestamp: number) { - const currentTime = new Date().getTime() - const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds - - return timestampInMilliseconds < currentTime -} +export function isTimestampInPast(unixTimestamp: number) { + const currentTime = new Date().getTime() + const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds + + return timestampInMilliseconds < currentTime +} From 81592b92aadc6ea7d2eca482343c81a66541961f Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Fri, 8 Dec 2023 11:49:39 -0800 Subject: [PATCH 096/106] rm on close --- .../UI/EmailVerifiedModal/index.tsx | 2 +- yarn.lock | 49 ------------------- 2 files changed, 1 insertion(+), 50 deletions(-) diff --git a/src/frontend/components/UI/EmailVerifiedModal/index.tsx b/src/frontend/components/UI/EmailVerifiedModal/index.tsx index 54b4deedb..254bd714c 100644 --- a/src/frontend/components/UI/EmailVerifiedModal/index.tsx +++ b/src/frontend/components/UI/EmailVerifiedModal/index.tsx @@ -21,7 +21,7 @@ const EmailVerifiedModal = () => { return ( - + ) } diff --git a/yarn.lock b/yarn.lock index 0e943dfb6..cee95e98f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1626,11 +1626,6 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== -"@fortawesome/fontawesome-common-types@6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz#fdb1ec4952b689f5f7aa0bffe46180bb35490032" - integrity sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A== - "@fortawesome/fontawesome-svg-core@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1638,13 +1633,6 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/fontawesome-svg-core@^6.4.0": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz#9d56d46bddad78a7ebb2043a97957039fcebcf0a" - integrity sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ== - dependencies: - "@fortawesome/fontawesome-common-types" "6.5.1" - "@fortawesome/free-brands-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" @@ -1659,13 +1647,6 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/free-regular-svg-icons@^6.4.0": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz#c98a91d2c9137ed54a7aa2362a916f46503e0627" - integrity sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ== - dependencies: - "@fortawesome/fontawesome-common-types" "6.5.1" - "@fortawesome/free-solid-svg-icons@^6.1.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz#8dcde48109354fd7a5ece8ea48d678bb91d4b5f0" @@ -1673,13 +1654,6 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/free-solid-svg-icons@^6.4.0": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz#737b8d787debe88b400ab7528f47be333031274a" - integrity sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ== - dependencies: - "@fortawesome/fontawesome-common-types" "6.5.1" - "@fortawesome/react-fontawesome@^0.1.18": version "0.1.19" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz#2b36917578596f31934e71f92b7cf9c425fd06e4" @@ -1687,13 +1661,6 @@ dependencies: prop-types "^15.8.1" -"@fortawesome/react-fontawesome@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" - integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== - dependencies: - prop-types "^15.8.1" - "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1713,13 +1680,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@hyperplay/chains@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@hyperplay/chains/-/chains-0.0.2.tgz#329aabdd30d5f1c25233fcb342840624fff235d1" - integrity sha512-yex3/IOnmxtM1N0uU20cceVKUDAjAGFO0LKNxH45Nn+bbOaVgXJCsXqEk3NfVLGk08X71fSDzRCcX2UCSUwEmA== - dependencies: - axios "^1.4.0" - "@hyperplay/ui@^0.1.38": version "0.1.38" resolved "https://registry.yarnpkg.com/@hyperplay/ui/-/ui-0.1.38.tgz#f1e0308a7e827055afeb3912a5e4450b9dedc47c" @@ -4759,15 +4719,6 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.4.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" From 39568f32bb3251c5c1f150e8b1a16be99307fece Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:48:43 -0800 Subject: [PATCH 097/106] mv util fxn --- src/common/utils.ts | 7 +++++++ src/frontend/helpers/achievementUtils.ts | 6 ------ 2 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 src/frontend/helpers/achievementUtils.ts diff --git a/src/common/utils.ts b/src/common/utils.ts index 1038ed76d..34ea06b03 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -11,3 +11,10 @@ export function domainsAreEqual(url: URL, otherUrl: URL) { if (urlDomain === otherUrlDomain) return true return false } + +export function isTimestampInPast(unixTimestamp: number) { + const currentTime = new Date().getTime() + const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds + + return timestampInMilliseconds < currentTime +} diff --git a/src/frontend/helpers/achievementUtils.ts b/src/frontend/helpers/achievementUtils.ts deleted file mode 100644 index 5000f9c79..000000000 --- a/src/frontend/helpers/achievementUtils.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function isTimestampInPast(unixTimestamp: number) { - const currentTime = new Date().getTime() - const timestampInMilliseconds = unixTimestamp * 1000 // Convert to milliseconds - - return timestampInMilliseconds < currentTime -} From 991c19ddde3a1d2dce416b917514c9ea72781cee Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:48:54 -0800 Subject: [PATCH 098/106] udpate import --- .../screens/Achievements/GameAchievementDetails/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 1dd63505c..2441a053d 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -8,7 +8,7 @@ import AchievementState, { ACHIEVEMENT_SORT_OPTIONS } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' -import { isTimestampInPast } from 'frontend/helpers/achievementUtils' +import { isTimestampInPast } from 'common/utils' const pageSize = 100 From 3e45d1d9a2e7c8545697b37cb4a1562d4070bd17 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:49:01 -0800 Subject: [PATCH 099/106] handle refresh --- .../components/UI/Sidebar/components/SidebarLinks/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx index e81a19374..138798029 100644 --- a/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx +++ b/src/frontend/components/UI/Sidebar/components/SidebarLinks/index.tsx @@ -78,7 +78,7 @@ export default observer(function SidebarLinks() { } end to={'/library'} - onClick={async () => handleRefresh()} + onClick={handleRefresh} > @@ -93,7 +93,7 @@ export default observer(function SidebarLinks() { } end to={'/achievements'} - onClick={async () => handleRefresh()} + onClick={handleRefresh} > From 6df4d24c681709d16e5bb463bfd5d73e1ffd8b3e Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:54:06 -0800 Subject: [PATCH 100/106] add console error --- src/frontend/state/AchievementState.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/frontend/state/AchievementState.ts b/src/frontend/state/AchievementState.ts index d1be12d90..4974d5e53 100644 --- a/src/frontend/state/AchievementState.ts +++ b/src/frontend/state/AchievementState.ts @@ -92,14 +92,17 @@ class AchievementState { .then((res) => (this.showAchievements = res)) } - getAchievementsStats = () => { - window.api - .getAchievementsStats({ + getAchievementsStats = async () => { + try { + const stats = await window.api.getAchievementsStats({ store: this.store, playerStoreId: this.playerStoreId, playerAddress: walletState.address }) - .then(this.setStats.bind(this)) + this.setStats(stats) + } catch (err) { + console.error(`Error while getting achievement stats ${err}`) + } } individualAchievementsKey(gameId: string) { From c5976da32de4741db5e8e2a4e721b427639044ad Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:55:40 -0800 Subject: [PATCH 101/106] refactor currentSummaryKey getter --- src/frontend/state/AchievementState.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/frontend/state/AchievementState.ts b/src/frontend/state/AchievementState.ts index 4974d5e53..3cea85d40 100644 --- a/src/frontend/state/AchievementState.ts +++ b/src/frontend/state/AchievementState.ts @@ -208,13 +208,12 @@ class AchievementState { }) } - private get currentSummaryKey() { - const requestKey: AchievementRequestKey = { + private get currentSummaryKey(): AchievementRequestKey { + return { filter: this.currentFilter, sort: this.currentSort.value, store: this.currentStore } - return requestKey } get currentSummaryAchievements() { From 03ef58678c8727bafbfb55af29f4171aa99cf296 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 18 Dec 2023 10:50:51 -0800 Subject: [PATCH 102/106] refactor state if else --- src/frontend/screens/Achievements/index.tsx | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index ef41751f3..09f2a9c16 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -54,14 +54,19 @@ export default observer(function Achievements(): JSX.Element { const id = String(game.gameId) const isUpdate = game.isNewAchievement && game.mintedAchievementCount > 0 - const state = !walletState.isConnected - ? 'disabled' - : achievementsToBeMinted.includes(id) || - achievementsToBeUpdated.includes(id) - ? 'active' - : isUpdate - ? 'update' - : 'default' + + let state = 'default' + + if (!walletState.isConnected) { + state = 'disabled' + } else if ( + achievementsToBeMinted.includes(id) || + achievementsToBeUpdated.includes(id) + ) { + state = 'active' + } else if (isUpdate) { + state = 'update' + } return ( From 273665bf6914be7807881c2a46ef446c4a11d073 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 18 Dec 2023 14:42:03 -0800 Subject: [PATCH 103/106] add free mints tranlsation key --- public/locales/en/translation.json | 2 ++ .../screens/Achievements/GameAchievementDetails/index.tsx | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 5cf86b433..7cb22c50b 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -307,6 +307,7 @@ }, "achievements": { "addThisGame": "Add this game", + "freeMints": "Free Mints", "gamesToMint": "Games to mint", "noAchievements": { "doubleCheckMessage": "It looks like we couldn't find any games in your Steam account at the moment. Just a quick reminder to double-check that your game details are set to public. This way, we can access your achievements and provide you with the best experience.", @@ -826,6 +827,7 @@ "logout": "Log out", "logout_confirmation": "Are you sure you want to log out?", "manageaccounts": "Manage Accounts", + "manageStore": "Manage stores", "quit": "Quit" }, "webview": { diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 2441a053d..265eaaa13 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -80,7 +80,8 @@ export default observer(function GameAchievementDetails(): JSX.Element { gamesToMintLabelText: t( 'hyperplay.achievements.gamesToMint', 'Games to mint' - ) + ), + freeMintsLabel: t('hyperplay.achievements.freeMints', 'Free Mints') } }} game={{ From 3ac1efd370201265eacd9978bba3d1ac69c31f7c Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:01:33 -0800 Subject: [PATCH 104/106] clear cache on new steam id --- src/frontend/state/AchievementState.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/frontend/state/AchievementState.ts b/src/frontend/state/AchievementState.ts index 3cea85d40..f136926e5 100644 --- a/src/frontend/state/AchievementState.ts +++ b/src/frontend/state/AchievementState.ts @@ -48,7 +48,7 @@ class AchievementState { storesEnabled = ['STEAM'] store = 'STEAM' as AchievementStore - playerStoreId = '' + private playerStoreId = '' // Stats newAchievements = 0 @@ -288,6 +288,11 @@ class AchievementState { setPlayerStoreId = (playerStoreId: string) => { this.playerStoreId = playerStoreId + this.summaryAchievements.clear() + } + + get getPlayerStoreId() { + return this.playerStoreId } get filterDisplayName() { From 87291ddb780268d6b3dfdb149b7601e021e1e2cf Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:43:06 -0800 Subject: [PATCH 105/106] share achievement nav prop translations summary and details pages --- .../Achievements/GameAchievementDetails/index.tsx | 13 ++----------- src/frontend/screens/Achievements/index.tsx | 4 +++- src/frontend/screens/Achievements/utils.ts | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 src/frontend/screens/Achievements/utils.ts diff --git a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx index 265eaaa13..2082452d8 100644 --- a/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx +++ b/src/frontend/screens/Achievements/GameAchievementDetails/index.tsx @@ -9,6 +9,7 @@ import AchievementState, { } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' import { isTimestampInPast } from 'common/utils' +import { getAchievementNavTranslations } from '../utils' const pageSize = 100 @@ -72,17 +73,7 @@ export default observer(function GameAchievementDetails(): JSX.Element { basketAmount: achievementsToBeMinted.length, showGameAddButton: false, gamesAdded: [], - i18n: { - addThisGameText: t( - 'hyperplay.achievements.addThisGame', - 'Add this game' - ), - gamesToMintLabelText: t( - 'hyperplay.achievements.gamesToMint', - 'Games to mint' - ), - freeMintsLabel: t('hyperplay.achievements.freeMints', 'Free Mints') - } + i18n: getAchievementNavTranslations(t) }} game={{ title: summaryAchievement.gameName diff --git a/src/frontend/screens/Achievements/index.tsx b/src/frontend/screens/Achievements/index.tsx index 09f2a9c16..0aa741f60 100644 --- a/src/frontend/screens/Achievements/index.tsx +++ b/src/frontend/screens/Achievements/index.tsx @@ -9,6 +9,7 @@ import AchievementState, { ACHIEVEMENT_SORT_OPTIONS } from 'frontend/state/AchievementState' import MintAchievementsState from 'frontend/state/MintAchievementsState' +import { getAchievementNavTranslations } from './utils' export default observer(function Achievements(): JSX.Element { const { t } = useTranslation() @@ -153,7 +154,8 @@ export default observer(function Achievements(): JSX.Element { basketAmount: achievementsToBeMinted.length + achievementsToBeUpdated.length, gamesAdded: [], - showGameAddButton: false + showGameAddButton: false, + i18n: getAchievementNavTranslations(t) }} fetchNextPage={() => { AchievementState.fetchMoreSummaryAchievements() diff --git a/src/frontend/screens/Achievements/utils.ts b/src/frontend/screens/Achievements/utils.ts new file mode 100644 index 000000000..9b1e386ec --- /dev/null +++ b/src/frontend/screens/Achievements/utils.ts @@ -0,0 +1,14 @@ +import { TFunction } from 'i18next' + +export function getAchievementNavTranslations( + t: TFunction<'translation', undefined, 'translation'> +) { + return { + addThisGameText: t('hyperplay.achievements.addThisGame', 'Add this game'), + gamesToMintLabelText: t( + 'hyperplay.achievements.gamesToMint', + 'Games to mint' + ), + freeMintsLabel: t('hyperplay.achievements.freeMints', 'Free Mints') + } +} From 1f6b5b745a6b7dc1220c70926791b69f44f31883 Mon Sep 17 00:00:00 2001 From: Brett <27568879+BrettCleary@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:53:04 -0800 Subject: [PATCH 106/106] prettier --- src/frontend/screens/Achievements/utils.ts | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/frontend/screens/Achievements/utils.ts b/src/frontend/screens/Achievements/utils.ts index 9b1e386ec..7087e680f 100644 --- a/src/frontend/screens/Achievements/utils.ts +++ b/src/frontend/screens/Achievements/utils.ts @@ -1,14 +1,14 @@ -import { TFunction } from 'i18next' - -export function getAchievementNavTranslations( - t: TFunction<'translation', undefined, 'translation'> -) { - return { - addThisGameText: t('hyperplay.achievements.addThisGame', 'Add this game'), - gamesToMintLabelText: t( - 'hyperplay.achievements.gamesToMint', - 'Games to mint' - ), - freeMintsLabel: t('hyperplay.achievements.freeMints', 'Free Mints') - } -} +import { TFunction } from 'i18next' + +export function getAchievementNavTranslations( + t: TFunction<'translation', undefined, 'translation'> +) { + return { + addThisGameText: t('hyperplay.achievements.addThisGame', 'Add this game'), + gamesToMintLabelText: t( + 'hyperplay.achievements.gamesToMint', + 'Games to mint' + ), + freeMintsLabel: t('hyperplay.achievements.freeMints', 'Free Mints') + } +}