Pull from upstream front and back

This commit is contained in:
Lewin Kelly 2023-09-12 22:52:15 +01:00
parent e61816bd6d
commit eef826a53d
No known key found for this signature in database
GPG Key ID: C103AD9C84014FD7
57 changed files with 8119 additions and 6225 deletions

View File

@ -5,3 +5,4 @@ PROD=true
LOCALCERTIFICATEPATH= LOCALCERTIFICATEPATH=
LOCALREDISCONNECTION= LOCALREDISCONNECTION=
DB_PASSWORD= DB_PASSWORD=
ACCESS_KEY=

View File

@ -25,3 +25,17 @@ easy enough
``` ```
PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 start server.mjs PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 start server.mjs
``` ```
# Setting up Access keys
Open regedit go to Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node
Make a key called ROBLOX Corporation if it doesn't exist
Inside of that key make another key called Roblox if it doesn't exist
Finally inside that key made a string value called AccessKey for the value put the same value as the one from the env file thank you.
# Contribution
Anyone is welcome to contribute.

View File

@ -1,14 +0,0 @@
const mongoose = require("mongoose")
const ConfigSchema = new mongoose.Schema(
{
RegistrationEnabled: { type: Boolean, required: true },
MaintenanceEnabled: { type: Boolean, required: true },
KeysEnabled: { type: Boolean, required: true },
GamesEnabled: { type: Boolean, required: true },
},
{ collection: "config" },
)
const model = mongoose.model("ConfigSchema", ConfigSchema)
module.exports = model

11
Back/model/configNew.mjs Normal file
View File

@ -0,0 +1,11 @@
import { Schema } from "redis-om"
const configSchema = new Schema("config", {
RegistrationEnabled: { type: "boolean" },
MaintenanceEnabled: { type: "boolean" },
GamesEnabled: { type: "boolean" },
KeysEnabled: { type: "boolean" },
bannermessage: { type: "string" },
})
export default configSchema

View File

@ -71,6 +71,13 @@ UserSchema.virtual("feed.userdata", {
justOne: true, justOne: true,
}) })
UserSchema.virtual("inventory.itemdata", {
ref: "CatalogSchema",
localField: "inventory.ItemId",
foreignField: "ItemId",
justOne: true,
})
const model = mongoose.model("UserSchema", UserSchema) const model = mongoose.model("UserSchema", UserSchema)
module.exports = model module.exports = model

6
Back/mykey.pub Normal file
View File

@ -0,0 +1,6 @@
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC04Nimx5hGYvQ54rZPWJ9qvvoP
SsBXt3PREKhramu1gXpv+W4Mh/vdzlTsNqmedZ2gaX0rd9smy3Kp2lgxKsuyX1gc
918k9L/PUzKvnfxy93RDwXdo6qJze+mdQlkDi9U5W4MAzcx6ann3YTHyiKHfs9Dq
F+kBJQiloPgcnk3HPQIDAQAB
-----END PUBLIC KEY-----

11
Back/package-lock.json generated
View File

