1
0
forked from noxious/server

use camelcase file names from now on...

This commit is contained in:
Dennis Postma 2024-08-21 20:55:58 +02:00
parent acc9eaae9e
commit 6b97e7d9cb
55 changed files with 396 additions and 116 deletions

251
package-lock.json generated
View File

@ -11,6 +11,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"express": "^4.19.2", "express": "^4.19.2",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"pino": "^9.3.2",
"prisma": "^5.17.0", "prisma": "^5.17.0",
"sharp": "^0.33.4", "sharp": "^0.33.4",
"socket.io": "^4.7.5", "socket.io": "^4.7.5",
@ -667,6 +668,18 @@
"@types/send": "*" "@types/send": "*"
} }
}, },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"license": "MIT",
"dependencies": {
"event-target-shim": "^5.0.0"
},
"engines": {
"node": ">=6.5"
}
},
"node_modules/accepts": { "node_modules/accepts": {
"version": "1.3.8", "version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
@ -730,6 +743,15 @@
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/atomic-sleep": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
"integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
"license": "MIT",
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/balanced-match": { "node_modules/balanced-match": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@ -737,6 +759,26 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/base64id": { "node_modules/base64id": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
@ -813,6 +855,30 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/buffer": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
}
},
"node_modules/buffer-equal-constant-time": { "node_modules/buffer-equal-constant-time": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
@ -1172,6 +1238,24 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"license": "MIT",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/express": { "node_modules/express": {
"version": "4.19.2", "version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
@ -1214,6 +1298,15 @@
"node": ">= 0.10.0" "node": ">= 0.10.0"
} }
}, },
"node_modules/fast-redact": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz",
"integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/fill-range": { "node_modules/fill-range": {
"version": "7.1.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@ -1417,6 +1510,26 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/ignore-by-default": { "node_modules/ignore-by-default": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@ -1758,6 +1871,15 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/on-exit-leak-free": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
"integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/on-finished": { "node_modules/on-finished": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@ -1798,6 +1920,44 @@
"url": "https://github.com/sponsors/jonschlinkert" "url": "https://github.com/sponsors/jonschlinkert"
} }
}, },
"node_modules/pino": {
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz",
"integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==",
"license": "MIT",
"dependencies": {
"atomic-sleep": "^1.0.0",
"fast-redact": "^3.1.1",
"on-exit-leak-free": "^2.1.0",
"pino-abstract-transport": "^1.2.0",
"pino-std-serializers": "^7.0.0",
"process-warning": "^4.0.0",
"quick-format-unescaped": "^4.0.3",
"real-require": "^0.2.0",
"safe-stable-stringify": "^2.3.1",
"sonic-boom": "^4.0.1",
"thread-stream": "^3.0.0"
},
"bin": {
"pino": "bin.js"
}
},
"node_modules/pino-abstract-transport": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz",
"integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==",
"license": "MIT",
"dependencies": {
"readable-stream": "^4.0.0",
"split2": "^4.0.0"
}
},
"node_modules/pino-std-serializers": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz",
"integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==",
"license": "MIT"
},
"node_modules/prettier": { "node_modules/prettier": {
"version": "3.3.3", "version": "3.3.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
@ -1830,6 +1990,21 @@
"node": ">=16.13" "node": ">=16.13"
} }
}, },
"node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
"license": "MIT",
"engines": {
"node": ">= 0.6.0"
}
},
"node_modules/process-warning": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz",
"integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==",
"license": "MIT"
},
"node_modules/proxy-addr": { "node_modules/proxy-addr": {
"version": "2.0.7", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@ -1865,6 +2040,12 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
"integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
"license": "MIT"
},
"node_modules/range-parser": { "node_modules/range-parser": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@ -1889,6 +2070,22 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/readable-stream": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
"integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
"license": "MIT",
"dependencies": {
"abort-controller": "^3.0.0",
"buffer": "^6.0.3",
"events": "^3.3.0",
"process": "^0.11.10",
"string_decoder": "^1.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/readdirp": { "node_modules/readdirp": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@ -1902,6 +2099,15 @@
"node": ">=8.10.0" "node": ">=8.10.0"
} }
}, },
"node_modules/real-require": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
"integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
"license": "MIT",
"engines": {
"node": ">= 12.13.0"
}
},
"node_modules/safe-buffer": { "node_modules/safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -1922,6 +2128,15 @@
], ],
"license": "MIT" "license": "MIT"
}, },
"node_modules/safe-stable-stringify": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
"integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/safer-buffer": { "node_modules/safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@ -2197,6 +2412,24 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/sonic-boom": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz",
"integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==",
"license": "MIT",
"dependencies": {
"atomic-sleep": "^1.0.0"
}
},
"node_modules/split2": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
"integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
"license": "ISC",
"engines": {
"node": ">= 10.x"
}
},
"node_modules/statuses": { "node_modules/statuses": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@ -2206,6 +2439,15 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/supports-color": { "node_modules/supports-color": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@ -2219,6 +2461,15 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/thread-stream": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz",
"integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==",
"license": "MIT",
"dependencies": {
"real-require": "^0.2.0"
}
},
"node_modules/to-regex-range": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",

