From 884ef30c791730a936cd30837766688bb51822d1 Mon Sep 17 00:00:00 2001 From: KittenTM Date: Sun, 15 Mar 2026 00:22:58 +0100 Subject: [PATCH] feat: catch & log invalid items to discord webhook --- config.py | 1 + judd/package-lock.json | 276 +++++++++++++++- judd/package.json | 1 + judd/routes/blacklist.json | 5 + judd/routes/ids.json | 644 +++++++++++++++++++++++++++++++++++++ judd/routes/post.js | 43 +++ 6 files changed, 968 insertions(+), 2 deletions(-) create mode 100644 judd/routes/blacklist.json create mode 100644 judd/routes/ids.json diff --git a/config.py b/config.py index be38748..273e130 100644 --- a/config.py +++ b/config.py @@ -14,6 +14,7 @@ class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", extra="ignore") cookie_secure: bool = True + webhook_url: str settings = Settings() cipher = Fernet(settings.fernet_key.encode()) \ No newline at end of file diff --git a/judd/package-lock.json b/judd/package-lock.json index 0b89e54..24e22ec 100644 --- a/judd/package-lock.json +++ b/judd/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "discord.js": "^14.25.1", "express": "^4.18.2", "express-subdomain": "^1.0.5", "joi": "^17.7.0", @@ -1126,6 +1127,136 @@ "node": ">=18.0.0" } }, + "node_modules/@discordjs/builders": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.13.1.tgz", + "integrity": "sha512-cOU0UDHc3lp/5nKByDxkmRiNZBpdp0kx55aarbiAfakfKJHlxv/yFW1zmIqCAmwH5CRlrH9iMFKJMpvW4DPB+w==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/formatters": "^0.6.2", + "@discordjs/util": "^1.2.0", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "^0.38.33", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/formatters": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.2.tgz", + "integrity": "sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==", + "license": "Apache-2.0", + "dependencies": { + "discord-api-types": "^0.38.33" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.0.tgz", + "integrity": "sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "^0.38.16", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.21.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.2.0.tgz", + "integrity": "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==", + "license": "Apache-2.0", + "dependencies": { + "discord-api-types": "^0.38.33" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.3.tgz", + "integrity": "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.5.1", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "^0.38.1", + "tslib": "^2.6.2", + "ws": "^8.17.0" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -1151,6 +1282,39 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz", + "integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v16" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -1838,6 +2002,25 @@ "@types/webidl-conversions": "*" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.7.tgz", + "integrity": "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2108,6 +2291,42 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/discord-api-types": { + "version": "0.38.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.42.tgz", + "integrity": "sha512-qs1kya7S84r5RR8m9kgttywGrmmoHaRifU1askAoi+wkoSefLpZP6aGXusjNw5b0jD3zOg3LTwUa3Tf2iHIceQ==", + "license": "MIT", + "workspaces": [ + "scripts/actions/documentation" + ] + }, + "node_modules/discord.js": { + "version": "14.25.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.25.1.tgz", + "integrity": "sha512-2l0gsPOLPs5t6GFZfQZKnL1OJNYFcuC/ETWsW4VtKVD/tg4ICa9x+jb9bkPffkMdRpRpuUaO/fKkHCBeiCKh8g==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/builders": "^1.13.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.6.2", + "@discordjs/rest": "^2.6.0", + "@discordjs/util": "^1.2.0", + "@discordjs/ws": "^1.2.3", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "^0.38.33", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.21.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, "node_modules/dottie": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", @@ -2240,6 +2459,12 @@ "integrity": "sha512-A51MvQhk5L3aDV4s5XcKrn5I0bCFOk95xikJjlDWNUrtiAaCjy44RjvBz4uLRH0nCvt8Y3SKt1EvxUUmGJ5QRQ==", "license": "MIT" }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fast-xml-parser": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz", @@ -2496,6 +2721,18 @@ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "license": "MIT" + }, + "node_modules/magic-bytes.js": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.13.0.tgz", + "integrity": "sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg==", + "license": "MIT" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3444,12 +3681,17 @@ "node": ">=12" } }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "license": "0BSD" }, "node_modules/type-is": { "version": "1.6.18", @@ -3476,6 +3718,15 @@ "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", "license": "MIT" }, + "node_modules/undici": { + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", @@ -3564,6 +3815,27 @@ "@types/node": "*" } }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/judd/package.json b/judd/package.json index d31b81b..4db1adf 100644 --- a/judd/package.json +++ b/judd/package.json @@ -11,6 +11,7 @@ "author": "", "license": "ISC", "dependencies": { + "discord.js": "^14.25.1", "express": "^4.18.2", "express-subdomain": "^1.0.5", "joi": "^17.7.0", diff --git a/judd/routes/blacklist.json b/judd/routes/blacklist.json new file mode 100644 index 0000000..236eb65 --- /dev/null +++ b/judd/routes/blacklist.json @@ -0,0 +1,5 @@ +{ + "weapons": [1000, 1001, 1002, 1003, 1100, 1200, 1800, 1801, 2000, 2001, 2002, 2003, 5000], + "clothes": [26061, 26062, 26063, 26064, 26065, 26066, 26067, 26068, 26069, 26070, 26071, 26072, 26073, 26074, 26075, 26076, 26077, 26078, 26079, 26080, 26081, 26082, 26083, 26084, 26085, 26086, 26087, 26088, 26089, 26090, 26091, 26092, 26093, 26094, 26095, 26096, 26097, 26098, 26099, 26100, 26101, 26102, 26103, 26104, 26105, 26106, 26107, 26108, 26109, 26110, 26111, 26112, 26113, 26114, 26115, 26116, 26117, 26118, 26119, 26120, 26121, 26122, 26123, 26124, 26125, 26126, 26127, 26128, 26129, 26130, 26131, 26132, 26133, 26134, 26135, 26136], + "rules": [-1] +} \ No newline at end of file diff --git a/judd/routes/ids.json b/judd/routes/ids.json new file mode 100644 index 0000000..2611607 --- /dev/null +++ b/judd/routes/ids.json @@ -0,0 +1,644 @@ +{ + "rules": { + "-1": "cNone (ID=-1)", + "0": "Turf War (ID=0)", + "1": "Rainmaker (ID=1)", + "2": "Splat Zones (ID=2)", + "3": "Tower Control (ID=3)" + }, + "modes": { + "0": "Turf War (ID=0)", + "1": "Ranked Battles (ID=1)", + "2": "Splatfest (ID=2)", + "3": "Private Battle (ID=3)", + "4": "Squad Battle (ID=4)" + }, + "maps": { + "0": "Urchin Underpass (ID=0)", + "1": "Walleye Warehouse (ID=1)", + "2": "Saltspray Rig (ID=2)", + "3": "Arowana Mall (ID=3)", + "4": "Blackbelly Skatepark (ID=4)", + "5": "Camp Triggerfish (ID=5)", + "6": "Port Mackerel (ID=6)", + "7": "Kelp Dome (ID=7)", + "8": "Moray Towers (ID=8)", + "9": "Bluefin Depot (ID=9)", + "10": "Hammerhead Bridge (ID=10)", + "11": "Flounder Heights (ID=11)", + "12": "Museum d'Alfonsino (ID=12)", + "13": "Ancho-V Games (ID=13)", + "14": "Piranha Pit (ID=14)", + "15": "Mahi-Mahi Resort (ID=15)" + }, + "weapons_main": { + "100": "Sploosh-o-matic (ID=100)", + "101": "Neo Sploosh-o-matic (ID=101)", + "102": "Splattershot Jr. (ID=102)", + "103": "Custom Splattershot Jr. (ID=103)", + "104": "Splash-o-matic (ID=104)", + "105": "Neo Splash-o-matic (ID=105)", + "106": "Aerospray MG (ID=106)", + "107": "Aerospray RG (ID=107)", + "108": "Splattershot (ID=108)", + "109": "Tentatek Splattershot (ID=109)", + "110": "Hero Shot Replica (ID=110)", + "111": "Octoshot Replica (ID=111)", + "112": ".52 Gal (ID=112)", + "113": ".52 Gal Deco (ID=113)", + "114": "N-ZAP '85 (ID=114)", + "115": "N-ZAP '89 (ID=115)", + "116": "Splattershot Pro (ID=116)", + "117": "Forge Splattershot Pro (ID=117)", + "118": ".96 Gal (ID=118)", + "119": ".96 Gal Deco (ID=119)", + "120": "Dual Squelcher (ID=120)", + "121": "Custom Dual Squelcher (ID=121)", + "122": "Jet Squelcher (ID=122)", + "123": "Custom Jet Squelcher (ID=123)", + "124": "Luna Blaster (ID=124)", + "125": "Luna Blaster Neo (ID=125)", + "126": "Blaster (ID=126)", + "127": "Custom Blaster (ID=127)", + "128": "Range Blaster (ID=128)", + "129": "Custom Range Blaster (ID=129)", + "130": "Rapid Blaster (ID=130)", + "131": "Rapid Blaster Deco (ID=131)", + "132": "Rapid Blaster Pro (ID=132)", + "133": "Rapid Blaster Pro Deco (ID=133)", + "134": "L-3 Nozzlenose (ID=134)", + "135": "L-3 Nozzlenose D (ID=135)", + "136": "H-3 Nozzlenose (ID=136)", + "137": "H-3 Nozzlenose D (ID=137)", + "138": "Wasabi Splattershot (ID=138)", + "139": "Berry Splattershot Pro (ID=139)", + "140": "Sploosh-o-matic 7 (ID=140)", + "141": "Aerospray PG (ID=141)", + "142": "N-ZAP '83 (ID=142)", + "143": "Grim Range Blaster (ID=143)", + "144": "Cherry H-3 Nozzlenose (ID=144)", + "200": "Carbon Roller (ID=200)", + "201": "Carbon Roller Deco (ID=201)", + "202": "Splat Roller (ID=202)", + "203": "Krak-On Splat Roller (ID=203)", + "204": "Hero Roller Replica (ID=204)", + "205": "Dynamo Roller (ID=205)", + "206": "Gold Dynamo Roller (ID=206)", + "207": "Inkbrush (ID=207)", + "208": "Inkbrush Nouveau (ID=208)", + "209": "Octobrush (ID=209)", + "210": "Octobrush Nouveau (ID=210)", + "211": "Tempered Dynamo Roller (ID=211)", + "212": "Permanent Inkbrush (ID=212)", + "213": "CoroCoro Splat Roller (ID=213)", + "300": "Classic Squiffer (ID=300)", + "301": "New Squiffer (ID=301)", + "302": "Splat Charger (ID=302)", + "303": "Kelp Splat Charger (ID=303)", + "304": "Hero Charger Replica (ID=304)", + "305": "Splatterscope (ID=305)", + "306": "Kelp Splatterscope (ID=306)", + "307": "E-liter 3K (ID=307)", + "308": "Custom E-liter 3K (ID=308)", + "309": "E-liter 3K Scope (ID=309)", + "310": "Custom E-liter 3K Scope (ID=310)", + "311": "Bamboozler 14 Mk I (ID=311)", + "312": "Bamboozler 14 Mk II (ID=312)", + "313": "Fresh Squiffer (ID=313)", + "314": "Bamboozler 14 Mk III (ID=314)", + "315": "Bento Splat Charger (ID=315)", + "316": "Bento Splatterscope (ID=316)", + "400": "Slosher (ID=400)", + "401": "Slosher Deco (ID=401)", + "402": "Tri-Slosher (ID=402)", + "403": "Tri-Slosher Nouveau (ID=403)", + "404": "Sloshing Machine (ID=404)", + "405": "Sloshing Machine Neo (ID=405)", + "406": "Soda Slosher (ID=406)", + "500": "Mini Splatling (ID=500)", + "501": "Zink Mini Splatling (ID=501)", + "502": "Heavy Splatling (ID=502)", + "503": "Heavy Splatling Deco (ID=503)", + "504": "Hydra Splatling (ID=504)", + "505": "Custom Hydra Splatling (ID=505)", + "506": "Refurbished Mini Splatling (ID=506)", + "507": "Heavy Splatling Remix (ID=507)", + "1000": "?Shot_Msn0Lv0 (ID=1000)", + "1001": "?Shot_Msn0Lv1 (ID=1001)", + "1002": "?Shot_Msn0Lv2 (ID=1002)", + "1003": "?Shot_Msn0Lv3 (ID=1003)", + "1100": "?Roller_Mission (ID=1100)", + "1200": "?Charge_Mission (ID=1200)", + "1800": "?BigBall_SpecAdjust01 (ID=1800)", + "1801": "?BigBall_SpecAdjust02 (ID=1801)", + "2000": "?Shot_Rvl0Lv0 (ID=2000)", + "2001": "?Shot_Rvl0Lv1 (ID=2001)", + "2002": "?Shot_Rvl0Lv2 (ID=2002)", + "2003": "?Shot_Rvl0Lv3 (ID=2003)", + "5000": "?Roller_KingSquid (ID=5000)" + }, + "sub_weapons": { + "0": "Splat Bomb (ID=0)", + "1": "Suction Bomb (ID=1)", + "2": "Burst Bomb (ID=2)", + "3": "Seeker (ID=3)", + "4": "Point Sensor (ID=4)", + "5": "Ink Mine (ID=5)", + "6": "Sprinkler (ID=6)", + "7": "Squid Beakon (ID=7)", + "8": "Splashwall (ID=8)", + "9": "Disruptor (ID=9)", + "1000": "?Bomb_Msn0Lv0 (ID=1000)", + "1001": "?Bomb_Msn0Lv1 (ID=1001)", + "1002": "?Bomb_Msn0Lv2 (ID=1002)", + "1003": "?Bomb_Msn0Lv3 (ID=1003)", + "1100": "?Bomb_Msn1Lv0 (ID=1100)", + "1101": "?Bomb_Msn1Lv1 (ID=1101)", + "1102": "?Bomb_Msn1Lv2 (ID=1102)", + "1103": "?Bomb_Msn1Lv3 (ID=1103)", + "1200": "?Bomb_Msn2Lv0 (ID=1200)", + "1201": "?Bomb_Msn2Lv1 (ID=1201)", + "1202": "?Bomb_Msn2Lv2 (ID=1202)", + "1203": "?Bomb_Msn2Lv3 (ID=1203)", + "2000": "?Bomb_Rvl0Lv0 (ID=2000)", + "2001": "?Bomb_Rvl0Lv1 (ID=2001)", + "2002": "?Bomb_Rvl0Lv2 (ID=2002)", + "2003": "?Bomb_Rvl0Lv3 (ID=2003)" + }, + "specials": { + "0": "Inkzooka (ID=0)", + "1": "Killer Wail (ID=1)", + "2": "Inkstrike (ID=2)", + "3": "Bubbler (ID=3)", + "4": "Bomb Rush (ID=4)", + "5": "Kraken (ID=5)", + "6": "Echolocator (ID=6)", + "7": "Rainmaker (ID=7)" + }, + "headgear": { + "0": "ARINOMAMA (ID=0)", + "1": "White Headband (ID=1)", + "1000": "Urchins Cap (ID=1000)", + "1001": "Lightweight Cap (ID=1001)", + "1002": "Takoroka Mesh (ID=1002)", + "1003": "Fashion Cap (ID=1003)", + "1004": "Squid-Stitch Cap (ID=1004)", + "1005": "Squidvader Cap (ID=1005)", + "1006": "Camo Mesh Cap (ID=1006)", + "1007": "5-Panel Cap (ID=1007)", + "1008": "Zekko Mesh (ID=1008)", + "1009": "Backwards Cap (ID=1009)", + "1010": "2-Stripe Mesh Cap (ID=1010)", + "1011": "Jet Cap (ID=1011)", + "1012": "Cycling Cap (ID=1012)", + "1013": "SQUID GIRL Hat (ID=1013)", + "1014": "Cycle King Cap (ID=1014)", + "1015": "Legendary Cap (ID=1015)", + "1016": "CoroCoro Cap (ID=1016)", + "2000": "Bobble Hat (ID=2000)", + "2001": "Short Beanie (ID=2001)", + "2002": "Striped Beanie (ID=2002)", + "2003": "Sporty Bobble Hat (ID=2003)", + "2004": "Special Forces Beret (ID=2004)", + "2005": "Squid Nordic (ID=2005)", + "3000": "Retro Specs (ID=3000)", + "3001": "Splash Googles (ID=3001)", + "3002": "Pilot Goggles (ID=3002)", + "3003": "Colored Shadows (ID=3003)", + "3004": "Black Arrowbands (ID=3004)", + "3005": "Snorkel (ID=3005)", + "3006": "White Arrowbands (ID=3006)", + "3007": "Fake Contacts (ID=3007)", + "3008": "18K Aviators (ID=3008)", + "3009": "Full Moon Glasses (ID=3009)", + "3010": "Octoglasses (ID=3010)", + "4000": "Jungle Hat (ID=4000)", + "4001": "Safari Hat (ID=4001)", + "4002": "Camping Hat (ID=4002)", + "4003": "Fugu Bell Hat (ID=4003)", + "4004": "Bambo Hat (ID=4004)", + "4005": "Straw Boater (ID=4005)", + "4006": "Treasure Hunter (ID=4006)", + "5000": "Studio Headphones (ID=5000)", + "5001": "Colorful Headphones (ID=5001)", + "5002": "Noise Cancellers (ID=5002)", + "6000": "Golf Visor (ID=6000)", + "6001": "FishFry Visor (ID=6001)", + "6002": "Sun Visor (ID=6002)", + "7000": "Cycle Helmet (ID=7000)", + "7002": "Stealth Goggles (ID=7002)", + "7003": "Tentacles Helmet (ID=7003)", + "7004": "Skate Helmet (ID=7004)", + "7005": "Visor Skate Helmet (ID=7005)", + "8000": "Gas Mask (ID=8000)", + "8001": "Paintball Mask (ID=8001)", + "8002": "Paisley Bandana (ID=8002)", + "8003": "Skull Bandana (ID=8003)", + "9001": "B-Ball Headband (ID=9001)", + "9002": "Squash Headband (ID=9002)", + "9003": "Tennis Headband (ID=9003)", + "9004": "Joggling Headband (ID=9004)", + "9005": "Soccer Headband (ID=9005)", + "9006": "Traditional Headband (ID=9006)", + "25000": "Squid Hairclip (ID=25000)", + "25001": "Samurai Helmet (ID=25001)", + "25002": "Power Mask (ID=25002)", + "27000": "Hero Headset Replica (ID=27000)", + "27001": "?MSN001 (ID=27001)", + "27002": "?MSN002 (ID=27002)", + "27003": "?MSN003 (ID=27003)", + "27004": "?MSN004 (ID=27004)", + "28000": "Octoling Scope (ID=28000)", + "28001": "ヘルメットライバル用強 (ID=28001)", + "29003": "?SubInk_Save (ID=29003)", + "29004": "?InkRecovery_Up (ID=29004)", + "29005": "?HumanMove_Up (ID=29005)", + "29006": "?SquidMove_Up (ID=29006)", + "29007": "?SpecialIncrease_Up (ID=29007)", + "29008": "?SpecialTime_Up (ID=29008)", + "29009": "?RespawnTime_Save (ID=29009)", + "29010": "?RespawnSpecialGauge_Save (ID=29010)", + "29011": "?JumpTime_Save (ID=29011)", + "29012": "?BombDistance_Up (ID=29012)", + "29013": "?StartAllUp (ID=29013)", + "29014": "?EndAllUp (ID=29014)", + "29015": "?MinorityUp (ID=29015)", + "29016": "?ComeBack (ID=29016)", + "29500": "?SUP000 (ID=29500)", + "29501": "?SUP001 (ID=29501)" + }, + "clothes": { + "0": "?NoClothes (ID=0)", + "1": "Basic Tee (ID=1)", + "1000": "White Tee (ID=1000)", + "1001": "Black Squideye (ID=1001)", + "1003": "Sky Blue Squideye (ID=1003)", + "1004": "RockenBerg White (ID=1004)", + "1005": "RockenBerg Black (ID=1005)", + "1006": "Black Tee (ID=1006)", + "1007": "Sunny Day Tee (ID=1007)", + "1008": "Rainy Day Tee (ID=1008)", + "1009": "Reggae Tee (ID=1009)", + "1010": "Fugu Tee (ID=1010)", + "1011": "Mint Tee (ID=1011)", + "1012": "Grape Tee (ID=1012)", + "1013": "Red Vector Tee (ID=1013)", + "1014": "Grey Vector Tee (ID=1014)", + "1015": "Blue Peaks Tee (ID=1015)", + "1016": "Ivory Peaks Tee (ID=1016)", + "1017": "Squid-Stitch Tee (ID=1017)", + "1018": "Pirate Stripes Tee (ID=1018)", + "1019": "Sailor Stripes Tee (ID=1019)", + "1020": "White 8-Bit FishFry (ID=1020)", + "1021": "Black 8-Bit FishFry (ID=1021)", + "1022": "White Anchor Tee (ID=1022)", + "1023": "Black Anchor Tee (ID=1023)", + "1024": "White Line Tee (ID=1024)", + "1025": "Black Pipe Tee (ID=1025)", + "1026": "Carnivore Tee (ID=1026)", + "1027": "Pearl Tee (ID=1027)", + "1028": "Octo Tee (ID=1028)", + "1029": "Herbivore Tee (ID=1029)", + "2000": "White Striped LS (ID=2000)", + "2001": "Black LS (ID=2001)", + "2002": "Purple Camo LS (ID=2002)", + "2003": "Navy Striped LS (ID=2003)", + "2004": "Zekko Baseball LS (ID=2004)", + "2005": "Varsity Baseball (ID=2005)", + "2006": "Black Baseball LS (ID=2006)", + "2007": "White Baseball LS (ID=2007)", + "2008": "White LS (ID=2008)", + "2009": "Green Striped LS (ID=2009)", + "2010": "Squidmark LS (ID=2010)", + "2011": "Zink LS (ID=2011)", + "2012": "Striped Peaks LS (ID=2012)", + "3000": "White Layered LS (ID=3000)", + "3001": "Yellow Layered LS (ID=3001)", + "3002": "Layered Camo LS (ID=3002)", + "3003": "Black Layered LS (ID=3003)", + "3004": "Zink Layered LS (ID=3004)", + "3005": "Layered Anchor LS (ID=3005)", + "3006": "Choco Layered LS (ID=3006)", + "3007": "Part-Time Pirate (ID=3007)", + "3008": "Layered Vector LS (ID=3008)", + "3009": "Green Tee (ID=3009)", + "4000": "Pink Shrimp Polo (ID=4000)", + "4001": "Striped Rugby (ID=4001)", + "4002": "Tricolor Rugby (ID=4002)", + "4003": "Sage Green Polo (ID=4003)", + "4004": "Black Polo (ID=4004)", + "4005": "Cycling Shirt (ID=4005)", + "4006": "Cycle King Jersey (ID=4006)", + "4007": "Slipstream United (ID=4007)", + "4008": "FC Albacore (ID=4008)", + "5000": "Olive Ski Jacket (ID=5000)", + "5002": "Berry Ski Jacket (ID=5002)", + "5003": "Varsity Jacket (ID=5003)", + "5004": "School Jersey (ID=5004)", + "5005": "Green Cardigan (ID=5005)", + "5006": "Black Inky Rider (ID=5006)", + "5007": "White Inky Rider (ID=5007)", + "5008": "Retro Gamer Jersey (ID=5008)", + "5009": "Orange Cardigan (ID=5009)", + "5010": "Forge Inkling Perka (ID=5010)", + "5011": "Forge Octarian Jacket (ID=5011)", + "5012": "Blue Sailor Suit (ID=5012)", + "5013": "White Sailor Suit (ID=5013)", + "5014": "Squid Satin Jacket (ID=5014)", + "5015": "Zapfish Satin Jacket (ID=5015)", + "5016": "Krak-On 528 (ID=5016)", + "6000": "B-Ball Vest (Home) (ID=6000)", + "6001": "B-Ball Vest (Away) (ID=6001)", + "6002": "SQUID GIRL Tunic (ID=6002)", + "7000": "Grey College Sweat (ID=7000)", + "7001": "Squidmark Sweat (ID=7001)", + "7002": "Retro Sweat (ID=7002)", + "7003": "Firefin Sweat Navy (ID=7003)", + "7004": "Navy Collage Sweat (ID=7004)", + "7005": "Reel Sweat (ID=7005)", + "7006": "Anchor Sweat (ID=7006)", + "8000": "Lumberjack Shirt (ID=8000)", + "8001": "Rodeo Shirt (ID=8001)", + "8002": "Green Check Shirt (ID=8002)", + "8003": "White Shirt (ID=8003)", + "8004": "Urchins Jersey (ID=8004)", + "8005": "Aloha Shirt (ID=8005)", + "8006": "Red Check Shirt (ID=8006)", + "8007": "Baby Jelly Shirt (ID=8007)", + "8008": "Baseball Jersey (ID=8008)", + "8009": "Grey Mixed Shirt (ID=8009)", + "8010": "Vintage Check (ID=8010)", + "8011": "Round Collar Shirt (ID=8011)", + "8012": "Logo Aloha Shirt (ID=8012)", + "8013": "Striped Shirt (ID=8013)", + "8014": "Linen Shirt (ID=8014)", + "8015": "Shirt and Tie (ID=8015)", + "8016": "Traditional Apron (ID=8016)", + "9000": "Mountain Gilet (ID=9000)", + "9001": "Forest Gilet (ID=9001)", + "9002": "Dark Urban Gilet (ID=9002)", + "9003": "Yellow Urban Gilet (ID=9003)", + "9004": "Squid Pattern Waistcoat (ID=9004)", + "9005": "Squidstar Waistcoat (ID=9005)", + "10000": "Camo Zip Hoodie (ID=10000)", + "10001": "Green Zip Hoodie (ID=10001)", + "10002": "Zekko Hoodie (ID=10002)", + "10003": "CoroCoro Hoodie (ID=10003)", + "25000": "School Uniform (ID=25000)", + "25001": "Samurai Jacket (ID=25001)", + "25002": "Power Armour (ID=25002)", + "27000": "?MSN000 (ID=27000)", + "27001": "?MSN001 (ID=27001)", + "27002": "?MSN002 (ID=27002)", + "27003": "?MSN003 (ID=27003)", + "27004": "Armor Jacket Replica (ID=27004)", + "28000": "Octoling Armor (ID=28000)", + "26000": "Splatfest Tee (ID=26000)", + "26001": "HAP001_A (ID=26001)", + "26002": "Test_Clt_HAP001_B (ID=26002)", + "26033": "Test_Clt_HAP1001_A (ID=26033)", + "26034": "Test_Clt_HAP1001_B (ID=26034)", + "26035": "Test_Clt_HAP2001_A (ID=26035)", + "26036": "Test_Clt_HAP2001_B (ID=26036)", + "26037": "Test_Clt_HAP3001_A (ID=26037)", + "26038": "Test_Clt_HAP3001_B (ID=26038)", + "26039": "Test_Clt_HAP1002_A (ID=26039)", + "26040": "Test_Clt_HAP1002_B (ID=26040)", + "26041": "Test_Clt_HAP2002_A (ID=26041)", + "26042": "Test_Clt_HAP2002_B (ID=26042)", + "26043": "Test_Clt_HAP3002_A (ID=26043)", + "26044": "Test_Clt_HAP3002_B (ID=26044)", + "26045": "Test_Clt_HAP1003_A (ID=26045)", + "26046": "Test_Clt_HAP1003_B (ID=26046)", + "26047": "Test_Clt_HAP2003_A (ID=26047)", + "26048": "Test_Clt_HAP2003_B (ID=26048)", + "26049": "Test_Clt_HAP3003_A (ID=26049)", + "26050": "Test_Clt_HAP3003_B (ID=26050)", + "26051": "Test_Clt_HAP1012_A (ID=26051)", + "26052": "Test_Clt_HAP1012_B (ID=26052)", + "26053": "Test_Clt_HAP2004_A (ID=26053)", + "26054": "Test_Clt_HAP2004_B (ID=26054)", + "26055": "Test_Clt_HAP3004_A (ID=26055)", + "26056": "Test_Clt_HAP3004_B (ID=26056)", + "26057": "Test_Clt_HAP1005_A (ID=26057)", + "26058": "Test_Clt_HAP1005_B (ID=26058)", + "26059": "Test_Clt_HAP2005_A (ID=26059)", + "26060": "Test_Clt_HAP2005_B (ID=26060)", + "26061": "Test Tee: ?HAP1007_A (ID=26061)", + "26062": "Test Tee: ?HAP1007_B (ID=26062)", + "26063": "Test Tee: ?HAP2006_A (ID=26063)", + "26064": "Test Tee: ?HAP2006_B (ID=26064)", + "26065": "Test Tee: ?HAP1008_A (ID=26065)", + "26066": "Test Tee: ?HAP1008_B (ID=26066)", + "26067": "Test Tee: ?HAP2007_A (ID=26067)", + "26068": "Test Tee: ?HAP2007_B (ID=26068)", + "26069": "Test Tee: ?HAP3007_A (ID=26069)", + "26070": "Test Tee: ?HAP3007_B (ID=26070)", + "26071": "Test Tee: ?HAP1009_A (ID=26071)", + "26072": "Test Tee: ?HAP1009_B (ID=26072)", + "26073": "Test Tee: ?HAP2008_A (ID=26073)", + "26074": "Test Tee: ?HAP2008_B (ID=26074)", + "26075": "Test Tee: ?HAP3008_A (ID=26075)", + "26076": "Test Tee: ?HAP3008_B (ID=26076)", + "26077": "Test Tee: ?HAP1015_A (ID=26077)", + "26078": "Test Tee: ?HAP1015_B (ID=26078)", + "26079": "Test Tee: ?HAP2009_A (ID=26079)", + "26080": "Test Tee: ?HAP2009_B (ID=26080)", + "26081": "Test Tee: ?HAP3009_A (ID=26081)", + "26082": "Test Tee: ?HAP3009_B (ID=26082)", + "26083": "Test Tee: ?HAP3010_A (ID=26083)", + "26084": "Test Tee: ?HAP3010_B (ID=26084)", + "26085": "Test Tee: ?HAP1011_A (ID=26085)", + "26086": "Test Tee: ?HAP1011_B (ID=26086)", + "26087": "Test Tee: ?HAP2011_A (ID=26087)", + "26088": "Test Tee: ?HAP2011_B (ID=26088)", + "26089": "Test Tee: ?HAP3011_A (ID=26089)", + "26090": "Test Tee: ?HAP3011_B (ID=26090)", + "26091": "Test Tee: ?HAP3012_A (ID=26091)", + "26092": "Test Tee: ?HAP3012_B (ID=26092)", + "26093": "Test Tee: ?HAP1013_A (ID=26093)", + "26094": "Test Tee: ?HAP1013_B (ID=26094)", + "26095": "Test Tee: ?HAP3013_A (ID=26095)", + "26096": "Test Tee: ?HAP3013_B (ID=26096)", + "26097": "Test Tee: ?HAP1017_A (ID=26097)", + "26098": "Test Tee: ?HAP1017_B (ID=26098)", + "26099": "Test Tee: ?HAP1018_A (ID=26099)", + "26100": "Test Tee: ?HAP1018_B (ID=26100)", + "26101": "Test Tee: ?HAP3014_A (ID=26101)", + "26102": "Test Tee: ?HAP3014_B (ID=26102)", + "26103": "Test Tee: ?HAP2016_A (ID=26103)", + "26104": "Test Tee: ?HAP2016_B (ID=26104)", + "26105": "Test Tee: ?HAP3019_A (ID=26105)", + "26106": "Test Tee: ?HAP3019_B (ID=26106)", + "26107": "Test Tee: ?HAP2019_A (ID=26107)", + "26108": "Test Tee: ?HAP2019_B (ID=26108)", + "26109": "Test Tee: ?HAP1021_A (ID=26109)", + "26110": "Test Tee: ?HAP1021_B (ID=26110)", + "26111": "Test Tee: ?HAP2020_A (ID=26111)", + "26112": "Test Tee: ?HAP2020_B (ID=26112)", + "26113": "Test Tee: ?HAP3020_A (ID=26113)", + "26114": "Test Tee: ?HAP3020_B (ID=26114)", + "26115": "Test Tee: ?HAP3021_A (ID=26115)", + "26116": "Test Tee: ?HAP3021_B (ID=26116)", + "26117": "Test Tee: ?HAP1022_A (ID=26117)", + "26118": "Test Tee: ?HAP1022_B (ID=26118)", + "26119": "Test Tee: ?HAP1023_A (ID=26119)", + "26120": "Test Tee: ?HAP1023_B (ID=26120)", + "26121": "Test Tee: ?HAP3022_A (ID=26121)", + "26122": "Test Tee: ?HAP3022_B (ID=26122)", + "26123": "Test Tee: ?HAP3023_A (ID=26123)", + "26124": "Test Tee: ?HAP3023_B (ID=26124)", + "26125": "Test Tee: ?HAP1024_A (ID=26125)", + "26126": "Test Tee: ?HAP1024_B (ID=26126)", + "26127": "Test Tee: ?HAP1025_A (ID=26127)", + "26128": "Test Tee: ?HAP1025_B (ID=26128)", + "26129": "Test Tee: ?HAP1020_A (ID=26129)", + "26130": "Test Tee: ?HAP1020_B (ID=26130)", + "26131": "Test Tee: ?HAP1026_A (ID=26131)", + "26132": "Test Tee: ?HAP1026_B (ID=26132)", + "26133": "Test Tee: ?HAP3024_A (ID=26133)", + "26134": "Test Tee: ?HAP3024_B (ID=26134)", + "26135": "Test Tee: ?HAP2021_A (ID=26135)", + "26136": "Test Tee: ?HAP2021_B (ID=26136)", + "29000": "Attack_Up (ID=29000)", + "29001": "Defense_Up (ID=29001)", + "29002": "MainInk_Save (ID=29002)", + "29003": "SubInk_Save (ID=29003)", + "29004": "InkRecovery_Up (ID=29004)", + "29005": "HumanMove_Up (ID=29005)", + "29006": "SquidMove_Up (ID=29006)", + "29007": "SpecialIncrease_Up (ID=29007)", + "29008": "SpecialTime_Up (ID=29008)", + "29009": "RespawnTime_Save (ID=29009)", + "29010": "RespawnSpecialGauge_Save (ID=29010)", + "29011": "JumpTime_Save (ID=29011)", + "29012": "BombDistance_Up (ID=29012)", + "29013": "MarkingCancel (ID=29013)", + "29014": "SquidMoveSpatter_Reduction (ID=29014)", + "29015": "DeathMarking (ID=29015)", + "29016": "RespawnRadar (ID=29016)", + "29500": "?SUP000 (ID=29500)", + "29501": "?SUP001 (ID=29501)" + }, + "shoes": { + "0": "ありのまま (ID=0)", + "1": "Cream Basics (ID=1)", + "1000": "Blue Lo-Tops (ID=1000)", + "1001": "Banana Basics (ID=1001)", + "1002": "LE Lo-Tops (ID=1002)", + "1003": "White Seahorses (ID=1003)", + "1004": "Orange Lo-Tops (ID=1004)", + "1005": "Black Seahorses (ID=1005)", + "1006": "Clownfish Basics (ID=1006)", + "1007": "Yellow Seahorses (ID=1007)", + "1008": "Strapping Whites (ID=1008)", + "1009": "Strapping Reds (ID=1009)", + "1010": "Soccer Cleats (ID=1010)", + "1011": "LE Soccer Cleats (ID=1011)", + "2000": "Red Hi-Horses (ID=2000)", + "2001": "Zombie Hi-Horses (ID=2001)", + "2002": "Cream Hi-Tops (ID=2002)", + "2003": "Purple Hi-Horses (ID=2003)", + "2004": "Hunter Hi-Tops (ID=2004)", + "2005": "Red Hi-Tops (ID=2005)", + "2006": "Gold Hi_Horses (ID=2006)", + "2007": "SQUID GIRL Shoes (ID=2007)", + "2008": "Shark Mawcasins (ID=2008)", + "2009": "Mawcasins (ID=2009)", + "3000": "Pink Trainers (ID=3000)", + "3001": "Orange Arrows (ID=3001)", + "3002": "Neon Sea Slugs (ID=3002)", + "3003": "White Arrows (ID=3003)", + "3004": "Cyan Trainers (ID=3004)", + "3005": "Purple Sea Slugs (ID=3005)", + "3006": "Red Sea Slugs (ID=3006)", + "3007": "Blue Sea Slugs (ID=3007)", + "3008": "Crazy Arrows (ID=3008)", + "3009": "Black Trainers (ID=3009)", + "4000": "Oyster Clogs (ID=4000)", + "4001": "Choco Clogs (ID=4001)", + "4002": "Blueberry Casuals (ID=4002)", + "4003": "Plum Casuals (ID=4003)", + "4006": "Traditional Sandals (ID=4006)", + "5000": "Trail Boots (ID=5000)", + "5001": "Custom Trail Boots (ID=5001)", + "5002": "Pro Trail Boots (ID=5002)", + "6000": "Moto Boots (ID=6000)", + "6001": "Tan Work Boots (ID=6001)", + "6002": "Red Work Boots (ID=6002)", + "6003": "Blue Moto Boots (ID=6003)", + "6004": "Green Rain Boots (ID=6004)", + "6005": "Acerola Rain Boots (ID=6005)", + "6006": "Punk Whites (ID=6006)", + "6007": "Punk Cherries (ID=6007)", + "6008": "Punk Yellows (ID=6008)", + "6009": "Bubble Rain Boots (ID=6009)", + "6010": "Snowy Down Boots (ID=6010)", + "6011": "Icy Down Boots (ID=6011)", + "7000": "Blue Slip-Ons (ID=7000)", + "7001": "Red Slip-Ons (ID=7001)", + "7002": "Squid-Stitch Slip-Ons (ID=7002)", + "8000": "White Kicks (ID=8000)", + "8001": "Cherry Kicks (ID=8001)", + "8002": "Turquoise Kicks (ID=8002)", + "8003": "Squink Wingtips (ID=8003)", + "8004": "Roasted Brogues (ID=8004)", + "25000": "School Shoes (ID=25000)", + "25001": "Samurai Shoes (ID=25001)", + "25002": "Power Boots (ID=25002)", + "27000": "Hero Runner Replica (ID=27000)", + "27001": "?MSN001 (ID=27001)", + "27002": "?MSN002 (ID=27002)", + "27003": "?MSN003 (ID=27003)", + "27004": "Armor Boots Replica (ID=27004)", + "28000": "Octoling Boots (ID=28000)", + "29000": "?Attack_Up (ID=29000)", + "29001": "?Defense_Up (ID=29001)", + "29002": "?MainInk_Save (ID=29002)", + "29003": "?SubInk_Save (ID=29003)", + "29004": "?Inkrecovery_Up (ID=29004)", + "29005": "?HumanMove_Up (ID=29005)", + "29006": "?SquidMove_Up (ID=29006)", + "29007": "?SpecialIncrease_Up (ID=29007)", + "29008": "?SpecialTime_Up (ID=29008)", + "29009": "?RespawnTime_Save (ID=29009)", + "29010": "?RespawnSpecialGauge_Save (ID=29010)", + "29011": "?JumpTime_Save (ID=29011)", + "29012": "?BombDistance_Up (ID=29012)", + "29013": "?TrapDetect (ID=29013)", + "29014": "?EnemyInkEffect_Reduction (ID=29014)", + "29015": "?SuperJumpSign_Hide (ID=29015)", + "29500": "?SUP000 (ID=29500)", + "29501": "?SUP001 (ID=29501)" + }, + "tanks": { + "0": "Default Ink Tank (ID=0)", + "1000": "Mission Ink Tank Level 0 (ID=1000)", + "1001": "Mission Ink Tank Level 1 (ID=1001)", + "1002": "Mission Ink Tank Level 2 (ID=1002)", + "1003": "Mission Ink Tank Level 3 (ID=1003)", + "2000": "Rival Ink Tank (ID=2000)" + }, + "eye_colors": { + "0": "Brown (ID=0)", + "1": "Pink (ID=1)", + "2": "Blue (ID=2)", + "3": "Orange (ID=3)", + "4": "Turquoise (ID=4)", + "5": "Black (ID=5)", + "6": "Yellow (ID=6)" + }, + "ranks": { + "0": "C- (ID=0)", + "1": "C (ID=1)", + "2": "C+ (ID=2)", + "3": "B- (ID=3)", + "4": "B (ID=4)", + "5": "B+ (ID=5)", + "6": "A- (ID=6)", + "7": "A (ID=7)", + "8": "A+ (ID=8)", + "9": "S (ID=9)", + "10": "S+ (ID=10)" + } +} \ No newline at end of file diff --git a/judd/routes/post.js b/judd/routes/post.js index 63d95ee..563be24 100644 --- a/judd/routes/post.js +++ b/judd/routes/post.js @@ -1,5 +1,10 @@ const router = require('express').Router(); const titles = require('../titles'); +const { WebhookClient, EmbedBuilder } = require('discord.js'); +const lookup = require('./ids.json'); +const blacklist = require('./blacklist.json'); + +const webhookClient = new WebhookClient({ url: process.env.WEBHOOK_URL }); router.post('/post', async (request, response, next) => { const title = titles[request.titleCode]; @@ -10,6 +15,7 @@ router.post('/post', async (request, response, next) => { } const ResultTypeModel = title.result_model; + const data = request.resultData || {}; try { const result = await ResultTypeModel.create({ @@ -18,6 +24,43 @@ router.post('/post', async (request, response, next) => { bossDigest: request.headers['x-boss-digest'], ...request.resultData }); + const offenses = []; + if ((blacklist.weapons || []).includes(Number(data.Weapon))) offenses.push("weapon"); + if ((blacklist.clothes || []).includes(Number(data.Gear_Clothes))) offenses.push("clothes"); + if ((blacklist.rules || []).includes(Number(data.Rule))) offenses.push("rule"); + if (offenses.length > 0) { + const sWep = offenses.includes("weapon") ? "⭐ " : ""; + const sClt = offenses.includes("clothes") ? "⭐ " : ""; + const sRul = offenses.includes("rule") ? "⭐ " : ""; + + const embed = new EmbedBuilder() + .setTitle(":warning: | Invalid Telemetry received") + .setDescription(`## Offending information detected in: ${offenses.join(', ')}`) + .setFields( + { + name: "User Information:", + value: `-# ID in db/results: ${result.id || 'N/A'}`, + inline: false + }, + { name: "PID", value: `${data.PId || 'N/A'}`, inline: true }, + { name: "Mii Name", value: `${data.MiiName || 'N/A'}`, inline: true }, + { name: "Weapon", value: `${sWep}${lookup.weapons_main[data.Weapon] || data.Weapon || 'N/A'}`, inline: true }, + { name: "Headgear", value: `${lookup.headgear[data.Gear_Head] || data.Gear_Head || 'N/A'}`, inline: true }, + { name: "Clothes", value: `${sClt}${lookup.clothes[data.Gear_Clothes] || data.Gear_Clothes || 'N/A'}`, inline: true }, + { name: "Shoes", value: `${lookup.shoes[data.Gear_Shoes] || data.Gear_Shoes || 'N/A'}`, inline: true }, + { name: "Match Information:", value: " ", inline: false }, + { name: "Match Type", value: `${lookup.modes[data.GameMode] || 'N/A'}`, inline: true }, + { name: "Rule", value: `${sRul}${lookup.rules[data.Rule] || data.Rule || 'N/A'}`, inline: true }, + { name: "Stage", value: `${lookup.maps[data.Stage] || 'N/A'}`, inline: true }, + { name: "Session ID", value: `${data.SessionID || 'N/A'}`, inline: true }, + { name: "Team:", value: `${data.Team || 'N/A'}`, inline: true }, + { name: " ", value: " ", inline: true }, + { name: "Team Alpha Paint", value: `${data.Paint_Alpha || 'N/A'}`, inline: true }, + { name: "Team Bravo Paint", value: `${data.Paint_Bravo || 'N/A'}`, inline: true } + ); + + webhookClient.send({ embeds: [embed] }).catch(err => console.error('Webhook Error:', err)); + } } catch (error) { console.error('[Database Error]', error.message);