@ -33,6 +33,7 @@
"jsonwebtoken": "^9.0.0", "jsonwebtoken": "^9.0.0",
"mongo-sanitize": "^1.1.0", "mongo-sanitize": "^1.1.0",
"mongoose": "^6.5.2", "mongoose": "^6.5.2",
"mongoose-execution-time": "^1.0.2",
"mongoose-unique-validator": "^3.1.0", "mongoose-unique-validator": "^3.1.0",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-fetch": "^3.2.10", "node-fetch": "^3.2.10",
@ -3524,6 +3525,11 @@
"url": "https://opencollective.com/mongoose" "url": "https://opencollective.com/mongoose"
} }
}, },
"node_modules/mongoose-execution-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-execution-time/-/mongoose-execution-time-1.0.2.tgz",
"integrity": "sha512-ROCOxLNOQcXuNcEmpcYUj6oeLWuBWMZXOPW4duuCJwmm4b7hGuLEExwWiy/4TtMULkw/heCHHOvXjyPw2+g9iA=="
},
"node_modules/mongoose-unique-validator": { "node_modules/mongoose-unique-validator": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz",
@ -7683,6 +7689,11 @@
} }
} }
}, },
"mongoose-execution-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-execution-time/-/mongoose-execution-time-1.0.2.tgz",
"integrity": "sha512-ROCOxLNOQcXuNcEmpcYUj6oeLWuBWMZXOPW4duuCJwmm4b7hGuLEExwWiy/4TtMULkw/heCHHOvXjyPw2+g9iA=="
},
"mongoose-unique-validator": { "mongoose-unique-validator": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz",

View File

@ -36,6 +36,7 @@
"jsonwebtoken": "^9.0.0", "jsonwebtoken": "^9.0.0",
"mongo-sanitize": "^1.1.0", "mongo-sanitize": "^1.1.0",
"mongoose": "^6.5.2", "mongoose": "^6.5.2",
"mongoose-execution-time": "^1.0.2",
"mongoose-unique-validator": "^3.1.0", "mongoose-unique-validator": "^3.1.0",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-fetch": "^3.2.10", "node-fetch": "^3.2.10",

View File

@ -52,7 +52,7 @@ dependencies:
version: 6.6.0(prom-client@14.2.0) version: 6.6.0(prom-client@14.2.0)
express-rate-limit: express-rate-limit:
specifier: ^6.7.0 specifier: ^6.7.0
version: 6.11.0(express@4.18.2) version: 6.11.2(express@4.18.2)
express-session: express-session:
specifier: ^1.17.3 specifier: ^1.17.3
version: 1.17.3 version: 1.17.3
@ -77,6 +77,9 @@ dependencies:
mongoose: mongoose:
specifier: ^6.5.2 specifier: ^6.5.2
version: 6.12.0 version: 6.12.0
mongoose-execution-time:
specifier: ^1.0.2
version: 1.1.1
mongoose-unique-validator: mongoose-unique-validator:
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(mongoose@6.12.0) version: 3.1.0(mongoose@6.12.0)
@ -142,7 +145,7 @@ packages:
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-crypto/util": 3.0.0 "@aws-crypto/util": 3.0.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
tslib: 1.14.1 tslib: 1.14.1
dev: false dev: false
optional: true optional: true
@ -169,7 +172,7 @@ packages:
"@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/sha256-js": 3.0.0
"@aws-crypto/supports-web-crypto": 3.0.0 "@aws-crypto/supports-web-crypto": 3.0.0
"@aws-crypto/util": 3.0.0 "@aws-crypto/util": 3.0.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-locate-window": 3.310.0 "@aws-sdk/util-locate-window": 3.310.0
"@aws-sdk/util-utf8-browser": 3.259.0 "@aws-sdk/util-utf8-browser": 3.259.0
tslib: 1.14.1 tslib: 1.14.1
@ -184,7 +187,7 @@ packages:
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-crypto/util": 3.0.0 "@aws-crypto/util": 3.0.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
tslib: 1.14.1 tslib: 1.14.1
dev: false dev: false
optional: true optional: true
@ -207,33 +210,33 @@ packages:
} }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-utf8-browser": 3.259.0 "@aws-sdk/util-utf8-browser": 3.259.0
tslib: 1.14.1 tslib: 1.14.1
dev: false dev: false
optional: true optional: true
/@aws-sdk/client-cognito-identity@3.409.0: /@aws-sdk/client-cognito-identity@3.410.0:
resolution: resolution:
{ {
integrity: sha512-vUThhqsTL39s4Gbtldher8EuaahWkVh9M5BrfIlIoDnO2dTA/NXbAA3tP7Zj+mw1PAjLZdEqtNmIeZFVGs+0nw==, integrity: sha512-J4iPhXswm66Fsk1x0Kly+PWzBizmms4kkkoAU1sk9n08XfWqNBTyf01mx6/t/X+Yh43p2zaeB/XvUwa0jSsWaQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0
"@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/sha256-js": 3.0.0
"@aws-sdk/client-sts": 3.409.0 "@aws-sdk/client-sts": 3.410.0
"@aws-sdk/credential-provider-node": 3.409.0 "@aws-sdk/credential-provider-node": 3.410.0
"@aws-sdk/middleware-host-header": 3.408.0 "@aws-sdk/middleware-host-header": 3.410.0
"@aws-sdk/middleware-logger": 3.408.0 "@aws-sdk/middleware-logger": 3.410.0
"@aws-sdk/middleware-recursion-detection": 3.408.0 "@aws-sdk/middleware-recursion-detection": 3.410.0
"@aws-sdk/middleware-signing": 3.408.0 "@aws-sdk/middleware-signing": 3.410.0
"@aws-sdk/middleware-user-agent": 3.408.0 "@aws-sdk/middleware-user-agent": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-endpoints": 3.408.0 "@aws-sdk/util-endpoints": 3.410.0
"@aws-sdk/util-user-agent-browser": 3.408.0 "@aws-sdk/util-user-agent-browser": 3.410.0
"@aws-sdk/util-user-agent-node": 3.408.0 "@aws-sdk/util-user-agent-node": 3.410.0
"@smithy/config-resolver": 2.0.7 "@smithy/config-resolver": 2.0.7
"@smithy/fetch-http-handler": 2.1.2 "@smithy/fetch-http-handler": 2.1.2
"@smithy/hash-node": 2.0.6 "@smithy/hash-node": 2.0.6
@ -245,7 +248,7 @@ packages:
"@smithy/middleware-stack": 2.0.0 "@smithy/middleware-stack": 2.0.0
"@smithy/node-config-provider": 2.0.9 "@smithy/node-config-provider": 2.0.9
"@smithy/node-http-handler": 2.1.2 "@smithy/node-http-handler": 2.1.2
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/smithy-client": 2.1.3 "@smithy/smithy-client": 2.1.3
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
"@smithy/url-parser": 2.0.6 "@smithy/url-parser": 2.0.6
@ -262,24 +265,24 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/client-sso@3.409.0: /@aws-sdk/client-sso@3.410.0:
resolution: resolution:
{ {
integrity: sha512-vlXcIzcmUhObuEJ6q3lsp1ZHeDeD9bUrG3dmdSTeII4U6A9imgvaXONWI9GFEUsgzCrrCxtCqBX2RqMfZDhylw==, integrity: sha512-MC9GrgwtlOuSL2WS3DRM3dQ/5y+49KSMMJRH6JiEcU5vE0dX/OtEcX+VfEwpi73x5pSfIjm7xnzjzOFx+sQBIg==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0
"@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/sha256-js": 3.0.0
"@aws-sdk/middleware-host-header": 3.408.0 "@aws-sdk/middleware-host-header": 3.410.0
"@aws-sdk/middleware-logger": 3.408.0 "@aws-sdk/middleware-logger": 3.410.0
"@aws-sdk/middleware-recursion-detection": 3.408.0 "@aws-sdk/middleware-recursion-detection": 3.410.0
"@aws-sdk/middleware-user-agent": 3.408.0 "@aws-sdk/middleware-user-agent": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-endpoints": 3.408.0 "@aws-sdk/util-endpoints": 3.410.0
"@aws-sdk/util-user-agent-browser": 3.408.0 "@aws-sdk/util-user-agent-browser": 3.410.0
"@aws-sdk/util-user-agent-node": 3.408.0 "@aws-sdk/util-user-agent-node": 3.410.0
"@smithy/config-resolver": 2.0.7 "@smithy/config-resolver": 2.0.7
"@smithy/fetch-http-handler": 2.1.2 "@smithy/fetch-http-handler": 2.1.2
"@smithy/hash-node": 2.0.6 "@smithy/hash-node": 2.0.6
@ -291,7 +294,7 @@ packages:
"@smithy/middleware-stack": 2.0.0 "@smithy/middleware-stack": 2.0.0
"@smithy/node-config-provider": 2.0.9 "@smithy/node-config-provider": 2.0.9
"@smithy/node-http-handler": 2.1.2 "@smithy/node-http-handler": 2.1.2
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/smithy-client": 2.1.3 "@smithy/smithy-client": 2.1.3
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
"@smithy/url-parser": 2.0.6 "@smithy/url-parser": 2.0.6
@ -308,27 +311,27 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/client-sts@3.409.0: /@aws-sdk/client-sts@3.410.0:
resolution: resolution:
{ {
integrity: sha512-yNL9zYWDVIOWZhIlsy2tiHetSYvio5ZVJ3nvR4xWPTwqOQveZx/K0PTK+nh6T6w5R3w5IOSKvd+vPCpY4bGx8Q==, integrity: sha512-e6VMrBJtnTxxUXwDmkADGIvyppmDMFf4+cGGA68tVCUm1cFNlCI6M/67bVSIPN/WVKAAfhEL5O2vVXCM7aatYg==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0
"@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/sha256-js": 3.0.0
"@aws-sdk/credential-provider-node": 3.409.0 "@aws-sdk/credential-provider-node": 3.410.0
"@aws-sdk/middleware-host-header": 3.408.0 "@aws-sdk/middleware-host-header": 3.410.0
"@aws-sdk/middleware-logger": 3.408.0 "@aws-sdk/middleware-logger": 3.410.0
"@aws-sdk/middleware-recursion-detection": 3.408.0 "@aws-sdk/middleware-recursion-detection": 3.410.0
"@aws-sdk/middleware-sdk-sts": 3.408.0 "@aws-sdk/middleware-sdk-sts": 3.410.0
"@aws-sdk/middleware-signing": 3.408.0 "@aws-sdk/middleware-signing": 3.410.0
"@aws-sdk/middleware-user-agent": 3.408.0 "@aws-sdk/middleware-user-agent": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-endpoints": 3.408.0 "@aws-sdk/util-endpoints": 3.410.0
"@aws-sdk/util-user-agent-browser": 3.408.0 "@aws-sdk/util-user-agent-browser": 3.410.0
"@aws-sdk/util-user-agent-node": 3.408.0 "@aws-sdk/util-user-agent-node": 3.410.0
"@smithy/config-resolver": 2.0.7 "@smithy/config-resolver": 2.0.7
"@smithy/fetch-http-handler": 2.1.2 "@smithy/fetch-http-handler": 2.1.2
"@smithy/hash-node": 2.0.6 "@smithy/hash-node": 2.0.6
@ -340,7 +343,7 @@ packages:
"@smithy/middleware-stack": 2.0.0 "@smithy/middleware-stack": 2.0.0
"@smithy/node-config-provider": 2.0.9 "@smithy/node-config-provider": 2.0.9
"@smithy/node-http-handler": 2.1.2 "@smithy/node-http-handler": 2.1.2
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/smithy-client": 2.1.3 "@smithy/smithy-client": 2.1.3
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
"@smithy/url-parser": 2.0.6 "@smithy/url-parser": 2.0.6
@ -358,16 +361,16 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-cognito-identity@3.409.0: /@aws-sdk/credential-provider-cognito-identity@3.410.0:
resolution: resolution:
{ {
integrity: sha512-8MLPJ8YjX+iAhsyeUah6388EHm0aeLPyn+bz5M/PwyDkX8UuuaM3VzH0dHoMdqX+iOCIynh/WRm+qYizrAscCA==, integrity: sha512-2QMvdnwnYsKnwy8O+o9ozKL80VFWI0skXVvKB3DFW4cr9IX5cBCx7xuhI7TXbCqiBxuz5SSiA1s19fVtq0sUmw==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/client-cognito-identity": 3.409.0 "@aws-sdk/client-cognito-identity": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
@ -376,34 +379,34 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-env@3.408.0: /@aws-sdk/credential-provider-env@3.410.0:
resolution: resolution:
{ {
integrity: sha512-GCpgHEHxRTzKaMkwDC2gLb3xlD+ZxhKPUJ1DVcO7I9E3eCGJsYVedIi0/2XE+NP+HVoy8LyW2qH8QQWh64JKow==, integrity: sha512-c7TB9LbN0PkFOsXI0lcRJnqPNOmc4VBvrHf8jP/BkTDg4YUoKQKOFd4d0SqzODmlZiAyoMQVZTR4ISZo95Zj4Q==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-ini@3.409.0: /@aws-sdk/credential-provider-ini@3.410.0:
resolution: resolution:
{ {
integrity: sha512-Z7hb0Kj0FuqD5HimDrtt0LRjKBHA5pvLcTYYdVorJovaBxEvfDpISSDVRIUmvhMGAlv7XezbvqESOU5cn0Gpzw==, integrity: sha512-D8rcr5bRCFD0f42MPQ7K6TWZq5d3pfqrKINL1/bpfkK5BJbvq1BGYmR88UC6CLpTRtZ1LHY2HgYG0fp/2zjjww==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/credential-provider-env": 3.408.0 "@aws-sdk/credential-provider-env": 3.410.0
"@aws-sdk/credential-provider-process": 3.408.0 "@aws-sdk/credential-provider-process": 3.410.0
"@aws-sdk/credential-provider-sso": 3.409.0 "@aws-sdk/credential-provider-sso": 3.410.0
"@aws-sdk/credential-provider-web-identity": 3.408.0 "@aws-sdk/credential-provider-web-identity": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/credential-provider-imds": 2.0.9 "@smithy/credential-provider-imds": 2.0.9
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/shared-ini-file-loader": 2.0.8 "@smithy/shared-ini-file-loader": 2.0.8
@ -414,20 +417,20 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-node@3.409.0: /@aws-sdk/credential-provider-node@3.410.0:
resolution: resolution:
{ {
integrity: sha512-kXmfBVYnHoEAACo6zskEryDSgMSo1QYiv6P8n6Go/RsJHe4Ec+YtrOMLg3hTOptiIGHOTWZ1ANaU/IfIxmqumA==, integrity: sha512-0wmVm33T/j1FS7MZ/j+WsPlgSc0YnCXnpbWSov1Mn6R86SHI2b2JhdIPRRE4XbGfyW2QGNUl2CwoZVaqhXeF5g==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/credential-provider-env": 3.408.0 "@aws-sdk/credential-provider-env": 3.410.0
"@aws-sdk/credential-provider-ini": 3.409.0 "@aws-sdk/credential-provider-ini": 3.410.0
"@aws-sdk/credential-provider-process": 3.408.0 "@aws-sdk/credential-provider-process": 3.410.0
"@aws-sdk/credential-provider-sso": 3.409.0 "@aws-sdk/credential-provider-sso": 3.410.0
"@aws-sdk/credential-provider-web-identity": 3.408.0 "@aws-sdk/credential-provider-web-identity": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/credential-provider-imds": 2.0.9 "@smithy/credential-provider-imds": 2.0.9
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/shared-ini-file-loader": 2.0.8 "@smithy/shared-ini-file-loader": 2.0.8
@ -438,15 +441,15 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-process@3.408.0: /@aws-sdk/credential-provider-process@3.410.0:
resolution: resolution:
{ {
integrity: sha512-qCTf9tr6+I2s3+v5zP4YRQQrGlYw/jyZ7u/k6bGshhlvgwGPfjNuHrM8uK/W1kv4ng1myxaL1/tAY6RVVdXz4Q==, integrity: sha512-BMju1hlDCDNkkSZpKF5SQ8G0WCLRj6/Jvw9QmudLHJuVwYJXEW1r2AsVMg98OZ3hB9G+MAvHruHZIbMiNmUMXQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/shared-ini-file-loader": 2.0.8 "@smithy/shared-ini-file-loader": 2.0.8
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
@ -454,17 +457,17 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-sso@3.409.0: /@aws-sdk/credential-provider-sso@3.410.0:
resolution: resolution:
{ {
integrity: sha512-Bh0ykbDpnUK4W8sQMEpRA/TlZxwpPLl4aU8eBLlbEcTL2M8or2nr0dQzOOvabZo8hbaPM6yfOl+vLTvWGs75zg==, integrity: sha512-zEaoY/sY+KYTlQUkp9dvveAHf175b8RIt0DsQkDrRPtrg/RBHR00r5rFvz9+nrwsR8546RaBU7h/zzTaQGhmcA==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/client-sso": 3.409.0 "@aws-sdk/client-sso": 3.410.0
"@aws-sdk/token-providers": 3.408.0 "@aws-sdk/token-providers": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/shared-ini-file-loader": 2.0.8 "@smithy/shared-ini-file-loader": 2.0.8
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
@ -474,40 +477,40 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-provider-web-identity@3.408.0: /@aws-sdk/credential-provider-web-identity@3.410.0:
resolution: resolution:
{ {
integrity: sha512-5FbDPF/zY/1t6k1zRI/HnrxcH2v7SwsEYu2SThI2qbzaP/K7MTnTanV5vNFcdQOpuQ7x3PrzTlH3AWZueCr3Vw==, integrity: sha512-cE0l8LmEHdWbDkdPNgrfdYSgp4/cIVXrjUKI1QCATA729CrHZ/OQjB/maOBOrMHO9YTiggko887NkslVvwVB7w==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/credential-providers@3.409.0: /@aws-sdk/credential-providers@3.410.0:
resolution: resolution:
{ {
integrity: sha512-eaQChfbLnVs1ctC04dIdQPh5FtJD9v8R3xbVttKowdhUUV18rTHM5sVJuL5DGbHTXxmZSiURsoVCujrc/kaEiA==, integrity: sha512-QcunzQRNi9dJdAGdduST7itRW+QhDrb9zZHn+HhLKUoVwLrqk1iuH2R9SoEdZg8eV5jR04yoOPdjj1jzdIkFXQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/client-cognito-identity": 3.409.0 "@aws-sdk/client-cognito-identity": 3.410.0
"@aws-sdk/client-sso": 3.409.0 "@aws-sdk/client-sso": 3.410.0
"@aws-sdk/client-sts": 3.409.0 "@aws-sdk/client-sts": 3.410.0
"@aws-sdk/credential-provider-cognito-identity": 3.409.0 "@aws-sdk/credential-provider-cognito-identity": 3.410.0
"@aws-sdk/credential-provider-env": 3.408.0 "@aws-sdk/credential-provider-env": 3.410.0
"@aws-sdk/credential-provider-ini": 3.409.0 "@aws-sdk/credential-provider-ini": 3.410.0
"@aws-sdk/credential-provider-node": 3.409.0 "@aws-sdk/credential-provider-node": 3.410.0
"@aws-sdk/credential-provider-process": 3.408.0 "@aws-sdk/credential-provider-process": 3.410.0
"@aws-sdk/credential-provider-sso": 3.409.0 "@aws-sdk/credential-provider-sso": 3.410.0
"@aws-sdk/credential-provider-web-identity": 3.408.0 "@aws-sdk/credential-provider-web-identity": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/credential-provider-imds": 2.0.9 "@smithy/credential-provider-imds": 2.0.9
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
@ -517,76 +520,76 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/middleware-host-header@3.408.0: /@aws-sdk/middleware-host-header@3.410.0:
resolution: resolution:
{ {
integrity: sha512-eofCXuSZ+ntbLzeCRdHzraXzgWqAplXU7W2qFFVC4O9lZBhADwNPI8n8x98TH0mftnmvZxh5Bo5U8WvEolIDkw==, integrity: sha512-ED/OVcyITln5rrxnajZP+V0PN1nug+gSDHJDqdDo/oLy7eiDr/ZWn3nlWW7WcMplQ1/Jnb+hK0UetBp/25XooA==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/middleware-logger@3.408.0: /@aws-sdk/middleware-logger@3.410.0:
resolution: resolution:
{ {
integrity: sha512-otwXPCubsGRFv8Hb6nKw6Vvnu4dC8CcPk05buStj42nF8QdjWrKGb2rDCvLph5lr576LF5HN+Y2moyOi7z/I7g==, integrity: sha512-YtmKYCVtBfScq3/UFJk+aSZOktKJBNZL9DaSc2aPcy/goCVsYDOkGwtHk0jIkC1JRSNCkVTqL7ya60sSr8zaQQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/middleware-recursion-detection@3.408.0: /@aws-sdk/middleware-recursion-detection@3.410.0:
resolution: resolution:
{ {
integrity: sha512-QfZwmX5z0IRC2c8pBi9VozSqbJw19V5oxyykSTqdjGe3CG3yNujXObV6xQesK67CWSnPb9wDgVGKUoYuIXwOxw==, integrity: sha512-KWaes5FLzRqj28vaIEE4Bimpga2E596WdPF2HaH6zsVMJddoRDsc3ZX9ZhLOGrXzIO1RqBd0QxbLrM0S/B2aOQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/middleware-sdk-sts@3.408.0: /@aws-sdk/middleware-sdk-sts@3.410.0:
resolution: resolution:
{ {
integrity: sha512-dIO9BTX049P2PwaeAK2lxJeA2rZi9/bWzMP1GIE60VrMDHmN5Ljvh1lLActECLAqNQIqN5Ub0bKV2tC/jMn+CA==, integrity: sha512-YfBpctDocRR4CcROoDueJA7D+aMLBV8nTFfmVNdLLLgyuLZ/AUR11VQSu1lf9gQZKl8IpKE/BLf2fRE/qV1ZuA==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/middleware-signing": 3.408.0 "@aws-sdk/middleware-signing": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/middleware-signing@3.408.0: /@aws-sdk/middleware-signing@3.410.0:
resolution: resolution:
{ {
integrity: sha512-flLiLKATJ4NLcLb7lPojyQ6NvLSyQ3axqIClqwMRnhSRxvREB7OgBKwmPecSl0I5JxsNEqo+mjARdMjUHadgWQ==, integrity: sha512-KBAZ/eoAJUSJv5us2HsKwK2OszG2s9FEyKpEhgnHLcbbKzW873zHBH5GcOGEQu4AWArTy2ndzJu3FF+9/J9hJQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/signature-v4": 2.0.6 "@smithy/signature-v4": 2.0.6
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
"@smithy/util-middleware": 2.0.0 "@smithy/util-middleware": 2.0.0
@ -594,40 +597,40 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/middleware-user-agent@3.408.0: /@aws-sdk/middleware-user-agent@3.410.0:
resolution: resolution:
{ {
integrity: sha512-UvlKri8/Mgf5W+tFU6ZJ65fC6HljcysIqfRFts/8Wurl322IS1I4j+pyjV2P6eK1054bzynfi3Trv+tRYHtVcA==, integrity: sha512-ZayDtLfvCZUohSxQc/49BfoU/y6bDHLfLdyyUJbJ54Sv8zQcrmdyKvCBFUZwE6tHQgAmv9/ZT18xECMl+xiONA==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-endpoints": 3.408.0 "@aws-sdk/util-endpoints": 3.410.0
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/token-providers@3.408.0: /@aws-sdk/token-providers@3.410.0:
resolution: resolution:
{ {
integrity: sha512-D//BjUrVtDzDdCz1mRdZZSAc822fh75Ssq46smeS6S6NKq3vJeHhfrQJMyVU1GclXu1tn9AwykaQW5Jwb5im+g==, integrity: sha512-d5Nc0xydkH/X0LA1HDyhGY5sEv4LuADFk+QpDtT8ogLilcre+b1jpdY8Sih/gd1KoGS1H+d1tz2hSGwUHAbUbw==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0
"@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/sha256-js": 3.0.0
"@aws-sdk/middleware-host-header": 3.408.0 "@aws-sdk/middleware-host-header": 3.410.0
"@aws-sdk/middleware-logger": 3.408.0 "@aws-sdk/middleware-logger": 3.410.0
"@aws-sdk/middleware-recursion-detection": 3.408.0 "@aws-sdk/middleware-recursion-detection": 3.410.0
"@aws-sdk/middleware-user-agent": 3.408.0 "@aws-sdk/middleware-user-agent": 3.410.0
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@aws-sdk/util-endpoints": 3.408.0 "@aws-sdk/util-endpoints": 3.410.0
"@aws-sdk/util-user-agent-browser": 3.408.0 "@aws-sdk/util-user-agent-browser": 3.410.0
"@aws-sdk/util-user-agent-node": 3.408.0 "@aws-sdk/util-user-agent-node": 3.410.0
"@smithy/config-resolver": 2.0.7 "@smithy/config-resolver": 2.0.7
"@smithy/fetch-http-handler": 2.1.2 "@smithy/fetch-http-handler": 2.1.2
"@smithy/hash-node": 2.0.6 "@smithy/hash-node": 2.0.6
@ -640,7 +643,7 @@ packages:
"@smithy/node-config-provider": 2.0.9 "@smithy/node-config-provider": 2.0.9
"@smithy/node-http-handler": 2.1.2 "@smithy/node-http-handler": 2.1.2
"@smithy/property-provider": 2.0.7 "@smithy/property-provider": 2.0.7
"@smithy/protocol-http": 2.0.5 "@smithy/protocol-http": 3.0.2
"@smithy/shared-ini-file-loader": 2.0.8 "@smithy/shared-ini-file-loader": 2.0.8
"@smithy/smithy-client": 2.1.3 "@smithy/smithy-client": 2.1.3
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
@ -658,10 +661,10 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/types@3.408.0: /@aws-sdk/types@3.410.0:
resolution: resolution:
{ {
integrity: sha512-sIsR5224xWQTW7O6h4V0S7DMWs4bK4DCunwOo7Avpq7ZVmH2YyLTs0n4NGL186j8xTosycF1ACQgpM48SLIvaA==, integrity: sha512-D7iaUCszv/v04NDaZUmCmekamy6VD/lKozm/3gS9+dkfU6cC2CsNoUfPV8BlV6dPdw0oWgF91am3I1stdvfVrQ==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
@ -671,15 +674,15 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/util-endpoints@3.408.0: /@aws-sdk/util-endpoints@3.410.0:
resolution: resolution:
{ {
integrity: sha512-N1D5cKEkCqf5Q7IF/pI9kfcNrT+/5ctZ6cQo4Ex6xaOcnUzdOZcXdPqaMRZVZRn8enjK2SpoLlRpXGISOugPaw==, integrity: sha512-iNiqJyC7N3+8zFwnXUqcWSxrZecVZLToo1iTQQdeYL2af1IcOtRgb7n8jpAI/hmXhBSx2+3RI+Y7pxyFo1vu+w==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
@ -696,24 +699,24 @@ packages:
dev: false dev: false
optional: true optional: true
/@aws-sdk/util-user-agent-browser@3.408.0: /@aws-sdk/util-user-agent-browser@3.410.0:
resolution: resolution:
{ {
integrity: sha512-wOVjDprG5h6kM8aJZk/tRX/RgxNxr73d6kIsUePlAgil13q62M9lcFMcIXduqtDsa1B6FfVB2wx/pyUuOZri5g==, integrity: sha512-i1G/XGpXGMRT2zEiAhi1xucJsfCWk8nNYjk/LbC0sA+7B9Huri96YAzVib12wkHPsJQvZxZC6CpQDIHWm4lXMA==,
} }
requiresBuild: true requiresBuild: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
bowser: 2.11.0 bowser: 2.11.0
tslib: 2.6.2 tslib: 2.6.2
dev: false dev: false
optional: true optional: true
/@aws-sdk/util-user-agent-node@3.408.0: /@aws-sdk/util-user-agent-node@3.410.0:
resolution: resolution:
{ {
integrity: sha512-BzMFV+cIXrtfcfJk3GpXnkANFkzZisvAtD306TMgIscn5FF26K1jD5DU+h5Q5WMq7gx+oXh9kJ3Lu3hi7hahKQ==, integrity: sha512-bK70t1jHRl8HrJXd4hEIwc5PBZ7U0w+81AKFnanIVKZwZedd6nLibUXDTK14z/Jp2GFcBqd4zkt2YLGkRt/U4A==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
requiresBuild: true requiresBuild: true
@ -723,7 +726,7 @@ packages:
aws-crt: aws-crt:
optional: true optional: true
dependencies: dependencies:
"@aws-sdk/types": 3.408.0 "@aws-sdk/types": 3.410.0
"@smithy/node-config-provider": 2.0.9 "@smithy/node-config-provider": 2.0.9
"@smithy/types": 2.3.0 "@smithy/types": 2.3.0
tslib: 2.6.2 tslib: 2.6.2
@ -1423,19 +1426,6 @@ packages:
dev: false dev: false
optional: true optional: true
/@smithy/protocol-http@2.0.5:
resolution:
{
integrity: sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==,
}
engines: { node: ">=14.0.0" }
requiresBuild: true
dependencies:
"@smithy/types": 2.3.0
tslib: 2.6.2
dev: false
optional: true
/@smithy/protocol-http@3.0.2: /@smithy/protocol-http@3.0.2:
resolution: resolution:
{ {
@ -1894,7 +1884,7 @@ packages:
postcss: ^8.1.0 postcss: ^8.1.0
dependencies: dependencies:
browserslist: 4.21.10 browserslist: 4.21.10
caniuse-lite: 1.0.30001532 caniuse-lite: 1.0.30001533
fraction.js: 4.3.6 fraction.js: 4.3.6
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.0.0 picocolors: 1.0.0
@ -2044,8 +2034,8 @@ packages:
engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
hasBin: true hasBin: true
dependencies: dependencies:
caniuse-lite: 1.0.30001532 caniuse-lite: 1.0.30001533
electron-to-chromium: 1.4.513 electron-to-chromium: 1.4.516
node-releases: 2.0.13 node-releases: 2.0.13
update-browserslist-db: 1.0.11(browserslist@4.21.10) update-browserslist-db: 1.0.11(browserslist@4.21.10)
dev: false dev: false
@ -2128,10 +2118,10 @@ packages:
engines: { node: ">=6" } engines: { node: ">=6" }
dev: false dev: false
/caniuse-lite@1.0.30001532: /caniuse-lite@1.0.30001533:
resolution: resolution:
{ {
integrity: sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==, integrity: sha512-9aY/b05NKU4Yl2sbcJhn4A7MsGwR1EPfW/nrqsnqVA0Oq50wpmPaGI+R1Z0UKlUl96oxUkGEOILWtOHck0eCWw==,
} }
dev: false dev: false
@ -2592,10 +2582,10 @@ packages:
} }
dev: false dev: false
/electron-to-chromium@1.4.513: /electron-to-chromium@1.4.516:
resolution: resolution:
{ {
integrity: sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==, integrity: sha512-A8xs6nie7jw/9GFRrCPrrE+maux1M3gSnFe1HVstK6ubH+7v5hMDFq3qoNxTRssYyz6jdzk/1wLebT+9tisLKA==,
} }
dev: false dev: false
@ -2698,10 +2688,10 @@ packages:
url-value-parser: 2.2.0 url-value-parser: 2.2.0
dev: false dev: false
/express-rate-limit@6.11.0(express@4.18.2): /express-rate-limit@6.11.2(express@4.18.2):
resolution: resolution:
{ {
integrity: sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==, integrity: sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==,
} }
engines: { node: ">= 14" } engines: { node: ">= 14" }
peerDependencies: peerDependencies:
@ -3635,12 +3625,19 @@ packages:
mongodb-connection-string-url: 2.6.0 mongodb-connection-string-url: 2.6.0
socks: 2.7.1 socks: 2.7.1
optionalDependencies: optionalDependencies:
"@aws-sdk/credential-providers": 3.409.0 "@aws-sdk/credential-providers": 3.410.0
"@mongodb-js/saslprep": 1.1.0 "@mongodb-js/saslprep": 1.1.0
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
dev: false dev: false
/mongoose-execution-time@1.1.1:
resolution:
{
integrity: sha512-1/kp7Gp/HlV2whQvulKTjpKFFYVv1yHfZGJIZiWu05pyWjuKaE3oMaEz59ZgchS5iRDXh6aTzCIKzmlpp+aQ4A==,
}
dev: false
/mongoose-unique-validator@3.1.0(mongoose@6.12.0): /mongoose-unique-validator@3.1.0(mongoose@6.12.0):
resolution: resolution:
{ {

View File

@ -281,4 +281,51 @@ router.post("/queue", requireAuth, async (req, res) => {
}) })
}) })
router.post("/config", requireAuth, async (req, res) => {
if (req.userdocument.admin == false) {
return res.redirect("/")
}
return res.json({
data: {
GamesEnabled: req.config.GamesEnabled,
KeysEnabled: req.config.KeysEnabled,
MaintenanceEnabled: req.config.MaintenanceEnabled,
RegistrationEnabled: req.config.RegistrationEnabled,
bannermessage: req.config.bannermessage,
},
})
})
router.post("/config/update", requireAuth, async (req, res) => {
if (req.userdocument.admin == false) {
return res.redirect("/")
}
if (
req.body.setting != "RegistrationEnabled" &&
req.body.setting != "MaintenanceEnabled" &&
req.body.setting != "GamesEnabled" &&
req.body.setting != "KeysEnabled"
) {
return res.json({
data: { status: "error", error: "Malformed input!" },
})
}
req.config[req.body.setting] = req.body.update
await req.configRepository.save(req.config)
return res.json({
data: {
GamesEnabled: req.config.GamesEnabled,
KeysEnabled: req.config.KeysEnabled,
MaintenanceEnabled: req.config.MaintenanceEnabled,
RegistrationEnabled: req.config.RegistrationEnabled,
bannermessage: req.config.bannermessage,
},
})
})
module.exports = router module.exports = router

View File

@ -24,7 +24,6 @@ router.get("/", requireAuth, async (req, res) => {
"ugcpermission", "ugcpermission",
"moderation", "moderation",
"colors", "colors",
"inventory",
"joindate", "joindate",
"lastclaimofcurrency", "lastclaimofcurrency",
"membership", "membership",

View File

@ -60,7 +60,6 @@ router.post("/", requireAuth, async (req, res) => {
inventory: { inventory: {
Type: itemdoc.Type, Type: itemdoc.Type,
ItemId: itemdoc.ItemId, ItemId: itemdoc.ItemId,
ItemName: itemdoc.Name,
Equipped: false, Equipped: false,
}, },
}, },

View File

@ -4,13 +4,18 @@ const user = require("./../..//model/user.js")
const games = require("./../../model/games.js") const games = require("./../../model/games.js")
const RelativeTime = require("@yaireo/relative-time") const RelativeTime = require("@yaireo/relative-time")
const relativeTime = new RelativeTime() const relativeTime = new RelativeTime()
const bodyParser = require("body-parser")
router.use(bodyParser.json())
router.get("/:id", async (req, res) => { router.get("/:id", async (req, res) => {
var id = req.params.id var id = req.params.id
if (isNaN(parseFloat(id)) === true) { if (isNaN(parseFloat(id)) === true) {
return res.json({ error: true }) return res.json({ error: true })
} }
const response = await user.findOne({ userid: id }).lean() const response = await user
.findOne({ userid: id })
.lean()
.select("-inventory")
if (!response) { if (!response) {
return res.json({ error: true, message: "404" }) return res.json({ error: true, message: "404" })
@ -69,7 +74,6 @@ router.get("/:id", async (req, res) => {
admin: response.admin, admin: response.admin,
discordid: response.discordid, discordid: response.discordid,
membership: response.membership, membership: response.membership,
inventory: response.inventory,
bio: response.bio, bio: response.bio,
status, status,
followers: response.followers?.length, followers: response.followers?.length,
@ -79,6 +83,150 @@ router.get("/:id", async (req, res) => {
}) })
}) })
router.post("/:id/inventory", async (req, res) => {
var id = req.params.id
const resultsPerPage = 5
let page = req.body.page ?? 0
if (page != 0) {
page -= 1
}
let filter = req.body.filter ?? "Shirts"
console.log(req.body)
filter = filter.charAt(0).toUpperCase() + filter.slice(1)
console.log(filter)
let onlywearing = req.body.onlywearing ?? false
if (isNaN(parseFloat(id)) === true) {
return res.json({ error: true })
}
console.log(onlywearing)
let response
if (onlywearing === true) {
response = await user.aggregate([
{
$match: {
userid: parseInt(id),
},
},
{
$project: {
inventory: 1,
},
},
{
$unwind: {
path: "$inventory",
},
},
{
$match: {
"inventory.Equipped": true,
},
},
{
$group: {
_id: "$_id",
inventory: {
$push: "$inventory",
},
},
},
])
} else {
response = await user.aggregate([
{
$match: {
userid: parseInt(id),
},
},
{
$project: {
inventory: 1,
},
},
{
$unwind: {
path: "$inventory",
},
},
{
$match: {
"inventory.Type": filter,
},
},
{
$group: {
_id: "$_id",
inventory: {
$push: "$inventory",
},
},
},
{
$project: {
inventory: {
$slice: [
"$inventory",
parseFloat(page) * resultsPerPage,
resultsPerPage,
],
},
},
},
])
}
await user.populate(response, {
path: "inventory.itemdata",
select: "Name",
})
console.log(response?.[0]?.inventory?.length)
if (!response[0]?.inventory) {
return res.json({ error: false, inventory: [] })
}
if (onlywearing === true) {
// we aren't gonna use pagination for equipped yet cause lazy and its only used on peoples profiles anyways
return res.json({ error: false, inventory: response?.[0]?.inventory })
}
let responsecount
if (onlywearing === true) {
responsecount = (
await user.aggregate([
{ $match: { userid: parseInt(id) } },
{ $project: { inventory: 1 } },
{ $unwind: { path: "$inventory" } },
{
$match: {
"inventory.Type": filter,
"inventory.Equipped": onlywearing,
},
},
{ $count: "inventory" },
])
)[0].inventory
} else {
responsecount = (
await user.aggregate([
{ $match: { userid: parseInt(id) } },
{ $project: { inventory: 1 } },
{ $unwind: { path: "$inventory" } },
{ $match: { "inventory.Type": filter } },
{ $count: "inventory" },
])
)[0].inventory
}
console.log(responsecount)
//const responsecount = await user.aggregate([ { $match : { userid : id } },{$project: { count: { $size:"$inventory" }}}]) // alternative yea
if (!response) {
return res.json({ error: true, message: "404" })
}
return res.json({
error: false,
inventory: response?.[0]?.inventory,
pages: Math.ceil(Math.max(responsecount / resultsPerPage, 1)),
})
})
router.get("/:id/creations", async (req, res) => { router.get("/:id/creations", async (req, res) => {
var id = req.params.id var id = req.params.id
if (isNaN(parseFloat(id)) === true) { if (isNaN(parseFloat(id)) === true) {

View File

@ -6,6 +6,7 @@ var path = require("path")
const crypto = require("crypto") const crypto = require("crypto")
require("dotenv").config() require("dotenv").config()
const RCC_HOST = process.env.RCC_HOST const RCC_HOST = process.env.RCC_HOST
const ACCESS_KEY = process.env.ACCESS_KEY
const User = require("../model/user.js") const User = require("../model/user.js")
const catalog = require("../model/item") const catalog = require("../model/item")
const games = require("./../model/games.js") const games = require("./../model/games.js")
@ -72,25 +73,31 @@ router.get("/", async (req, res) => {
console.log(ip) console.log(ip)
var sanitizedid = req.query.id.match(rgx) var sanitizedid = req.query.id.match(rgx)
if (ip === RCC_HOST || ip === "::ffff:" + RCC_HOST) { if (ip === RCC_HOST || ip === "::ffff:" + RCC_HOST) {
fs.access( console.log(req.headers["accesskey"])
"./assets/ugc/gamefile-" + sanitizedid + ".rbxl", if (req.headers?.["accesskey"] === ACCESS_KEY) {
fs.F_OK, fs.access(
err => { "./assets/ugc/gamefile-" + sanitizedid + ".rbxl",
if (err) { fs.F_OK,
res.status(404).send("not found") err => {
return if (err) {
} res.status(404).send("not found")
return
}
//file exists //file exists
res.sendFile( res.sendFile(
path.resolve( path.resolve(
"./assets/ugc/gamefile-" + sanitizedid + ".rbxl", "./assets/ugc/gamefile-" +
), sanitizedid +
) ".rbxl",
return ),
}, )
) return
},
)
}
} }
return res.status(401).end()
} else { } else {
if (!req.query.id) { if (!req.query.id) {
req.query.id = req.query.assetversionid req.query.id = req.query.assetversionid

View File

@ -4,6 +4,7 @@ const { requireAuth } = require("./../middleware/authmiddleware")
const User = require("./../model/item.js") const User = require("./../model/item.js")
const bodyParser = require("body-parser") const bodyParser = require("body-parser")
router.use(bodyParser.json()) router.use(bodyParser.json())
const xss = require("xss")
router.post("/fetch", async (req, res) => { router.post("/fetch", async (req, res) => {
const resultsPerPage = 30 const resultsPerPage = 30
@ -12,6 +13,7 @@ router.post("/fetch", async (req, res) => {
page -= 1 page -= 1
} }
let { filter, sort } = req.body let { filter, sort } = req.body
let libraryassets = ["User Ad", "Gamepass", "Video"] // we don't want to include these in the catalog
//console.log(req.body) //console.log(req.body)
try { try {
if (filter === "Best Selling") { if (filter === "Best Selling") {
@ -33,7 +35,7 @@ router.post("/fetch", async (req, res) => {
if (sort === "All") { if (sort === "All") {
response = await User.find({ response = await User.find({
Hidden: { $exists: false }, Hidden: { $exists: false },
Type: { $ne: "User Ad" }, Type: { $nin: libraryassets },
}) })
.limit(resultsPerPage) .limit(resultsPerPage)
.skip(0 + parseFloat(page) * resultsPerPage) .skip(0 + parseFloat(page) * resultsPerPage)
@ -42,7 +44,7 @@ router.post("/fetch", async (req, res) => {
.select(["-_id"]) .select(["-_id"])
responsecount = await User.countDocuments({ responsecount = await User.countDocuments({
Hidden: { $exists: false }, Hidden: { $exists: false },
Type: { $ne: "User Ad" }, Type: { $nin: libraryassets },
}) })
} }
} else { } else {
@ -63,7 +65,7 @@ router.post("/fetch", async (req, res) => {
if (sort === "All") { if (sort === "All") {
response = await User.find({ response = await User.find({
Hidden: { $exists: false }, Hidden: { $exists: false },
Type: { $ne: "User Ad" }, Type: { $nin: libraryassets },
}) })
.limit(resultsPerPage) .limit(resultsPerPage)
.skip(0 + parseFloat(page) * resultsPerPage) .skip(0 + parseFloat(page) * resultsPerPage)
@ -71,7 +73,7 @@ router.post("/fetch", async (req, res) => {
.select(["-_id"]) .select(["-_id"])
responsecount = await User.countDocuments({ responsecount = await User.countDocuments({
Hidden: { $exists: false }, Hidden: { $exists: false },
Type: { $ne: "User Ad" }, Type: { $nin: libraryassets },
}) })
} }
} }
@ -89,7 +91,7 @@ router.post("/fetch", async (req, res) => {
router.get("/iteminfo/:id", async (req, res) => { router.get("/iteminfo/:id", async (req, res) => {
var id = req.params.id var id = req.params.id
if (isNaN(parseFloat(id)) === true) { if (isNaN(parseInt(id)) === true) {
return res.json({ status: "error", error: "Must be number" }) return res.json({ status: "error", error: "Must be number" })
} }
const response = await User.findOne({ ItemId: id }).lean() const response = await User.findOne({ ItemId: id }).lean()
@ -100,6 +102,78 @@ router.get("/iteminfo/:id", async (req, res) => {
return res.json({ error: false, iteminfo: response }) return res.json({ error: false, iteminfo: response })
}) })
router.post("/iteminfo/:id/configure", requireAuth, async (req, res) => {
var id = req.params.id
let { name, description, price } = req.body
if (
typeof name === "undefined" &&
typeof description === "undefined" &&
typeof price === "undefined"
) {
return res.json({ status: "error", error: "Nothing to update" })
}
if (isNaN(parseInt(id)) === true) {
return res.json({ status: "error", error: "Must be number" })
}
const response = await User.findOne({ ItemId: parseInt(id) })
if (!response) {
return res.json({ status: "error", error: "Not found" })
}
if (
response.Creator !== req.userdocument.userid &&
req.userdocument.admin === false
) {
return res.status(401).json({ status: "error", error: "Unauthorized!" })
}
let save = false
if (price && price != null) {
if (isNaN(parseInt(price)) === true) {
return res.json({ status: "error", error: "Must be number" })
}
price = parseInt(price)
if (price < 5 && response.Type != "Gamepass") {
return res.json({
status: "error",
error: "Minimum price is 5 rocks.",
})
} else if (price < 1 && response.Type === "Gamepass") {
return res.json({
status: "error",
error: "Minimum price is 1 rock.",
})
}
response.Price = price
response.markModified("Price")
save = true
}
if (description && description != "") {
response.Description = xss(description)
response.markModified("Description")
save = true
}
if (name && name != "") {
response.Name = xss(name)
response.markModified("Name")
save = true
}
if (save === true) {
await response.save()
}
console.log(name, description, price)
return res.json({ status: "success", message: "Item updated!" })
})
router.post("/search", async (req, res) => { router.post("/search", async (req, res) => {
const resultsPerPage = 30 const resultsPerPage = 30
let page = req.body.page ?? 0 let page = req.body.page ?? 0

View File

@ -260,6 +260,7 @@ router.get("/gameinfo/:id", async (req, res) => {
]) ])
.populate("owner", "username") .populate("owner", "username")
//console.log(response) //console.log(response)
//console.log(response)
if (!response) { if (!response) {
return res.json({ status: "error", error: "Not found" }) return res.json({ status: "error", error: "Not found" })

11
Back/routes/ide.js Normal file
View File

@ -0,0 +1,11 @@
const express = require("express")
const router = express.Router()
const { requireAuth } = require("./../middleware/authmiddleware")
const bodyParser = require("body-parser")
router.use(bodyParser.json())
router.get("/welcome", requireAuth, async (req, res) => {
res.send("test")
})
module.exports = router

View File

@ -108,7 +108,6 @@ router.post("/marketplace/purchase", requireAuth, async (req, res) => {
inventory: { inventory: {
Type: itemdoc.Type, Type: itemdoc.Type,
ItemId: itemdoc.ItemId, ItemId: itemdoc.ItemId,
ItemName: itemdoc.Name,
Equipped: false, Equipped: false,
}, },
}, },
@ -273,7 +272,6 @@ router.post(
inventory: { inventory: {
Type: itemdoc.Type, Type: itemdoc.Type,
ItemId: itemdoc.ItemId, ItemId: itemdoc.ItemId,
ItemName: itemdoc.Name,
Equipped: false, Equipped: false,
}, },
}, },

View File

@ -15,7 +15,7 @@ var cookieParser = require("cookie-parser")
var session = require("express-session") var session = require("express-session")
const helmet = require("helmet") const helmet = require("helmet")
const mongoose = require("mongoose") const mongoose = require("mongoose")
const config = require("./model/config.js") import configNew from "./model/configNew.mjs"
import ipWhitelist from "./model/ipWhitelist.mjs" import ipWhitelist from "./model/ipWhitelist.mjs"
const user = require("./model/user.js") const user = require("./model/user.js")
const model = require("./model/user.js") const model = require("./model/user.js")
@ -64,15 +64,16 @@ let redis
if (PROD === "true") { if (PROD === "true") {
redis = createClient() redis = createClient()
} else { } else {
redis = createClient({ const localRedisConnection = process.env.LOCALREDISCONNECTION
url: "redis://default:2BxaAV7Dcbt8d6QqNm58TdUfdIQtEY5q@redis-15195.c53.west-us.azure.cloud.redislabs.com:15195", redis = createClient({ url: localRedisConnection })
})
} }
redis.on("error", err => console.log("Redis Client Error", err)) redis.on("error", err => console.log("Redis Client Error", err))
await redis.connect() await redis.connect()
import { Repository } from "redis-om" import { Repository } from "redis-om"
const configRepository = new Repository(configNew, redis)
const ipWhiteListRepository = new Repository(ipWhitelist, redis) const ipWhiteListRepository = new Repository(ipWhitelist, redis)
const collectDefaultMetrics = client.collectDefaultMetrics const collectDefaultMetrics = client.collectDefaultMetrics
@ -133,8 +134,11 @@ const JWT_SECRET = process.env.JWT_SECRET
const RCC_HOST = process.env.RCC_HOST const RCC_HOST = process.env.RCC_HOST
const DB_PASSWORD = process.env.DB_PASSWORD const DB_PASSWORD = process.env.DB_PASSWORD
console.log(RCC_HOST) console.log(RCC_HOST)
const { logExecutionTime } = require("mongoose-execution-time")
//mongoose.plugin(logExecutionTime);
if (PROD === "true") { if (PROD === "true") {
mongoose.connect("mongodb://localhost:27017/meteoritedb", { mongoose.connect("mongodb://127.0.0.1:27017/meteoritedb", {
useNewUrlParser: true, useNewUrlParser: true,
useUnifiedTopology: true, useUnifiedTopology: true,
authSource: "admin", authSource: "admin",
@ -142,24 +146,26 @@ if (PROD === "true") {
pass: DB_PASSWORD, pass: DB_PASSWORD,
}) })
} else { } else {
mongoose.connect("mongodb://localhost:27017/meteoritedb", { mongoose.connect("mongodb://127.0.0.1:27017/meteoritedb", {
useNewUrlParser: true, useNewUrlParser: true,
useUnifiedTopology: true, useUnifiedTopology: true,
}) })
} }
app.disable("x-powered-by") // we don't wanna tell potential attackers our exact framework yet lol app.disable("x-powered-by") // we don't wanna tell potential attackers our exact framework yet lol
// automatically create a default document in mongodb for our config // automatically create a default document in redisdb for our config
// if the config document doesn't exist auto create one these are also the default settings your site will start with // if the redis document doesn't exist auto create one these are also the default settings your site will start with
async function createconfig() { async function createconfig() {
try { try {
var resp = await config.findOne() var resp = await redis.exists("config:ONE")
if (!resp) { if (resp === 0) {
const response = await config.create({ // doesn't exist
await configRepository.save("ONE", {
RegistrationEnabled: true, RegistrationEnabled: true,
MaintenanceEnabled: false, MaintenanceEnabled: false,
KeysEnabled: false,
GamesEnabled: true, GamesEnabled: true,
KeysEnabled: false,
bannermessage: "",
}) })
} }
} catch (err) { } catch (err) {
@ -174,8 +180,9 @@ app.use(async function (req, res, next) {
return next() return next()
} }
res.header("Cache-Control", "no-store,no-cache,must-revalidate") res.header("Cache-Control", "no-store,no-cache,must-revalidate")
var resp = await config.findOne().lean() var resp = await configRepository.fetch("ONE")
req.config = resp req.config = resp
req.configRepository = configRepository
//console.log(req.headers['x-forwarded-proto']) //console.log(req.headers['x-forwarded-proto'])
if (!req.headers["x-forwarded-proto"]) { if (!req.headers["x-forwarded-proto"]) {
@ -185,10 +192,9 @@ app.use(async function (req, res, next) {
req.headers["x-forwarded-proto"] = "http" req.headers["x-forwarded-proto"] = "http"
} }
} }
if (!req.headers["cf-connecting-ip"]) { /*if (!req.headers['cf-connecting-ip']){ //localhost
//localhost res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Origin", "*") }*/
}
if ( if (
req.headers["x-forwarded-host"] === "www.mete0r.xyz" && req.headers["x-forwarded-host"] === "www.mete0r.xyz" &&
req.headers["x-forwarded-host"] && req.headers["x-forwarded-host"] &&
@ -210,7 +216,7 @@ app.use(async function (req, res, next) {
//req.headers['x-forwarded-host'] = "mete0r.xyz" //req.headers['x-forwarded-host'] = "mete0r.xyz"
//console.log(req.headers?.['cf-connecting-ip']) //console.log(req.headers?.['cf-connecting-ip'])
//console.log(req.socket.remoteAddress) //console.log(req.socket.remoteAddress)
//console.log(req.url) console.log(req.url)
if (req.url === "/assets/2020.zip") { if (req.url === "/assets/2020.zip") {
return res.redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ") return res.redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
} }
@ -426,9 +432,9 @@ app.use("/api/requestad", requestAdRouter)
app.use('/api/bank',bankRouter)*/ app.use('/api/bank',bankRouter)*/
/*const groupRouter = require('./routes/api/groups.js'); const groupRouter = require("./routes/api/groups.js")
app.use('/api/groups',groupRouter)*/ app.use("/api/groups", groupRouter)
const feedRouter = require("./routes/api/feed.js") const feedRouter = require("./routes/api/feed.js")
@ -438,6 +444,10 @@ const commentRouter = require("./routes/api/comment.js")
app.use("/api/comments", commentRouter) app.use("/api/comments", commentRouter)
const ideRouter = require("./routes/ide.js")
app.use(["/ide", "//ide"], ideRouter)
/* /*
app.get("/My/Places", (req, res) => { app.get("/My/Places", (req, res) => {
res.send("No editing sorry") res.send("No editing sorry")

View File

@ -1,77 +0,0 @@
-- This is the thumbnail script for R6 avatars. Straight up and down, with the right arm out if they have a gear.
local person = 0
local baseurl = "http://mete0r.xyz" -- have to set to https for production
local HttpService = game:GetService("HttpService")
HttpService.HttpEnabled = true
---@diagnostic disable-next-line: invalid-class-name
local ThumbnailGenerator = game:GetService("ThumbnailGenerator")
pcall(function() game:GetService("ContentProvider"):SetBaseUrl(baseurl) end)
game:GetService("ScriptContext").ScriptsDisabled = true
local player = game:GetService("Players"):CreateLocalPlayer(0)
player:LoadCharacter()
-- bodycolors
a = HttpService:JSONDecode(HttpService:GetAsync("http://mete0r.xyz/game/colors?name="..person.."&rcc=''"))
bcolor = Instance.new("BodyColors", player.Character)
bcolor.HeadColor = BrickColor.new(a[1])
bcolor.TorsoColor = BrickColor.new(a[2])
bcolor.LeftArmColor = BrickColor.new(a[3])
bcolor.RightArmColor = BrickColor.new(a[4])
bcolor.LeftLegColor = BrickColor.new(a[5])
bcolor.RightLegColor = BrickColor.new(a[6])
-- charapp
b = HttpService:JSONDecode(HttpService:GetAsync("http://mete0r.xyz/game/charapp?name="..person.."&rcc=''"))
tool = false
pcall(function()
for i,v in pairs(b) do
pcall(function()
print(v.item.itemid)
---@diagnostic disable-next-line: undefined-global
thing = game:GetService("InsertService"):LoadAsset(v.item.itemid)
if thing:GetChildren()[1].ClassName == "Tool" then
if tool == false then
tool = true
thing:GetChildren()[1].Parent = player.Character
end
elseif thing:GetChildren()[1]:IsA("Decal") then
--face
player.Character.Head.face:Destroy()
thing:GetChildren()[1].Parent = player.Character.Head
else
thing:GetChildren()[1].Parent = player.Character
end
end)
end
end)
-- Raise up the character's arm if they have gear.
if player.Character then
for _, child in pairs(player.Character:GetChildren()) do
if child:IsA("Tool") then
player.Character.Torso["Right Shoulder"].CurrentAngle = math.rad(90)
break
end
end
end
game.CoreGui.RobloxGui.HealthGui:Destroy()
game.CoreGui.RobloxGui.Backpack:Destroy()
local arguments = {
["thumbnail"] = ThumbnailGenerator:Click("PNG", 400, 400, --[[hideSky = ]] true),
["player"] = person
}
HttpService:PostAsync(
baseurl .. "/api/thumbnailrender/rcc",
HttpService:JSONEncode(arguments)
)

View File

@ -2109,6 +2109,11 @@
"@aws-sdk/credential-providers" "^3.186.0" "@aws-sdk/credential-providers" "^3.186.0"
"saslprep" "^1.0.3" "saslprep" "^1.0.3"
"mongoose-execution-time@^1.0.2":
"integrity" "sha512-ROCOxLNOQcXuNcEmpcYUj6oeLWuBWMZXOPW4duuCJwmm4b7hGuLEExwWiy/4TtMULkw/heCHHOvXjyPw2+g9iA=="
"resolved" "https://registry.npmjs.org/mongoose-execution-time/-/mongoose-execution-time-1.0.2.tgz"
"version" "1.0.2"
"mongoose-unique-validator@^3.1.0": "mongoose-unique-validator@^3.1.0":
"integrity" "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==" "integrity" "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg=="
"resolved" "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz" "resolved" "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz"

View File

@ -1,4 +1,5 @@
# create-svelte # create-svelte
## Hey idiots to push to PRODUCTION go to actions tab and use Meteorite Push to Prod ONLY USE THIS WHEN READY ## Hey idiots to push to PRODUCTION go to actions tab and use Meteorite Push to Prod ONLY USE THIS WHEN READY
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).

8336
Front/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +1,39 @@
{ {
"name": "meteoriterewrite", "name": "meteoriterewrite",
"version": "0.0.1", "version": "0.0.1",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
"build": "vite build", "build": "vite build",
"preview": "vite preview", "preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
}, },
"devDependencies": { "devDependencies": {
"@skeletonlabs/skeleton": "^0.124.2", "@skeletonlabs/skeleton": "^0.124.2",
"@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-node": "^1.1.4", "@sveltejs/adapter-node": "^1.1.4",
"@sveltejs/kit": "^1.5.0", "@sveltejs/kit": "^1.5.0",
"@tailwindcss/forms": "^0.5.3", "@tailwindcss/forms": "^0.5.3",
"@tailwindcss/typography": "^0.5.8", "@tailwindcss/typography": "^0.5.8",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"postcss": "^8.4.21", "postcss": "^8.4.21",
"prettier": "^3.0.3", "prettier": "^3.0.3",
"prettier-plugin-svelte": "^3.0.3", "prettier-plugin-svelte": "^3.0.3",
"svelte": "^3.56.0", "svelte": "^3.56.0",
"svelte-check": "^3.0.3", "svelte-check": "^3.0.3",
"svelte-feather-icons": "^4.0.0", "svelte-feather-icons": "^4.0.0",
"svelte-hcaptcha": "^0.1.1", "svelte-hcaptcha": "^0.1.1",
"svelte-preprocess": "^5.0.1", "svelte-preprocess": "^5.0.1",
"tailwindcss": "^3.2.4", "tailwindcss": "^3.2.4",
"tslib": "^2.4.1", "tslib": "^2.4.1",
"typescript": "^4.9.3", "typescript": "^4.9.3",
"vite": "^4.0.0" "vite": "^4.0.0"
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@yaireo/relative-time": "^1.0.3", "@yaireo/relative-time": "^1.0.3",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"lucide-svelte": "^0.216.0" "lucide-svelte": "^0.216.0"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,115 @@
<script lang="ts">
import { SlideToggle } from "@skeletonlabs/skeleton"
import { Regex } from "lucide-svelte"
let regEnabled = false
let mainEnabled = false
let gameEnabled = false
let keyEnabled = false
let bannerMessage = ""
export let jwt: string
async function updateSliders() {
const response = await fetch("admin/config", {
method: "POST",
headers: { "content-type": "application/json", Authorization: jwt },
})
const data = (await response.json()).data
if (!data.error) {
regEnabled = data.RegistrationEnabled
mainEnabled = data.MaintenanceEnabled
gameEnabled = data.GamesEnabled
keyEnabled = data.KeysEnabled
bannerMessage = data.bannermessage
}
}
updateSliders()
async function updateSetting(setting: String, update: boolean) {
const response = await fetch("admin/config/update", {
method: "POST",
body: JSON.stringify({
setting,
update: update === true ? false : true,
}),
headers: { "content-type": "application/json", Authorization: jwt },
})
const data = (await response.json()).data
if (!data.error) {
regEnabled = data.RegistrationEnabled
mainEnabled = data.MaintenanceEnabled
gameEnabled = data.GamesEnabled
keyEnabled = data.KeysEnabled
bannerMessage = data.bannermessage
}
}
</script>
<div class="grow">
<h2>Config</h2>
<div class="flex flex-col gap-4 justify-between">
<div class="flex flex-row space-x-2 grow">
<h5 class="text-tertiary-600 text-base">Registration enabled</h5>
<SlideToggle
name=""
active="bg-success-600"
on:click={() => {
updateSetting("RegistrationEnabled", regEnabled)
}}
bind:checked={regEnabled}></SlideToggle>
</div>
<div class="flex flex-row space-x-2 grow">
<h5 class="text-tertiary-600 text-base">Maintenance enabled</h5>
<SlideToggle
name=""
active="bg-success-600"
on:click={() => {
updateSetting("MaintenanceEnabled", mainEnabled)
}}
bind:checked={mainEnabled}></SlideToggle>
</div>
<div class="flex flex-row space-x-2 grow">
<h5 class="text-tertiary-600 text-base">Games enabled</h5>
<SlideToggle
name=""
active="bg-success-600"
on:click={() => {
updateSetting("GamesEnabled", gameEnabled)
}}
bind:checked={gameEnabled}></SlideToggle>
</div>
<div class="flex flex-row space-x-2 grow">
<h5 class="text-tertiary-600 text-base">
Keys enabled (Keys can't be generated normally)
</h5>
<SlideToggle
name=""
active="bg-success-600"
on:click={() => {
updateSetting("KeysEnabled", keyEnabled)
}}
bind:checked={keyEnabled}></SlideToggle>
</div>
<div class="flex flex-row space-x-2 grow">
<h5 class="text-tertiary-600 text-base">
Banner message (Not functional yet.)
</h5>
<input
type="text"
bind:value={bannerMessage}
placeholder="..."
class="input input-bordered input-primary w-full max-w-xs rounded-md"
required />
</div>
</div>
</div>

View File

@ -0,0 +1,34 @@
<script lang="ts">
export let jwt: string
</script>
<div class="grow">
<h2 class="">Admin Logs</h2>
<table
class="border-separate border-spacing-2 border border-slate-500 w-full">
<thead>
<tr>
<th class="border border-slate-600">Person</th>
<th class="border border-slate-600">Action</th>
<th class="border border-slate-600">Date</th>
</tr>
</thead>
<tbody>
<tr>
<td class="border border-slate-700">Indiana</td>
<td class="border border-slate-700">Indianapolis</td>
<td class="border border-slate-700">Indianapolis</td>
</tr>
<tr>
<td class="border border-slate-700">Ohio</td>
<td class="border border-slate-700">Columbus</td>
<td class="border border-slate-700">Indianapolis</td>
</tr>
<tr>
<td class="border border-slate-700">Michigan</td>
<td class="border border-slate-700">Detroit</td>
<td class="border border-slate-700">Indianapolis</td>
</tr>
</tbody>
</table>
</div>

View File

@ -7,7 +7,7 @@
let price: string let price: string
let creations: any[] = [] let creations: any[] = []
$: if (!itemname || !price) { $: if (!itemname || typeof price === "undefined") {
disabled = true disabled = true
message.message = "Item name and price required." message.message = "Item name and price required."
message.error = true message.error = true

View File

@ -101,12 +101,12 @@
</label> </label>
<label class="input-label gap-8"> <label class="input-label gap-8">
<span class="pt-3">Description:</span> <span class="">Description:</span>
<input <textarea
bind:value={itemdesc} bind:value={itemdesc}
type="text"
class="input input-bordered input-primary w-full max-w-md rounded-md" class="input input-bordered input-primary w-full max-w-md rounded-md"
required /> required>
</textarea>
</label> </label>
<label class="input-label gap-8"> <label class="input-label gap-8">

View File

@ -12,29 +12,31 @@
src="/api/thumbnailrender/asset/?id={itemid}" /> src="/api/thumbnailrender/asset/?id={itemid}" />
<a <a
href="/catalog/{itemid}/{itemname href="/catalog/{itemid}/{itemname
.replace(/[^a-zA-Z ]/g, '') .replace(/[^0-9a-z ]/gi, '')
.replaceAll(' ', '-')}"> .replaceAll(' ', '-')}">
<h5 class="!text-sm">{itemname}</h5> <h5 class="!text-sm">{itemname}</h5>
</a> </a>
</div> </div>
<svg <a href="/catalog/{itemid}/configure" class="unstyled">
fill="none" <svg
stroke="currentColor" fill="none"
height="24" stroke="currentColor"
width="24" height="24"
stroke-width="1.5" width="24"
viewBox="0 0 24 24" stroke-width="1.5"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
aria-hidden="true"> xmlns="http://www.w3.org/2000/svg"
<path aria-hidden="true">
stroke-linecap="round" <path
stroke-linejoin="round" stroke-linecap="round"
d="M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z"> stroke-linejoin="round"
</path> d="M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z">
<path </path>
stroke-linecap="round" <path
stroke-linejoin="round" stroke-linecap="round"
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"> stroke-linejoin="round"
</path> d="M15 12a3 3 0 11-6 0 3 3 0 016 0z">
</svg> </path>
</svg>
</a>
</div> </div>

View File

@ -34,7 +34,7 @@
"/games/" + "/games/" +
idofgame + idofgame +
"/" + "/" +
gamename.replace(/[^a-zA-Z ]/g, "").replaceAll(" ", "-") gamename.replace(/[^0-9a-z ]/gi, "").replaceAll(" ", "-")
}}> }}>
<div <div
class="card rounded-md card-glass-surface snap-center card-hover w-20 sm:w-40 relative"> class="card rounded-md card-glass-surface snap-center card-hover w-20 sm:w-40 relative">
@ -70,7 +70,7 @@
<a <a
class="unstyled group" class="unstyled group"
href="/games/{idofgame}/{gamename href="/games/{idofgame}/{gamename
.replace(/[^a-zA-Z ]/g, '') .replace(/[^0-9a-z ]/gi, '')
.replaceAll(' ', '-')}"> .replaceAll(' ', '-')}">
<div <div
class="card rounded-md card-glass-surface snap-center card-hover w-20 sm:w-40 relative"> class="card rounded-md card-glass-surface snap-center card-hover w-20 sm:w-40 relative">

View File

@ -40,7 +40,7 @@
<a <a
class="unstyled hidden sm:block" class="unstyled hidden sm:block"
href="/catalog/{itemid}/{itemname href="/catalog/{itemid}/{itemname
.replace(/[^a-zA-Z ]/g, '') .replace(/[^0-9a-z ]/gi, '')
.replaceAll(' ', '-')}"> .replaceAll(' ', '-')}">
{#if type != "Audio" && type != "Video"} {#if type != "Audio" && type != "Video"}
{#if imageloading} {#if imageloading}
@ -49,7 +49,7 @@
{/if} {/if}
<img <img
alt="" alt=""
class="avatar-image bg-surface-400-500-token w-full h-full flex aspect-square object-cover {imageloading === class="avatar-image bg-surface-400-500-token w-{width} h-{width} flex aspect-square object-cover {imageloading ===
true true
? 'hidden' ? 'hidden'
: ''} " : ''} "
@ -84,7 +84,7 @@
on:click={() => { on:click={() => {
action("remove", parseFloat({ itemid }.itemid)) action("remove", parseFloat({ itemid }.itemid))
}} }}
class="btn variant-filled-primary rounded-md btn-sm absolute right-0 top-0"> class="btn variant-filled-primary rounded-none btn-sm absolute right-0 top-0">
Remove Remove
</button> </button>
{:else} {:else}
@ -92,13 +92,14 @@
on:click={() => { on:click={() => {
action("wear", parseFloat({ itemid }.itemid)) action("wear", parseFloat({ itemid }.itemid))
}} }}
class="btn variant-filled-primary rounded-md btn-sm absolute right-0 top-0"> class="btn variant-filled-primary rounded-none btn-sm absolute right-0 top-0">
Wear Wear
</button> </button>
{/if} {/if}
{/if} {/if}
<p class="truncate w-28">{itemname}</p> <p class="truncate w-28">{itemname}</p>
{#if sales}
{#if interact !== "true"}
<div class="!text-xs">{sales ?? "0"} Sales</div> <div class="!text-xs">{sales ?? "0"} Sales</div>
{/if} {/if}

View File

@ -162,6 +162,9 @@
on:click={() => { on:click={() => {
search = "" search = ""
}} }}
on:keydown
on:keyup
on:keypress
class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3" class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="24" width="24"
@ -264,6 +267,9 @@
<svg <svg
class="w-6 h-6 md:hidden block" class="w-6 h-6 md:hidden block"
on:click={drawerOpen} on:click={drawerOpen}
on:keydown
on:keyup
on:keypress
fill="none" fill="none"
stroke="currentColor" stroke="currentColor"
viewBox="0 0 24 24" viewBox="0 0 24 24"
@ -334,6 +340,9 @@
on:click={() => { on:click={() => {
search = "" search = ""
}} }}
on:keydown
on:keyup
on:keypress
class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3" class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="24" width="24"
@ -425,7 +434,7 @@
<svelte:fragment slot="trail"> <svelte:fragment slot="trail">
{#if data.user} {#if data.user}
<Rocks /> <Rocks />
{coins ?? "0"} {coins ?? "?"}
<span class="relative pr-2"> <span class="relative pr-2">
<button <button
class="w-6 pt-2" class="w-6 pt-2"

View File

@ -6,7 +6,9 @@
import Lookup from "../../components/admin/lookup.svelte" import Lookup from "../../components/admin/lookup.svelte"
import Lookupdone from "../../components/admin/lookupdone.svelte" import Lookupdone from "../../components/admin/lookupdone.svelte"
import Assetqueue from "../../components/admin/assetqueue.svelte" import Assetqueue from "../../components/admin/assetqueue.svelte"
import Logs from "../../components/admin/logs.svelte"
import type { PageData } from "../$types" import type { PageData } from "../$types"
import Config from "../../components/admin/config.svelte"
let lookupdata: any let lookupdata: any
let storeTab = "lookup" let storeTab = "lookup"
@ -35,6 +37,14 @@
<Tab bind:group={storeTab} value="queue">Asset Queue</Tab> <Tab bind:group={storeTab} value="queue">Asset Queue</Tab>
</div> </div>
<div class="pl-2">
<Tab bind:group={storeTab} value="logs">Logs</Tab>
</div>
<div class="pl-2">
<Tab bind:group={storeTab} value="config">Config</Tab>
</div>
<h5>Forums</h5> <h5>Forums</h5>
<h5>Website</h5> <h5>Website</h5>
@ -59,5 +69,13 @@
{#if storeTab === "queue"} {#if storeTab === "queue"}
<Assetqueue jwt={data.jwt} /> <Assetqueue jwt={data.jwt} />
{/if} {/if}
{#if storeTab === "logs"}
<Logs jwt={data.jwt} />
{/if}
{#if storeTab === "config"}
<Config jwt={data.jwt} />
{/if}
</div> </div>
</div> </div>

View File

@ -9,6 +9,8 @@
import { url } from "$lib/url" import { url } from "$lib/url"
let avatar: string let avatar: string
import { avatarstore } from "$lib/avatarstore" import { avatarstore } from "$lib/avatarstore"
import { page } from "$app/stores"
import { goto, invalidate } from "$app/navigation"
import { onMount } from "svelte" import { onMount } from "svelte"
avatarstore.subscribe(value => { avatarstore.subscribe(value => {
avatar = value avatar = value
@ -16,13 +18,17 @@
let regenerating = false let regenerating = false
$: query = $page.url
export let data: PageData export let data: PageData
const jwt = data.jwt const jwt = data.jwt
const userid = data.user.userid const userid = data.user.userid
let avatartype = data.user.avatartype ?? "R6" let avatartype = data.user.avatartype ?? "R6"
let avatarfilter = "shirts" $: avatarfilter = data.avatarfilter
let currentItems: any[] = [] $: currentPage = data.currentPage
$: maxiumumPage = data.maxiumumPage
$: currentItems = data.currentItems
async function updateBodyType(newavatartype: string) { async function updateBodyType(newavatartype: string) {
if (avatartype != newavatartype) { if (avatartype != newavatartype) {
avatartype = newavatartype avatartype = newavatartype
@ -35,20 +41,6 @@
}) })
} }
} }
async function updateItems() {
const response = await fetch(url + `/api/userinfo/${userid}`)
const data = await response.json()
if (currentItems) {
currentItems.length = 0
currentItems = currentItems
}
currentItems = data.userinfo.inventory
currentItems = currentItems
currentItems = currentItems.filter(
currentItems => currentItems.Type.toLowerCase() === avatarfilter,
)
//console.log(currentItems)
}
async function itemaction(action: any, itemid: Number) { async function itemaction(action: any, itemid: Number) {
console.log(action) console.log(action)
console.log(itemid) console.log(itemid)
@ -64,28 +56,25 @@
}), }),
}) })
const itemaction = await itemactionresult.json() const itemaction = await itemactionresult.json()
updateItems() invalidate("/api/userinfo/" + userid)
console.log(itemaction) console.log(itemaction)
} }
$: { $: if (avatarfilter == "bodycolors") {
if (avatarfilter != "bodycolors") { // pop up modal
updateItems() const modalComponent: ModalComponent = {
} else { // Pass a reference to your custom component
// pop up modal ref: Colorpicker,
const modalComponent: ModalComponent = { props: { jwt: data.jwt },
// Pass a reference to your custom component
ref: Colorpicker,
props: { jwt: data.jwt },
}
const d: ModalSettings = {
type: "component",
// NOTE: title, body, response, etc are supported!
component: modalComponent,
modalClasses: "w-full max-w-[700px] p-4",
}
modalStore.trigger(d)
} }
const d: ModalSettings = {
type: "component",
// NOTE: title, body, response, etc are supported!
component: modalComponent,
modalClasses: "w-full max-w-[700px] p-4",
}
modalStore.trigger(d)
} }
let regeneratebtn = "Regenerate" let regeneratebtn = "Regenerate"
let regenerateimg: HTMLImageElement let regenerateimg: HTMLImageElement
@ -117,6 +106,17 @@
regenerating = false regenerating = false
} }
} }
function setPage(value: number) {
if (currentPage - value >= 1 && currentPage - value <= maxiumumPage) {
currentPage -= value
query.searchParams.set("page", currentPage.toString())
goto(query.href)
console.log(query.href)
}
}
//$:avatarfilter,updateAvatarFilter()
</script> </script>
<div <div
@ -192,41 +192,59 @@
<div class="bg-surface-800"> <div class="bg-surface-800">
<RadioGroup rounded="rounded-md truncate flex-wrap lg:flex-nowrap"> <RadioGroup rounded="rounded-md truncate flex-wrap lg:flex-nowrap">
<RadioItem bind:group={avatarfilter} value="shirts"> <a class="unstyled" href="?filter=shirts">
Shirts <RadioItem bind:group={avatarfilter} value="shirts">
</RadioItem> Shirts
<RadioItem bind:group={avatarfilter} value="pants"> </RadioItem>
Pants </a>
</RadioItem> <a class="unstyled" href="?filter=pants">
<RadioItem bind:group={avatarfilter} value="hats"> <RadioItem bind:group={avatarfilter} value="pants">
Hats Pants
</RadioItem> </RadioItem>
<RadioItem bind:group={avatarfilter} value="faces"> </a>
Faces <a class="unstyled" href="?filter=hats">
</RadioItem> <RadioItem bind:group={avatarfilter} value="hats">
<RadioItem bind:group={avatarfilter} value="packages"> Hats
Packages </RadioItem>
</RadioItem> </a>
<RadioItem bind:group={avatarfilter} value="heads"> <a class="unstyled" href="?filter=faces">
Heads <RadioItem bind:group={avatarfilter} value="faces">
</RadioItem> Faces
<RadioItem bind:group={avatarfilter} value="gears"> </RadioItem>
Gears </a>
</RadioItem> <a class="unstyled" href="?filter=packages">
<RadioItem bind:group={avatarfilter} value="emotes"> <RadioItem bind:group={avatarfilter} value="packages">
Emotes Packages
</RadioItem> </RadioItem>
<RadioItem bind:group={avatarfilter} value="bodycolors"> </a>
🖌️ <a class="unstyled" href="?filter=heads">
</RadioItem> <RadioItem bind:group={avatarfilter} value="heads">
Heads
</RadioItem>
</a>
<a class="unstyled" href="?filter=gears">
<RadioItem bind:group={avatarfilter} value="gears">
Gears
</RadioItem>
</a>
<a class="unstyled" href="?filter=emotes">
<RadioItem bind:group={avatarfilter} value="emotes">
Emotes
</RadioItem>
</a>
<a class="unstyled" href="?filter=bodycolors">
<RadioItem bind:group={avatarfilter} value="bodycolors">
🖌️
</RadioItem>
</a>
</RadioGroup> </RadioGroup>
<div <div
class="flex flex-col flex-wrap sm:grid sm:grid-cols-6 gap-2 p-2"> class="flex flex-col flex-wrap sm:grid sm:grid-cols-6 gap-2 p-2">
{#if currentItems && avatarfilter != "bodycolors"} {#if currentItems && avatarfilter != "bodycolors"}
{#each currentItems as { ItemName, ItemId, Hidden, Equipped }} {#each currentItems as { itemdata, ItemId, Hidden, Equipped }}
{#if !Hidden} {#if !Hidden}
<Itemcard <Itemcard
itemname={ItemName} itemname={itemdata.Name}
itemid={ItemId} itemid={ItemId}
width="w-24" width="w-24"
interact="true" interact="true"
@ -236,8 +254,8 @@
class="bg-surface-800 flex flex-row block sm:hidden px-2 relative"> class="bg-surface-800 flex flex-row block sm:hidden px-2 relative">
<a <a
class="unstyled" class="unstyled"
href="/catalog/{ItemId}/{ItemName.replace( href="/catalog/{ItemId}/{itemdata.Name.replace(
/[^a-zA-Z ]/g, /[^0-9a-z ]/gi,
'', '',
).replaceAll(' ', '-')}"> ).replaceAll(' ', '-')}">
<img <img
@ -246,7 +264,7 @@
src="/api/thumbnailrender/asset/?id={ItemId}" /> src="/api/thumbnailrender/asset/?id={ItemId}" />
</a> </a>
<div> <div>
<h3 class="truncate">{ItemName}</h3> <h3 class="truncate">{itemdata.Name}</h3>
</div> </div>
{#if Equipped === true} {#if Equipped === true}
<button <button
@ -276,6 +294,25 @@
{/each} {/each}
{/if} {/if}
</div> </div>
{#if avatarfilter != "bodycolors"}
<div class="flex flex-row space-x-2 justify-center">
<button
on:click={() => {
setPage(1)
}}
class="btn btn-sm bg-surface-600 rounded-md">
&lt;
</button>
<h5 class="">{currentPage} / {maxiumumPage}</h5>
<button
on:click={() => {
setPage(-1)
}}
class="btn btn-sm bg-surface-600 rounded-md">
&gt;
</button>
</div>
{/if}
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,31 @@
import { error } from "@sveltejs/kit"
import type { PageLoad } from "./$types"
import { url as url2 } from "$lib/url"
export const load = (async ({ parent, url, fetch }) => {
const avatarfilter = String(url.searchParams.get("filter") ?? "shirts")
const currentPage = Number(url.searchParams.get("page") ?? "1")
let currentItems: Array<any> = []
const userid = (await parent()).user.userid
const response = await fetch(url2 + `/api/userinfo/${userid}/inventory`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ page: currentPage, filter: avatarfilter }),
})
const data = await response.json()
currentItems = data.inventory
currentItems = currentItems.filter(
currentItems => currentItems.Type.toLowerCase() === avatarfilter,
)
if (!data.error) {
return {
currentItems,
maxiumumPage: data.pages,
currentPage,
avatarfilter,
}
}
}) satisfies PageLoad

View File

@ -4,7 +4,7 @@
import Itemcard from "../../components/itemcard.svelte" import Itemcard from "../../components/itemcard.svelte"
import Rocks from "../../components/rocks.svelte" import Rocks from "../../components/rocks.svelte"
import { url } from "$lib/url" import { url } from "$lib/url"
import { Avatar } from "@skeletonlabs/skeleton" import { menu } from "@skeletonlabs/skeleton"
import { page } from "$app/stores" import { page } from "$app/stores"
import { goto } from "$app/navigation" import { goto } from "$app/navigation"
import type { PageData } from "../$types" import type { PageData } from "../$types"
@ -12,6 +12,7 @@
let bodyparts = false let bodyparts = false
let animations = false let animations = false
let items: any let items: any
let currentSort = "Oldest"
$: query = $page.url.searchParams $: query = $page.url.searchParams
export let data: PageData export let data: PageData
@ -282,7 +283,60 @@
</div> </div>
<h3>{currentFilter}</h3> <h3>{currentFilter}</h3>
<h4>{currentCategory}</h4>
<div class="flex flex-row">
<h4>{currentCategory}</h4>
<button
class="ring-surface-500 hover:ring-surface-300 ring-2 rounded p-1 flex flex-row gap-x-3 relative ml-auto w-24"
use:menu={{ menu: "navigationsort" }}>
<h5 class="!text-sm hover:text-white">{currentSort}</h5>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
class="w-4 ml-auto">
<line x1="12" y1="5" x2="12" y2="19"></line>
<polyline points="19 12 12 19 5 12"></polyline>
</svg>
<nav class=" rounded-none mt-6" data-menu="navigationsort">
<ul>
<button
class="btn bg-surface-700 !rounded-none text-sm">
Oldest
</button>
</ul>
<ul>
<button
class="btn bg-surface-700 !rounded-none text-sm">
Newest
</button>
</ul>
<ul>
<button
class="btn bg-surface-700 !rounded-none text-sm">
Bestselling
</button>
</ul>
<ul>
<button
class="btn bg-surface-700 !rounded-none text-sm">
Price (High to Low)
</button>
</ul>
<ul>
<button
class="btn bg-surface-700 !rounded-none text-sm">
Price (Low to High)
</button>
</ul>
</nav>
</button>
</div>
<div <div
class="flex flex-col flex-wrap sm:grid sm:grid-cols-6 sm:grid-rows-5 gap-2"> class="flex flex-col flex-wrap sm:grid sm:grid-cols-6 sm:grid-rows-5 gap-2">
{#if items} {#if items}
@ -295,7 +349,7 @@
<a <a
class="unstyled block sm:hidden px-2" class="unstyled block sm:hidden px-2"
href="/catalog/{ItemId}/{Name.replace( href="/catalog/{ItemId}/{Name.replace(
/[^a-zA-Z ]/g, /[^0-9a-z ]/gi,
'', '',
).replaceAll(' ', '-')}"> ).replaceAll(' ', '-')}">
<div class="bg-surface-800 flex flex-row"> <div class="bg-surface-800 flex flex-row">

View File

@ -12,7 +12,7 @@ export const load = (async ({ fetch, params }) => {
"/catalog/" + "/catalog/" +
params.slug + params.slug +
"/" + "/" +
data.iteminfo.Name.replace(/[^a-zA-Z ]/g, "").replaceAll( data.iteminfo.Name.replace(/[^0-9a-z ]/gi, "").replaceAll(
" ", " ",
"-", "-",
), ),

View File

@ -3,9 +3,10 @@
import Rocks from "../../../../components/rocks.svelte" import Rocks from "../../../../components/rocks.svelte"
import Commentcard from "../../../../components/commentcard.svelte" import Commentcard from "../../../../components/commentcard.svelte"
import type { PageData } from "./$types" import type { PageData } from "./$types"
import { toastStore } from "@skeletonlabs/skeleton" import { toastStore, menu } from "@skeletonlabs/skeleton"
import type { ToastSettings } from "@skeletonlabs/skeleton" import type { ToastSettings } from "@skeletonlabs/skeleton"
import { coinstore } from "$lib/coinstore" import { coinstore } from "$lib/coinstore"
import { MoreHorizontalIcon } from "lucide-svelte"
export let data: PageData export let data: PageData
@ -87,7 +88,7 @@
class="m-auto border sm:border-0 object-cover" class="m-auto border sm:border-0 object-cover"
alt={data.item.Name} alt={data.item.Name}
src="/api/thumbnailrender/asset/?id={data.item.ItemId}" /> src="/api/thumbnailrender/asset/?id={data.item.ItemId}" />
{#if data.user.admin === true} {#if data.user.admin === true || (data.user.userid === data.item?.Creator && data.user.ugcpermission === true)}
<button <button
on:click={moderate} on:click={moderate}
class="btn variant-filled-primary rounded-md btn-sm absolute right-0 top-0"> class="btn variant-filled-primary rounded-md btn-sm absolute right-0 top-0">
@ -96,7 +97,25 @@
{/if} {/if}
</div> </div>
<div class="text-center sm:text-left"> <div class="text-center sm:text-left">
<h2>{data.item.Name}</h2> <div class="flex flex-row">
<h2>{data.item.Name}</h2>
<span class="relative ml-auto">
<button use:menu={{ menu: "navigationconfig" }}>
<MoreHorizontalIcon />
</button>
<nav
class=" rounded-none pb-2 pt-2 w-40"
data-menu="navigationconfig">
<ul>
<a
href="/catalog/{data.item.ItemId}/configure"
class="btn variant-filled-primary !rounded-md w-full btn-sm text-xs">
Configure
</a>
</ul>
</nav>
</span>
</div>
<h5> <h5>
By <a href="/users/{data.item.Creator ?? '0'}"> By <a href="/users/{data.item.Creator ?? '0'}">
@ -130,7 +149,7 @@
<h5 class="text-base">Description</h5> <h5 class="text-base">Description</h5>
<div class=" pl-8"> <div class=" pl-8">
<h5 <h5
class="text-base w-52 h-48 overflow-y-auto break-words"> class="text-base w-52 h-48 overflow-y-auto break-words whitespace-pre-line">
{data.item?.Description ?? ""} {data.item?.Description ?? ""}
</h5> </h5>
</div> </div>

View File

@ -9,14 +9,14 @@ export const load = (async ({ fetch, params }) => {
if ( if (
params.name != params.name !=
data.iteminfo.Name.replace(/[^a-zA-Z ]/g, "").replaceAll(" ", "-") data.iteminfo.Name.replace(/[^0-9a-z ]/gi, "").replaceAll(" ", "-")
) { ) {
throw redirect( throw redirect(
301, 301,
"/catalog/" + "/catalog/" +
params.slug + params.slug +
"/" + "/" +
data.iteminfo.Name.replace(/[^a-zA-Z ]/g, "").replaceAll( data.iteminfo.Name.replace(/[^0-9a-z ]/gi, "").replaceAll(
" ", " ",
"-", "-",
), ),

View File

@ -0,0 +1,116 @@
<script lang="ts">
import { goto } from "$app/navigation"
import type { PageData } from "./$types"
export let data: PageData
const jwt = data.jwt
let disabled = false
let message = { error: false, message: "" }
let name: string
let price: number
let description: string
async function save() {
const save = await fetch(
`/api/catalog/iteminfo/${data.item.ItemId}/configure`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: jwt,
},
body: JSON.stringify({
name,
description,
price,
}),
},
)
const saveJson = await save.json()
if (!saveJson.error) {
message.message = "Done!"
message.error = false
goto("/catalog/" + data.item.ItemId)
} else {
message.message = saveJson.error
message.error = true
}
}
$: if (!name && !description && !price && price !== 0) {
disabled = true
message.error = true
message.message = "Change required"
} else {
disabled = false
message.message = ""
}
</script>
<svelte:head>
<title>Meteorite - {data.item.Name} Configure</title>
</svelte:head>
<div
class="bg-surface-700 p-4 space-x-2 flex flex-row flex-wrap sm:flex-nowrap max-w-[1100px] m-0 m-auto">
<div class="sm:border sm:p-12 sm:w-[418px] relative">
<img
class="m-auto border sm:border-0 object-cover"
alt={data.item.Name}
src="/api/thumbnailrender/asset/?id={data.item.ItemId}" />
</div>
<div class="text-center sm:text-left ml-auto grow">
<h2>{data.item.Name} - Configure</h2>
<div class="space-y-4 w-full">
<h5 class="">Edit Asset</h5>
<label class="label">
<span>Name</span>
<input
type="text"
bind:value={name}
class="input input-bordered input-primary w-full rounded-md" />
</label>
<label class="label">
<span>Price</span>
<input
type="number"
bind:value={price}
min="0"
step="1"
class="input input-bordered input-primary w-full rounded-md" />
</label>
<label class="label">
<span>Description</span>
<textarea
bind:value={description}
class="input input-bordered input-primary w-full rounded-md">
</textarea>
</label>
<div
class="!text-xs mt-6 {message.error === true
? 'text-error-600'
: 'text-success-600'}">
{message.message ?? ""}
</div>
<button
on:click={save}
type="submit"
class="btn variant-filled-primary btn-sm w-full text-base rounded-md"
{disabled}>
Save
</button>
</div>
</div>
</div>

View File

@ -0,0 +1,21 @@
import { error, redirect } from "@sveltejs/kit"
import type { PageLoad } from "./$types"
export const load = (async ({ parent, fetch, params }) => {
const res = await fetch(
`http://mete0r.xyz/api/catalog/iteminfo/${params.slug}`,
)
const data = await res.json()
let self = (await parent()).user
if (data.iteminfo?.Creator != self.userid && self.admin === false) {
throw error(403, "Forbidden")
}
if (data.error === false) {
return {
item: data.iteminfo,
}
}
throw error(404, "Not found")
}) satisfies PageLoad

View File

@ -271,7 +271,7 @@
<a <a
class="unstyled block sm:hidden px-2" class="unstyled block sm:hidden px-2"
href="/catalog/{ItemId}/{Name.replace( href="/catalog/{ItemId}/{Name.replace(
/[^a-zA-Z ]/g, /[^0-9a-z ]/gi,
'', '',
).replaceAll(' ', '-')}"> ).replaceAll(' ', '-')}">
<div class="bg-surface-800 flex flex-row"> <div class="bg-surface-800 flex flex-row">

View File

@ -11,7 +11,7 @@ export const load = (async ({ fetch, params }) => {
params.slug + params.slug +
"/" + "/" +
data.gameinfo.nameofgame data.gameinfo.nameofgame
.replace(/[^a-zA-Z ]/g, "") .replace(/[^0-9a-z ]/gi, "")
.replaceAll(" ", "-"), .replaceAll(" ", "-"),
) )
} }

View File

@ -12,6 +12,7 @@
import Linkdiscordmodal from "../../../../components/games/linkdiscordmodal.svelte" import Linkdiscordmodal from "../../../../components/games/linkdiscordmodal.svelte"
import Advertisemodal from "../../../../components/assets/advertisemodal.svelte" import Advertisemodal from "../../../../components/assets/advertisemodal.svelte"
import Itemcard from "../../../../components/itemcard.svelte" import Itemcard from "../../../../components/itemcard.svelte"
import { MoreHorizontalIcon } from "lucide-svelte"
let storeTab = "About" let storeTab = "About"
export let data: PageData export let data: PageData
@ -162,26 +163,12 @@
<button <button
class="w-6 pt-2" class="w-6 pt-2"
use:menu={{ menu: "navigationgame" }}> use:menu={{ menu: "navigationgame" }}>
<svg <MoreHorizontalIcon />
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</button> </button>
<nav <nav
class="list-nav rounded-none pb-2 pt-2 w-40" class="rounded-none pb-2 pt-2 w-40"
data-menu="navigationgame"> data-menu="navigationgame">
<ul> <ul class="space-y-1">
<button <button
on:click={shutdown} on:click={shutdown}
class="btn variant-filled-primary !rounded-md w-full btn-sm text-xs"> class="btn variant-filled-primary !rounded-md w-full btn-sm text-xs">

View File

@ -7,7 +7,9 @@ export const load = (async ({ fetch, params }) => {
if ( if (
params.name != params.name !=
data.gameinfo.nameofgame.replace(/[^a-zA-Z ]/g, "").replaceAll(" ", "-") data.gameinfo.nameofgame
.replace(/[^0-9a-z ]/gi, "")
.replaceAll(" ", "-")
) { ) {
throw redirect( throw redirect(
301, 301,
@ -15,7 +17,7 @@ export const load = (async ({ fetch, params }) => {
params.slug + params.slug +
"/" + "/" +
data.gameinfo.nameofgame data.gameinfo.nameofgame
.replace(/[^a-zA-Z ]/g, "") .replace(/[^0-9a-z ]/gi, "")
.replaceAll(" ", "-"), .replaceAll(" ", "-"),
) )
} }

View File

@ -0,0 +1,15 @@
<script lang="ts">
import type { PageData } from "../$types"
import Groupbar from "../../components/groups/groupbar.svelte"
let selectedgroup = "Lambda Media Group"
export let data: PageData
</script>
<div class="sm:flex sm:flex-row gap-2 max-w-[1400px] m-0 m-auto">
{#if data.groups}
<Groupbar {selectedgroup} grouplist={data.groups} />
{/if}
<div class="col-span-5"></div>
</div>

View File

@ -0,0 +1,19 @@
import type { PageLoad } from "./$types"
import { url } from "$lib/url"
export const load = (async ({ fetch, parent }) => {
let data = await parent()
const response = await fetch(url + "/api/groups", {
method: "POST",
headers: {
"content-type": "application/json",
Authorization: data.jwt,
},
})
const groups = await response.json()
return {
groups,
}
}) satisfies PageLoad

View File

@ -0,0 +1,146 @@
<script lang="ts">
import { Avatar, menu } from "@skeletonlabs/skeleton"
import type { PageData } from "../$types"
import Groupbar from "../../../components/groups/groupbar.svelte"
import Commentcard from "../../../components/commentcard.svelte"
import { url } from "$lib/url"
let selectedgroup = "Lambda Media Group"
let currentPage = 1
let maxiumumPage = 1
let users: []
export let data: PageData
let groupid = data.group.groupid
async function updateMembers() {
const response = await fetch(
url + "/api/groups/" + groupid + "/members",
{
method: "POST",
body: JSON.stringify({ page: currentPage, rank: 1 }),
headers: { "content-type": "application/json" },
},
)
const data = await response.json()
if (!data.error) {
if (users) {
users.length = 0
users = users
}
users = data.data
users = users
maxiumumPage = data.pages
}
}
updateMembers()
</script>
<div class="sm:flex sm:flex-row gap-2 max-w-[1400px] m-0 m-auto">
<Groupbar {selectedgroup} grouplist={data.groups} />
<div class="col-span-5 mt-8 w-full space-y-2">
<div class="bg-surface-700 p-4">
<div class="">
<div class="flex flex-row gap-x-4">
<Avatar
width="w-36"
rounded="rounded-none"
src="/assets/groupicons/icon-0.png" />
<div>
<h2 class="font-bold">{data.group.Name}</h2>
<h5 class="!text-sm">
By <a href="/users/{data.group.owner.userid}">
{data.group.owner.username}
</a>
</h5>
</div>
</div>
<div class="w-full space-y-2">
<h5 class="font-bold !text-base">Description</h5>
<h5>{data.group.Description}</h5>
</div>
</div>
</div>
<h4 class="font-bold">Shout</h4>
<div class="">
<div class="bg-surface-700 p-4 flex flex-row gap-x-2">
<a href="/users/0">
<Avatar
width="w-12"
src="/api/thumbnailrender?id=0&type=headshot" />
</a>
<div>
<h5 class="!text-sm font-semibold">SushiWasNotHere</h5>
<h5 class="!text-sm">Hello, world!</h5>
</div>
</div>
<div class="bg-surface-700 p-4 flex flex-row gap-x-2">
<textarea
class="rounded-md grow input input-bordered input-primary"
placeholder="Shout here!!" />
<button class="btn mb-6 variant-filled-primary rounded-md">
Shout
</button>
</div>
</div>
<div class="flex flex-row justify-between">
<h4 class="font-bold">Members</h4>
<div class="flex flex-row gap-x-2">
<button
on:click={() => {}}
class="btn btn-sm bg-surface-600 rounded-md">
&lt;
</button>
<h5 class="">1 / 1</h5>
<button
on:click={() => {}}
class="btn btn-sm bg-surface-600 rounded-md">
&gt;
</button>
<button
class="ring-surface-500 hover:ring-surface-300 ring-2 rounded p-1 flex flex-row gap-x-3 relative">
<h5 class="!text-sm hover:text-white">Members</h5>
<h5 class="!text-sm hover:text-white">(1)</h5>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
class="w-4">
<line x1="12" y1="5" x2="12" y2="19"></line>
<polyline points="19 12 12 19 5 12"></polyline>
</svg>
</button>
</div>
</div>
<div class="bg-surface-700 p-4 flex flex-row gap-x-2">
{#if users}
{#each users as { userid, username }}
<a class="unstyled" href="/users/{userid}">
<div class="w-20">
<Avatar
width="w-20"
src="/api/thumbnailrender?id={userid}&type=headshot" />
<h5 class="!text-base truncate">{username}</h5>
</div>
</a>
{/each}
{/if}
</div>
<h4 class="font-bold">Wall</h4>
<Commentcard PostText="Post" PlaceholderText="Say something..." />
</div>
</div>

View File

@ -0,0 +1,33 @@
import type { PageLoad } from "./$types"
import { url } from "$lib/url"
import { error } from "@sveltejs/kit"
export const load = (async ({ fetch, parent, params }) => {
let data = await parent()
const response = await fetch(url + "/api/groups", {
method: "POST",
headers: {
"content-type": "application/json",
Authorization: data.jwt,
},
})
const groups = await response.json()
const responsegroup = await fetch(url + "/api/groups/" + params.slug, {
method: "POST",
headers: {
"content-type": "application/json",
Authorization: data.jwt,
},
})
const group = await responsegroup.json()
if (!group.error) {
return {
groups,
group: group.data,
}
}
throw error(404, "Not found")
}) satisfies PageLoad

View File

@ -0,0 +1,134 @@
<script lang="ts">
import { goto } from "$app/navigation"
import { FileDropzone } from "@skeletonlabs/skeleton"
import type { PageData } from "../$types"
let groupname: string
let groupdescription: string
let files: FileList
let publicgroup = true
let disabled = true
import Rocks from "../../../components/rocks.svelte"
export let data: PageData
let jwt = data.jwt
$: if (groupname && files && data.user.coins >= 100) {
disabled = false
} else {
disabled = true
}
const toBase64 = (file: Blob) =>
new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => resolve(reader.result)
reader.onerror = error => reject(error)
})
async function create() {
const formData = new FormData()
formData.append("groupicon", files[0])
formData.append("groupname", groupname)
formData.append("description", groupdescription ?? "...")
formData.append("publicgroup", publicgroup.toString())
const req = await fetch("/api/groups/create", {
method: "post",
body: formData,
headers: {
Authorization: jwt,
},
})
const res = await req.json()
if (!res.error) {
goto("/groups")
} else {
}
}
let base64: any
async function conv() {
base64 = await toBase64(files[0])
}
$: if (files) {
conv()
}
</script>
<div class="max-w-[1200px] m-0 m-auto">
<div class="flex flex-col gap-y-2">
<h2 class="font-bold">Create a Group</h2>
<label>
<span class="block text-sm">Group Name</span>
<input
bind:value={groupname}
maxlength={20}
type="text"
class="input input-bordered input-primary w-full rounded-md"
placeholder="Name of group"
required />
</label>
<label>
<span class="block text-sm">Group Description</span>
<textarea
bind:value={groupdescription}
maxlength={500}
class="input input-bordered input-primary w-full h-64 rounded-md"
placeholder="Description"
required>
</textarea>
</label>
<label>
<span class="block text-sm">Icon</span>
<input class="w-full" accept="image/png" bind:files type="file" />
{#if base64}
<img alt="" class="w-32 aspect-square" src={base64} />
{/if}
</label>
<h4 class="font-bold">Settings</h4>
<div class="space-y-4 w-full bg-surface-700 rounded-md p-4">
<label class="flex items-center space-x-2">
<input
bind:group={publicgroup}
class="radio"
type="radio"
checked
name="radio-setting"
value={true} />
<p>Anyone can join</p>
</label>
<label class="flex items-center space-x-2">
<input
bind:group={publicgroup}
class="radio"
type="radio"
name="radio-setting"
value={false} />
<p>Manual Approval</p>
</label>
</div>
<div class="flex flex-row gap-2 justify-end">
<a
href="/groups"
class="btn variant-ringed-surface rounded-md btn-sm">
Cancel
</a>
<button
class="btn variant-filled-primary rounded-md btn-sm"
{disabled}
on:click={create}>
<Rocks width="w-4" />
100
</button>
</div>
</div>
</div>

View File

@ -17,6 +17,7 @@
let creations: any[] = [] let creations: any[] = []
let editAbout = false let editAbout = false
let about: string let about: string
let checkedgames = false
//$:console.log(friends) //$:console.log(friends)
async function saveabout() { async function saveabout() {
const result = await fetch("/settings/aboutme", { const result = await fetch("/settings/aboutme", {
@ -51,9 +52,14 @@
) )
creations = await res.json() creations = await res.json()
console.log(creations) console.log(creations)
checkedgames = true
} }
$: if (storeTab === "Games" && creations.length === 0) { $: if (
storeTab === "Games" &&
creations.length === 0 &&
checkedgames === false
) {
requestGames() requestGames()
} }
@ -326,17 +332,17 @@
8 8
? 'md:gap-y-10' ? 'md:gap-y-10'
: ''} overflow-x-scroll md:overflow-x-hidden md:overflow-y-scroll grid md:grid-cols-4 grid-flow-col md:grid-rows-none md:grid-flow-row auto-rows-max auto-cols-max"> : ''} overflow-x-scroll md:overflow-x-hidden md:overflow-y-scroll grid md:grid-cols-4 grid-flow-col md:grid-rows-none md:grid-flow-row auto-rows-max auto-cols-max">
{#if data.profile.inventory} {#if data.wearingItems}
{#each data.profile.inventory as { Type, ItemId, ItemName, Equipped, Hidden }} {#each data.wearingItems as { Type, ItemId, itemdata, Equipped, Hidden }}
{#if Equipped === true && !Hidden} {#if Equipped === true && !Hidden}
<a <a
href="/catalog/{ItemId}/{ItemName.replace( href="/catalog/{ItemId}/{itemdata.Name.replace(
/[^a-zA-Z ]/g, /[^0-9a-z ]/gi,
'', '',
).replaceAll(' ', '-')}"> ).replaceAll(' ', '-')}">
<img <img
class="bg-surface-800 p-2 rounded-md w-28" class="bg-surface-800 p-2 rounded-md w-28"
alt={ItemName} alt={itemdata.Name}
src="/api/thumbnailrender/asset/?id={ItemId}" /> src="/api/thumbnailrender/asset/?id={ItemId}" />
</a> </a>
{/if} {/if}

View File

@ -1,10 +1,12 @@
import { error } from "@sveltejs/kit" import { error } from "@sveltejs/kit"
import type { PageLoad } from "./$types" import type { PageLoad } from "./$types"
import { url } from "$lib/url"
export const load = (async ({ fetch, params, parent }) => { export const load = (async ({ fetch, params, parent }) => {
let data = await parent() let data = await parent()
let alreadyFriends = false let alreadyFriends = false
let otherUserWantsToBeFriends = false let otherUserWantsToBeFriends = false
let wearingItems: Array<any> = []
const res = await fetch(`http://mete0r.xyz/api/userinfo/${params.slug}`) const res = await fetch(`http://mete0r.xyz/api/userinfo/${params.slug}`)
const datauser = await res.json() const datauser = await res.json()
@ -36,12 +38,24 @@ export const load = (async ({ fetch, params, parent }) => {
} }
} }
const wearingresponse = await fetch(
url + `/api/userinfo/${params.slug}/inventory`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ onlywearing: true }),
},
)
const wearingdata = await wearingresponse.json()
wearingItems = wearingdata.inventory
if (datauser.error === false) { if (datauser.error === false) {
return { return {
profile: datauser.userinfo, profile: datauser.userinfo,
alreadyFriends, alreadyFriends,
otherUserWantsToBeFriends, otherUserWantsToBeFriends,
visits: datavisits.visits, visits: datavisits.visits,
wearingItems,
} }
} }
throw error(404, "Not found") throw error(404, "Not found")

View File

@ -1,16 +1,16 @@
import adapter from '@sveltejs/adapter-node'; import adapter from "@sveltejs/adapter-node"
import preprocess from 'svelte-preprocess'; import preprocess from "svelte-preprocess"
/** @type {import('@sveltejs/kit').Config} */ /** @type {import('@sveltejs/kit').Config} */
const config = { const config = {
kit: { kit: {
adapter: adapter(), adapter: adapter(),
}, },
preprocess: [ preprocess: [
preprocess({ preprocess({
postcss: true, postcss: true,
}), }),
], ],
}; }
export default config; export default config

View File

@ -1,17 +1,29 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
darkMode: 'class', darkMode: "class",
content: ['./src/**/*.{html,js,svelte,ts}', require('path').join(require.resolve('@skeletonlabs/skeleton'), '../**/*.{html,js,svelte,ts}')], content: [
"./src/**/*.{html,js,svelte,ts}",
require("path").join(
require.resolve("@skeletonlabs/skeleton"),
"../**/*.{html,js,svelte,ts}",
),
],
theme: { theme: {
extend: {transitionProperty: { extend: {
'width': 'width' transitionProperty: {
}}, width: "width",
},
},
}, },
safelist: [ safelist: [
'float-left', "float-left",
'float-right', "float-right",
'h-5', "h-5",
'w-5' // status bubbles "w-5", // status bubbles
], ],
plugins: [require('@tailwindcss/forms'),require('@tailwindcss/typography'),...require("@skeletonlabs/skeleton/tailwind/skeleton.cjs")()], plugins: [
require("@tailwindcss/forms"),
require("@tailwindcss/typography"),
...require("@skeletonlabs/skeleton/tailwind/skeleton.cjs")(),
],
} }

View File

@ -1,44 +1,43 @@
import { sveltekit } from '@sveltejs/kit/vite'; import { sveltekit } from "@sveltejs/kit/vite"
import { defineConfig } from 'vite' import { defineConfig } from "vite"
let url = 'http://localhost:80' let url = "http://localhost:80"
/** @type {import('vite').UserConfig} */ /** @type {import('vite').UserConfig} */
const deb = { const deb = {
target: url, target: url,
changeOrigin: true changeOrigin: true,
} }
const defaultconfig = { const defaultconfig = {
plugins: [sveltekit()], plugins: [sveltekit()],
server: { server: {
proxy: { proxy: {
'/login': deb, "/login": deb,
'/api': deb, "/api": deb,
'/games/': deb, "/games/": deb,
"/develop/": deb, "/develop/": deb,
"/favicon": deb, "/favicon": deb,
"/assets": deb, "/assets": deb,
"/settings/": deb, "/settings/": deb,
} "/admin/": deb,
} },
}; },
}
export default defineConfig(({ command, mode, ssrBuild }) => { export default defineConfig(({ command, mode, ssrBuild }) => {
if (command === 'serve') { if (command === "serve") {
return { return {
...defaultconfig ...defaultconfig,
}
} else {
// command === 'build'
return {
// build specific config
...{
plugins: [sveltekit()]
}
} }
} else {
// command === 'build'
return {
// build specific config
} ...{
plugins: [sveltekit()],
},
}
} }
) })
//export default config; //export default config;