View File

@ -12,6 +12,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"express": "^4.19.2", "express": "^4.19.2",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"pino": "^9.3.2",
"prisma": "^5.17.0", "prisma": "^5.17.0",
"sharp": "^0.33.4", "sharp": "^0.33.4",
"socket.io": "^4.7.5", "socket.io": "^4.7.5",

View File

@ -1,5 +1,5 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import ZoneManager from '../managers/ZoneManager' import ZoneManager from '../managers/zoneManager'
type CommandInput = string[] type CommandInput = string[]

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket, ExtendedCharacter } from '../../utilities/Types' import { TSocket, ExtendedCharacter } from '../../utilities/types'
import CharacterRepository from '../../repositories/CharacterRepository' import CharacterRepository from '../../repositories/characterRepository'
type SocketResponseT = { type SocketResponseT = {
character_id: number character_id: number

View File

@ -1,9 +1,10 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../utilities/Types' import { TSocket } from '../../utilities/types'
import { Character } from '@prisma/client' import { Character } from '@prisma/client'
import CharacterRepository from '../../repositories/CharacterRepository' import CharacterRepository from '../../repositories/characterRepository'
import { ZCharacterCreate } from '../../utilities/ZodTypes' import { ZCharacterCreate } from '../../utilities/zodTypes'
import prisma from '../../utilities/Prisma' import prisma from '../../utilities/prisma'
import logger from '../../utilities/logger'
export default function (socket: TSocket, io: Server) { export default function (socket: TSocket, io: Server) {
socket.on('character:create', async (data: any) => { socket.on('character:create', async (data: any) => {
@ -30,7 +31,7 @@ export default function (socket: TSocket, io: Server) {
data: { data: {
name: data.name, name: data.name,
userId: user_id, userId: user_id,
characterTypeId: 1 // @TODO set to chosen character type // characterTypeId: 1 // @TODO set to chosen character type
} }
}) })
@ -38,8 +39,10 @@ export default function (socket: TSocket, io: Server) {
socket.emit('character:create:success') socket.emit('character:create:success')
socket.emit('character:list', characters) socket.emit('character:list', characters)
logger.info('character:create success')
} catch (error: any) { } catch (error: any) {
console.log('character:create error', error) logger.error('character:create error', error)
return socket.emit('notification', { message: 'Could not create character. Please try again (later).' }) return socket.emit('notification', { message: 'Could not create character. Please try again (later).' })
} }
}) })

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../utilities/Types' import { TSocket } from '../../utilities/types'
import { Character, Zone } from '@prisma/client' import { Character, Zone } from '@prisma/client'
import CharacterRepository from '../../repositories/CharacterRepository' import CharacterRepository from '../../repositories/characterRepository'
type TypePayload = { type TypePayload = {
character_id: number character_id: number

View File

@ -1,7 +1,7 @@
import { Socket, Server } from 'socket.io' import { Socket, Server } from 'socket.io'
import { TSocket } from '../../utilities/Types' import { TSocket } from '../../utilities/types'
import { Character } from '@prisma/client' import { Character } from '@prisma/client'
import CharacterRepository from '../../repositories/CharacterRepository' import CharacterRepository from '../../repositories/characterRepository'
export default function CharacterList(socket: TSocket, io: Server) { export default function CharacterList(socket: TSocket, io: Server) {
socket.on('character:list', async (data: any) => { socket.on('character:list', async (data: any) => {

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket, ExtendedCharacter } from '../../utilities/Types' import { TSocket, ExtendedCharacter } from '../../utilities/types'
import ZoneManager from '../../managers/ZoneManager' import ZoneManager from '../../managers/zoneManager'
import prisma from '../../utilities/Prisma' import prisma from '../../utilities/prisma'
import { AStar } from '../../utilities/Player/AStar' import { AStar } from '../../utilities/player/aStar'
import Rotation from '../../utilities/Player/Rotation' import Rotation from '../../utilities/player/rotation'
const moveTokens = new Map<number, symbol>() const moveTokens = new Map<number, symbol>()

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../utilities/Types' import { TSocket } from '../../utilities/types'
import ZoneRepository from '../../repositories/ZoneRepository' import ZoneRepository from '../../repositories/zoneRepository'
import ZoneManager from '../../managers/ZoneManager' import ZoneManager from '../../managers/zoneManager'
import { Character, Zone } from '@prisma/client' import { Character, Zone } from '@prisma/client'
/** /**

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../utilities/Types' import { TSocket } from '../../utilities/types'
import ZoneRepository from '../../repositories/ZoneRepository' import ZoneRepository from '../../repositories/zoneRepository'
import ZoneManager from '../../managers/ZoneManager' import ZoneManager from '../../managers/zoneManager'
import { Character, Zone } from '@prisma/client' import { Character, Zone } from '@prisma/client'
interface IPayload { interface IPayload {

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { getArgs, isCommand } from '../../../utilities/Chat' import { getArgs, isCommand } from '../../../utilities/chat'
import CharacterRepository from '../../../repositories/CharacterRepository' import CharacterRepository from '../../../repositories/characterRepository'
type TypePayload = { type TypePayload = {
message: string message: string

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../utilities/Types' import { TSocket } from '../../utilities/types'
import CharacterRepository from '../../repositories/CharacterRepository' import CharacterRepository from '../../repositories/characterRepository'
import ZoneRepository from '../../repositories/ZoneRepository' import ZoneRepository from '../../repositories/zoneRepository'
import { isCommand } from '../../utilities/Chat' import { isCommand } from '../../utilities/chat'
type TypePayload = { type TypePayload = {
message: string message: string

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../utilities/Types' import { TSocket } from '../utilities/types'
import ZoneManager from '../managers/ZoneManager' import ZoneManager from '../managers/zoneManager'
export default function (socket: TSocket, io: Server) { export default function (socket: TSocket, io: Server) {
socket.on('disconnect', (data: any) => { socket.on('disconnect', (data: any) => {

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { Object } from '@prisma/client' import { Object } from '@prisma/client'
import ObjectRepository from '../../../repositories/ObjectRepository' import ObjectRepository from '../../../repositories/objectRepository'
interface IPayload {} interface IPayload {}

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import path from 'path' import path from 'path'
import fs from 'fs' import fs from 'fs'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
interface IPayload { interface IPayload {
object: string object: string

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
type Payload = { type Payload = {
id: string id: string

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { writeFile } from 'node:fs/promises' import { writeFile } from 'node:fs/promises'
import path from 'path' import path from 'path'
import fs from 'fs/promises' import fs from 'fs/promises'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
interface IObjectData { interface IObjectData {
[key: string]: Buffer [key: string]: Buffer

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import path from 'path' import path from 'path'
import fs from 'fs/promises' import fs from 'fs/promises'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
/** /**
* Handle game master new sprite event * Handle game master new sprite event

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { Sprite } from '@prisma/client' import { Sprite } from '@prisma/client'
import SpriteRepository from '../../../repositories/SpriteRepository' import SpriteRepository from '../../../repositories/spriteRepository'
interface IPayload {} interface IPayload {}

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import fs from 'fs' import fs from 'fs'
import path from 'path' import path from 'path'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
type Payload = { type Payload = {
id: string id: string

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
import type { Prisma, SpriteAction } from '@prisma/client' import type { Prisma, SpriteAction } from '@prisma/client'
import path from 'path' import path from 'path'
import { writeFile, mkdir } from 'node:fs/promises' import { writeFile, mkdir } from 'node:fs/promises'

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { Tile } from '@prisma/client' import { Tile } from '@prisma/client'
import TileRepository from '../../../repositories/TileRepository' import TileRepository from '../../../repositories/tileRepository'
interface IPayload {} interface IPayload {}

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import path from 'path' import path from 'path'
import fs from 'fs' import fs from 'fs'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
type Payload = { type Payload = {
id: string id: string

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
type Payload = { type Payload = {
id: string id: string

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { writeFile } from 'node:fs/promises' import { writeFile } from 'node:fs/promises'
import path from 'path' import path from 'path'
import fs from 'fs/promises' import fs from 'fs/promises'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
interface ITileData { interface ITileData {
[key: string]: Buffer [key: string]: Buffer

View File

@ -1,8 +1,8 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import ZoneRepository from '../../../repositories/ZoneRepository' import ZoneRepository from '../../../repositories/zoneRepository'
import { Zone } from '@prisma/client' import { Zone } from '@prisma/client'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
type Payload = { type Payload = {
name: string name: string

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import ZoneRepository from '../../../repositories/ZoneRepository' import ZoneRepository from '../../../repositories/zoneRepository'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
type Payload = { type Payload = {
zoneId: number zoneId: number

View File

@ -1,7 +1,7 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import { Zone } from '@prisma/client' import { Zone } from '@prisma/client'
import ZoneRepository from '../../../repositories/ZoneRepository' import ZoneRepository from '../../../repositories/zoneRepository'
interface IPayload {} interface IPayload {}

View File

@ -1,6 +1,6 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import ZoneRepository from '../../../repositories/ZoneRepository' import ZoneRepository from '../../../repositories/zoneRepository'
import { Zone } from '@prisma/client' import { Zone } from '@prisma/client'
interface IPayload { interface IPayload {

View File

@ -1,9 +1,9 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../../../utilities/Types' import { TSocket } from '../../../utilities/types'
import ZoneRepository from '../../../repositories/ZoneRepository' import ZoneRepository from '../../../repositories/zoneRepository'
import { ZoneEventTile, ZoneObject } from '@prisma/client' import { ZoneEventTile, ZoneObject } from '@prisma/client'
import prisma from '../../../utilities/Prisma' import prisma from '../../../utilities/prisma'
import zoneManager from '../../../managers/ZoneManager' import zoneManager from '../../../managers/zoneManager'
interface IPayload { interface IPayload {
zoneId: number zoneId: number

View File

@ -1,5 +1,5 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '../utilities/Types' import { TSocket } from '../utilities/types'
export default function (socket: TSocket, io: Server) { export default function (socket: TSocket, io: Server) {
socket.on('login', () => { socket.on('login', () => {

View File

@ -1,4 +1,5 @@
import { User } from '@prisma/client' import { User } from '@prisma/client'
import logger from '../utilities/logger'
type TLoggedInUsers = { type TLoggedInUsers = {
users: User[] users: User[]
@ -9,7 +10,7 @@ class UserManager {
// Method to initialize user manager // Method to initialize user manager
public async boot() { public async boot() {
console.log('[✅] User manager loaded') logger.info('User manager loaded')
} }
// Function that adds user to logged in users // Function that adds user to logged in users

View File

@ -1,7 +1,8 @@
import { Character, Zone } from '@prisma/client' import { Character, Zone } from '@prisma/client'
import ZoneRepository from '../repositories/ZoneRepository' import ZoneRepository from '../repositories/zoneRepository'
import ZoneService from '../services/ZoneService' import ZoneService from '../services/zoneService'
import zoneRepository from '../repositories/ZoneRepository' import zoneRepository from '../repositories/zoneRepository'
import logger from '../utilities/logger'
type TLoadedZone = { type TLoadedZone = {
zone: Zone zone: Zone
@ -25,7 +26,7 @@ class ZoneManager {
await this.loadZone(zone) await this.loadZone(zone)
} }
console.log('[✅] Zone manager loaded') logger.info('Zone manager loaded')
} }
// Method to handle individual zone loading // Method to handle individual zone loading
@ -36,7 +37,7 @@ class ZoneManager {
characters: [], characters: [],
grid grid
}) })
console.log(`[✅] Zone ID ${zone.id} loaded`) logger.info(`Zone ID ${zone.id} loaded`)
} }
// Method to handle individual zone unloading // Method to handle individual zone unloading
@ -44,7 +45,7 @@ class ZoneManager {
this.loadedZones = this.loadedZones.filter((loadedZone) => { this.loadedZones = this.loadedZones.filter((loadedZone) => {
return loadedZone.zone.id !== zoneId return loadedZone.zone.id !== zoneId
}) })
console.log(`[❌] Zone ID ${zoneId} unloaded`) logger.info(`Zone ID ${zoneId} unloaded`)
} }
// Getter for loaded zones // Getter for loaded zones

View File

@ -1,8 +1,8 @@
// socket io jwt auth middleware // socket io jwt auth middleware
import { verify } from 'jsonwebtoken' import { verify } from 'jsonwebtoken'
import { TSocket } from '../utilities/Types' import { TSocket } from '../utilities/types'
import config from '../utilities/Config' import config from '../utilities/config'
import UserRepository from '../repositories/UserRepository' import UserRepository from '../repositories/userRepository'
import { User } from '@prisma/client' import { User } from '@prisma/client'
export async function Authentication(socket: TSocket, next: any) { export async function Authentication(socket: TSocket, next: any) {

View File

@ -1,4 +1,4 @@
import prisma from '../utilities/Prisma' // Import the global Prisma instance import prisma from '../utilities/prisma' // Import the global Prisma instance
import { Character } from '@prisma/client' import { Character } from '@prisma/client'
class CharacterRepository { class CharacterRepository {

View File

@ -1,4 +1,4 @@
import prisma from '../utilities/Prisma' // Import the global Prisma instance import prisma from '../utilities/prisma' // Import the global Prisma instance
import { Object } from '@prisma/client' import { Object } from '@prisma/client'
class ObjectRepository { class ObjectRepository {

View File

@ -1,4 +1,4 @@
import prisma from '../utilities/Prisma' // Import the global Prisma instance import prisma from '../utilities/prisma' // Import the global Prisma instance
import { Sprite, SpriteAction } from '@prisma/client' import { Sprite, SpriteAction } from '@prisma/client'
class SpriteRepository { class SpriteRepository {

View File

@ -1,4 +1,4 @@
import prisma from '../utilities/Prisma' // Import the global Prisma instance import prisma from '../utilities/prisma' // Import the global Prisma instance
import { Tile } from '@prisma/client' import { Tile } from '@prisma/client'
class TileRepository { class TileRepository {

View File

@ -1,4 +1,4 @@
import prisma from '../utilities/Prisma' // Import the global Prisma instance import prisma from '../utilities/prisma' // Import the global Prisma instance
import { User } from '@prisma/client' import { User } from '@prisma/client'
class UserRepository { class UserRepository {

View File

@ -1,5 +1,5 @@
import { Zone } from '@prisma/client' import { Zone } from '@prisma/client'
import prisma from '../utilities/Prisma' // Import the global Prisma instance import prisma from '../utilities/prisma' // Import the global Prisma instance
class ZoneRepository { class ZoneRepository {
async getFirst(): Promise<Zone | null> { async getFirst(): Promise<Zone | null> {

View File

@ -1,22 +1,24 @@
import fs from 'fs' import fs from 'fs'
import path from 'path' import path from 'path'
import express, { Application } from 'express' import express, { Application } from 'express'
import { createServer as httpServer } from 'http' import { createServer as httpServer, Server as HTTPServer } from 'http'
import { addHttpRoutes } from './utilities/Http' import { addHttpRoutes } from './utilities/http'
import cors from 'cors' import cors from 'cors'
import { Server as SocketServer } from 'socket.io' import { Server as SocketServer } from 'socket.io'
import { TSocket } from './utilities/Types' import { TSocket } from './utilities/types'
import config from './utilities/Config' import config from './utilities/config'
import prisma from './utilities/Prisma' import prisma from './utilities/prisma'
import ZoneManager from './managers/ZoneManager' import ZoneManager from './managers/zoneManager'
import UserManager from './managers/UserManager' import UserManager from './managers/userManager'
import { Authentication } from './middleware/Authentication' import { Authentication } from './middleware/authentication'
import CommandManager from './managers/CommandManager' // import CommandManager from './managers/CommandManager'
import { Dirent } from 'node:fs' import { Dirent } from 'node:fs'
import logger from './utilities/logger'
export class Server { export class Server {
private readonly app: Application private readonly app: Application
private readonly http: any private readonly http: HTTPServer
private readonly io: SocketServer private readonly io: SocketServer
/** /**
@ -39,17 +41,17 @@ export class Server {
// Check prisma connection // Check prisma connection
try { try {
await prisma.$connect() await prisma.$connect()
console.log('[✅] Database connected') logger.info('Database connected')
} catch (error: any) { } catch (error: any) {
throw new Error(`[❌] Database connection failed: ${error.message}`) logger.error(`Database connection failed: ${error.message}`)
} }
// Start the server // Start the server
try { try {
await this.http.listen(config.PORT, config.HOST) await this.http.listen(config.PORT, config.HOST)
console.log('[✅] Socket.IO running on port', config.PORT) logger.info(`Socket.IO running on port ${config.PORT}`)
} catch (error: any) { } catch (error: any) {
throw new Error(`[❌] Socket.IO failed to start: ${error.message}`) logger.error(`Socket.IO failed to start: ${error.message}`)
} }
// Add http API routes // Add http API routes
@ -78,7 +80,7 @@ export class Server {
try { try {
await this.loadEventHandlers(eventsPath, socket) await this.loadEventHandlers(eventsPath, socket)
} catch (error: any) { } catch (error: any) {
throw new Error('[❌] Failed to load event handlers: ' + error.message) logger.error(`Failed to load event handlers: ${error.message}`)
} }
} }
@ -101,3 +103,5 @@ export class Server {
// Start the server // Start the server
const server = new Server() const server = new Server()
server.start() server.start()
console.log('Server started')

View File

@ -1,6 +1,6 @@
import bcrypt from 'bcryptjs' import bcrypt from 'bcryptjs'
import UserRepository from '../repositories/UserRepository' import UserRepository from '../repositories/userRepository'
import prisma from '../utilities/Prisma' import prisma from '../utilities/prisma'
import { User } from '@prisma/client' import { User } from '@prisma/client'
class UserService { class UserService {

View File

@ -1,4 +1,4 @@
import prisma from '../utilities/Prisma' import prisma from '../utilities/prisma'
class ZoneService { class ZoneService {
async createDemoZone(): Promise<boolean> { async createDemoZone(): Promise<boolean> {

View File

@ -1,14 +1,15 @@
import { Application, Request, Response } from 'express' import { Application, Request, Response } from 'express'
import UserService from '../services/UserService' import UserService from '../services/userService'
import jwt from 'jsonwebtoken' import jwt from 'jsonwebtoken'
import config from './Config' import config from './config'
import { loginAccountSchema, registerAccountSchema } from './ZodTypes' import { loginAccountSchema, registerAccountSchema } from './zodTypes'
import path from 'path' import path from 'path'
import { TAsset } from './Types' import { TAsset } from './types'
import tileRepository from '../repositories/TileRepository' import tileRepository from '../repositories/tileRepository'
import objectRepository from '../repositories/ObjectRepository' import objectRepository from '../repositories/objectRepository'
import spriteRepository from '../repositories/SpriteRepository' import spriteRepository from '../repositories/spriteRepository'
import fs from 'fs' import fs from 'fs'
import logger from './logger'
async function addHttpRoutes(app: Application) { async function addHttpRoutes(app: Application) {
app.get('/assets', async (req: Request, res: Response) => { app.get('/assets', async (req: Request, res: Response) => {
@ -60,8 +61,6 @@ async function addHttpRoutes(app: Application) {
assetPath = path.join(process.cwd(), 'public', assetType, fileName) assetPath = path.join(process.cwd(), 'public', assetType, fileName)
} }
console.log(`Attempting to serve: ${assetPath}`)
if (!fs.existsSync(assetPath)) { if (!fs.existsSync(assetPath)) {
console.error(`File not found: ${assetPath}`) console.error(`File not found: ${assetPath}`)
return res.status(404).send('Asset not found') return res.status(404).send('Asset not found')
@ -114,7 +113,7 @@ async function addHttpRoutes(app: Application) {
return res.status(400).json({ message: 'Failed to register user' }) return res.status(400).json({ message: 'Failed to register user' })
}) })
console.log('[✅] Web routes added') logger.info('Web routes added')
} }
export { addHttpRoutes } export { addHttpRoutes }

20
src/utilities/logger.ts Normal file
View File

@ -0,0 +1,20 @@
import pino from 'pino'
const logger = pino({
level: process.env.LOG_LEVEL || 'debug',
transport: {
target: 'pino/file',
options: {
destination: './logs/app.log',
mkdir: true
}
},
formatters: {
level: (label) => {
return { level: label.toUpperCase() }
},
},
timestamp: pino.stdTimeFunctions.isoTime
})
export default logger