cyberia 3.1.3 → 3.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +0 -2
- package/.github/workflows/engine-cyberia.cd.yml +10 -8
- package/.github/workflows/engine-cyberia.ci.yml +12 -29
- package/.github/workflows/ghpkg.ci.yml +4 -4
- package/.github/workflows/npmpkg.ci.yml +28 -11
- package/.github/workflows/publish.ci.yml +21 -2
- package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -5
- package/.github/workflows/pwa-microservices-template-test.ci.yml +3 -3
- package/.github/workflows/release.cd.yml +14 -10
- package/CHANGELOG.md +783 -1
- package/CLI-HELP.md +95 -18
- package/Dockerfile +0 -2
- package/README.md +290 -220
- package/bin/build.js +24 -7
- package/bin/cyberia.js +2838 -252
- package/bin/deploy.js +747 -125
- package/bin/file.js +9 -0
- package/bin/index.js +2838 -252
- package/bin/vs.js +1 -1
- package/conf.js +99 -65
- package/deployment.yaml +18 -164
- package/hardhat/hardhat.config.js +13 -13
- package/hardhat/ignition/modules/ObjectLayerToken.js +1 -1
- package/hardhat/package-lock.json +2559 -5864
- package/hardhat/package.json +14 -23
- package/hardhat/scripts/deployObjectLayerToken.js +1 -1
- package/hardhat/test/ObjectLayerToken.js +4 -2
- package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
- package/hardhat/types/ethers-contracts/common.ts +92 -0
- package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
- package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
- package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
- package/hardhat/types/ethers-contracts/index.ts +6 -0
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +6 -5
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +6 -5
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +18 -164
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +7 -79
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +112 -28
- package/manifests/deployment/dd-test-development/proxy.yaml +46 -1
- package/manifests/deployment/playwright/deployment.yaml +1 -1
- package/nodemon.json +1 -1
- package/package.json +39 -24
- package/proxy.yaml +7 -79
- package/scripts/k3s-node-setup.sh +2 -2
- package/scripts/nat-iptables.sh +103 -18
- package/scripts/rhel-grpc-setup.sh +56 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +58 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +23 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +148 -20
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.service.js +10 -10
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.service.js +8 -8
- package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
- package/src/api/cyberia-action/cyberia-action.model.js +87 -0
- package/src/api/cyberia-action/cyberia-action.router.js +27 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
- package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
- package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
- package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +178 -0
- package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
- package/src/api/cyberia-instance/cyberia-instance.model.js +87 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
- package/src/api/cyberia-instance/cyberia-instance.service.js +156 -0
- package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +574 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +231 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
- package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
- package/src/api/cyberia-map/cyberia-map.model.js +30 -0
- package/src/api/cyberia-map/cyberia-map.router.js +40 -0
- package/src/api/cyberia-map/cyberia-map.service.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.service.js +10 -10
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.ref.json +18 -0
- package/src/api/file/file.service.js +36 -36
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.service.js +10 -10
- package/src/api/ipfs/ipfs.controller.js +15 -36
- package/src/api/ipfs/ipfs.model.js +47 -47
- package/src/api/ipfs/ipfs.router.js +8 -13
- package/src/api/ipfs/ipfs.service.js +67 -129
- package/src/api/object-layer/object-layer.controller.js +12 -12
- package/src/api/object-layer/object-layer.model.js +4 -17
- package/src/api/object-layer/object-layer.router.js +30 -0
- package/src/api/object-layer/object-layer.service.js +126 -43
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.service.js +8 -8
- package/src/api/user/guest.service.js +99 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.service.js +11 -27
- package/src/cli/cluster.js +68 -21
- package/src/cli/db.js +753 -825
- package/src/cli/deploy.js +215 -125
- package/src/cli/env.js +29 -0
- package/src/cli/fs.js +82 -8
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +74 -3
- package/src/cli/kubectl.js +211 -0
- package/src/cli/release.js +340 -0
- package/src/cli/repository.js +475 -74
- package/src/cli/run.js +582 -43
- package/src/cli/secrets.js +73 -0
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/cli/test.js +3 -3
- package/src/client/Cryptokoyn.index.js +18 -22
- package/src/client/CyberiaPortal.index.js +19 -24
- package/src/client/Default.index.js +21 -34
- package/src/client/Itemledger.index.js +20 -27
- package/src/client/Underpost.index.js +19 -24
- package/src/client/components/core/404.js +4 -4
- package/src/client/components/core/500.js +4 -4
- package/src/client/components/core/Account.js +73 -60
- package/src/client/components/core/AgGrid.js +23 -33
- package/src/client/components/core/Alert.js +12 -13
- package/src/client/components/core/AppStore.js +69 -0
- package/src/client/components/core/Auth.js +35 -37
- package/src/client/components/core/Badge.js +7 -13
- package/src/client/components/core/BtnIcon.js +15 -17
- package/src/client/components/core/CalendarCore.js +43 -64
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +87 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/Content.js +17 -14
- package/src/client/components/core/Css.js +15 -71
- package/src/client/components/core/CssCore.js +12 -16
- package/src/client/components/core/D3Chart.js +4 -4
- package/src/client/components/core/Docs.js +64 -91
- package/src/client/components/core/DropDown.js +194 -96
- package/src/client/components/core/EventBus.js +92 -0
- package/src/client/components/core/EventsUI.js +14 -17
- package/src/client/components/core/FileExplorer.js +96 -228
- package/src/client/components/core/FullScreen.js +47 -75
- package/src/client/components/core/Input.js +24 -69
- package/src/client/components/core/Keyboard.js +26 -19
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +25 -31
- package/src/client/components/core/LogIn.js +43 -43
- package/src/client/components/core/LogOut.js +25 -16
- package/src/client/components/core/Modal.js +462 -179
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -51
- package/src/client/components/core/PanelForm.js +44 -144
- package/src/client/components/core/Polyhedron.js +110 -214
- package/src/client/components/core/PublicProfile.js +39 -32
- package/src/client/components/core/Recover.js +48 -44
- package/src/client/components/core/Responsive.js +88 -32
- package/src/client/components/core/RichText.js +9 -18
- package/src/client/components/core/Router.js +24 -3
- package/src/client/components/core/SearchBox.js +37 -37
- package/src/client/components/core/SignUp.js +39 -30
- package/src/client/components/core/SocketIo.js +112 -30
- package/src/client/components/core/SocketIoHandler.js +75 -0
- package/src/client/components/core/Stream.js +143 -95
- package/src/client/components/core/ToggleSwitch.js +8 -20
- package/src/client/components/core/ToolTip.js +5 -17
- package/src/client/components/core/Translate.js +56 -59
- package/src/client/components/core/Validator.js +26 -16
- package/src/client/components/core/Wallet.js +15 -26
- package/src/client/components/core/Webhook.js +40 -7
- package/src/client/components/core/Worker.js +163 -27
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +59 -59
- package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +9 -7
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +8 -6
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
- package/src/client/components/cyberia/InstanceEngineCyberia.js +781 -0
- package/src/client/components/cyberia/MapEngineCyberia.js +1836 -2
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1220 -99
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +252 -316
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +136 -103
- package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +462 -32
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +9 -7
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +8 -6
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +91 -91
- package/src/client/components/default/AppStoreDefault.js +5 -0
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +9 -7
- package/src/client/components/default/LogOutDefault.js +8 -6
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +4 -4
- package/src/client/components/default/SignUpDefault.js +6 -4
- package/src/client/components/default/SocketIoDefault.js +3 -51
- package/src/client/components/default/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +59 -59
- package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +9 -7
- package/src/client/components/itemledger/LogOutItemledger.js +8 -6
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +4 -4
- package/src/client/components/itemledger/SignUpItemledger.js +6 -4
- package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
- package/src/client/components/itemledger/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +92 -92
- package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
- package/src/client/components/underpost/CssUnderpost.js +14 -14
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
- package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
- package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
- package/src/client/components/underpost/LogInUnderpost.js +9 -7
- package/src/client/components/underpost/LogOutUnderpost.js +8 -6
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +4 -4
- package/src/client/components/underpost/SignUpUnderpost.js +6 -4
- package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
- package/src/client/components/underpost/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
- package/src/client/services/core/core.service.js +35 -55
- package/src/client/services/crypto/crypto.service.js +8 -13
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +116 -0
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
- package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
- package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/default/default.management.js +159 -267
- package/src/client/services/default/default.service.js +10 -16
- package/src/client/services/document/document.service.js +14 -19
- package/src/client/services/file/file.service.js +8 -13
- package/src/client/services/instance/instance.management.js +6 -6
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +14 -40
- package/src/client/services/object-layer/object-layer.management.js +14 -14
- package/src/client/services/object-layer/object-layer.service.js +39 -24
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
- package/src/client/services/test/test.service.js +8 -13
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +6 -6
- package/src/client/services/user/user.service.js +14 -20
- package/src/client/ssr/body/404.js +3 -3
- package/src/client/ssr/body/500.js +3 -3
- package/src/client/ssr/body/CacheControl.js +5 -2
- package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
- package/src/client/ssr/head/PwaItemledger.js +197 -60
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
- package/src/client/ssr/offline/Maintenance.js +12 -11
- package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
- package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/pages/Test.js +2 -2
- package/src/client/sw/core.sw.js +212 -0
- package/src/grpc/cyberia/grpc-server.js +642 -0
- package/src/index.js +24 -1
- package/src/runtime/cyberia-client/Dockerfile +80 -0
- package/src/runtime/cyberia-server/Dockerfile +37 -0
- package/src/runtime/express/Dockerfile +5 -1
- package/src/runtime/express/Express.js +18 -1
- package/src/runtime/lampp/Dockerfile +17 -5
- package/src/runtime/lampp/Lampp.js +27 -4
- package/src/runtime/wp/Dockerfile +62 -0
- package/src/runtime/wp/Wp.js +639 -0
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/auth.js +24 -1
- package/src/server/backup.js +37 -9
- package/src/server/client-build-docs.js +52 -46
- package/src/server/client-build.js +356 -82
- package/src/server/client-formatted.js +140 -57
- package/src/server/conf.js +29 -13
- package/src/server/cron.js +25 -23
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +24 -1
- package/src/server/ipfs-client.js +253 -89
- package/src/server/object-layer.js +150 -114
- package/src/server/peer.js +8 -0
- package/src/server/process.js +13 -27
- package/src/server/runtime.js +25 -1
- package/src/server/semantic-layer-generator-floor.js +319 -0
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +1164 -0
- package/src/server/semantic-layer-generator.js +211 -542
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +19 -5
- package/src/server/valkey.js +141 -235
- package/src/ws/IoInterface.js +1 -10
- package/src/ws/IoServer.js +14 -33
- package/src/ws/core/channels/core.ws.chat.js +65 -20
- package/src/ws/core/channels/core.ws.mailer.js +113 -32
- package/src/ws/core/channels/core.ws.stream.js +90 -31
- package/src/ws/core/core.ws.connection.js +12 -33
- package/src/ws/core/core.ws.emit.js +10 -26
- package/src/ws/core/core.ws.server.js +25 -58
- package/src/ws/default/channels/default.ws.main.js +53 -12
- package/src/ws/default/default.ws.connection.js +26 -13
- package/src/ws/default/default.ws.server.js +30 -12
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +29 -0
- package/typedoc.json +29 -0
- package/WHITE-PAPER.md +0 -1540
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -59
- package/jsdoc.json +0 -59
- package/src/api/object-layer/README.md +0 -347
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
- package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -58
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/ElementsDefault.js +0 -38
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/CommonItemledger.js +0 -29
- package/src/client/components/itemledger/ElementsItemledger.js +0 -38
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/CommonUnderpost.js +0 -29
- package/src/client/components/underpost/ElementsUnderpost.js +0 -38
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/ws/core/management/core.ws.chat.js +0 -8
- package/src/ws/core/management/core.ws.mailer.js +0 -16
- package/src/ws/core/management/core.ws.stream.js +0 -8
- package/src/ws/default/management/default.ws.main.js +0 -8
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Schema, model } from 'mongoose';
|
|
2
|
+
import { CYBERIA_INSTANCE_CONF_DEFAULTS as D } from './cyberia-instance-conf.defaults.js';
|
|
3
|
+
|
|
4
|
+
const ColorEntrySchema = new Schema(
|
|
5
|
+
{
|
|
6
|
+
key: { type: String, required: true },
|
|
7
|
+
r: { type: Number, default: 0 },
|
|
8
|
+
g: { type: Number, default: 0 },
|
|
9
|
+
b: { type: Number, default: 0 },
|
|
10
|
+
a: { type: Number, default: 255 },
|
|
11
|
+
},
|
|
12
|
+
{ _id: false },
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
// ObjectLayer inventory slot: itemId + whether it starts active + initial quantity.
|
|
16
|
+
// Used by EntityDefaultSchema.defaultObjectLayers.
|
|
17
|
+
const ObjectLayerSlotSchema = new Schema(
|
|
18
|
+
{
|
|
19
|
+
itemId: { type: String, required: true },
|
|
20
|
+
active: { type: Boolean, default: false },
|
|
21
|
+
quantity: { type: Number, default: 1 },
|
|
22
|
+
},
|
|
23
|
+
{ _id: false },
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const EntityDefaultSchema = new Schema(
|
|
27
|
+
{
|
|
28
|
+
// Entity category string (matches entity_type_str / bot Behavior in game engine)
|
|
29
|
+
entityType: { type: String, required: true },
|
|
30
|
+
// Default ObjectLayer item IDs when the entity is alive and carries no assigned items.
|
|
31
|
+
liveItemIds: { type: [String], default: [] },
|
|
32
|
+
// Default ObjectLayer item IDs for the dead / ghost / respawning state.
|
|
33
|
+
// Empty array = use liveItemIds solid fill color.
|
|
34
|
+
deadItemIds: { type: [String], default: [] },
|
|
35
|
+
// Resource-only inventory items granted on extraction/depletion.
|
|
36
|
+
// These are not auto-activated on the entity itself.
|
|
37
|
+
dropItemIds: { type: [String], default: [] },
|
|
38
|
+
// Palette key for solid-color fallback when no OL items are assigned.
|
|
39
|
+
colorKey: { type: String, default: '' },
|
|
40
|
+
// Full default ObjectLayer inventory for this entity type.
|
|
41
|
+
// Each entry specifies itemId, whether it starts active, and its initial quantity.
|
|
42
|
+
// The coin slot must always have active:false — coins are non-activable.
|
|
43
|
+
// When non-empty this supersedes liveItemIds for inventory initialization.
|
|
44
|
+
defaultObjectLayers: { type: [ObjectLayerSlotSchema], default: [] },
|
|
45
|
+
},
|
|
46
|
+
{ _id: false },
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const SkillConfigEntrySchema = new Schema(
|
|
50
|
+
{
|
|
51
|
+
triggerItemId: { type: String, required: true },
|
|
52
|
+
logicEventIds: { type: [String], default: [] },
|
|
53
|
+
},
|
|
54
|
+
{ _id: false },
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// ── StatusIconEntrySchema ────────────────────────────────────────────────────
|
|
58
|
+
// Maps a u8 status ID to an overhead icon and a border colour used by the
|
|
59
|
+
// interaction bubble / interact overlay on the C/WASM client.
|
|
60
|
+
// See STATUS_ICONS in cyberia-instance-conf.defaults.js.
|
|
61
|
+
const StatusIconBorderColorSchema = new Schema(
|
|
62
|
+
{
|
|
63
|
+
r: { type: Number, default: 100 },
|
|
64
|
+
g: { type: Number, default: 100 },
|
|
65
|
+
b: { type: Number, default: 100 },
|
|
66
|
+
a: { type: Number, default: 200 },
|
|
67
|
+
},
|
|
68
|
+
{ _id: false },
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
const StatusIconEntrySchema = new Schema(
|
|
72
|
+
{
|
|
73
|
+
id: { type: Number, required: true },
|
|
74
|
+
name: { type: String, default: '' },
|
|
75
|
+
iconId: { type: String, default: null },
|
|
76
|
+
bounce: { type: Boolean, default: false },
|
|
77
|
+
borderColor: { type: StatusIconBorderColorSchema },
|
|
78
|
+
description: { type: String, default: '' },
|
|
79
|
+
},
|
|
80
|
+
{ _id: false },
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// ── EconomyRulesSchema ───────────────────────────────────────────────────────
|
|
84
|
+
// Mirrors the EconomyRules proto message and the economyRules sub-document in
|
|
85
|
+
// cyberia-instance-conf.defaults.js. All fields default from those canonical
|
|
86
|
+
// values so a freshly created document is immediately playable.
|
|
87
|
+
// See OFF_CHAIN_ECONOMY.md for the full Fountain & Sink architecture.
|
|
88
|
+
const EconomyRulesSchema = new Schema(
|
|
89
|
+
{
|
|
90
|
+
// ── Fountains ───────────────────────────────────────────────────────────
|
|
91
|
+
botSpawnCoins: { type: Number, default: D.economyRules.botSpawnCoins },
|
|
92
|
+
playerSpawnCoins: { type: Number, default: D.economyRules.playerSpawnCoins },
|
|
93
|
+
// ── Kill Transfer ───────────────────────────────────────────────────────
|
|
94
|
+
coinKillPercentVsBot: { type: Number, default: D.economyRules.coinKillPercentVsBot },
|
|
95
|
+
coinKillPercentVsPlayer: { type: Number, default: D.economyRules.coinKillPercentVsPlayer },
|
|
96
|
+
coinKillMinAmount: { type: Number, default: D.economyRules.coinKillMinAmount },
|
|
97
|
+
// ── Sinks ───────────────────────────────────────────────────────────────
|
|
98
|
+
respawnCostPercent: { type: Number, default: D.economyRules.respawnCostPercent },
|
|
99
|
+
portalFee: { type: Number, default: D.economyRules.portalFee },
|
|
100
|
+
craftingFeePercent: { type: Number, default: D.economyRules.craftingFeePercent },
|
|
101
|
+
},
|
|
102
|
+
{ _id: false },
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// ── EquipmentRulesSchema ─────────────────────────────────────────────────────
|
|
106
|
+
// Governs which ObjectLayer item types can be simultaneously active on a
|
|
107
|
+
// character entity and enforces the one-active-per-type constraint.
|
|
108
|
+
// See EQUIPMENT_RULES_DEFAULTS in cyberia-instance-conf.defaults.js.
|
|
109
|
+
const EquipmentRulesSchema = new Schema(
|
|
110
|
+
{
|
|
111
|
+
// Item types that players are allowed to activate (equip).
|
|
112
|
+
// Types not in this list are non-activable (coins, floors, etc.).
|
|
113
|
+
activeItemTypes: { type: [String], default: D.equipmentRules.activeItemTypes },
|
|
114
|
+
// Enforce at most one active item per item type.
|
|
115
|
+
onePerType: { type: Boolean, default: D.equipmentRules.onePerType },
|
|
116
|
+
// Require at least one active skin when the player owns any skin.
|
|
117
|
+
requireSkin: { type: Boolean, default: D.equipmentRules.requireSkin },
|
|
118
|
+
},
|
|
119
|
+
{ _id: false },
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const SkillRulesSchema = new Schema(
|
|
123
|
+
{
|
|
124
|
+
projectileSpawnChance: { type: Number, default: D.skillRules.projectileSpawnChance },
|
|
125
|
+
projectileLifetimeMs: { type: Number, default: D.skillRules.projectileLifetimeMs },
|
|
126
|
+
projectileWidth: { type: Number, default: D.skillRules.projectileWidth },
|
|
127
|
+
projectileHeight: { type: Number, default: D.skillRules.projectileHeight },
|
|
128
|
+
projectileSpeedMultiplier: { type: Number, default: D.skillRules.projectileSpeedMultiplier },
|
|
129
|
+
doppelgangerSpawnChance: { type: Number, default: D.skillRules.doppelgangerSpawnChance },
|
|
130
|
+
doppelgangerLifetimeMs: { type: Number, default: D.skillRules.doppelgangerLifetimeMs },
|
|
131
|
+
doppelgangerSpawnRadius: { type: Number, default: D.skillRules.doppelgangerSpawnRadius },
|
|
132
|
+
doppelgangerInitialLifeFraction: { type: Number, default: D.skillRules.doppelgangerInitialLifeFraction },
|
|
133
|
+
},
|
|
134
|
+
{ _id: false },
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Game server configuration for a Cyberia instance.
|
|
139
|
+
* Separated from CyberiaInstance so the GUI never overwrites live server parameters
|
|
140
|
+
* when editing instance identity / map-graph fields.
|
|
141
|
+
*
|
|
142
|
+
* Linked from CyberiaInstance.conf (ObjectId ref).
|
|
143
|
+
* Looked up by instanceCode for CLI / gRPC use.
|
|
144
|
+
*/
|
|
145
|
+
const CyberiaInstanceConfSchema = new Schema(
|
|
146
|
+
{
|
|
147
|
+
// Back-reference to the owning instance (indexed for fast lookup by code).
|
|
148
|
+
instanceCode: { type: String, required: true, unique: true, trim: true },
|
|
149
|
+
|
|
150
|
+
// ── Rendering / camera ──────────────────────────────────────────
|
|
151
|
+
cellSize: { type: Number, default: D.cellSize },
|
|
152
|
+
fps: { type: Number, default: D.fps },
|
|
153
|
+
interpolationMs: { type: Number, default: D.interpolationMs },
|
|
154
|
+
defaultObjWidth: { type: Number, default: D.defaultObjWidth },
|
|
155
|
+
defaultObjHeight: { type: Number, default: D.defaultObjHeight },
|
|
156
|
+
cameraSmoothing: { type: Number, default: D.cameraSmoothing },
|
|
157
|
+
cameraZoom: { type: Number, default: D.cameraZoom },
|
|
158
|
+
defaultWidthScreenFactor: { type: Number, default: D.defaultWidthScreenFactor },
|
|
159
|
+
defaultHeightScreenFactor: { type: Number, default: D.defaultHeightScreenFactor },
|
|
160
|
+
devUi: { type: Boolean, default: D.devUi },
|
|
161
|
+
// Empty array by default — colours must be configured per-instance.
|
|
162
|
+
// toInstanceConfig() fills in CYBERIA_INSTANCE_CONF_DEFAULTS.colors when the array is empty.
|
|
163
|
+
colors: { type: [ColorEntrySchema], default: [] },
|
|
164
|
+
|
|
165
|
+
// ── World / AOI ─────────────────────────────────────────────────
|
|
166
|
+
aoiRadius: { type: Number, default: D.aoiRadius },
|
|
167
|
+
portalHoldTimeMs: { type: Number, default: D.portalHoldTimeMs },
|
|
168
|
+
portalSpawnRadius: { type: Number, default: D.portalSpawnRadius },
|
|
169
|
+
|
|
170
|
+
// ── Entity base stats ────────────────────────────────────────────
|
|
171
|
+
entityBaseSpeed: { type: Number, default: D.entityBaseSpeed },
|
|
172
|
+
entityBaseMaxLife: { type: Number, default: D.entityBaseMaxLife },
|
|
173
|
+
entityBaseActionCooldownMs: { type: Number, default: D.entityBaseActionCooldownMs },
|
|
174
|
+
entityBaseMinActionCooldownMs: { type: Number, default: D.entityBaseMinActionCooldownMs },
|
|
175
|
+
|
|
176
|
+
// ── Bot defaults ─────────────────────────────────────────────────
|
|
177
|
+
botAggroRange: { type: Number, default: D.botAggroRange },
|
|
178
|
+
|
|
179
|
+
// ── Player defaults ──────────────────────────────────────────────
|
|
180
|
+
defaultPlayerWidth: { type: Number, default: D.defaultPlayerWidth },
|
|
181
|
+
defaultPlayerHeight: { type: Number, default: D.defaultPlayerHeight },
|
|
182
|
+
playerBaseLifeRegenMin: { type: Number, default: D.playerBaseLifeRegenMin },
|
|
183
|
+
playerBaseLifeRegenMax: { type: Number, default: D.playerBaseLifeRegenMax },
|
|
184
|
+
sumStatsLimit: { type: Number, default: D.sumStatsLimit },
|
|
185
|
+
maxActiveLayers: { type: Number, default: D.maxActiveLayers },
|
|
186
|
+
initialLifeFraction: { type: Number, default: D.initialLifeFraction },
|
|
187
|
+
|
|
188
|
+
// ── Combat / death ───────────────────────────────────────────────
|
|
189
|
+
respawnDurationMs: { type: Number, default: D.respawnDurationMs },
|
|
190
|
+
collisionLifeLoss: { type: Number, default: D.collisionLifeLoss },
|
|
191
|
+
|
|
192
|
+
// ── Economy ──────────────────────────────────────────────────────
|
|
193
|
+
// Fountain & Sink parameters. See EconomyRulesSchema and OFF_CHAIN_ECONOMY.md.
|
|
194
|
+
economyRules: { type: EconomyRulesSchema },
|
|
195
|
+
|
|
196
|
+
// ── Regen ────────────────────────────────────────────────────────
|
|
197
|
+
lifeRegenChance: { type: Number, default: D.lifeRegenChance },
|
|
198
|
+
maxChance: { type: Number, default: D.maxChance },
|
|
199
|
+
|
|
200
|
+
// ── Entity type rendering defaults ───────────────────────────────
|
|
201
|
+
// Replaces flat fields: userDefaultItemId, botDefaultItemId, ghostItemId,
|
|
202
|
+
// coinItemId, defaultFloorItemId, weaponDefaultItemId.
|
|
203
|
+
// Each entry: { entityType, liveItemIds, deadItemIds, dropItemIds, colorKey }.
|
|
204
|
+
entityDefaults: { type: [EntityDefaultSchema], default: D.entityDefaults },
|
|
205
|
+
|
|
206
|
+
// ── Entity Status Indicators ────────────────────────────────────
|
|
207
|
+
// Overhead icon mapping + per-status border colour.
|
|
208
|
+
// See STATUS_ICONS in cyberia-instance-conf.defaults.js.
|
|
209
|
+
statusIcons: { type: [StatusIconEntrySchema], default: D.statusIcons },
|
|
210
|
+
|
|
211
|
+
// ── Skill system ─────────────────────────────────────────────────
|
|
212
|
+
// Each entry maps a trigger item to an ordered list of logic handler keys.
|
|
213
|
+
// Spawning entities (e.g. projectiles) is handled inside the logic handler itself.
|
|
214
|
+
skillConfig: { type: [SkillConfigEntrySchema], default: [] },
|
|
215
|
+
|
|
216
|
+
// Numeric tuning parameters for each skill archetype.
|
|
217
|
+
skillRules: { type: SkillRulesSchema },
|
|
218
|
+
|
|
219
|
+
// ── Equipment rules ──────────────────────────────────────────────
|
|
220
|
+
// Governs which item types can be simultaneously active and enforces
|
|
221
|
+
// the one-active-per-type constraint. See EQUIPMENT_RULES_DEFAULTS.
|
|
222
|
+
equipmentRules: { type: EquipmentRulesSchema },
|
|
223
|
+
},
|
|
224
|
+
{ timestamps: true },
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
const CyberiaInstanceConfModel = model('CyberiaInstanceConf', CyberiaInstanceConfSchema);
|
|
228
|
+
|
|
229
|
+
const ProviderSchema = CyberiaInstanceConfSchema;
|
|
230
|
+
|
|
231
|
+
export { CyberiaInstanceConfSchema, CyberiaInstanceConfModel, ProviderSchema };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
2
|
+
import { CyberiaInstanceConfController } from './cyberia-instance-conf.controller.js';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
|
|
5
|
+
const logger = loggerFactory(import.meta);
|
|
6
|
+
|
|
7
|
+
const CyberiaInstanceConfRouter = (options) => {
|
|
8
|
+
const router = express.Router();
|
|
9
|
+
const authMiddleware = options.authMiddleware;
|
|
10
|
+
router.post(`/:id`, async (req, res) => await CyberiaInstanceConfController.post(req, res, options));
|
|
11
|
+
router.post(`/`, async (req, res) => await CyberiaInstanceConfController.post(req, res, options));
|
|
12
|
+
router.get(
|
|
13
|
+
`/:id`,
|
|
14
|
+
// authMiddleware,
|
|
15
|
+
async (req, res) => await CyberiaInstanceConfController.get(req, res, options),
|
|
16
|
+
);
|
|
17
|
+
router.get(`/`, async (req, res) => await CyberiaInstanceConfController.get(req, res, options));
|
|
18
|
+
router.put(`/:id`, async (req, res) => await CyberiaInstanceConfController.put(req, res, options));
|
|
19
|
+
router.put(`/`, async (req, res) => await CyberiaInstanceConfController.put(req, res, options));
|
|
20
|
+
router.delete(`/:id`, async (req, res) => await CyberiaInstanceConfController.delete(req, res, options));
|
|
21
|
+
router.delete(`/`, async (req, res) => await CyberiaInstanceConfController.delete(req, res, options));
|
|
22
|
+
return router;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const ApiRouter = CyberiaInstanceConfRouter;
|
|
26
|
+
|
|
27
|
+
export { ApiRouter, CyberiaInstanceConfRouter };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { DataBaseProvider } from '../../db/DataBaseProvider.js';
|
|
2
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
3
|
+
import { DataQuery } from '../../server/data-query.js';
|
|
4
|
+
|
|
5
|
+
const logger = loggerFactory(import.meta);
|
|
6
|
+
|
|
7
|
+
class CyberiaInstanceConfService {
|
|
8
|
+
static post = async (req, res, options) => {
|
|
9
|
+
/** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
|
|
10
|
+
const CyberiaInstanceConf =
|
|
11
|
+
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
|
|
12
|
+
return await new CyberiaInstanceConf(req.body).save();
|
|
13
|
+
};
|
|
14
|
+
static get = async (req, res, options) => {
|
|
15
|
+
/** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
|
|
16
|
+
const CyberiaInstanceConf =
|
|
17
|
+
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
|
|
18
|
+
if (req.params.id) return await CyberiaInstanceConf.findById(req.params.id);
|
|
19
|
+
|
|
20
|
+
// Parse query parameters using DataQuery helper
|
|
21
|
+
const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
|
|
22
|
+
|
|
23
|
+
const [data, total] = await Promise.all([
|
|
24
|
+
CyberiaInstanceConf.find(query).sort(sort).limit(limit).skip(skip),
|
|
25
|
+
CyberiaInstanceConf.countDocuments(query),
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
const totalPages = Math.ceil(total / limit);
|
|
29
|
+
return { data, total, page, totalPages };
|
|
30
|
+
};
|
|
31
|
+
static put = async (req, res, options) => {
|
|
32
|
+
/** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
|
|
33
|
+
const CyberiaInstanceConf =
|
|
34
|
+
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
|
|
35
|
+
return await CyberiaInstanceConf.findByIdAndUpdate(req.params.id, req.body);
|
|
36
|
+
};
|
|
37
|
+
static delete = async (req, res, options) => {
|
|
38
|
+
/** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
|
|
39
|
+
const CyberiaInstanceConf =
|
|
40
|
+
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
|
|
41
|
+
if (req.params.id) return await CyberiaInstanceConf.findByIdAndDelete(req.params.id);
|
|
42
|
+
else return await CyberiaInstanceConf.deleteMany();
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { CyberiaInstanceConfService };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
2
|
+
import { CyberiaMapService } from './cyberia-map.service.js';
|
|
3
|
+
|
|
4
|
+
const logger = loggerFactory(import.meta);
|
|
5
|
+
|
|
6
|
+
class CyberiaMapController {
|
|
7
|
+
static post = async (req, res, options) => {
|
|
8
|
+
try {
|
|
9
|
+
const result = await CyberiaMapService.post(req, res, options);
|
|
10
|
+
return res.status(200).json({
|
|
11
|
+
status: 'success',
|
|
12
|
+
data: result,
|
|
13
|
+
});
|
|
14
|
+
} catch (error) {
|
|
15
|
+
logger.error(error, error.stack);
|
|
16
|
+
return res.status(400).json({
|
|
17
|
+
status: 'error',
|
|
18
|
+
message: error.message,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
static get = async (req, res, options) => {
|
|
23
|
+
try {
|
|
24
|
+
const { page, limit } = req.query;
|
|
25
|
+
const result = await CyberiaMapService.get(
|
|
26
|
+
{
|
|
27
|
+
...req,
|
|
28
|
+
path: req.path,
|
|
29
|
+
params: req.params,
|
|
30
|
+
query: { ...req.query, page: parseInt(page), limit: parseInt(limit) },
|
|
31
|
+
},
|
|
32
|
+
res,
|
|
33
|
+
options,
|
|
34
|
+
);
|
|
35
|
+
return res.status(200).json({
|
|
36
|
+
status: 'success',
|
|
37
|
+
data: result,
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
logger.error(error, error.stack);
|
|
41
|
+
return res.status(400).json({
|
|
42
|
+
status: 'error',
|
|
43
|
+
message: error.message,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
static put = async (req, res, options) => {
|
|
48
|
+
try {
|
|
49
|
+
const result = await CyberiaMapService.put(req, res, options);
|
|
50
|
+
return res.status(200).json({
|
|
51
|
+
status: 'success',
|
|
52
|
+
data: result,
|
|
53
|
+
});
|
|
54
|
+
} catch (error) {
|
|
55
|
+
logger.error(error, error.stack);
|
|
56
|
+
return res.status(400).json({
|
|
57
|
+
status: 'error',
|
|
58
|
+
message: error.message,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
static delete = async (req, res, options) => {
|
|
63
|
+
try {
|
|
64
|
+
const result = await CyberiaMapService.delete(req, res, options);
|
|
65
|
+
return res.status(200).json({
|
|
66
|
+
status: 'success',
|
|
67
|
+
data: result,
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
logger.error(error, error.stack);
|
|
71
|
+
return res.status(400).json({
|
|
72
|
+
status: 'error',
|
|
73
|
+
message: error.message,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { CyberiaMapController };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Schema, model, Types } from 'mongoose';
|
|
2
|
+
import { CyberiaEntitySchema } from '../cyberia-entity/cyberia-entity.model.js';
|
|
3
|
+
|
|
4
|
+
// https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
|
|
5
|
+
|
|
6
|
+
const CyberiaMapSchema = new Schema(
|
|
7
|
+
{
|
|
8
|
+
code: { type: String, default: '', unique: true },
|
|
9
|
+
name: { type: String, default: '' },
|
|
10
|
+
description: { type: String, default: '' },
|
|
11
|
+
entities: { type: [CyberiaEntitySchema], default: [] },
|
|
12
|
+
tags: { type: [String], default: [] },
|
|
13
|
+
creator: { type: Schema.Types.ObjectId, ref: 'User' },
|
|
14
|
+
status: { type: String, default: 'unlisted' },
|
|
15
|
+
thumbnail: { type: Schema.Types.ObjectId, ref: 'File' },
|
|
16
|
+
gridX: { type: Number, default: 16 },
|
|
17
|
+
gridY: { type: Number, default: 16 },
|
|
18
|
+
cellWidth: { type: Number, default: 32 },
|
|
19
|
+
cellHeight: { type: Number, default: 32 },
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
timestamps: true,
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const CyberiaMapModel = model('CyberiaMap', CyberiaMapSchema);
|
|
27
|
+
|
|
28
|
+
const ProviderSchema = CyberiaMapSchema;
|
|
29
|
+
|
|
30
|
+
export { CyberiaMapSchema, CyberiaMapModel, ProviderSchema };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
2
|
+
import { CyberiaMapController } from './cyberia-map.controller.js';
|
|
3
|
+
import { userGuard, adminGuard } from '../../server/auth.js';
|
|
4
|
+
import express from 'express';
|
|
5
|
+
|
|
6
|
+
const logger = loggerFactory(import.meta);
|
|
7
|
+
|
|
8
|
+
const CyberiaMapRouter = (options) => {
|
|
9
|
+
const router = express.Router();
|
|
10
|
+
const authMiddleware = options.authMiddleware;
|
|
11
|
+
router.post(
|
|
12
|
+
`/:id`,
|
|
13
|
+
authMiddleware,
|
|
14
|
+
userGuard,
|
|
15
|
+
async (req, res) => await CyberiaMapController.post(req, res, options),
|
|
16
|
+
);
|
|
17
|
+
router.post(`/`, authMiddleware, userGuard, async (req, res) => await CyberiaMapController.post(req, res, options));
|
|
18
|
+
router.get(`/search-codes`, async (req, res) => await CyberiaMapController.get(req, res, options));
|
|
19
|
+
router.get(`/:id`, async (req, res) => await CyberiaMapController.get(req, res, options));
|
|
20
|
+
router.get(`/`, async (req, res) => await CyberiaMapController.get(req, res, options));
|
|
21
|
+
router.put(`/:id`, authMiddleware, userGuard, async (req, res) => await CyberiaMapController.put(req, res, options));
|
|
22
|
+
router.put(`/`, authMiddleware, userGuard, async (req, res) => await CyberiaMapController.put(req, res, options));
|
|
23
|
+
router.delete(
|
|
24
|
+
`/:id`,
|
|
25
|
+
authMiddleware,
|
|
26
|
+
userGuard,
|
|
27
|
+
async (req, res) => await CyberiaMapController.delete(req, res, options),
|
|
28
|
+
);
|
|
29
|
+
router.delete(
|
|
30
|
+
`/`,
|
|
31
|
+
authMiddleware,
|
|
32
|
+
adminGuard,
|
|
33
|
+
async (req, res) => await CyberiaMapController.delete(req, res, options),
|
|
34
|
+
);
|
|
35
|
+
return router;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const ApiRouter = CyberiaMapRouter;
|
|
39
|
+
|
|
40
|
+
export { ApiRouter, CyberiaMapRouter };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { DataBaseProvider } from '../../db/DataBaseProvider.js';
|
|
2
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
3
|
+
import { DataQuery } from '../../server/data-query.js';
|
|
4
|
+
|
|
5
|
+
const logger = loggerFactory(import.meta);
|
|
6
|
+
|
|
7
|
+
class CyberiaMapService {
|
|
8
|
+
static post = async (req, res, options) => {
|
|
9
|
+
/** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
|
|
10
|
+
const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
|
|
11
|
+
if (req.auth && req.auth.user) req.body.creator = req.auth.user._id;
|
|
12
|
+
return await new CyberiaMap(req.body).save();
|
|
13
|
+
};
|
|
14
|
+
static get = async (req, res, options) => {
|
|
15
|
+
/** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
|
|
16
|
+
const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
|
|
17
|
+
const populateCreator = { path: 'creator', model: 'User', select: '_id username' };
|
|
18
|
+
|
|
19
|
+
// GET /search-codes?q=<partial> - Fast partial match search on code
|
|
20
|
+
if (req.path?.startsWith('/search-codes')) {
|
|
21
|
+
const q = (req.query.q || '').trim();
|
|
22
|
+
if (!q) return { codes: [] };
|
|
23
|
+
const escaped = q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
24
|
+
const results = await CyberiaMap.find({ code: { $regex: escaped, $options: 'i' } }, { code: 1, _id: 0 })
|
|
25
|
+
.limit(20)
|
|
26
|
+
.lean();
|
|
27
|
+
const codes = [...new Set(results.map((r) => r.code).filter(Boolean))];
|
|
28
|
+
return { codes };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (req.params.id) return await CyberiaMap.findById(req.params.id).populate(populateCreator);
|
|
32
|
+
|
|
33
|
+
// Parse query parameters using DataQuery helper
|
|
34
|
+
const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
|
|
35
|
+
|
|
36
|
+
const [data, total] = await Promise.all([
|
|
37
|
+
CyberiaMap.find(query).sort(sort).limit(limit).skip(skip).populate(populateCreator),
|
|
38
|
+
CyberiaMap.countDocuments(query),
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
const totalPages = Math.ceil(total / limit);
|
|
42
|
+
return { data, total, page, totalPages };
|
|
43
|
+
};
|
|
44
|
+
static put = async (req, res, options) => {
|
|
45
|
+
/** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
|
|
46
|
+
const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
|
|
47
|
+
const map = await CyberiaMap.findById(req.params.id);
|
|
48
|
+
if (!map) throw new Error('map not found');
|
|
49
|
+
if (req.auth.user.role !== 'admin' && String(map.creator) !== String(req.auth.user._id))
|
|
50
|
+
throw new Error('insufficient permission');
|
|
51
|
+
if (req.body.thumbnail && map.thumbnail && String(req.body.thumbnail) !== String(map.thumbnail)) {
|
|
52
|
+
const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
|
|
53
|
+
await File.findByIdAndDelete(map.thumbnail);
|
|
54
|
+
}
|
|
55
|
+
return await CyberiaMap.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
|
|
56
|
+
};
|
|
57
|
+
static delete = async (req, res, options) => {
|
|
58
|
+
/** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
|
|
59
|
+
const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
|
|
60
|
+
if (req.params.id) {
|
|
61
|
+
const map = await CyberiaMap.findById(req.params.id);
|
|
62
|
+
if (!map) throw new Error('map not found');
|
|
63
|
+
if (req.auth.user.role !== 'admin' && String(map.creator) !== String(req.auth.user._id))
|
|
64
|
+
throw new Error('insufficient permission');
|
|
65
|
+
if (map.thumbnail) {
|
|
66
|
+
const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
|
|
67
|
+
await File.findByIdAndDelete(map.thumbnail);
|
|
68
|
+
}
|
|
69
|
+
return await CyberiaMap.findByIdAndDelete(req.params.id);
|
|
70
|
+
} else return await CyberiaMap.deleteMany();
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { CyberiaMapService };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
2
|
+
import { CyberiaQuestService } from './cyberia-quest.service.js';
|
|
3
|
+
|
|
4
|
+
const logger = loggerFactory(import.meta);
|
|
5
|
+
|
|
6
|
+
class CyberiaQuestController {
|
|
7
|
+
static post = async (req, res, options) => {
|
|
8
|
+
try {
|
|
9
|
+
const result = await CyberiaQuestService.post(req, res, options);
|
|
10
|
+
return res.status(200).json({
|
|
11
|
+
status: 'success',
|
|
12
|
+
data: result,
|
|
13
|
+
});
|
|
14
|
+
} catch (error) {
|
|
15
|
+
logger.error(error, error.stack);
|
|
16
|
+
return res.status(400).json({
|
|
17
|
+
status: 'error',
|
|
18
|
+
message: error.message,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
static get = async (req, res, options) => {
|
|
23
|
+
try {
|
|
24
|
+
const { page, limit } = req.query;
|
|
25
|
+
const result = await CyberiaQuestService.get(
|
|
26
|
+
{ ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
|
|
27
|
+
res,
|
|
28
|
+
options,
|
|
29
|
+
);
|
|
30
|
+
return res.status(200).json({
|
|
31
|
+
status: 'success',
|
|
32
|
+
data: result,
|
|
33
|
+
});
|
|
34
|
+
} catch (error) {
|
|
35
|
+
logger.error(error, error.stack);
|
|
36
|
+
return res.status(400).json({
|
|
37
|
+
status: 'error',
|
|
38
|
+
message: error.message,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
static put = async (req, res, options) => {
|
|
43
|
+
try {
|
|
44
|
+
const result = await CyberiaQuestService.put(req, res, options);
|
|
45
|
+
return res.status(200).json({
|
|
46
|
+
status: 'success',
|
|
47
|
+
data: result,
|
|
48
|
+
});
|
|
49
|
+
} catch (error) {
|
|
50
|
+
logger.error(error, error.stack);
|
|
51
|
+
return res.status(400).json({
|
|
52
|
+
status: 'error',
|
|
53
|
+
message: error.message,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
static delete = async (req, res, options) => {
|
|
58
|
+
try {
|
|
59
|
+
const result = await CyberiaQuestService.delete(req, res, options);
|
|
60
|
+
return res.status(200).json({
|
|
61
|
+
status: 'success',
|
|
62
|
+
data: result,
|
|
63
|
+
});
|
|
64
|
+
} catch (error) {
|
|
65
|
+
logger.error(error, error.stack);
|
|
66
|
+
return res.status(400).json({
|
|
67
|
+
status: 'error',
|
|
68
|
+
message: error.message,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { CyberiaQuestController };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Schema, model } from 'mongoose';
|
|
2
|
+
import { QUEST_STEPS_TYPES } from '../../client/components/cyberia-portal/CommonCyberiaPortal.js';
|
|
3
|
+
|
|
4
|
+
// https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
|
|
5
|
+
|
|
6
|
+
const CyberiaQuestSchema = new Schema(
|
|
7
|
+
{
|
|
8
|
+
// Spatial origin: the NPC/entity cell that grants this quest.
|
|
9
|
+
// Matched against map entity initCellX/initCellY during instance init
|
|
10
|
+
// and assignable from ObjectLayerEngineModal.
|
|
11
|
+
sourceMapCode: { type: String, trim: true },
|
|
12
|
+
sourceCellX: { type: Number },
|
|
13
|
+
sourceCellY: { type: Number },
|
|
14
|
+
|
|
15
|
+
// Stable slug, e.g. "fallback-intro-quest"
|
|
16
|
+
code: { type: String, required: true, trim: true },
|
|
17
|
+
title: { type: String, required: true, trim: true },
|
|
18
|
+
description: { type: String, default: '' },
|
|
19
|
+
|
|
20
|
+
// ── Chain / tree unlock structure ─────────────────────────────────────
|
|
21
|
+
// All listed quest codes must be completed before this quest becomes
|
|
22
|
+
// available (AND logic). Empty array = no prerequisites.
|
|
23
|
+
prerequisiteCodes: { type: [String], default: [] },
|
|
24
|
+
|
|
25
|
+
// Quest codes unlocked when this quest is completed.
|
|
26
|
+
// Supports both chain (one successor) and tree (multiple successors).
|
|
27
|
+
// The server re-checks prerequisiteCodes on each target before activating it.
|
|
28
|
+
unlocksQuestCodes: { type: [String], default: [] },
|
|
29
|
+
|
|
30
|
+
// ── Steps ─────────────────────────────────────────────────────────────
|
|
31
|
+
// Ordered linear sequence. The active step is always the first incomplete one.
|
|
32
|
+
steps: [
|
|
33
|
+
{
|
|
34
|
+
id: { type: String, required: true },
|
|
35
|
+
description: { type: String, default: '' },
|
|
36
|
+
objectives: [
|
|
37
|
+
{
|
|
38
|
+
// collect — itemId = item that must appear in the player's inventory
|
|
39
|
+
// talk — itemId = provideItemId of the CyberiaAction to interact with
|
|
40
|
+
// kill — itemId = skin item ID of the target entity
|
|
41
|
+
type: { type: String, required: true, enum: QUEST_STEPS_TYPES },
|
|
42
|
+
itemId: { type: String, required: true, trim: true },
|
|
43
|
+
quantity: { type: Number, default: 1, min: 1 },
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
|
|
49
|
+
// ── Rewards ───────────────────────────────────────────────────────────
|
|
50
|
+
rewards: [
|
|
51
|
+
{
|
|
52
|
+
itemId: { type: String, required: true, trim: true },
|
|
53
|
+
quantity: { type: Number, default: 1, min: 1 },
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{ timestamps: true },
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CyberiaQuestSchema.index({ code: 1 }, { unique: true });
|
|
61
|
+
CyberiaQuestSchema.index({ sourceMapCode: 1, sourceCellX: 1, sourceCellY: 1 });
|
|
62
|
+
|
|
63
|
+
const CyberiaQuestModel = model('CyberiaQuest', CyberiaQuestSchema);
|
|
64
|
+
|
|
65
|
+
const ProviderSchema = CyberiaQuestSchema;
|
|
66
|
+
|
|
67
|
+
export { CyberiaQuestSchema, CyberiaQuestModel, ProviderSchema };
|