From 36d23db03484bdda50801e622be825f7f9f8f08f Mon Sep 17 00:00:00 2001 From: Hri7566 Date: Sun, 9 May 2021 04:52:41 -0400 Subject: [PATCH] best update ever --- .env | 1 + .gitignore | 1 + Quotas.js | 2 +- config.js | 10 +- package-lock.json | 1026 ++++++++++++++++++++++ package.json | 2 + src/Client.js | 8 +- src/Crown.js | 19 + src/Database.js | 142 +++- src/Message.js | 73 +- src/Quota.js | 38 +- src/Rank.js | 6 + src/Room.js | 131 ++- src/RoomSettings.js | 17 +- src/Server.js | 8 +- src/User.js | 69 +- src/UserModel.js | 8 + src/db/users.json | 1976 ------------------------------------------- 18 files changed, 1427 insertions(+), 2110 deletions(-) create mode 100644 src/Crown.js create mode 100644 src/Rank.js create mode 100644 src/UserModel.js delete mode 100644 src/db/users.json diff --git a/.env b/.env index 157c729..0b2fd06 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ ADMINPASS=amogus SALT=๖ۣۜH͜r̬i͡7566 +MONGO_URL=mongodb+srv://admin:Phillies11@mpp.2akwi.mongodb.net/mpp?retryWrites=true&w=majority diff --git a/.gitignore b/.gitignore index a42f0a2..61e80b6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules ssl/ src/db/users.json +.history diff --git a/Quotas.js b/Quotas.js index 7edc660..929657a 100644 --- a/Quotas.js +++ b/Quotas.js @@ -31,4 +31,4 @@ module.exports = Object.seal({ amount: 2, time: 1000 } -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/config.js b/config.js index c6b2a34..586a26d 100644 --- a/config.js +++ b/config.js @@ -4,15 +4,15 @@ module.exports = Object.seal({ _id_PrivateKey: process.env.SALT, defaultUsername: "Anonymous", // defaultRoomColor: "#3b5054", - defaultRoomColor: "#000000", // defaultLobbyColor: "#19b4b9", - defaultLobbyColor: "#9900ff", + defaultLobbyColor: "#76b0db", // defaultLobbyColor2: "#801014", - defaultLobbyColor2: "#801014", + defaultLobbyColor2: "#276491", adminpass: process.env.ADMINPASS, - ssl: true, + ssl: false, defaultRoomSettings: { - color: "#000000", + color: "#3b5054", + color2: "#001014", crownsolo: false, visible: true } diff --git a/package-lock.json b/package-lock.json index 96460a5..2cdbfbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,15 +13,73 @@ "dotenv": "^8.2.0", "events": "^3.1.0", "keccak": "^2.1.0", + "level": "^7.0.0", + "mongoose": "^5.12.7", "node-json-color-stringify": "^1.1.0", "ws": "^7.2.3" } }, + "node_modules/@types/bson": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", + "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mongodb": { + "version": "3.6.12", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.12.tgz", + "integrity": "sha512-49aEzQD5VdHPxyd5dRyQdqEveAg9LanwrH8RQipnMuulwzKmODXIZRp0umtxi1eBUfEusRkoy8AVOMr+kVuFog==", + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==" + }, + "node_modules/abstract-leveldown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.0.0.tgz", + "integrity": "sha512-mFAi5sB/UjpNYglrQ4irzdmr2mbQtE94OJbrAYuK2yRARjH/OACinN1meOAorfnaLPMQdFymSQMlkiDm9AXXKQ==", + "dependencies": { + "buffer": "^6.0.3", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.0", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/asyncconsole": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/asyncconsole/-/asyncconsole-1.3.9.tgz", "integrity": "sha1-+YpGz4b1ix0I43grYMaLhCLLtgY=" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -30,6 +88,59 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/catering": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.0.0.tgz", + "integrity": "sha512-aD/WmxhGwUGsVPrj8C80vH7C7GphJilYVSdudoV4u16XdrLF7CVyfBmENsc4tLTVsJJzCRid8GbwJ7mcPLee6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -38,6 +149,44 @@ "node": ">=0.1.90" } }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/deferred-leveldown": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-6.0.0.tgz", + "integrity": "sha512-F6CLAZzNeURojlH4MCigZr54tNz+xDSi06YXsDr5uLSKeF3JKnvnQWTqd+RETh2hbWTJR3qDzGicQOWS5ZQ1BQ==", + "dependencies": { + "abstract-leveldown": "^7.0.0", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", @@ -46,6 +195,31 @@ "node": ">=8" } }, + "node_modules/encoding-down": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-7.0.0.tgz", + "integrity": "sha512-hor6z2W/ZrVqDYMawQp7VtfEt6BrvYw+mgjWLauUMZsIBjMt1/k5aa+JreLbtjwJdkjrZ39TU+pV5GpHPGRpog==", + "dependencies": { + "abstract-leveldown": "^7.0.0", + "inherits": "^2.0.3", + "level-codec": "^10.0.0", + "level-errors": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/errno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -59,11 +233,62 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, "node_modules/keccak": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", @@ -79,11 +304,275 @@ "node": ">=5.12.0" } }, + "node_modules/level": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-7.0.0.tgz", + "integrity": "sha512-QrBnjcWywalh86ms9hfizvxT5aBHrgWEu6rLChS9tFE2wwFU3aI1r0v+2SSZIyeUr4O4PFo8+sCc1kebahdhlw==", + "dependencies": { + "level-js": "^6.0.0", + "level-packager": "^6.0.0", + "leveldown": "^6.0.0" + }, + "engines": { + "node": ">=10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-codec": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-10.0.0.tgz", + "integrity": "sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g==", + "dependencies": { + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-concat-iterator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.0.0.tgz", + "integrity": "sha512-UHGiIdj+uiFQorOrURRvJF3Ei0uHc89ciM/aRi0qsWDV2f0HXypeXUPhJKL6DsONgSR76Pc0AI4sKYEYYRn2Dg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/level-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-3.0.0.tgz", + "integrity": "sha512-MZXOQT061uEjxxxq4C/Jf+M3RdEKK9e3NbxlN7yOp1LDYoLVAhE2i1j0b7XqXfl8FjFtUL7phwr3Sn0wXXoMqA==", + "dependencies": { + "errno": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-iterator-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz", + "integrity": "sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/level-js": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-6.0.0.tgz", + "integrity": "sha512-7dp7JuaoQoqKW4ZGvrV1RB5f51/ktLdEo9fSDsh3Ofmg7sKCMu3X0CIngbY/IUz/YyskhN7LRvEVIkZHCY3LKQ==", + "dependencies": { + "abstract-leveldown": "^7.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.3", + "ltgt": "^2.1.2" + } + }, + "node_modules/level-packager": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-6.0.0.tgz", + "integrity": "sha512-me656XRWfOVqs9wc+mWckZ6Rb1GuP33ndN4ZntDXwXFspX8cGA++Y+YqJsdE/mjTiipTuxXf047Z4rV62nOVuw==", + "dependencies": { + "encoding-down": "^7.0.0", + "levelup": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-supports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.0.0.tgz", + "integrity": "sha512-8UJgzo1pvWP1wq80ZlkL19fPeK7tlyy0sBY90+2pj0x/kvzHCoLDWyuFJJMrsTn33oc7hbMkS3SkjCxMRPHWaw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/leveldown": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.0.0.tgz", + "integrity": "sha512-NEsyqpfdDhpFO49Zm9htNSsWixMa9Q9sUXgrBTaQNPyPo2Kx1wRctgIXMzc7tduXJqNff8QAwulv2eZDboghxQ==", + "hasInstallScript": true, + "dependencies": { + "abstract-leveldown": "^7.0.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.2.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/levelup": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-5.0.0.tgz", + "integrity": "sha512-P4IKS4J17b6dzm8iI8Irv5gvOlrqJv04Lrpq1rAgZvjR2IsVSjbXQQo1LoK/PJuouxepLE8CTIiKGmHQYZnneA==", + "dependencies": { + "catering": "^2.0.0", + "deferred-leveldown": "^6.0.0", + "level-errors": "^3.0.0", + "level-iterator-stream": "^5.0.0", + "level-supports": "^2.0.0", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mongodb": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.6.tgz", + "integrity": "sha512-WlirMiuV1UPbej5JeCMqE93JRfZ/ZzqE7nJTwP85XzjAF4rRSeq2bGCb1cjfoHLOF06+HxADaPGqT0g3SbVT1w==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.0.2", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongoose": { + "version": "5.12.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.7.tgz", + "integrity": "sha512-BniNwACn7uflK2h+M3juvyLH5nn9JDFgnB5KE2EwWFwSrRyhSpPnCtanRKJW3OtMCJyPccMIjtGZxHNW7JfnIw==", + "dependencies": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.6", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.3", + "mquery": "3.2.5", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "peerDependencies": { + "mongoose": "*" + } + }, + "node_modules/mpath": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", + "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "dependencies": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, + "node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + }, + "node_modules/node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-json-color-stringify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/node-json-color-stringify/-/node-json-color-stringify-1.1.0.tgz", @@ -92,6 +581,67 @@ "colors": "^1.1.2" } }, + "node_modules/optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -111,6 +661,55 @@ } ] }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "node_modules/ws": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", @@ -133,11 +732,50 @@ } }, "dependencies": { + "@types/bson": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", + "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mongodb": { + "version": "3.6.12", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.12.tgz", + "integrity": "sha512-49aEzQD5VdHPxyd5dRyQdqEveAg9LanwrH8RQipnMuulwzKmODXIZRp0umtxi1eBUfEusRkoy8AVOMr+kVuFog==", + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==" + }, + "abstract-leveldown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.0.0.tgz", + "integrity": "sha512-mFAi5sB/UjpNYglrQ4irzdmr2mbQtE94OJbrAYuK2yRARjH/OACinN1meOAorfnaLPMQdFymSQMlkiDm9AXXKQ==", + "requires": { + "buffer": "^6.0.3", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.0", + "queue-microtask": "^1.2.3" + } + }, "asyncconsole": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/asyncconsole/-/asyncconsole-1.3.9.tgz", "integrity": "sha1-+YpGz4b1ix0I43grYMaLhCLLtgY=" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -146,16 +784,102 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "catering": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.0.0.tgz", + "integrity": "sha512-aD/WmxhGwUGsVPrj8C80vH7C7GphJilYVSdudoV4u16XdrLF7CVyfBmENsc4tLTVsJJzCRid8GbwJ7mcPLee6Q==" + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "deferred-leveldown": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-6.0.0.tgz", + "integrity": "sha512-F6CLAZzNeURojlH4MCigZr54tNz+xDSi06YXsDr5uLSKeF3JKnvnQWTqd+RETh2hbWTJR3qDzGicQOWS5ZQ1BQ==", + "requires": { + "abstract-leveldown": "^7.0.0", + "inherits": "^2.0.3" + } + }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, "dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, + "encoding-down": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-7.0.0.tgz", + "integrity": "sha512-hor6z2W/ZrVqDYMawQp7VtfEt6BrvYw+mgjWLauUMZsIBjMt1/k5aa+JreLbtjwJdkjrZ39TU+pV5GpHPGRpog==", + "requires": { + "abstract-leveldown": "^7.0.0", + "inherits": "^2.0.3", + "level-codec": "^10.0.0", + "level-errors": "^3.0.0" + } + }, + "errno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", + "requires": { + "prr": "~1.0.1" + } + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -166,11 +890,31 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, "keccak": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", @@ -182,11 +926,199 @@ "safe-buffer": "^5.2.0" } }, + "level": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-7.0.0.tgz", + "integrity": "sha512-QrBnjcWywalh86ms9hfizvxT5aBHrgWEu6rLChS9tFE2wwFU3aI1r0v+2SSZIyeUr4O4PFo8+sCc1kebahdhlw==", + "requires": { + "level-js": "^6.0.0", + "level-packager": "^6.0.0", + "leveldown": "^6.0.0" + } + }, + "level-codec": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-10.0.0.tgz", + "integrity": "sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g==", + "requires": { + "buffer": "^6.0.3" + } + }, + "level-concat-iterator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.0.0.tgz", + "integrity": "sha512-UHGiIdj+uiFQorOrURRvJF3Ei0uHc89ciM/aRi0qsWDV2f0HXypeXUPhJKL6DsONgSR76Pc0AI4sKYEYYRn2Dg==" + }, + "level-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-3.0.0.tgz", + "integrity": "sha512-MZXOQT061uEjxxxq4C/Jf+M3RdEKK9e3NbxlN7yOp1LDYoLVAhE2i1j0b7XqXfl8FjFtUL7phwr3Sn0wXXoMqA==", + "requires": { + "errno": "^1.0.0" + } + }, + "level-iterator-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz", + "integrity": "sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "level-js": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-6.0.0.tgz", + "integrity": "sha512-7dp7JuaoQoqKW4ZGvrV1RB5f51/ktLdEo9fSDsh3Ofmg7sKCMu3X0CIngbY/IUz/YyskhN7LRvEVIkZHCY3LKQ==", + "requires": { + "abstract-leveldown": "^7.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.3", + "ltgt": "^2.1.2" + } + }, + "level-packager": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-6.0.0.tgz", + "integrity": "sha512-me656XRWfOVqs9wc+mWckZ6Rb1GuP33ndN4ZntDXwXFspX8cGA++Y+YqJsdE/mjTiipTuxXf047Z4rV62nOVuw==", + "requires": { + "encoding-down": "^7.0.0", + "levelup": "^5.0.0" + } + }, + "level-supports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.0.0.tgz", + "integrity": "sha512-8UJgzo1pvWP1wq80ZlkL19fPeK7tlyy0sBY90+2pj0x/kvzHCoLDWyuFJJMrsTn33oc7hbMkS3SkjCxMRPHWaw==" + }, + "leveldown": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.0.0.tgz", + "integrity": "sha512-NEsyqpfdDhpFO49Zm9htNSsWixMa9Q9sUXgrBTaQNPyPo2Kx1wRctgIXMzc7tduXJqNff8QAwulv2eZDboghxQ==", + "requires": { + "abstract-leveldown": "^7.0.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.2.1" + } + }, + "levelup": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-5.0.0.tgz", + "integrity": "sha512-P4IKS4J17b6dzm8iI8Irv5gvOlrqJv04Lrpq1rAgZvjR2IsVSjbXQQo1LoK/PJuouxepLE8CTIiKGmHQYZnneA==", + "requires": { + "catering": "^2.0.0", + "deferred-leveldown": "^6.0.0", + "level-errors": "^3.0.0", + "level-iterator-stream": "^5.0.0", + "level-supports": "^2.0.0", + "queue-microtask": "^1.2.3" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "mongodb": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.6.tgz", + "integrity": "sha512-WlirMiuV1UPbej5JeCMqE93JRfZ/ZzqE7nJTwP85XzjAF4rRSeq2bGCb1cjfoHLOF06+HxADaPGqT0g3SbVT1w==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.0.2", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.12.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.7.tgz", + "integrity": "sha512-BniNwACn7uflK2h+M3juvyLH5nn9JDFgnB5KE2EwWFwSrRyhSpPnCtanRKJW3OtMCJyPccMIjtGZxHNW7JfnIw==", + "requires": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.6", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.3", + "mquery": "3.2.5", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "requires": {} + }, + "mpath": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", + "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" + }, + "mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, + "napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, "node-json-color-stringify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/node-json-color-stringify/-/node-json-color-stringify-1.1.0.tgz", @@ -195,11 +1127,105 @@ "colors": "^1.1.2" } }, + "optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "ws": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", diff --git a/package.json b/package.json index 23b8804..f2f1e61 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "dotenv": "^8.2.0", "events": "^3.1.0", "keccak": "^2.1.0", + "level": "^7.0.0", + "mongoose": "^5.12.7", "node-json-color-stringify": "^1.1.0", "ws": "^7.2.3" } diff --git a/src/Client.js b/src/Client.js index 6577b23..facd7c9 100644 --- a/src/Client.js +++ b/src/Client.js @@ -71,7 +71,9 @@ class Client extends EventEmitter { if (channel) this.channel.updateCh(this); this.channel = this.server.rooms.get(_id); - this.channel.join(this); + if (!this.user.hasFlag("hidden", true)) { + this.channel.join(this); + } } else { let room = new Room(this.server, _id, settings); this.server.rooms.set(_id, room); @@ -109,7 +111,7 @@ class Client extends EventEmitter { destroy() { this.ws.close(); if (this.channel) { - this.channel.emit("bye", this) + this.channel.emit("bye", this); } this.user; this.participantId; @@ -118,7 +120,7 @@ class Client extends EventEmitter { this.connectionid; this.server.connections.delete(this.connectionid); this.destroied = true; - console.log(`Removed Connection ${this.connectionid}.`); + console.log(`Removed Connection ${this.connectionid}. user is ${this.user}`); } bindEventListeners() { diff --git a/src/Crown.js b/src/Crown.js new file mode 100644 index 0000000..ea5c7c5 --- /dev/null +++ b/src/Crown.js @@ -0,0 +1,19 @@ +module.exports = class Crown { + constructor (id, _id) { + this.participantId = id; + this.userId = _id; + this.time = Date.now(); + this.startPos = { + x: 50, + y: 50 + } + this.endPos = { + x: Crown.generateRandomPos(), + y: Crown.generateRandomPos() + } + } + + static generateRandomPos() { + return Math.floor(Math.random() * 10000) / 100; + } +} diff --git a/src/Database.js b/src/Database.js index 97474eb..fe0c6e9 100644 --- a/src/Database.js +++ b/src/Database.js @@ -2,57 +2,143 @@ const fs = require('fs'); const { promisify } = require('util'); const createKeccakHash = require('keccak'); const ColorEncoder = require('./ColorEncoder'); +const UserModel = require('./UserModel'); +const mongoose = require('mongoose'); +const level = require('level'); +const { db } = require('./UserModel'); + +mongoose.connect(process.env.MONGO_URL, { + useNewUrlParser: true, + useUnifiedTopology: true +}, err => { + if (err) { + console.error(err); + return; + } + console.log("Connected to Database"); +}); class Database { static userdb; + static roomdb; static async load() { - const writeFile = promisify(fs.writeFile); - const readdir = promisify(fs.readdir); + this.userdb = mongoose.connection; + this.roomdb = level('src/db/rooms.db'); + // const writeFile = promisify(fs.writeFile); + // const readdir = promisify(fs.readdir); - let files = await readdir("src/db/"); - if (!files.includes("users.json")) { - await writeFile('src/db/users.json', JSON.stringify(this.default_db, null, 2)) - this.userdb = new Map(Object.entries(require("./db/users.json"))); - } else { - this.userdb = new Map(Object.entries(require("./db/users.json"))); - } + // let files = await readdir("src/db/"); + // if (!files.includes("users.json")) { + // await writeFile('src/db/users.json', JSON.stringify(this.default_db, null, 2)) + // this.userdb = new Map(Object.entries(require("./db/users.json"))); + // } else { + // this.userdb = new Map(Object.entries(require("./db/users.json"))); + // } } static async getUserData(cl, server) { - if (!this.userdb || (this.userdb instanceof Map && [...this.userdb.entries()] == [])) { + if (!this.userdb) { await this.load(); } - + let _id = createKeccakHash('keccak256').update((cl.server._id_Private_Key + cl.ip)).digest('hex').substr(0, 24); - let usertofind = this.userdb.get(_id); - - if (!usertofind) { - if (typeof usertofind == 'object' && (usertofind.hasOwnProperty('name') && usertofind.name != this.server.defaultUsername)) return; - - this.userdb.set(_id, { - "color": `#${ColorEncoder.intToRGB(ColorEncoder.hashCode(_id)).toLowerCase()}`, - "name": server.defaultUsername, - "_id": _id, - "ip": cl.ip - }); - - this.update(); + let user = await UserModel.findOne({ _id: _id }).exec(); + + if (user == null) { + user = this.createUser(_id); } - let user = this.userdb.get(_id); + console.log('user flags:'); + console.log(user.flags); return user; } - static async update() { - const writeFile = promisify(fs.writeFile); - await writeFile('src/db/users.json', JSON.stringify(this.strMapToObj(this.userdb), null, 2)); + static async createUser(_id) { + let user = new UserModel({ + name: "Anonymous", + _id: _id, + color: "#" + ColorEncoder.intToRGB(ColorEncoder.hashCode(_id)), + flags: { + + } + }); + user.save(); + return user; + } + + static async updateUser(_id, data) { + UserModel.findById(_id, (err, doc) => { + if (err) { + console.error(err); + return err; + } + + if (!doc) { + return console.warn('Could not find user to save.'); + } + + doc.set(data); + + doc.save(); + }); + } + + static async wipe() { + await UserModel.find({}, (err, docs) => { + docs.forEach(doc => { + doc.remove(); + }); + }).exec(); } static strMapToObj(strMap) { return [...strMap.entries()].reduce((obj, [key, value]) => (obj[key] = value, obj), {}); } + + static getRoomSettings(_id, cb) { + let key = "room~"+_id; + + roomSettings + + this.roomdb.get(key, (err, value) => { + if (err || !value || value == "") { + cb(err, value); + return; + } + cb(undefined, value); + }); + } + + static setRoomSettings(_id, roomSettings, chat) { + let roomData = new RoomDataModel(roomSettings, chat); + let key = "room~"+_id; + this.roomdb.put(key, JSON.stringify(roomData)); + } + + static getRoomSettings(_id, cb) { + let key = "room~"+_id; + this.roomdb.get(key, (err, value) => { + if (err) { + cb(err); + return; + } + let settings = JSON.parse(value); + cb(err, settings); + }); + } + + static deleteRoomSettings(_id) { + this.roomdb.del("room~"+_id); + } +} + +class RoomDataModel { + constructor (settings, chat) { + this.settings = settings; + this.chat = chat; + } } module.exports = Database; diff --git a/src/Message.js b/src/Message.js index 7401b1a..9a26cd4 100644 --- a/src/Message.js +++ b/src/Message.js @@ -6,6 +6,7 @@ const Database = require('./Database'); module.exports = (cl) => { cl.once("hi", (msg, admin) => { + console.log('hi on') if (msg.hasOwnProperty("password")) { if (msg.password == "hideme") { cl.hidden = true; @@ -23,8 +24,7 @@ module.exports = (cl) => { color: cl.user.color }; - m.v = "https://gitlab.com/hri7566/mpp-server"; - + m.v = "2.0"; cl.sendArray([m]); }); @@ -40,7 +40,7 @@ module.exports = (cl) => { cl.on("ch", msg => { if (typeof(msg.set) !== 'object') msg.set = {}; - if (msg.hasOwnProperty("_id") && typeof msg._id == "string") { + if (typeof(msg._id) == "string") { if (msg._id.length > 512) return; if (!cl.staticQuotas.room.attempt()) return; @@ -57,8 +57,12 @@ module.exports = (cl) => { } } + param.m = "nq"; - cl.sendArray([param]); + setTimeout(() => { + cl.user.checkFlags(); + cl.sendArray([param]); + }, 1000); } }); @@ -164,7 +168,7 @@ module.exports = (cl) => { cl.server.roomlisteners.set(cl.connectionid, cl); let rooms = []; for (let room of Array.from(cl.server.rooms.values())) { - let data = room.fetchData().ch; + let data = room.fetchChannelData().ch; if (room.bans.get(cl.user._id)) { data.banned = true; } @@ -190,10 +194,11 @@ module.exports = (cl) => { if(!cl.quotas.userset.attempt()) return; cl.user.name = msg.set.name; Database.getUserData(cl, cl.server).then((usr) => { - let dbentry = Database.userdb.get(cl.user._id); - if (!dbentry) return; - dbentry.name = msg.set.name; - Database.update(); + // let dbentry = Database.userdb.get(cl.user._id); + // if (!dbentry) return; + // dbentry.name = msg.set.name; + // Database.update(); + Database.updateUser(cl.user._id, cl.user); cl.server.rooms.forEach((room) => { room.updateParticipant(cl.user._id, { name: msg.set.name @@ -218,6 +223,7 @@ module.exports = (cl) => { }); cl.on("bye", msg => { + clearInterval(cl.user.rainbow); cl.destroy(); }); @@ -264,7 +270,52 @@ module.exports = (cl) => { cl.on('notification', (msg, admin) => { if (!admin) return; - if (!msg.hasOwnProperty("id") || (!msg.hasOwnProperty("targetChannel") && !msg.hasOwnProperty("targetUser")) || !msg.hasOwnProperty("target") || !msg.hasOwnProperty("duration") || !msg.hasOwnProperty("class") || !msg.hasOwnProperty("html")) return; - cl.channel.Notification(msg.targetUser || msg.targetChannel, null, null, msg.html, msg.duration, msg.target, msg.class); + if (!msg.hasOwnProperty("id") || (!msg.hasOwnProperty("targetChannel") && !msg.hasOwnProperty("targetUser")) + || !msg.hasOwnProperty("target") || !msg.hasOwnProperty("duration")) return; + + let id = msg.id; + let targetChannel = msg.targetChannel; + let targetUser = msg.targetUser; + let target = msg.target; + let duration = msg.duration; + let klass; + let title; + let text; + let html; + + if (msg.hasOwnProperty("class")) { + klass = msg.class; + } + + if (!msg.hasOwnProperty("html")) { + if (!msg.hasOwnProperty("title") || !msg.hasOwnProperty("text")) return; + title = msg.title; + text = msg.text; + } else { + html = msg.html; + } + + cl.channel.Notification(targetUser || targetChannel, title, text, html, duration, target, klass, id); + }); + + cl.on('user_flag', (msg, admin) => { + if (!admin) return; + if (!msg.hasOwnProperty('_id') || !msg.hasOwnProperty('key') || !msg.hasOwnProperty('value')) return; + console.log("stuff"); + + cl.server.connections.forEach((usr) => { + if ((usr.channel && usr.participantId && usr.user) && (usr.user._id == msg._id || (usr.participantId == msg.id))) { + if (!usr.hasOwnProperty('user')) return; + usr.user.flags[msg.key] = msg.value; + usr.user.checkFlags(); + } + }); + + console.log(`set user flag: ${msg.key} - ${msg.value}`); + }); + + cl.on('clear_chat', (msg, admin) => { + if (!admin) return; + }); } diff --git a/src/Quota.js b/src/Quota.js index f259672..ff657e1 100644 --- a/src/Quota.js +++ b/src/Quota.js @@ -45,61 +45,72 @@ class Quota { this.setParams(params); this.resetPoints(); this.interval; - }; + } + static N_PARAMS_LOBBY = { allowance: 200, max: 600, interval: 2000 - }; + } + static N_PARAMS_NORMAL = { allowance: 400, max: 1200, interval: 2000 - }; + } + static N_PARAMS_RIDICULOUS = { allowance: 600, max: 1800, interval: 2000 - }; + } + static PARAMS_OFFLINE = { allowance: 8000, max: 24000, maxHistLen: 3, interval: 2000 - }; + } + static PARAMS_A_NORMAL = { allowance: 4, max: 4, interval: 6000 - }; + } + static PARAMS_A_CROWNED = { allowance:10, max:10, interval: 2000 } + static PARAMS_CH = { allowance: 1, max: 2, interval: 1000 } + static PARAMS_USED_A_LOT = { allowance:1, max:1, interval: 2000 } + static PARAMS_M = { allowance:15000, max:500000, interval: 2000 } + getParams() { return { m: "nq", allowance: this.allowance, max: this.max, maxHistLen: this.maxHistLen - }; - }; + } + } + setParams(params) { params = params || Quota.PARAMS_OFFLINE; var allowance = params.allowance || this.allowance || Quota.PARAMS_OFFLINE.allowance; @@ -118,14 +129,16 @@ class Quota { return true; } return false; - }; + } + resetPoints() { this.points = this.max; this.history = []; for (var i = 0; i < this.maxHistLen; i++) this.history.unshift(this.points); if (this.cb) this.cb(this.points); - }; + } + tick() { // keep a brief history this.history.unshift(this.points); @@ -137,7 +150,8 @@ class Quota { // fire callback if (this.cb) this.cb(this.points); } - }; + } + spend(needed) { // check whether aggressive limitation is needed var sum = 0; @@ -153,7 +167,7 @@ class Quota { if (this.cb) this.cb(this.points); // fire callback return true; } - }; + } } module.exports = Quota diff --git a/src/Rank.js b/src/Rank.js new file mode 100644 index 0000000..41b781e --- /dev/null +++ b/src/Rank.js @@ -0,0 +1,6 @@ +module.exports = class Rank { + constructor (name, _id) { + this.name = name; + this._id = _id; + } +} diff --git a/src/Room.js b/src/Room.js index 0f99050..146f861 100644 --- a/src/Room.js +++ b/src/Room.js @@ -1,14 +1,15 @@ const createKeccakHash = require('keccak'); +const Crown = require('./Crown.js'); +const Database = require('./Database.js'); const Quota = require("./Quota.js"); const RoomSettings = require('./RoomSettings.js'); class Room extends EventEmitter { constructor(server, _id, settings) { super(); - EventEmitter.call(this); this._id = _id; this.server = server; - this.crown = null; + this.crown; this.crowndropped = false; this.settings = settings; this.chatmsgs = []; @@ -17,30 +18,31 @@ class Room extends EventEmitter { this.bindEventListeners(); this.server.rooms.set(_id, this); this.bans = new Map(); + this.flags = {} + + Database.getRoomSettings(this._id, (err, set) => { + if (err) { + return; + } + + this.settings = set.settings; + this.chatmsgs = set.chat; + this.setData(); + }); } join(cl, set) { //this stuff is complicated let otheruser = this.connections.find((a) => a.user._id == cl.user._id) if (!otheruser) { let participantId = createKeccakHash('keccak256').update((Math.random().toString() + cl.ip)).digest('hex').substr(0, 24); + cl.user.id = participantId; cl.participantId = participantId; cl.initParticipantQuotas(); + if (((this.connections.length == 0 && Array.from(this.ppl.values()).length == 0) && this.isLobby(this._id) == false) || this.crown && (this.crown.userId == cl.user._id)) { //user that created the room, give them the crown. //cl.quotas.a.setParams(Quota.PARAMS_A_CROWNED); - this.crown = { - participantId: cl.participantId, - userId: cl.user._id, - time: Date.now(), - startPos: { - x: 50, - y: 50 - }, - endPos: { - x: this.getCrownX(), - y: this.getCrownY() - } - } + this.crown = new Crown(cl.participantId, cl.user._id); this.crowndropped = false; this.settings = new RoomSettings(set, 'user'); @@ -105,7 +107,6 @@ class Room extends EventEmitter { if (!(otheruser.length > 1)) { this.ppl.delete(p.participantId); this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1); - console.log(`Deleted client ${p.user.id}`); this.sendArray([{ m: "bye", p: p.participantId @@ -125,19 +126,15 @@ class Room extends EventEmitter { if (Array.from(this.ppl.values()).length <= 0) { setTimeout(() => { this.destroy(); - }, 10000); + }, 5000); } this.connections.forEach((usr) => { - let u = this.fetchData(usr, cl); - u.ppl.forEach(c => { - c.ip = undefined; - c.server = undefined; - }); - this.server.connections.get(usr.connectionid).sendArray([u]) + let u = this.fetchChannelData(usr, cl); + this.server.connections.get(usr.connectionid).sendArray([u]); }); - this.server.updateRoom(this.fetchData()); + this.server.updateRoom(this.fetchChannelData()); } updateParticipant(pid, options) { @@ -195,11 +192,17 @@ class Room extends EventEmitter { }); } - fetchData(usr, cl) { + fetchChannelData(usr, cl) { let chppl = []; - [...this.ppl.values()].forEach((a) => { - chppl.push(a.user); + [...this.ppl.values()].forEach(c => { + let u = { + _id: c.user._id, + name: c.user.name, + color: c.user.color, + id: c.participantId + } + chppl.push(u); }); let data = { @@ -270,44 +273,13 @@ class Room extends EventEmitter { } - getCrownY() { - return Math.floor(Math.random() * 10000) / 100; - } - - getCrownX() { - return Math.floor(Math.random() * 10000) / 100; - } - chown(id) { let prsn = this.ppl.get(id); if (prsn) { - this.crown = { - participantId: prsn.participantId, - userId: prsn.user._id, - time: Date.now(), - startPos: { - x: 50, - y: 50 - }, - endPos: { - x: this.getCrownX(), - y: this.getCrownY() - }, - } + this.crown = new Crown(id, prsn.user._id); this.crowndropped = false; } else { - this.crown = { - userId: this.crown.userId, - time: Date.now(), - startPos: { - x: 50, - y: 50 - }, - endPos: { - x: this.getCrownX(), - y: this.getCrownY() - } - } + this.crown = new Crown(id, this.crown.userId); this.crowndropped = true; } @@ -329,7 +301,7 @@ class Room extends EventEmitter { chat(p, msg) { if (msg.message.length > 512) return; - let filter = ["AMIGHTYWIND"]; + let filter = ["AMIGHTYWIND", "CHECKLYHQ"]; let regexp = new RegExp("\\b(" + filter.join("|") + ")\\b", "i"); if (regexp.test(msg.message)) return; if (p.participantId == 0) { @@ -344,7 +316,9 @@ class Room extends EventEmitter { }; message.t = Date.now(); this.sendArray([message]); + this.chatmsgs.push(message); + this.setData(); return; } let prsn = this.ppl.get(p.participantId); @@ -352,6 +326,9 @@ class Room extends EventEmitter { let message = {}; message.m = "a"; message.a = msg.message; + if (prsn.user.hasFlag('vowels')) { + message.a = message.a.split(/[aeiouAEIOU]/).join(prsn.user.flags["vowels"]); + } message.p = { color: p.user.color, id: p.participantId, @@ -361,34 +338,46 @@ class Room extends EventEmitter { message.t = Date.now(); this.sendArray([message]); this.chatmsgs.push(message); + this.setData(); } } playNote(cl, note) { + let vel = Math.round(cl.user.flags["volume"])/100 || undefined; + if (vel == 1) vel = undefined; + this.sendArray([{ m: "n", n: note.n, p: cl.participantId, - t: note.t + t: note.t, + v: vel }], cl, true); } kickban(_id, ms) { ms = parseInt(ms); + if (ms >= (1000 * 60 * 60)) return; if (ms < 0) return; + ms = Math.round(ms / 1000) * 1000; + let user = this.connections.find((usr) => usr.user._id == _id); if (!user) return; let asd = true; let pthatbanned = this.ppl.get(this.crown.participantId); + this.connections.filter((usr) => usr.participantId == user.participantId).forEach((u) => { user.bantime = Math.floor(Math.floor(ms / 1000) / 60); user.bannedtime = Date.now(); user.msbanned = ms; + this.bans.set(user.user._id, user); - if (this.crown && (this.crown.userId)) { + + //if (this.crown && (this.crown.userId)) { u.setChannel("test/awkward", {}); + if (asd) this.Notification(user.user._id, "Notice", @@ -416,8 +405,7 @@ class Room extends EventEmitter { "#room" ); } - - } + //} }) } @@ -433,6 +421,7 @@ class Room extends EventEmitter { class: klass, id: id }; + if (!id) delete obj.id; if (!title) delete obj.title; if (!text) delete obj.text; @@ -440,6 +429,7 @@ class Room extends EventEmitter { if (!target) delete obj.target; if (!duration) delete obj.duration; if (!klass) delete obj.class; + switch (who) { case "all": { for (let con of Array.from(this.server.connections.values())) { @@ -475,7 +465,7 @@ class Room extends EventEmitter { }) } - verifySet(_id, msg){ + verifySet(_id, msg) { if(typeof(msg.set) !== 'object') { msg.set = { visible: true, @@ -496,6 +486,15 @@ class Room extends EventEmitter { } } } + + setData() { + Database.setRoomSettings(this._id, this.settings, this.chatmsgs); + } + + hasFlag(flag, val) { + if (!val) return this.flags.hasOwnProperty(flag); + return this.flags.hasOwnProperty(flag) && this.flags[flag] == val; + } } module.exports = Room; diff --git a/src/RoomSettings.js b/src/RoomSettings.js index 248d707..0e391b3 100644 --- a/src/RoomSettings.js +++ b/src/RoomSettings.js @@ -1,14 +1,16 @@ +const config = require ('../config'); + class RoomSettings { static allowedProperties = { color: { type: 'color', - default: "#9900ff", + default: config.defaultRoomSettings.color, allowedChange: true, required: true }, color2: { type: 'color2', - default: "#5900bf", + default: config.defaultRoomSettings.color2, allowedChange: true, required: false }, @@ -39,10 +41,15 @@ class RoomSettings { default: false, allowedChange: true, required: true + }, + "no cussing": { + type: 'boolean', + allowedChange: true, + required: false } } - constructor (set, cont) { + constructor (set, context) { Object.keys(RoomSettings.allowedProperties).forEach(key => { if (typeof(RoomSettings.allowedProperties[key].default) !== 'undefined') { if (this[key] !== RoomSettings.allowedProperties[key].default) { @@ -63,10 +70,10 @@ class RoomSettings { Object.keys(set).forEach(key => { if (typeof(set[key]) == 'undefined') return; if (Object.keys(RoomSettings.allowedProperties).indexOf(key) !== -1) { - if (typeof(cont) == 'undefined') { + if (typeof(context) == 'undefined') { this[key] = this.verifyPropertyType(key, set[key], RoomSettings.allowedProperties[key].type); } else { - if (cont == 'user') { + if (context == 'user') { if (RoomSettings.allowedProperties[key].allowedChange) { this[key] = this.verifyPropertyType(key, set[key], RoomSettings.allowedProperties[key].type); } diff --git a/src/Server.js b/src/Server.js index 259f059..94bafc3 100644 --- a/src/Server.js +++ b/src/Server.js @@ -52,11 +52,13 @@ class Server extends EventEmitter { this.roomlisteners = new Map(); this.rooms = new Map(); + this.specialIntervals = {}; + this.wss.on('connection', (ws, req) => { this.connections.set(++this.connectionid, new Client(ws, req, this)); }); - this.legit_m = ["a", "bye", "hi", "ch", "+ls", "-ls", "m", "n", "devices", "t", "chset", "userset", "chown", "kickban", "admin message", "color", "eval", "notification"] + this.legit_m = ["a", "bye", "hi", "ch", "+ls", "-ls", "m", "n", "devices", "t", "chset", "userset", "chown", "kickban", "admin message", "color", "eval", "notification", "user_flag", "room_flag", "clear_chat"] this.welcome_motd = config.motd || "You agree to read this message."; this._id_Private_Key = config._id_PrivateKey || "boppity"; @@ -68,6 +70,10 @@ class Server extends EventEmitter { if (!data.ch.settings.visible) return; for (let cl of Array.from(this.roomlisteners.values())) { + if (cl.destroied) { + cl = undefined; + return; + } cl.sendArray([{ "m": "ls", "c": false, diff --git a/src/User.js b/src/User.js index 61a8a66..2be8e24 100644 --- a/src/User.js +++ b/src/User.js @@ -1,12 +1,77 @@ const Database = require("./Database"); +function hslToHex(h, s, l) { + l /= 100; + const a = s * Math.min(l, 1 - l) / 100; + const f = n => { + const k = (n + h / 30) % 12; + const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); + return Math.round(255 * color).toString(16).padStart(2, '0'); + }; + return `#${f(0)}${f(8)}${f(4)}`; +} + class User { constructor(cl, data) { - this.server = cl.server; this.name = data.name; + this.cl = cl; this._id = data._id; this.color = data.color; - this.ip = data.ip; + this.flags = typeof data.flags == "object" ? data.flags : { + volume: 100, + "no chat rate limit": false, + } + } + + getPublicUser() { + let t = {}; + t.name = this.name; + t.color = this.color; + t._id = this._id; + return t; + } + + checkFlags() { + if (typeof(this.cl.server.specialIntervals[this._id]) == 'undefined') this.cl.server.specialIntervals[this._id] = {}; + if (this.hasFlag('rainbow', true)) { + if (!this.cl.server.specialIntervals[this._id].hasOwnProperty('rainbow')) { + let h = Math.floor(Math.random() * 360); + let s = 50; + let l = 50; + + let hvel = 5; + let svel = 1; + let lvel = 0.5; + + this.cl.server.specialIntervals[this._id].rainbow = setInterval(() => { + hvel = Math.floor(Math.random()*10); + h += hvel; + if (h > 360) h = 0; + + s += svel; + if (s >= 100 || s <= 50) { + svel = -svel; + } + + l += lvel; + if (l >= 75 || l <= 25) { + lvel = -lvel; + } + + this.color = hslToHex(h, s, l); + Database.updateUser(this._id, this); + + this.cl.channel.updateParticipant(this._id, this); + }, 1000/15); + } + } else if (this.hasFlag('rainbow', false)) { + clearInterval(this.cl.server.specialIntervals[this._id].rainbow); + } + } + + hasFlag(flag, val) { + if (!val) return this.flags.hasOwnProperty(flag); + return this.flags.hasOwnProperty(flag) && this.flags[flag] == val; } static updateUserModel(cl, user) { diff --git a/src/UserModel.js b/src/UserModel.js new file mode 100644 index 0000000..33e857d --- /dev/null +++ b/src/UserModel.js @@ -0,0 +1,8 @@ +const mongoose = require('mongoose'); + +module.exports = mongoose.model('User', { + name: String, + _id: String, + color: String, + flags: Object +}); diff --git a/src/db/users.json b/src/db/users.json deleted file mode 100644 index f55391d..0000000 --- a/src/db/users.json +++ /dev/null @@ -1,1976 +0,0 @@ -{ - "4a50b6981d9f08b9675cd49a": { - "color": "#8d3f50", - "name": "๖ۣۜH͜r̬i͡7566", - "_id": "4a50b6981d9f08b9675cd49a", - "ip": "192.168.1.242" - }, - "386890461381636080bea894": { - "color": "#3f189f", - "name": "Anonymous", - "_id": "386890461381636080bea894", - "ip": "185.220.101.15" - }, - "e9d981a544435b1ad7a179de": { - "color": "#d24c38", - "name": "Anonymous", - "_id": "e9d981a544435b1ad7a179de", - "ip": "94.230.208.148" - }, - "47b5f28f890d4a78058e4603": { - "color": "#c78e40", - "name": "𝔻𝔸ℕ𝕀𝔼𝕃𝐅𝘛𝘖𝘚𝘛𝘈 𝟙𝟟𝟞", - "_id": "47b5f28f890d4a78058e4603", - "ip": "179.180.68.199" - }, - "9e57623d9cf4dd26ffa92edd": { - "color": "#52df42", - "name": "Anonymous", - "_id": "9e57623d9cf4dd26ffa92edd", - "ip": "27.92.141.124" - }, - "e1b364d47abef86ef6aa076c": { - "color": "#9de3bd", - "name": "Lamp 89", - "_id": "e1b364d47abef86ef6aa076c", - "ip": "154.28.188.216" - }, - "2cea68b050ff7f95b1c4911d": { - "color": "#33080e", - "name": "Lamp 89", - "_id": "2cea68b050ff7f95b1c4911d", - "ip": "154.28.188.214" - }, - "83dac5b16c9191aafefe8df2": { - "color": "#13b26c", - "name": "Lamp 89", - "_id": "83dac5b16c9191aafefe8df2", - "ip": "154.28.188.217" - }, - "4a6cb1197d4bdba1f5ef6640": { - "color": "#59f966", - "name": "Lamp 89", - "_id": "4a6cb1197d4bdba1f5ef6640", - "ip": "154.28.188.215" - }, - "5cb1209406878bd41e02dcff": { - "color": "#96e78a", - "name": "Lamp 89", - "_id": "5cb1209406878bd41e02dcff", - "ip": "154.28.188.213" - }, - "1fc592f782828f4d1c5732eb": { - "color": "#92c8b3", - "name": "Lamp 89", - "_id": "1fc592f782828f4d1c5732eb", - "ip": "154.28.188.212" - }, - "1533e422090c49e034c16889": { - "color": "#702c31", - "name": "Lamp 89", - "_id": "1533e422090c49e034c16889", - "ip": "154.28.188.220" - }, - "11dc08c9705bcd5610fba4be": { - "color": "#285196", - "name": "Lamp 89", - "_id": "11dc08c9705bcd5610fba4be", - "ip": "154.28.188.219" - }, - "7092d81847b21794759c97b7": { - "color": "#5f089c", - "name": "Lamp 89", - "_id": "7092d81847b21794759c97b7", - "ip": "154.28.188.218" - }, - "8cdb2b3fed35b89aed1330dd": { - "color": "#105529", - "name": "Lamp 89", - "_id": "8cdb2b3fed35b89aed1330dd", - "ip": "154.28.188.222" - }, - "cd52106b03c1ef9da913ecf2": { - "color": "#a77f6a", - "name": "Lamp 89", - "_id": "cd52106b03c1ef9da913ecf2", - "ip": "154.28.188.223" - }, - "5b6ee15e43751a8b7caebc60": { - "color": "#429d3a", - "name": "Lamp 89", - "_id": "5b6ee15e43751a8b7caebc60", - "ip": "154.28.188.221" - }, - "427b725bba166c8b276fab53": { - "color": "#317ee0", - "name": "Lamp 89", - "_id": "427b725bba166c8b276fab53", - "ip": "154.28.188.224" - }, - "fd44843440c865150d32d9bd": { - "color": "#2b02d9", - "name": "Lamp 89", - "_id": "fd44843440c865150d32d9bd", - "ip": "154.28.188.226" - }, - "5e4793b074ff942269c071c1": { - "color": "#3ac5ab", - "name": "Lamp 89", - "_id": "5e4793b074ff942269c071c1", - "ip": "154.28.188.225" - }, - "c857a1b0e9fc87b78b9cfcaa": { - "color": "#2dbdab", - "name": "Anonymous", - "_id": "c857a1b0e9fc87b78b9cfcaa", - "ip": "89.187.163.153" - }, - "6193e6b4ad4ada6ae31568f4": { - "color": "#b147f2", - "name": "Anonymous", - "_id": "6193e6b4ad4ada6ae31568f4", - "ip": "89.187.163.154" - }, - "973705e920804b5e2ab7f36a": { - "color": "#b5e1eb", - "name": "Anonymous", - "_id": "973705e920804b5e2ab7f36a", - "ip": "89.187.163.161" - }, - "772bd786b22dcdb10a18245e": { - "color": "#eb023d", - "name": "Anonymous", - "_id": "772bd786b22dcdb10a18245e", - "ip": "89.187.163.160" - }, - "8978161ea43839b02a4ad021": { - "color": "#d81b4e", - "name": "Anonymous", - "_id": "8978161ea43839b02a4ad021", - "ip": "89.187.163.162" - }, - "4c84080324475f88004776d7": { - "color": "#135a41", - "name": "Anonymous", - "_id": "4c84080324475f88004776d7", - "ip": "89.187.163.163" - }, - "2df6ecaf73b2f4efed358d86": { - "color": "#c4974b", - "name": "Anonymous", - "_id": "2df6ecaf73b2f4efed358d86", - "ip": "89.187.163.165" - }, - "b93c32a6d271d2aa8fef9867": { - "color": "#7fab80", - "name": "Anonymous", - "_id": "b93c32a6d271d2aa8fef9867", - "ip": "89.187.163.164" - }, - "b6df542eacb5dbb4ff17663f": { - "color": "#2aa866", - "name": "Anonymous", - "_id": "b6df542eacb5dbb4ff17663f", - "ip": "89.187.163.166" - }, - "7f777cd34769aae62eaad87e": { - "color": "#22c0d6", - "name": "Anonymous", - "_id": "7f777cd34769aae62eaad87e", - "ip": "89.187.163.167" - }, - "d326a8f178c635d851b0deb9": { - "color": "#fc6621", - "name": "Anonymous", - "_id": "d326a8f178c635d851b0deb9", - "ip": "89.187.163.169" - }, - "7fd814aaa0494e5e67fc3d09": { - "color": "#bc0933", - "name": "Anonymous", - "_id": "7fd814aaa0494e5e67fc3d09", - "ip": "89.187.163.168" - }, - "3b944fcbe1b6e12de0905a71": { - "color": "#62cf41", - "name": "Anonymous", - "_id": "3b944fcbe1b6e12de0905a71", - "ip": "89.187.163.170" - }, - "25add56dbda797cfeb4eafda": { - "color": "#265ece", - "name": "Anonymous", - "_id": "25add56dbda797cfeb4eafda", - "ip": "89.187.163.172" - }, - "32a408c1a0368a47141e23c3": { - "color": "#c8a32e", - "name": "Anonymous", - "_id": "32a408c1a0368a47141e23c3", - "ip": "89.187.163.173" - }, - "40ade5da331de7bef42e0cfc": { - "color": "#b4b1a5", - "name": "Anonymous", - "_id": "40ade5da331de7bef42e0cfc", - "ip": "89.187.163.175" - }, - "41f0f6ff83e7bac9fed4eb8b": { - "color": "#d07ecf", - "name": "Anonymous", - "_id": "41f0f6ff83e7bac9fed4eb8b", - "ip": "89.187.163.174" - }, - "637ceec665f835ae1f1b28a3": { - "color": "#228a11", - "name": "Anonymous", - "_id": "637ceec665f835ae1f1b28a3", - "ip": "89.187.163.177" - }, - "34e8d2eb8194e93decb99c21": { - "color": "#4e2496", - "name": "Anonymous", - "_id": "34e8d2eb8194e93decb99c21", - "ip": "89.187.163.176" - }, - "5173b72f1d002360cfd9606f": { - "color": "#ce45b1", - "name": "Anonymous", - "_id": "5173b72f1d002360cfd9606f", - "ip": "89.187.163.178" - }, - "fdafb4909630210d43709639": { - "color": "#321754", - "name": "Anonymous", - "_id": "fdafb4909630210d43709639", - "ip": "89.187.163.171" - }, - "2371d018d571a7b258399fe1": { - "color": "#c0ce01", - "name": "Anonymous", - "_id": "2371d018d571a7b258399fe1", - "ip": "89.187.163.179" - }, - "f4a4ac5d608316704e1081a9": { - "color": "#8461a6", - "name": "Anonymous", - "_id": "f4a4ac5d608316704e1081a9", - "ip": "89.187.163.180" - }, - "d353e9622bfcb235eef8f5d9": { - "color": "#5f9a52", - "name": "Anonymous", - "_id": "d353e9622bfcb235eef8f5d9", - "ip": "177.10.10.67" - }, - "385001c231fb3d6ff01065f4": { - "color": "#62d1c1", - "name": "Anonymous", - "_id": "385001c231fb3d6ff01065f4", - "ip": "189.27.152.31" - }, - "b7e75966b558b1bf7a836ce9": { - "color": "#0205da", - "name": "Anonymous", - "_id": "b7e75966b558b1bf7a836ce9", - "ip": "178.235.186.226" - }, - "5d028e6a5f1d2969bb96fd53": { - "color": "#26a6d6", - "name": "karol", - "_id": "5d028e6a5f1d2969bb96fd53", - "ip": "172.83.43.136" - }, - "05aa1cef57ed45ecba498794": { - "color": "#98e956", - "name": "Anonymous", - "_id": "05aa1cef57ed45ecba498794", - "ip": "87.118.116.103" - }, - "1ccdb5f17b3424eb60cce23e": { - "color": "#1b2ad5", - "name": "*Dan", - "_id": "1ccdb5f17b3424eb60cce23e", - "ip": "47.55.100.237" - }, - "3d7628947aa7c7c7358f604c": { - "color": "#8d3f50", - "name": "๖ۣۜH͜r̬i͡", - "_id": "3d7628947aa7c7c7358f604c", - "ip": "50.233.16.238" - }, - "4060ec310d95b37c9bb38c17": { - "color": "#22b76d", - "name": "7566 | h!help", - "_id": "4060ec310d95b37c9bb38c17", - "ip": "34.83.177.200" - }, - "290a01f695ac9e72b83e70f3": { - "color": "#14d4bc", - "name": "7566 | h!help", - "_id": "290a01f695ac9e72b83e70f3", - "ip": "104.198.104.15" - }, - "1f8613fd8b4e64c6ebdf619c": { - "color": "#b815e3", - "name": "No.", - "_id": "1f8613fd8b4e64c6ebdf619c", - "ip": "154.28.188.234" - }, - "7d93e42c521b84bbcd30f72b": { - "color": "#c1c7b0", - "name": "No.", - "_id": "7d93e42c521b84bbcd30f72b", - "ip": "96.250.89.180" - }, - "1b79fcdc59926f62f1e3eeee": { - "color": "#ba6151", - "name": "Shadow-chan|影-ちゃん || Sky System|スカイ・システム", - "_id": "1b79fcdc59926f62f1e3eeee", - "ip": "73.148.194.202" - }, - "61fe03abb2807a2da474a933": { - "color": "#b20d8a", - "name": "Fishi", - "_id": "61fe03abb2807a2da474a933", - "ip": "68.106.138.210" - }, - "c259198d9d027147e38027dd": { - "color": "#22e63c", - "name": "Anonymous", - "_id": "c259198d9d027147e38027dd", - "ip": "62.47.0.238" - }, - "deade80e69308ac1bd262a6a": { - "color": "#005763", - "name": "Anonymous", - "_id": "deade80e69308ac1bd262a6a", - "ip": "110.14.16.131" - }, - "a8377d815c5181f73ef9f5a5": { - "color": "#6926fd", - "name": "CakeyBoi", - "_id": "a8377d815c5181f73ef9f5a5", - "ip": "71.202.147.84" - }, - "ed3a901177ec9ad57410a527": { - "color": "#4bfc70", - "name": "Anonymous", - "_id": "ed3a901177ec9ad57410a527", - "ip": "92.34.54.187" - }, - "cc1d015783e743956dc07c72": { - "color": "#55d6a0", - "name": "Anonymous", - "_id": "cc1d015783e743956dc07c72", - "ip": "2.132.202.108" - }, - "198b81b27cae8a05d58a5bad": { - "color": "#2f4823", - "name": "7566 | h!help", - "_id": "198b81b27cae8a05d58a5bad", - "ip": "34.78.39.151" - }, - "1bf5f8ec648a8374562b5f81": { - "color": "#d55c2a", - "name": "7566 | h!help", - "_id": "1bf5f8ec648a8374562b5f81", - "ip": "35.230.74.122" - }, - "c5ef95bdb5b6ca5092741a58": { - "color": "#31ae3a", - "name": "Anonymous", - "_id": "c5ef95bdb5b6ca5092741a58", - "ip": "82.71.35.128" - }, - "c86b0df5b33a18bd73c178ab": { - "color": "#a54c78", - "name": "7566 | h!help", - "_id": "c86b0df5b33a18bd73c178ab", - "ip": "35.197.114.225" - }, - "dcdc35d3bbfa352108c61c7e": { - "color": "#22f9a6", - "name": "fishing", - "_id": "dcdc35d3bbfa352108c61c7e", - "ip": "192.168.1.244" - }, - "de619073b1f59ae25bdbbad7": { - "color": "#adeb1f", - "name": "Anonymous", - "_id": "de619073b1f59ae25bdbbad7", - "ip": "69.174.145.92" - }, - "45de61c0e6dafaa2e68e6db3": { - "color": "#8dc361", - "name": "7566 | h!help", - "_id": "45de61c0e6dafaa2e68e6db3", - "ip": "35.185.223.185" - }, - "6a163cdbc0cf8a6fad240bba": { - "color": "#745a9d", - "name": "7566 | h!help", - "_id": "6a163cdbc0cf8a6fad240bba", - "ip": "34.83.110.154" - }, - "2eb99bf73c436c35dc4b256f": { - "color": "#fe7562", - "name": "⧸⎠╱⧸⎠⧸⎠╱⧸⎠⧸⎠╱⧸⎠⧸⎠╱⧸⎠⧸⎠╱⧸⎠⧸⎠╱⧸⎠⧸⎠╱⧸⎠⧸⎠╱⧸⎠", - "_id": "2eb99bf73c436c35dc4b256f", - "ip": "191.251.148.171" - }, - "3ec063d63c33121b02f3016a": { - "color": "#6efceb", - "name": "Mayah", - "_id": "3ec063d63c33121b02f3016a", - "ip": "165.155.140.86" - }, - "ec52476e6ec3982e4547ca50": { - "color": "#1abbdb", - "name": "Krystal 👧", - "_id": "ec52476e6ec3982e4547ca50", - "ip": "151.224.233.58" - }, - "9488f4dc1dce9aea298b8606": { - "color": "#684876", - "name": "Anonymous", - "_id": "9488f4dc1dce9aea298b8606", - "ip": "65.96.140.129" - }, - "5114ccf2f1662a65e60104d7": { - "color": "#e81f2d", - "name": "Bob", - "_id": "5114ccf2f1662a65e60104d7", - "ip": "24.21.250.136" - }, - "e27f3d5f32cb04aad503e91f": { - "color": "#8ae45d", - "name": "Anonymood ガオ [(help]", - "_id": "e27f3d5f32cb04aad503e91f", - "ip": "24.255.244.140" - }, - "48833dc54122da8257413136": { - "color": "#e4d516", - "name": "Katniss_Everdeen_HungerGames", - "_id": "48833dc54122da8257413136", - "ip": "104.251.79.1" - }, - "d44fdfffdcb7ee3402cdefde": { - "color": "#e319f5", - "name": "aeiou", - "_id": "d44fdfffdcb7ee3402cdefde", - "ip": "104.59.148.205" - }, - "66c35068ac608e878e9fe0f2": { - "color": "#d82b46", - "name": "Anonymous", - "_id": "66c35068ac608e878e9fe0f2", - "ip": "31.36.1.25" - }, - "70326df3c71041b72289934b": { - "color": "#cd5321", - "name": "Anonymous", - "_id": "70326df3c71041b72289934b", - "ip": "98.237.41.63" - }, - "ccb8083fc0c18c315f3140b4": { - "color": "#65b572", - "name": "Anonymous", - "_id": "ccb8083fc0c18c315f3140b4", - "ip": "178.235.186.8" - }, - "a0a1ad09c1839fda365f4fbb": { - "color": "#c979a4", - "name": "Anonymous", - "_id": "a0a1ad09c1839fda365f4fbb", - "ip": "173.81.100.10" - }, - "6ce1a34db6aa167e4ffeb489": { - "color": "#e3aee6", - "name": "Anonymous", - "_id": "6ce1a34db6aa167e4ffeb489", - "ip": "177.41.37.192" - }, - "0e8a1392b08dc8ab5542710e": { - "color": "#f31e56", - "name": "Anonymous", - "_id": "0e8a1392b08dc8ab5542710e", - "ip": "89.248.171.23" - }, - "d606817674c0e695d8e4af56": { - "color": "#c2e1b0", - "name": "cookie", - "_id": "d606817674c0e695d8e4af56", - "ip": "92.9.161.43" - }, - "d4399950515ac17a69837114": { - "color": "#93320c", - "name": "Anonymous", - "_id": "d4399950515ac17a69837114", - "ip": "174.78.3.135" - }, - "1ba40d919f436494387897b3": { - "color": "#deaa39", - "name": "Wow", - "_id": "1ba40d919f436494387897b3", - "ip": "208.53.99.59" - }, - "96b8ebad39527f7dd9ca24b3": { - "color": "#f9e718", - "name": "Anonymous", - "_id": "96b8ebad39527f7dd9ca24b3", - "ip": "187.113.79.83" - }, - "674c34572287610228cb6ef2": { - "color": "#04220f", - "name": "Anonymous", - "_id": "674c34572287610228cb6ef2", - "ip": "187.114.121.72" - }, - "16470cdd3e8e69e9fbe94a43": { - "color": "#3d89ad", - "name": "Wolfy", - "_id": "16470cdd3e8e69e9fbe94a43", - "ip": "173.186.15.10" - }, - "1b7fa0fc59d6fe30a0438eab": { - "color": "#fab21a", - "name": "˜”*°P҉r҉ㄖO͓̽ Ҝ𐌋i°º¤ø˜”", - "_id": "1b7fa0fc59d6fe30a0438eab", - "ip": "147.160.230.250" - }, - "d4a64586717966c710823315": { - "color": "#291891", - "name": "Anonymous", - "_id": "d4a64586717966c710823315", - "ip": "191.34.5.28" - }, - "809e2f3cf5b8d63b2772359b": { - "color": "#ba1219", - "name": "Anonymous", - "_id": "809e2f3cf5b8d63b2772359b", - "ip": "186.214.59.136" - }, - "4e2c627ab8b160462c02978f": { - "color": "#cd7493", - "name": "𝓢𝓱𝓾𝓽 𝓣𝓱𝓮 𝓕𝓾𝓬𝓴 𝓤𝓹", - "_id": "4e2c627ab8b160462c02978f", - "ip": "152.22.40.25" - }, - "550eebeb54f625960be49af0": { - "color": "#f33351", - "name": "Anonymous", - "_id": "550eebeb54f625960be49af0", - "ip": "177.98.76.61" - }, - "ed5d719eca1e12a076ed4a1b": { - "color": "#38ccd2", - "name": "Anonymous", - "_id": "ed5d719eca1e12a076ed4a1b", - "ip": "81.108.21.128" - }, - "c69fb5c9263e772b7c1807f4": { - "color": "#2e8da5", - "name": "Muffin", - "_id": "c69fb5c9263e772b7c1807f4", - "ip": "96.32.198.199" - }, - "c5828d6260cc57ad677994a9": { - "color": "#2bf0cd", - "name": "💀Tofu ‮yrruF ‭ ", - "_id": "c5828d6260cc57ad677994a9", - "ip": "64.203.231.247" - }, - "c5592c6640f93a40b490aab8": { - "color": "#e021bf", - "name": "dog sans", - "_id": "c5592c6640f93a40b490aab8", - "ip": "81.101.111.103" - }, - "091ebc07655bb4f46566945f": { - "color": "#3fccfc", - "name": "Papaya ", - "_id": "091ebc07655bb4f46566945f", - "ip": "96.230.138.27" - }, - "01db9560111c70321a8dbe95": { - "color": "#12e6cd", - "name": "Anonymous", - "_id": "01db9560111c70321a8dbe95", - "ip": "179.176.187.104" - }, - "fefe73cd003aa00c0d3a6d44": { - "color": "#ac6d9b", - "name": "Anonymous", - "_id": "fefe73cd003aa00c0d3a6d44", - "ip": "172.243.6.160" - }, - "19f4dc7f43e7330c2cb07522": { - "color": "#4862ef", - "name": "TheClayJar", - "_id": "19f4dc7f43e7330c2cb07522", - "ip": "68.186.184.219" - }, - "043d2dd35e757c4ecfbe3c75": { - "color": "#836015", - "name": "Anonymous", - "_id": "043d2dd35e757c4ecfbe3c75", - "ip": "91.46.221.42" - }, - "a47ffabf634427a63a57206f": { - "color": "#cd9e56", - "name": "Anonymous", - "_id": "a47ffabf634427a63a57206f", - "ip": "178.202.210.49" - }, - "983ed301a5dacadf28e4763a": { - "color": "#3477eb", - "name": "Rinbow", - "_id": "983ed301a5dacadf28e4763a", - "ip": "73.151.198.165" - }, - "5bd05dd1a18469e162f7daf3": { - "color": "#6248a7", - "name": "Exionthix", - "_id": "5bd05dd1a18469e162f7daf3", - "ip": "37.79.158.187" - }, - "92f8caea22a13eb29da98558": { - "color": "#3bf71a", - "name": "\"Ангелочек_красотка\"", - "_id": "92f8caea22a13eb29da98558", - "ip": "176.122.121.199" - }, - "d24933cede594853b868d1d3": { - "color": "#dc0871", - "name": "Anonymous", - "_id": "d24933cede594853b868d1d3", - "ip": "96.225.160.151" - }, - "09f60b44f2ba42219c8f9463": { - "color": "#c1b2a3", - "name": "Anonymous", - "_id": "09f60b44f2ba42219c8f9463", - "ip": "5.166.92.236" - }, - "c1684f19f2e204aeea8ad403": { - "color": "#147e03", - "name": "Anonymous", - "_id": "c1684f19f2e204aeea8ad403", - "ip": "73.124.182.85" - }, - "e21f89a4b97dee65cbb17d6f": { - "color": "#b54964", - "name": "Torie", - "_id": "e21f89a4b97dee65cbb17d6f", - "ip": "109.70.100.38" - }, - "161691a8dbb6507879720288": { - "color": "#f5a526", - "name": "Anonymous", - "_id": "161691a8dbb6507879720288", - "ip": "166.137.178.83" - }, - "6b702751c20b59381bc16199": { - "color": "#eea5ea", - "name": "Gigi", - "_id": "6b702751c20b59381bc16199", - "ip": "69.118.185.179" - }, - "cb4e41d8009cf729f837867c": { - "color": "#14f8b0", - "name": "๖ۣۜIntel", - "_id": "cb4e41d8009cf729f837867c", - "ip": "75.74.69.43" - }, - "20d0b2eb1ed848556addef94": { - "color": "#abbd2a", - "name": "Anonymous", - "_id": "20d0b2eb1ed848556addef94", - "ip": "75.155.118.143" - }, - "d1c222ee3e8bacb13650cacf": { - "color": "#1b3e88", - "name": "Angel ", - "_id": "d1c222ee3e8bacb13650cacf", - "ip": "165.155.160.127" - }, - "d3884148e8288bd0840e49a7": { - "color": "#ce7838", - "name": "FNNN", - "_id": "d3884148e8288bd0840e49a7", - "ip": "47.34.149.121" - }, - "c0014607a748353938c42112": { - "color": "#c19f2f", - "name": "Muffin", - "_id": "c0014607a748353938c42112", - "ip": "206.180.150.21" - }, - "ba264edfc73fb42aa454fccb": { - "color": "#c8932c", - "name": "sans", - "_id": "ba264edfc73fb42aa454fccb", - "ip": "151.229.241.219" - }, - "749cd9b4e1e1f83b43cc9e00": { - "color": "#b45bf2", - "name": "Anonymous", - "_id": "749cd9b4e1e1f83b43cc9e00", - "ip": "104.225.161.116" - }, - "d2065e54852e2912576ef21a": { - "color": "#ff78c7", - "name": "🦉🎩⭐♛๖ۣۜ𝔊𝔯𝔦𝔣𝔣𝔬𝔫♥𝑔𝓊𝓇𝓁♞✨🌺🎹", - "_id": "d2065e54852e2912576ef21a", - "ip": "90.206.106.100" - }, - "3e1d1c7c8ba96ae42a5fc479": { - "color": "#b0e152", - "name": "dru", - "_id": "3e1d1c7c8ba96ae42a5fc479", - "ip": "173.71.104.223" - }, - "330fbf3dd9af4116bc108cfe": { - "color": "#fb90b5", - "name": "🖤🤍Harley quinn❤️💙", - "_id": "330fbf3dd9af4116bc108cfe", - "ip": "89.125.118.64" - }, - "c369a442e600258d58286081": { - "color": "#cc8c60", - "name": "Hustandant", - "_id": "c369a442e600258d58286081", - "ip": "37.112.111.18" - }, - "c127b1732bcd4575f31cb0ee": { - "color": "#774d5b", - "name": "Anonymous", - "_id": "c127b1732bcd4575f31cb0ee", - "ip": "31.135.179.36" - }, - "5024db4ab4df0c6491b78ae8": { - "color": "#357c96", - "name": "💥⚡𝕴𝖒𝖕𝖗𝖔𝖘𝖙𝖊𝖗8⚡💥", - "_id": "5024db4ab4df0c6491b78ae8", - "ip": "77.234.87.16" - }, - "5d7b407d4b7ebd43eec2b7f0": { - "color": "#9d6cb7", - "name": "User‮repuS ‭", - "_id": "5d7b407d4b7ebd43eec2b7f0", - "ip": "174.126.164.156" - }, - "33ae914ef0775361f5f880e4": { - "color": "#f4690e", - "name": "Punch*", - "_id": "33ae914ef0775361f5f880e4", - "ip": "77.77.223.207" - }, - "65fda202e4b4c4aa25ca29cf": { - "color": "#51538d", - "name": "Anonymous", - "_id": "65fda202e4b4c4aa25ca29cf", - "ip": "174.51.208.216" - }, - "a4567acd2b9e0039272b2cc0": { - "color": "#963834", - "name": "Anonymous", - "_id": "a4567acd2b9e0039272b2cc0", - "ip": "104.34.201.148" - }, - "ac0954c6bed603396833c634": { - "color": "#8e81b1", - "name": "Anonymous", - "_id": "ac0954c6bed603396833c634", - "ip": "178.203.201.98" - }, - "3e6f3311116efaf544750b06": { - "color": "#4779b1", - "name": "Anonymous", - "_id": "3e6f3311116efaf544750b06", - "ip": "98.182.142.78" - }, - "3c08643cbc59cf147aeec6dd": { - "color": "#c9a96e", - "name": "AndrewSDT Slovenian Pianist", - "_id": "3c08643cbc59cf147aeec6dd", - "ip": "109.182.31.46" - }, - "710fde43d83d5e380d4f7281": { - "color": "#502fe4", - "name": "Anonymous", - "_id": "710fde43d83d5e380d4f7281", - "ip": "156.146.59.43" - }, - "89b30e5aa412e1bd094eecc6": { - "color": "#bb5960", - "name": "Error", - "_id": "89b30e5aa412e1bd094eecc6", - "ip": "219.164.173.145" - }, - "714ce8fb68bf61c8df176514": { - "color": "#57dbf8", - "name": "zack wolf /isaac wolf", - "_id": "714ce8fb68bf61c8df176514", - "ip": "24.247.115.45" - }, - "37a5c5c7ab388190d1b088b9": { - "color": "#017506", - "name": "Anonymous", - "_id": "37a5c5c7ab388190d1b088b9", - "ip": "217.121.66.187" - }, - "9800b3a76d81058d032d53ca": { - "color": "#27a52f", - "name": "Anonymous", - "_id": "9800b3a76d81058d032d53ca", - "ip": "73.43.216.162" - }, - "92eb952600c8f945989a2d9a": { - "color": "#000000", - "name": "DJDan - Not on Discord much.", - "_id": "92eb952600c8f945989a2d9a", - "ip": "185.220.101.195" - }, - "09e5ba1095193124e0976223": { - "color": "#630401", - "name": "Anonymous", - "_id": "09e5ba1095193124e0976223", - "ip": "146.71.0.108" - }, - "01693b865e8e70776868540e": { - "color": "#f36f5f", - "name": "e", - "_id": "01693b865e8e70776868540e", - "ip": "174.218.21.105" - }, - "cd2f93da423fd3e613b677e1": { - "color": "#e0003f", - "name": "Frisk 2| LV 1| Hp 2/20 | Undertale", - "_id": "cd2f93da423fd3e613b677e1", - "ip": "24.245.37.131" - }, - "74ad099b443b3c23c32be8e9": { - "color": "#d08ff9", - "name": "Anonymous", - "_id": "74ad099b443b3c23c32be8e9", - "ip": "24.182.8.55" - }, - "7bff84d29d3ec45906cc7565": { - "color": "#a7970a", - "name": "Anonymous", - "_id": "7bff84d29d3ec45906cc7565", - "ip": "115.20.149.87" - }, - "0393d980dee141e18efc3615": { - "color": "#160731", - "name": "Anonymous", - "_id": "0393d980dee141e18efc3615", - "ip": "91.173.26.59" - }, - "85d25d8d49eb6d7a3172c5ae": { - "color": "#6ba72f", - "name": "DADDY J WOLF", - "_id": "85d25d8d49eb6d7a3172c5ae", - "ip": "172.6.79.26" - }, - "271abaf6a518f71bb0b4a517": { - "color": "#9900db", - "name": "test", - "_id": "271abaf6a518f71bb0b4a517", - "ip": "154.28.188.229" - }, - "0f400e9941b793ee05519231": { - "color": "#a9ddeb", - "name": "test", - "_id": "0f400e9941b793ee05519231", - "ip": "154.28.188.228" - }, - "3255e3d6b43134dd4aa16358": { - "color": "#31438d", - "name": "Anonymous", - "_id": "3255e3d6b43134dd4aa16358", - "ip": "154.28.188.231" - }, - "74b1b03d3fbcc88e9834d751": { - "color": "#9d6af0", - "name": "Anonymous", - "_id": "74b1b03d3fbcc88e9834d751", - "ip": "154.28.188.230" - }, - "853ff36fe921aebe9f2f428f": { - "color": "#6dca54", - "name": "Anonymous", - "_id": "853ff36fe921aebe9f2f428f", - "ip": "154.28.188.235" - }, - "f72a094061d5576d9b654e3d": { - "color": "#37532b", - "name": "Anonymous", - "_id": "f72a094061d5576d9b654e3d", - "ip": "154.28.188.233" - }, - "55ff990ea85062f0b4beca6a": { - "color": "#14c7eb", - "name": "Anonymous", - "_id": "55ff990ea85062f0b4beca6a", - "ip": "154.28.188.236" - }, - "2e6e61bb8952f7c435802df3": { - "color": "#5c1b16", - "name": "Anonymous", - "_id": "2e6e61bb8952f7c435802df3", - "ip": "154.28.188.232" - }, - "023e81a2bc1fa9a0bd9191fd": { - "color": "#e07aab", - "name": "Anonymous", - "_id": "023e81a2bc1fa9a0bd9191fd", - "ip": "154.28.188.237" - }, - "3f875de2685a1f71c136db76": { - "color": "#a4a2b9", - "name": "Anonymous", - "_id": "3f875de2685a1f71c136db76", - "ip": "154.28.188.241" - }, - "3c066699c837787ec612bcfb": { - "color": "#1d6a4f", - "name": "Anonymous", - "_id": "3c066699c837787ec612bcfb", - "ip": "154.28.188.239" - }, - "1008f1bf2f7b7e33ac764c5e": { - "color": "#69a0a3", - "name": "Anonymous", - "_id": "1008f1bf2f7b7e33ac764c5e", - "ip": "154.28.188.197" - }, - "302cd6bff4514c6737a4a281": { - "color": "#dabd7f", - "name": "Anonymous", - "_id": "302cd6bff4514c6737a4a281", - "ip": "154.28.188.199" - }, - "6cdadb72ae325db422e457c8": { - "color": "#a949ad", - "name": "Anonymous", - "_id": "6cdadb72ae325db422e457c8", - "ip": "154.28.188.198" - }, - "d54afe4a45168d7c10485da3": { - "color": "#77346c", - "name": "Anonymous", - "_id": "d54afe4a45168d7c10485da3", - "ip": "154.28.188.242" - }, - "404e2e1ec35a3f50110d402c": { - "color": "#ce7f5f", - "name": "Anonymous", - "_id": "404e2e1ec35a3f50110d402c", - "ip": "154.28.188.201" - }, - "0261a8a9d9ac382ac7976a71": { - "color": "#53988e", - "name": "Anonymous", - "_id": "0261a8a9d9ac382ac7976a71", - "ip": "154.28.188.200" - }, - "703bb7874d0ade1fc8684977": { - "color": "#144f4f", - "name": "Anonymous", - "_id": "703bb7874d0ade1fc8684977", - "ip": "154.28.188.204" - }, - "a08e6879560e8a640d11c2f0": { - "color": "#60810a", - "name": "Muffin", - "_id": "a08e6879560e8a640d11c2f0", - "ip": "154.28.188.238" - }, - "099864661d97fae95abd49d6": { - "color": "#6a5e2b", - "name": "Anonymous", - "_id": "099864661d97fae95abd49d6", - "ip": "154.28.188.208" - }, - "83023fe6ca25800192cd32af": { - "color": "#ecd699", - "name": "Anonymous", - "_id": "83023fe6ca25800192cd32af", - "ip": "154.28.188.206" - }, - "c232bed58b8222f6169644de": { - "color": "#343e19", - "name": "Anonymous", - "_id": "c232bed58b8222f6169644de", - "ip": "154.28.188.209" - }, - "e31b40c77e6e6b3296c6304e": { - "color": "#7af595", - "name": "Anonymous", - "_id": "e31b40c77e6e6b3296c6304e", - "ip": "154.28.188.205" - }, - "f551fd464e6568f3bf4419fb": { - "color": "#796552", - "name": "Anonymous", - "_id": "f551fd464e6568f3bf4419fb", - "ip": "154.28.188.207" - }, - "133795a0cd08324d32676b79": { - "color": "#4b1237", - "name": "Anonymous", - "_id": "133795a0cd08324d32676b79", - "ip": "154.28.188.202" - }, - "8273926e743e1acc80608873": { - "color": "#f5ab0b", - "name": "Anonymous", - "_id": "8273926e743e1acc80608873", - "ip": "154.28.188.203" - }, - "e95cdcdb0e4bd58b0d01e80b": { - "color": "#b02a77", - "name": "Anonymous", - "_id": "e95cdcdb0e4bd58b0d01e80b", - "ip": "154.28.188.196" - }, - "6d588bf1ead3c3b54a97ef1f": { - "color": "#893935", - "name": "Anonymous", - "_id": "6d588bf1ead3c3b54a97ef1f", - "ip": "193.176.86.38" - }, - "6a311810452ea70dec60159b": { - "color": "#d42432", - "name": "Anonymous", - "_id": "6a311810452ea70dec60159b", - "ip": "154.28.188.210" - }, - "1dcdadad80245bedaac3e7e9": { - "color": "#249496", - "name": "Anonymous", - "_id": "1dcdadad80245bedaac3e7e9", - "ip": "154.28.188.240" - }, - "60d5e8e92dbe5bad24132a7c": { - "color": "#f9cd36", - "name": "Anonymous", - "_id": "60d5e8e92dbe5bad24132a7c", - "ip": "193.176.86.37" - }, - "b05ff760042add0d3dfeebf0": { - "color": "#f1b588", - "name": "Anonymous", - "_id": "b05ff760042add0d3dfeebf0", - "ip": "193.176.86.36" - }, - "40cf6cc2e09f225c91e6e58d": { - "color": "#ea8ae6", - "name": "Anonymous", - "_id": "40cf6cc2e09f225c91e6e58d", - "ip": "193.176.86.35" - }, - "010159253ffd43d2aecf0869": { - "color": "#c40a99", - "name": "Anonymous", - "_id": "010159253ffd43d2aecf0869", - "ip": "193.176.86.39" - }, - "fb545b2abe15e3e44e2c25c3": { - "color": "#e473f0", - "name": "Anonymous", - "_id": "fb545b2abe15e3e44e2c25c3", - "ip": "92.46.148.229" - }, - "abf477ddaa44d1f0e002b4f9": { - "color": "#d2d0d8", - "name": "【✦】𝐇 𝐀 𝐂 𝐇 𝐌 𝐄 𝐓【✦", - "_id": "abf477ddaa44d1f0e002b4f9", - "ip": "130.13.147.177" - }, - "ff363409ece053aa3a610f4d": { - "color": "#e96dc3", - "name": "Anonymous", - "_id": "ff363409ece053aa3a610f4d", - "ip": "97.64.56.233" - }, - "dd234dc6d2a72ee5aa298e17": { - "color": "#75a405", - "name": "wolf girl ", - "_id": "dd234dc6d2a72ee5aa298e17", - "ip": "190.197.121.160" - }, - "cfa48afd1266cdcb550f0e2e": { - "color": "#45a51c", - "name": "Anonymous", - "_id": "cfa48afd1266cdcb550f0e2e", - "ip": "191.99.150.20" - }, - "25207cedf736e9b65eee3c72": { - "color": "#000000", - "name": "7566 | h!help", - "_id": "25207cedf736e9b65eee3c72", - "ip": "172.17.0.2" - }, - "ae05accc6fbdc81a57904664": { - "color": "#4b7c9b", - "name": "Anonymous", - "_id": "ae05accc6fbdc81a57904664", - "ip": "72.178.227.39" - }, - "cf4998d24265b2c4a1881e07": { - "color": "#8b8b9e", - "name": "Anonymous", - "_id": "cf4998d24265b2c4a1881e07", - "ip": "97.100.43.170" - }, - "d1304afc05eb3a9b23f5b506": { - "color": "#b2f836", - "name": "Anonymous", - "_id": "d1304afc05eb3a9b23f5b506", - "ip": "96.241.218.248" - }, - "b75b98abc55621fa68a56526": { - "color": "#8e4ba8", - "name": "Anonymous", - "_id": "b75b98abc55621fa68a56526", - "ip": "188.225.126.127" - }, - "b7aff9ab5fbff6d7464f9cf1": { - "color": "#7e0f2f", - "name": "Qhy 「 qhelp 」 ", - "_id": "b7aff9ab5fbff6d7464f9cf1", - "ip": "177.10.7.1" - }, - "7f0b6f86c7fdd285f3ddc4e0": { - "color": "#cc3a55", - "name": "Anonymous", - "_id": "7f0b6f86c7fdd285f3ddc4e0", - "ip": "204.225.81.181" - }, - "7c3b94c94a1a895d67eb4fc1": { - "color": "#fa8ff7", - "name": "Anonymous", - "_id": "7c3b94c94a1a895d67eb4fc1", - "ip": "172.17.0.3" - }, - "65337bbbabe04ee462e6ac5f": { - "color": "#10cfb6", - "name": "Anonymous", - "_id": "65337bbbabe04ee462e6ac5f", - "ip": "51.68.142.141" - }, - "8fd971a373e8e89997c748d1": { - "color": "#79a714", - "name": "Anonymous", - "_id": "8fd971a373e8e89997c748d1", - "ip": "31.8.217.252" - }, - "7b7f29fad1191d33ebf4c6a0": { - "color": "#4e9c11", - "name": "Anonymous", - "_id": "7b7f29fad1191d33ebf4c6a0", - "ip": "121.181.128.100" - }, - "61fe49754a0f41e12e734f3d": { - "color": "#6d7f6f", - "name": " ", - "_id": "61fe49754a0f41e12e734f3d", - "ip": "49.144.3.126" - }, - "d3e5c4e58c912ffcedc8bf3a": { - "color": "#92d6fa", - "name": "Anonymous", - "_id": "d3e5c4e58c912ffcedc8bf3a", - "ip": "178.235.186.57" - }, - "52385a267ba22ea78f81e57a": { - "color": "#0c0d2e", - "name": "mousemanjeff", - "_id": "52385a267ba22ea78f81e57a", - "ip": "104.49.3.35" - }, - "ae2c4858a7e138c263c43f7e": { - "color": "#22f9a6", - "name": "🦉ℍ𝕒𝕡𝕡𝕪 ♥️ 𝕗𝕣𝕚𝕖𝕟𝕕✨", - "_id": "ae2c4858a7e138c263c43f7e", - "ip": "86.176.27.143" - }, - "e66b6d6c6f9c6e425d65f89e": { - "color": "#06d10b", - "name": "Anonymous", - "_id": "e66b6d6c6f9c6e425d65f89e", - "ip": "5.155.148.68" - }, - "2bdb32907d1dea061622b86f": { - "color": "#7a8391", - "name": "Anonymous", - "_id": "2bdb32907d1dea061622b86f", - "ip": "84.23.156.213" - }, - "2cca0e3cbdb0398e1300b014": { - "color": "#90d8ca", - "name": "Anonymous", - "_id": "2cca0e3cbdb0398e1300b014", - "ip": "82.142.29.79" - }, - "5fd6a68f87bde57d477e4307": { - "color": "#3b28db", - "name": "Anonymous", - "_id": "5fd6a68f87bde57d477e4307", - "ip": "2.135.128.33" - }, - "06ab23c2306ee93e1e9497bf": { - "color": "#9b4a3a", - "name": "https://www.twitch.tv/wtfhaks", - "_id": "06ab23c2306ee93e1e9497bf", - "ip": "216.227.107.77" - }, - "845a93940c388518a6381e30": { - "color": "#64aa04", - "name": "JoacoPlay A", - "_id": "845a93940c388518a6381e30", - "ip": "152.231.56.110" - }, - "bbc367254b68c34a94b3263b": { - "color": "#624340", - "name": "Backstabber Manipulator Liar", - "_id": "bbc367254b68c34a94b3263b", - "ip": "79.176.154.45" - }, - "af7d86f5061c5e61431b91cc": { - "color": "#89ceea", - "name": "Anonymous", - "_id": "af7d86f5061c5e61431b91cc", - "ip": "83.185.32.154" - }, - "080ab1b94a3998a0436007be": { - "color": "#415443", - "name": "Anonymous", - "_id": "080ab1b94a3998a0436007be", - "ip": "174.78.0.254" - }, - "9b08a49664295e027a54cb3a": { - "color": "#2e798e", - "name": "mousemanjeff", - "_id": "9b08a49664295e027a54cb3a", - "ip": "3.122.185.48" - }, - "18f3c92fad68be70e8b4db1f": { - "color": "#582db7", - "name": "Anonymous", - "_id": "18f3c92fad68be70e8b4db1f", - "ip": "79.201.32.142" - }, - "a906c18bfc49a037f4985cd0": { - "color": "#c36eb2", - "name": "Anonymous", - "_id": "a906c18bfc49a037f4985cd0", - "ip": "24.90.155.168" - }, - "dadecd47616ae9a5c317c316": { - "color": "#38d05b", - "name": "Muffin", - "_id": "dadecd47616ae9a5c317c316", - "ip": "174.255.193.173" - }, - "47559b4814b7143d31d8a265": { - "color": "#90707e", - "name": "Anonymous", - "_id": "47559b4814b7143d31d8a265", - "ip": "174.255.212.165" - }, - "3eed9f4c1464d198c8ad29a2": { - "color": "#92494a", - "name": "Anonymous", - "_id": "3eed9f4c1464d198c8ad29a2", - "ip": "3.14.244.122" - }, - "15132160e6830ce63c63efb9": { - "color": "#1fd1d4", - "name": "aeiou", - "_id": "15132160e6830ce63c63efb9", - "ip": "185.51.134.236" - }, - "26e2ecc687f580143c61ca6b": { - "color": "#8ce500", - "name": "Anonymous", - "_id": "26e2ecc687f580143c61ca6b", - "ip": "98.40.144.204" - }, - "fa382ff61a8dca678fcb69c2": { - "color": "#b1023e", - "name": "𝔻𝔸ℕ𝕀𝔼𝕃𝐅𝘛𝘖𝘚𝘛𝘈 176", - "_id": "fa382ff61a8dca678fcb69c2", - "ip": "187.114.122.117" - }, - "929aead8d3fc352e8c5ab38f": { - "color": "#6128e8", - "name": "Anonymous", - "_id": "929aead8d3fc352e8c5ab38f", - "ip": "121.181.133.217" - }, - "a5608e7e06e52689ed519f17": { - "color": "#3fe312", - "name": "Anonymous", - "_id": "a5608e7e06e52689ed519f17", - "ip": "86.40.54.114" - }, - "c7cff27af5a526bb83368344": { - "color": "#9146cd", - "name": "blobek-lady2013", - "_id": "c7cff27af5a526bb83368344", - "ip": "92.40.188.5" - }, - "31576b73ff117a288978094b": { - "color": "#a63511", - "name": "blobek-lady2013", - "_id": "31576b73ff117a288978094b", - "ip": "92.40.188.12" - }, - "11b31e18be7c0ad048e103f3": { - "color": "#2e8e38", - "name": "Anonymous", - "_id": "11b31e18be7c0ad048e103f3", - "ip": "92.40.188.9" - }, - "e7d72dd62779c3c2808d948d": { - "color": "#6d427a", - "name": "Berat", - "_id": "e7d72dd62779c3c2808d948d", - "ip": "77.77.223.170" - }, - "abdbe19792f7ffd44d908dc7": { - "color": "#d69d8a", - "name": "kitten", - "_id": "abdbe19792f7ffd44d908dc7", - "ip": "73.203.197.118" - }, - "ba135067c661669576470a69": { - "color": "#c2b31d", - "name": "Anonymous", - "_id": "ba135067c661669576470a69", - "ip": "90.216.199.140" - }, - "ce67b1c9917d6dbd829c7f24": { - "color": "#1de277", - "name": "Duchess", - "_id": "ce67b1c9917d6dbd829c7f24", - "ip": "70.172.162.142" - }, - "a0a30131d1fba0fa9953dabd": { - "color": "#48b730", - "name": "Anonymous", - "_id": "a0a30131d1fba0fa9953dabd", - "ip": "5.166.68.245" - }, - "deda43c0f19d523bac64714d": { - "color": "#dfc416", - "name": "𝓢𝓱𝓾𝓽 𝓣𝓱𝓮 𝓕𝓾𝓬𝓴 𝓤𝓹", - "_id": "deda43c0f19d523bac64714d", - "ip": "152.22.40.24" - }, - "33fed6de26c25abaca3a6b5e": { - "color": "#8eca36", - "name": "𝓢𝓱𝓾𝓽 𝓣𝓱𝓮 𝓕𝓾𝓬𝓴 𝓤𝓹", - "_id": "33fed6de26c25abaca3a6b5e", - "ip": "152.22.41.23" - }, - "5c6fcfcf177ce034e9c360ec": { - "color": "#0c667e", - "name": "𝓢𝓱𝓾𝓽 𝓣𝓱𝓮 𝓕𝓾𝓬𝓴 𝓤𝓹", - "_id": "5c6fcfcf177ce034e9c360ec", - "ip": "152.22.73.27" - }, - "a55f4a1e37b3ef834f49af5d": { - "color": "#7f2d42", - "name": "Anonymous", - "_id": "a55f4a1e37b3ef834f49af5d", - "ip": "51.81.153.189" - }, - "dda4df7fe1a50fa678f3a368": { - "color": "#088f71", - "name": "Anonymous", - "_id": "dda4df7fe1a50fa678f3a368", - "ip": "51.81.153.6" - }, - "5b7397e5813bc9db9f361176": { - "color": "#96d9e2", - "name": "Anonymous", - "_id": "5b7397e5813bc9db9f361176", - "ip": "51.81.153.188" - }, - "a9e3e705a46cd3eae014a380": { - "color": "#a73ee0", - "name": "Anonymous", - "_id": "a9e3e705a46cd3eae014a380", - "ip": "51.81.153.23" - }, - "eb623b6ccbc1bf8341f90003": { - "color": "#c7a7b4", - "name": "Qhy 「 qhelp 」 ", - "_id": "eb623b6ccbc1bf8341f90003", - "ip": "201.86.214.135" - }, - "654d75a39e7b7367414964cc": { - "color": "#38e653", - "name": "fasdgvgvs", - "_id": "654d75a39e7b7367414964cc", - "ip": "5.179.134.31" - }, - "00fb4479da5cb84f8d30b7e2": { - "color": "#09003c", - "name": "Qhy 「 qhelp 」 ", - "_id": "00fb4479da5cb84f8d30b7e2", - "ip": "177.97.75.146" - }, - "6a37b2d50e87ed4d9939ee92": { - "color": "#000000", - "name": "gitpod 7566 | h.help", - "_id": "6a37b2d50e87ed4d9939ee92", - "ip": "35.227.151.217" - }, - "25bfd0d5ca3f36c1d22cc7a3": { - "color": "#f9118b", - "name": "Workaoe", - "_id": "25bfd0d5ca3f36c1d22cc7a3", - "ip": "187.113.125.96" - }, - "cbfa0976219553637b99fa19": { - "color": "#d90106", - "name": "Anonymousyay", - "_id": "cbfa0976219553637b99fa19", - "ip": "219.100.37.238" - }, - "3970d66269c865e06718e41b": { - "color": "#64d017", - "name": "Anonymous", - "_id": "3970d66269c865e06718e41b", - "ip": "35.203.163.44" - }, - "6a58b1f5f6938b48a30851b2": { - "color": "#95aaaa", - "name": "Anonymous", - "_id": "6a58b1f5f6938b48a30851b2", - "ip": "99.122.116.135" - }, - "ed650565366d1376cfd671db": { - "color": "#097d01", - "name": "Anonymous", - "_id": "ed650565366d1376cfd671db", - "ip": "82.73.169.151" - }, - "7d492728b6a6fa70783399c0": { - "color": "#51d0c8", - "name": "Anonymous", - "_id": "7d492728b6a6fa70783399c0", - "ip": "194.103.203.170" - }, - "990f80cd034082faaa3db830": { - "color": "#317a47", - "name": "COdER", - "_id": "990f80cd034082faaa3db830", - "ip": "90.150.241.32" - }, - "3eb2c11167c8ccbe35fa2e06": { - "color": "#308f1f", - "name": "Anonymous", - "_id": "3eb2c11167c8ccbe35fa2e06", - "ip": "46.1.36.238" - }, - "5dd3e3822072e788d1742871": { - "color": "#4067db", - "name": "Luke", - "_id": "5dd3e3822072e788d1742871", - "ip": "174.101.165.114" - }, - "0a0d1669e95d61713d178353": { - "color": "#957ab5", - "name": "๖ۣۜ7566 | h!help", - "_id": "0a0d1669e95d61713d178353", - "ip": "45.33.68.34" - }, - "1791d8403447f308ca1551fc": { - "color": "#d59de2", - "name": "Anonymous", - "_id": "1791d8403447f308ca1551fc", - "ip": "185.220.100.253" - }, - "afea549eec9b4e9661b0a830": { - "color": "#56d2be", - "name": "Anonymous", - "_id": "afea549eec9b4e9661b0a830", - "ip": "51.79.161.242" - }, - "9d89ad09c20b9b45bd0090a3": { - "color": "#1177ae", - "name": "Anonymous", - "_id": "9d89ad09c20b9b45bd0090a3", - "ip": "69.114.129.46" - }, - "9caae223ec541915f36ef1a6": { - "color": "#2c6ddd", - "name": "Papaya", - "_id": "9caae223ec541915f36ef1a6", - "ip": "66.30.200.172" - }, - "0ec8330223aba058513f9317": { - "color": "#f229ef", - "name": "bignoob", - "_id": "0ec8330223aba058513f9317", - "ip": "103.121.17.1" - }, - "e7e552603d10e566dd19b7e7": { - "color": "#135d08", - "name": "Anonymous", - "_id": "e7e552603d10e566dd19b7e7", - "ip": "45.44.241.76" - }, - "ee57f34262d8f71bf37466bc": { - "color": "#74f2ea", - "name": "Hustandant", - "_id": "ee57f34262d8f71bf37466bc", - "ip": "176.212.179.128" - }, - "31e850624793bb46382057a1": { - "color": "#deab7c", - "name": "Все дети идут нахуй [proxy]", - "_id": "31e850624793bb46382057a1", - "ip": "173.254.222.170" - }, - "067e069a99ea84ee281d3ce4": { - "color": "#4a6152", - "name": "Anonymous", - "_id": "067e069a99ea84ee281d3ce4", - "ip": "174.222.8.146" - }, - "5474c679800736aa096d0fb9": { - "color": "#494757", - "name": "Anonymous", - "_id": "5474c679800736aa096d0fb9", - "ip": "192.168.1.204" - }, - "dd413e238a8f4bf302e0e917": { - "color": "#e09029", - "name": "Anonymous", - "_id": "dd413e238a8f4bf302e0e917", - "ip": "71.168.136.227" - }, - "8b1e7580204b73ab4ddf3110": { - "color": "#b13fec", - "name": "Hustandant [proxy]", - "_id": "8b1e7580204b73ab4ddf3110", - "ip": "213.238.167.119" - }, - "e7b905b5b0f80c89f6dd8516": { - "color": "#bffee7", - "name": "Все дети идут нахуй [proxy]", - "_id": "e7b905b5b0f80c89f6dd8516", - "ip": "195.206.105.217" - }, - "14e20b8a18d376506a83b5ce": { - "color": "#3ad7f6", - "name": "Все дети идут нахуй [proxy]", - "_id": "14e20b8a18d376506a83b5ce", - "ip": "39.129.13.12" - }, - "c712e4550d914df5606e2ee3": { - "color": "#659179", - "name": "Anonymous", - "_id": "c712e4550d914df5606e2ee3", - "ip": "37.79.145.53" - }, - "229b8db394f6b39d053058e7": { - "color": "#529944", - "name": "Anonymous", - "_id": "229b8db394f6b39d053058e7", - "ip": "185.180.222.151" - }, - "93e78b64c822c97d22f902fa": { - "color": "#6d6a7c", - "name": "Lamp 89", - "_id": "93e78b64c822c97d22f902fa", - "ip": "177.54.145.61" - }, - "f6ee0a45867045935c6b3d7a": { - "color": "#02d269", - "name": "Lamp 89", - "_id": "f6ee0a45867045935c6b3d7a", - "ip": "213.6.141.146" - }, - "a38213162f79af8f1b30a2ae": { - "color": "#db0ddf", - "name": "f낊Cᦣ.Y鿅A\udff9`귱J譟", - "_id": "a38213162f79af8f1b30a2ae", - "ip": "178.249.219.86" - }, - "fad8aeaeb636062feedab531": { - "color": "#e28856", - "name": "Lamp 89", - "_id": "fad8aeaeb636062feedab531", - "ip": "103.23.101.30" - }, - "09ec63941239e40a4b25c2ca": { - "color": "#fb07e4", - "name": "Lamp 89", - "_id": "09ec63941239e40a4b25c2ca", - "ip": "210.245.51.15" - }, - "5a08dccac6952f95db72818e": { - "color": "#e122cf", - "name": "Lamp 89", - "_id": "5a08dccac6952f95db72818e", - "ip": "91.237.161.211" - }, - "c96beb64bfa6899af8860e7e": { - "color": "#774892", - "name": "Lamp 89", - "_id": "c96beb64bfa6899af8860e7e", - "ip": "213.136.89.190" - }, - "b11f9bc1339ccb447e450385": { - "color": "#a8d173", - "name": "Lamp 89", - "_id": "b11f9bc1339ccb447e450385", - "ip": "177.137.168.132" - }, - "8fd2d61b2ea85cb79f4c61bb": { - "color": "#446223", - "name": "Lamp 89", - "_id": "8fd2d61b2ea85cb79f4c61bb", - "ip": "92.86.33.126" - }, - "a0fdc649210631a08f4a21e1": { - "color": "#9784fd", - "name": "Lamp 89", - "_id": "a0fdc649210631a08f4a21e1", - "ip": "138.97.236.2" - }, - "01629ac5ff3a7962bdeb8865": { - "color": "#57f181", - "name": "Lamp 89", - "_id": "01629ac5ff3a7962bdeb8865", - "ip": "119.243.95.62" - }, - "98ca6d5def437feb7b40dcfc": { - "color": "#c72709", - "name": "v眻!ĿY\udb81?㎅v쫳A碁+恉", - "_id": "98ca6d5def437feb7b40dcfc", - "ip": "49.51.74.19" - }, - "be780fa033e908c9dbd2d35e": { - "color": "#cdfcc6", - "name": "R領K༰ 䀝0ꈬb◐I궝e牆", - "_id": "be780fa033e908c9dbd2d35e", - "ip": "31.128.248.1" - }, - "4452915ccddc23a7417a9367": { - "color": "#cea23c", - "name": "Lamp 89", - "_id": "4452915ccddc23a7417a9367", - "ip": "185.220.102.245" - }, - "ecac5635da794e2d29d1101d": { - "color": "#4ba30b", - "name": "U뮼Yv\udb57_腬s䡷2偁o\uda18", - "_id": "ecac5635da794e2d29d1101d", - "ip": "61.41.9.213" - }, - "784e31477464932c791e3248": { - "color": "#d01872", - "name": "-ꮟz숷Yꎒ:꼫<롋R柢]⬒", - "_id": "784e31477464932c791e3248", - "ip": "103.25.120.138" - }, - "2b7176ebaa26673c69faf634": { - "color": "#ff6b2a", - "name": "Qrdy&B!kqY-D3YzNFy+.PNvSI>G.vSa&UeFG/|wm&p", - "_id": "a682856063e145dda43c158b", - "ip": "46.0.205.175" - }, - "768736f43c144f3ed1d8b109": { - "color": "#775f7f", - "name": "DL딐0욮\"뻨gᠠ/䭱T泜", - "_id": "768736f43c144f3ed1d8b109", - "ip": "36.94.126.50" - }, - "1efa8da06955863d5d5b8bc1": { - "color": "#d01e90", - "name": "Anonymous", - "_id": "1efa8da06955863d5d5b8bc1", - "ip": "157.245.108.114" - }, - "388d69de44f93a313b5ec1b1": { - "color": "#ee0330", - "name": "Anonymous", - "_id": "388d69de44f93a313b5ec1b1", - "ip": "185.22.173.86" - }, - "831403a0d54075ed5ea6749e": { - "color": "#9835c8", - "name": "Lamp 89", - "_id": "831403a0d54075ed5ea6749e", - "ip": "185.220.100.249" - }, - "c415cf5e2c824a8373305fef": { - "color": "#88ce06", - "name": "P⶘g9♭l夭O쿶tꄂ4椮", - "_id": "c415cf5e2c824a8373305fef", - "ip": "58.32.206.226" - }, - "f4cf9e5d28236f3bf31260a3": { - "color": "#8c4bac", - "name": "DF176#2208", - "_id": "f4cf9e5d28236f3bf31260a3", - "ip": "195.210.172.43" - }, - "36bc5eefc8e24f145fc9c081": { - "color": "#594c39", - "name": "w黰x背.㗈'叞F脯FKՊ", - "_id": "36bc5eefc8e24f145fc9c081", - "ip": "202.158.49.138" - }, - "235f154423176f226b90e80c": { - "color": "#0919b6", - "name": "DF176#2208", - "_id": "235f154423176f226b90e80c", - "ip": "185.220.101.11" - }, - "70f2af1bd82399b9f8d31a03": { - "color": "#cc445b", - "name": "DF176#2208", - "_id": "70f2af1bd82399b9f8d31a03", - "ip": "43.224.10.44" - }, - "2397c695b6e9e0a5e1aab277": { - "color": "#b4d8d1", - "name": "=㷶W\udb65v뇤6獮x岯(啉@텐", - "_id": "2397c695b6e9e0a5e1aab277", - "ip": "176.235.137.2" - }, - "a6f3e8ac7a6476f7e0696327": { - "color": "#88363f", - "name": "DF176#2208", - "_id": "a6f3e8ac7a6476f7e0696327", - "ip": "84.209.139.0" - }, - "3238fbae44854838914353f0": { - "color": "#7ee589", - "name": ",6vK#wr'|b{^FGf^e^q.}VckH6b0^lmGmh}*GkQgoNDSjlA^l HpE'c", - "_id": "ac18a81a35ba8b20e97711fe", - "ip": "109.224.22.34" - }, - "fc1fd459ecc7382e320a60ec": { - "color": "#72d558", - "name": "Anonymous", - "_id": "fc1fd459ecc7382e320a60ec", - "ip": "68.183.232.141" - }, - "f03f419411fa98911a66ad15": { - "color": "#9396de", - "name": "D뤥K邁_3簱A㚔!酊)ퟑ", - "_id": "f03f419411fa98911a66ad15", - "ip": "147.135.211.7" - }, - "c6109353c10617808c2eed98": { - "color": "#6239f8", - "name": "Anonymous", - "_id": "c6109353c10617808c2eed98", - "ip": "143.110.183.114" - }, - "efc65679050ee5f409ea0bb9": { - "color": "#e1847d", - "name": "DF176#2208", - "_id": "efc65679050ee5f409ea0bb9", - "ip": "209.141.45.189" - }, - "875312b8124eb3fe0b4ec909": { - "color": "#96bb18", - "name": "socks5://159.65.69.186:9200", - "_id": "875312b8124eb3fe0b4ec909", - "ip": "45.129.56.200" - }, - "bb99207b33cc003207ace03f": { - "color": "#93e36f", - "name": "DF176#2208", - "_id": "bb99207b33cc003207ace03f", - "ip": "162.247.74.74" - }, - "c4eea81c29cbd33dd79368ff": { - "color": "#2cc2cf", - "name": "DF176#2208", - "_id": "c4eea81c29cbd33dd79368ff", - "ip": "23.129.64.253" - }, - "1d5af174b1a46dce2ade5390": { - "color": "#77e1fe", - "name": "DF176#2208", - "_id": "1d5af174b1a46dce2ade5390", - "ip": "91.218.203.59" - }, - "45882583b6a5c12c1a5c6ee7": { - "color": "#d46825", - "name": "Anonymous", - "_id": "45882583b6a5c12c1a5c6ee7", - "ip": "185.220.100.247" - }, - "1b033ad3848e41444b031bd7": { - "color": "#8130ec", - "name": "socks5://88.198.82.12:9051", - "_id": "1b033ad3848e41444b031bd7", - "ip": "23.129.64.243" - }, - "c2e7a40eb0ca1b64d238ebaf": { - "color": "#c633b9", - "name": "DF176#2208", - "_id": "c2e7a40eb0ca1b64d238ebaf", - "ip": "128.31.0.13" - }, - "30bb9e9f1ce9aea4f6d1cc8d": { - "color": "#4bd7bc", - "name": "DF176#2208", - "_id": "30bb9e9f1ce9aea4f6d1cc8d", - "ip": "45.153.160.137" - }, - "1f882c5be704059a4ae623d6": { - "color": "#b7abc7", - "name": "pQL81U|R(vl{ZFJ@)5iZC_xLNRP{{6^X.0m)F|.n", - "_id": "1f882c5be704059a4ae623d6", - "ip": "185.220.100.248" - }, - "29719ee67bee6a2f390cecb6": { - "color": "#ee1773", - "name": "!糿D翌H뒞v㤒F趕aܻJ뀱", - "_id": "29719ee67bee6a2f390cecb6", - "ip": "162.247.73.192" - }, - "5580f8fd85a6fd75b46341c8": { - "color": "#d81177", - "name": "Yᜑv෮ 퍞d暈+꧖?#鲇", - "_id": "5580f8fd85a6fd75b46341c8", - "ip": "109.69.67.17" - }, - "96a23c12d376ad6519558b8a": { - "color": "#b238aa", - "name": "t驸V໅}陒6艖{䊇Cカ7뱅", - "_id": "96a23c12d376ad6519558b8a", - "ip": "185.220.101.205" - }, - "2c7cc3e8fe3dfabbe082b1ec": { - "color": "#e7e93d", - "name": "Anonymous", - "_id": "2c7cc3e8fe3dfabbe082b1ec", - "ip": "191.96.97.58" - }, - "799c73a08bce160a2c2ffe19": { - "color": "#97bee5", - "name": "Anonymous", - "_id": "799c73a08bce160a2c2ffe19", - "ip": "69.223.210.159" - }, - "12e30313d1dddd5e0e1418bf": { - "color": "#9e1b54", - "name": "Anonymous", - "_id": "12e30313d1dddd5e0e1418bf", - "ip": "174.223.131.181" - }, - "0ab97760481baa49c1b2784b": { - "color": "#ebe0a9", - "name": "aeiou", - "_id": "0ab97760481baa49c1b2784b", - "ip": "193.160.245.166" - }, - "b899ba27d2d4d6ff811e9a27": { - "color": "#a1c044", - "name": "Anonymous", - "_id": "b899ba27d2d4d6ff811e9a27", - "ip": "185.248.103.164" - }, - "5a9177b56fe460da5bea85c1": { - "color": "#620c01", - "name": "Anonymous", - "_id": "5a9177b56fe460da5bea85c1", - "ip": "185.248.102.118" - }, - "05be78c1c128ce9c2a7061e7": { - "color": "#0333ec", - "name": "Muffin", - "_id": "05be78c1c128ce9c2a7061e7", - "ip": "194.36.108.90" - }, - "490ee81de815b5b17a5467d4": { - "color": "#e2a6b3", - "name": "Hustandant [GGNBcom]", - "_id": "490ee81de815b5b17a5467d4", - "ip": "185.100.87.202" - }, - "78e9bdf3225f3c5e1b019ee0": { - "color": "#ed9d9e", - "name": "TheClayJar", - "_id": "78e9bdf3225f3c5e1b019ee0", - "ip": "47.36.216.152" - }, - "44a4ce2beb3ab317fc27451d": { - "color": "#5b32fd", - "name": "Hustandant [GGNBcom]", - "_id": "44a4ce2beb3ab317fc27451d", - "ip": "23.129.64.202" - }, - "b1795a6a98065f51b25ece8b": { - "color": "#545966", - "name": "Hustandant [GGNBcom]", - "_id": "b1795a6a98065f51b25ece8b", - "ip": "23.129.64.245" - }, - "c76a7017149a5ee2e87de992": { - "color": "#2a9113", - "name": "Anonymous", - "_id": "c76a7017149a5ee2e87de992", - "ip": "93.170.64.212" - }, - "f0ecdc324d7269d0803f68e3": { - "color": "#d6e2db", - "name": "Anonymous", - "_id": "f0ecdc324d7269d0803f68e3", - "ip": "193.176.84.214" - } -} \ No newline at end of file