cyberia 2.8.885

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.
Files changed (525) hide show
  1. package/.dockerignore +15 -0
  2. package/.env.development +45 -0
  3. package/.env.production +50 -0
  4. package/.env.test +45 -0
  5. package/.github/workflows/engine-cyberia.cd.yml +31 -0
  6. package/.github/workflows/engine-cyberia.ci.yml +60 -0
  7. package/.github/workflows/ghpkg.ci.yml +87 -0
  8. package/.github/workflows/npmpkg.ci.yml +72 -0
  9. package/.github/workflows/publish.ci.yml +84 -0
  10. package/.github/workflows/publish.cyberia.ci.yml +84 -0
  11. package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
  12. package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
  13. package/.github/workflows/release.cd.yml +37 -0
  14. package/.nycrc +9 -0
  15. package/.prettierignore +13 -0
  16. package/.prettierrc +9 -0
  17. package/.vscode/extensions.json +51 -0
  18. package/.vscode/settings.json +87 -0
  19. package/AUTHORS.md +21 -0
  20. package/CHANGELOG.md +205 -0
  21. package/Dockerfile +28 -0
  22. package/LICENSE +21 -0
  23. package/README.md +85 -0
  24. package/bin/build.js +209 -0
  25. package/bin/cron.js +47 -0
  26. package/bin/cyberia.js +145 -0
  27. package/bin/db.js +199 -0
  28. package/bin/deploy.js +1293 -0
  29. package/bin/file.js +197 -0
  30. package/bin/hwt.js +49 -0
  31. package/bin/index.js +145 -0
  32. package/bin/ssl.js +63 -0
  33. package/bin/util.js +80 -0
  34. package/bin/vs.js +74 -0
  35. package/cli.md +714 -0
  36. package/conf.js +204 -0
  37. package/deployment.yaml +138 -0
  38. package/jsconfig.json +7 -0
  39. package/jsdoc.json +32 -0
  40. package/manifests/deployment/adminer/deployment.yaml +32 -0
  41. package/manifests/deployment/adminer/kustomization.yaml +7 -0
  42. package/manifests/deployment/adminer/service.yaml +13 -0
  43. package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
  44. package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
  45. package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
  46. package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
  47. package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
  48. package/manifests/deployment/fastapi/backend-service.yml +19 -0
  49. package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
  50. package/manifests/deployment/fastapi/frontend-service.yml +15 -0
  51. package/manifests/deployment/fastapi/initial_data.sh +56 -0
  52. package/manifests/deployment/kafka/deployment.yaml +69 -0
  53. package/manifests/deployment/mongo-express/deployment.yaml +60 -0
  54. package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
  55. package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
  56. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
  57. package/manifests/envoy-service-nodeport.yaml +23 -0
  58. package/manifests/grafana/deployment.yaml +57 -0
  59. package/manifests/grafana/kustomization.yaml +7 -0
  60. package/manifests/grafana/pvc.yaml +12 -0
  61. package/manifests/grafana/service.yaml +14 -0
  62. package/manifests/kind-config-dev.yaml +12 -0
  63. package/manifests/kind-config.yaml +12 -0
  64. package/manifests/kubeadm-calico-config.yaml +119 -0
  65. package/manifests/kubelet-config.yaml +65 -0
  66. package/manifests/letsencrypt-prod.yaml +15 -0
  67. package/manifests/lxd/lxd-admin-profile.yaml +17 -0
  68. package/manifests/lxd/lxd-preseed.yaml +30 -0
  69. package/manifests/lxd/underpost-setup.sh +163 -0
  70. package/manifests/mariadb/config.yaml +10 -0
  71. package/manifests/mariadb/kustomization.yaml +9 -0
  72. package/manifests/mariadb/pv.yaml +12 -0
  73. package/manifests/mariadb/pvc.yaml +10 -0
  74. package/manifests/mariadb/secret.yaml +8 -0
  75. package/manifests/mariadb/service.yaml +10 -0
  76. package/manifests/mariadb/statefulset.yaml +56 -0
  77. package/manifests/mariadb/storage-class.yaml +10 -0
  78. package/manifests/mongodb/backup-access.yaml +16 -0
  79. package/manifests/mongodb/backup-cronjob.yaml +42 -0
  80. package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
  81. package/manifests/mongodb/configmap.yaml +26 -0
  82. package/manifests/mongodb/headless-service.yaml +10 -0
  83. package/manifests/mongodb/kustomization.yaml +11 -0
  84. package/manifests/mongodb/pv-pvc.yaml +23 -0
  85. package/manifests/mongodb/statefulset.yaml +126 -0
  86. package/manifests/mongodb/storage-class.yaml +9 -0
  87. package/manifests/mongodb-4.4/kustomization.yaml +7 -0
  88. package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
  89. package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
  90. package/manifests/mysql/kustomization.yaml +7 -0
  91. package/manifests/mysql/pv-pvc.yaml +27 -0
  92. package/manifests/mysql/statefulset.yaml +55 -0
  93. package/manifests/postgresql/configmap.yaml +9 -0
  94. package/manifests/postgresql/kustomization.yaml +10 -0
  95. package/manifests/postgresql/pv.yaml +15 -0
  96. package/manifests/postgresql/pvc.yaml +13 -0
  97. package/manifests/postgresql/service.yaml +10 -0
  98. package/manifests/postgresql/statefulset.yaml +37 -0
  99. package/manifests/prometheus/deployment.yaml +82 -0
  100. package/manifests/valkey/kustomization.yaml +7 -0
  101. package/manifests/valkey/service.yaml +11 -0
  102. package/manifests/valkey/statefulset.yaml +38 -0
  103. package/nodemon.json +6 -0
  104. package/package.json +118 -0
  105. package/proxy.yaml +35 -0
  106. package/scripts/device-scan.sh +43 -0
  107. package/scripts/gpu-diag.sh +19 -0
  108. package/scripts/maas-setup.sh +120 -0
  109. package/scripts/nat-iptables.sh +26 -0
  110. package/scripts/nvim.sh +91 -0
  111. package/scripts/snap-clean.sh +26 -0
  112. package/scripts/ssh-cluster-info.sh +14 -0
  113. package/scripts/ssl.sh +164 -0
  114. package/src/api/blockchain/blockchain.controller.js +51 -0
  115. package/src/api/blockchain/blockchain.model.js +90 -0
  116. package/src/api/blockchain/blockchain.router.js +21 -0
  117. package/src/api/blockchain/blockchain.service.js +24 -0
  118. package/src/api/core/core.controller.js +69 -0
  119. package/src/api/core/core.model.js +11 -0
  120. package/src/api/core/core.router.js +24 -0
  121. package/src/api/core/core.service.js +35 -0
  122. package/src/api/crypto/crypto.controller.js +51 -0
  123. package/src/api/crypto/crypto.model.js +23 -0
  124. package/src/api/crypto/crypto.router.js +20 -0
  125. package/src/api/crypto/crypto.service.js +64 -0
  126. package/src/api/default/default.controller.js +74 -0
  127. package/src/api/default/default.model.js +20 -0
  128. package/src/api/default/default.router.js +27 -0
  129. package/src/api/default/default.service.js +40 -0
  130. package/src/api/document/document.controller.js +66 -0
  131. package/src/api/document/document.model.js +51 -0
  132. package/src/api/document/document.router.js +24 -0
  133. package/src/api/document/document.service.js +133 -0
  134. package/src/api/file/file.controller.js +67 -0
  135. package/src/api/file/file.model.js +19 -0
  136. package/src/api/file/file.router.js +22 -0
  137. package/src/api/file/file.service.js +100 -0
  138. package/src/api/instance/instance.controller.js +69 -0
  139. package/src/api/instance/instance.model.js +40 -0
  140. package/src/api/instance/instance.router.js +34 -0
  141. package/src/api/instance/instance.service.js +70 -0
  142. package/src/api/ipfs/ipfs.controller.js +51 -0
  143. package/src/api/ipfs/ipfs.model.js +17 -0
  144. package/src/api/ipfs/ipfs.router.js +20 -0
  145. package/src/api/ipfs/ipfs.service.js +25 -0
  146. package/src/api/object-layer/README.md +85 -0
  147. package/src/api/object-layer/object-layer.controller.js +69 -0
  148. package/src/api/object-layer/object-layer.model.js +181 -0
  149. package/src/api/object-layer/object-layer.router.js +29 -0
  150. package/src/api/object-layer/object-layer.service.js +49 -0
  151. package/src/api/test/test.controller.js +59 -0
  152. package/src/api/test/test.model.js +14 -0
  153. package/src/api/test/test.router.js +21 -0
  154. package/src/api/test/test.service.js +35 -0
  155. package/src/api/user/postman_collection.json +216 -0
  156. package/src/api/user/user.build.js +16 -0
  157. package/src/api/user/user.controller.js +35 -0
  158. package/src/api/user/user.model.js +100 -0
  159. package/src/api/user/user.router.js +400 -0
  160. package/src/api/user/user.service.js +500 -0
  161. package/src/api.js +23 -0
  162. package/src/cli/baremetal.js +1310 -0
  163. package/src/cli/cloud-init.js +548 -0
  164. package/src/cli/cluster.js +834 -0
  165. package/src/cli/cron.js +95 -0
  166. package/src/cli/db.js +414 -0
  167. package/src/cli/deploy.js +661 -0
  168. package/src/cli/env.js +101 -0
  169. package/src/cli/fs.js +256 -0
  170. package/src/cli/image.js +156 -0
  171. package/src/cli/index.js +436 -0
  172. package/src/cli/lxd.js +402 -0
  173. package/src/cli/monitor.js +260 -0
  174. package/src/cli/repository.js +274 -0
  175. package/src/cli/run.js +728 -0
  176. package/src/cli/script.js +85 -0
  177. package/src/cli/secrets.js +71 -0
  178. package/src/cli/ssh.js +46 -0
  179. package/src/cli/test.js +159 -0
  180. package/src/client/Cyberia.index.js +50 -0
  181. package/src/client/CyberiaAdmin.index.js +34 -0
  182. package/src/client/CyberiaPortal.index.js +36 -0
  183. package/src/client/Default.index.js +84 -0
  184. package/src/client/components/core/404.js +20 -0
  185. package/src/client/components/core/500.js +20 -0
  186. package/src/client/components/core/Account.js +326 -0
  187. package/src/client/components/core/AgGrid.js +191 -0
  188. package/src/client/components/core/Alert.js +77 -0
  189. package/src/client/components/core/Auth.js +342 -0
  190. package/src/client/components/core/Badge.js +32 -0
  191. package/src/client/components/core/Blockchain.js +41 -0
  192. package/src/client/components/core/Blog.js +9 -0
  193. package/src/client/components/core/BtnIcon.js +111 -0
  194. package/src/client/components/core/CalendarCore.js +464 -0
  195. package/src/client/components/core/Chat.js +64 -0
  196. package/src/client/components/core/ColorPalette.js +5267 -0
  197. package/src/client/components/core/CommonJs.js +1010 -0
  198. package/src/client/components/core/Content.js +196 -0
  199. package/src/client/components/core/Css.js +1099 -0
  200. package/src/client/components/core/CssCore.js +882 -0
  201. package/src/client/components/core/D3Chart.js +44 -0
  202. package/src/client/components/core/Docs.js +376 -0
  203. package/src/client/components/core/DropDown.js +223 -0
  204. package/src/client/components/core/EventsUI.js +133 -0
  205. package/src/client/components/core/FileExplorer.js +707 -0
  206. package/src/client/components/core/FullScreen.js +36 -0
  207. package/src/client/components/core/Input.js +383 -0
  208. package/src/client/components/core/JoyStick.js +80 -0
  209. package/src/client/components/core/Keyboard.js +73 -0
  210. package/src/client/components/core/LoadingAnimation.js +159 -0
  211. package/src/client/components/core/LogIn.js +190 -0
  212. package/src/client/components/core/LogOut.js +63 -0
  213. package/src/client/components/core/Logger.js +29 -0
  214. package/src/client/components/core/Modal.js +2494 -0
  215. package/src/client/components/core/NotificationManager.js +84 -0
  216. package/src/client/components/core/ObjectLayerEngine.js +1229 -0
  217. package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
  218. package/src/client/components/core/Pagination.js +207 -0
  219. package/src/client/components/core/Panel.js +772 -0
  220. package/src/client/components/core/PanelForm.js +627 -0
  221. package/src/client/components/core/Polyhedron.js +162 -0
  222. package/src/client/components/core/Recover.js +207 -0
  223. package/src/client/components/core/Responsive.js +82 -0
  224. package/src/client/components/core/RichText.js +43 -0
  225. package/src/client/components/core/Router.js +317 -0
  226. package/src/client/components/core/Scroll.js +76 -0
  227. package/src/client/components/core/SignUp.js +125 -0
  228. package/src/client/components/core/SocketIo.js +74 -0
  229. package/src/client/components/core/Stream.js +113 -0
  230. package/src/client/components/core/ToggleSwitch.js +101 -0
  231. package/src/client/components/core/ToolTip.js +90 -0
  232. package/src/client/components/core/Translate.js +522 -0
  233. package/src/client/components/core/Validator.js +115 -0
  234. package/src/client/components/core/VanillaJs.js +423 -0
  235. package/src/client/components/core/Wallet.js +106 -0
  236. package/src/client/components/core/WebComponent.js +44 -0
  237. package/src/client/components/core/Webhook.js +25 -0
  238. package/src/client/components/core/Worker.js +371 -0
  239. package/src/client/components/core/windowGetDimensions.js +269 -0
  240. package/src/client/components/cyberia/BagCyberia.js +1253 -0
  241. package/src/client/components/cyberia/BiomeCyberia.js +130 -0
  242. package/src/client/components/cyberia/CharacterCyberia.js +321 -0
  243. package/src/client/components/cyberia/CommonCyberia.js +1834 -0
  244. package/src/client/components/cyberia/CssCyberia.js +816 -0
  245. package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
  246. package/src/client/components/cyberia/ElementsCyberia.js +146 -0
  247. package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
  248. package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
  249. package/src/client/components/cyberia/LogInCyberia.js +68 -0
  250. package/src/client/components/cyberia/LogOutCyberia.js +24 -0
  251. package/src/client/components/cyberia/MainUserCyberia.js +424 -0
  252. package/src/client/components/cyberia/MapCyberia.js +160 -0
  253. package/src/client/components/cyberia/MatrixCyberia.js +147 -0
  254. package/src/client/components/cyberia/MenuCyberia.js +575 -0
  255. package/src/client/components/cyberia/PixiCyberia.js +1639 -0
  256. package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
  257. package/src/client/components/cyberia/QuestCyberia.js +1420 -0
  258. package/src/client/components/cyberia/RoutesCyberia.js +47 -0
  259. package/src/client/components/cyberia/SettingsCyberia.js +16 -0
  260. package/src/client/components/cyberia/SignUpCyberia.js +14 -0
  261. package/src/client/components/cyberia/SkillCyberia.js +124 -0
  262. package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
  263. package/src/client/components/cyberia/TileCyberia.js +685 -0
  264. package/src/client/components/cyberia/TranslateCyberia.js +96 -0
  265. package/src/client/components/cyberia/UniverseCyberia.js +14 -0
  266. package/src/client/components/cyberia/WebhookCyberia.js +13 -0
  267. package/src/client/components/cyberia/WikiCyberia.js +144 -0
  268. package/src/client/components/cyberia/WorldCyberia.js +680 -0
  269. package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
  270. package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
  271. package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
  272. package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
  273. package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
  274. package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
  275. package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
  276. package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
  277. package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
  278. package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
  279. package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
  280. package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
  281. package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
  282. package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
  283. package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
  284. package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
  285. package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
  286. package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
  287. package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
  288. package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
  289. package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
  290. package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
  291. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
  292. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
  293. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
  294. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
  295. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
  296. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
  297. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
  298. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
  299. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
  300. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
  301. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
  302. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
  303. package/src/client/components/default/CommonDefault.js +29 -0
  304. package/src/client/components/default/CssDefault.js +27 -0
  305. package/src/client/components/default/ElementsDefault.js +38 -0
  306. package/src/client/components/default/LogInDefault.js +14 -0
  307. package/src/client/components/default/LogOutDefault.js +10 -0
  308. package/src/client/components/default/MenuDefault.js +743 -0
  309. package/src/client/components/default/RoutesDefault.js +48 -0
  310. package/src/client/components/default/SettingsDefault.js +16 -0
  311. package/src/client/components/default/SignUpDefault.js +9 -0
  312. package/src/client/components/default/SocketIoDefault.js +54 -0
  313. package/src/client/components/default/TranslateDefault.js +7 -0
  314. package/src/client/public/default/android-chrome-144x144.png +0 -0
  315. package/src/client/public/default/android-chrome-192x192.png +0 -0
  316. package/src/client/public/default/android-chrome-256x256.png +0 -0
  317. package/src/client/public/default/android-chrome-36x36.png +0 -0
  318. package/src/client/public/default/android-chrome-384x384.png +0 -0
  319. package/src/client/public/default/android-chrome-48x48.png +0 -0
  320. package/src/client/public/default/android-chrome-512x512.png +0 -0
  321. package/src/client/public/default/android-chrome-72x72.png +0 -0
  322. package/src/client/public/default/android-chrome-96x96.png +0 -0
  323. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  324. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  325. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  326. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  327. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  328. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  329. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  330. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  331. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  332. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  333. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  334. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  335. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  336. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  337. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  338. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  339. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  340. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  341. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  342. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  343. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  344. package/src/client/public/default/apple-touch-icon.png +0 -0
  345. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  346. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  347. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  348. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  349. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  350. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  351. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  352. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  353. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  354. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  355. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  356. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  357. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  358. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  359. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  360. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  361. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  362. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  363. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  364. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  365. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  366. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  367. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  368. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  369. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  370. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  371. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  372. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  373. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  374. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  375. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  376. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  377. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  378. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  379. package/src/client/public/default/assets/background/dark.jpg +0 -0
  380. package/src/client/public/default/assets/background/dark.svg +557 -0
  381. package/src/client/public/default/assets/background/white.jpg +0 -0
  382. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  383. package/src/client/public/default/assets/background/white0.jpg +0 -0
  384. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  385. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  386. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  387. package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
  388. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  389. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  390. package/src/client/public/default/browserconfig.xml +12 -0
  391. package/src/client/public/default/favicon-16x16.png +0 -0
  392. package/src/client/public/default/favicon-32x32.png +0 -0
  393. package/src/client/public/default/favicon-48x48.png +0 -0
  394. package/src/client/public/default/favicon.ico +0 -0
  395. package/src/client/public/default/manifest.webmanifest +69 -0
  396. package/src/client/public/default/mstile-144x144.png +0 -0
  397. package/src/client/public/default/mstile-150x150.png +0 -0
  398. package/src/client/public/default/mstile-310x150.png +0 -0
  399. package/src/client/public/default/mstile-310x310.png +0 -0
  400. package/src/client/public/default/mstile-70x70.png +0 -0
  401. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  402. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  403. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  404. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  405. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  406. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  407. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  408. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  409. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  410. package/src/client/public/default/site.webmanifest +69 -0
  411. package/src/client/public/default/sitemap +148 -0
  412. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  413. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  414. package/src/client/public/doc/favicon.ico +0 -0
  415. package/src/client/public/doc/sitemap +148 -0
  416. package/src/client/public/test/favicon.ico +0 -0
  417. package/src/client/public/test/sitemap +148 -0
  418. package/src/client/services/blockchain/blockchain.service.js +73 -0
  419. package/src/client/services/core/core.service.js +165 -0
  420. package/src/client/services/crypto/crypto.service.js +73 -0
  421. package/src/client/services/default/default.management.js +450 -0
  422. package/src/client/services/default/default.service.js +98 -0
  423. package/src/client/services/document/document.service.js +97 -0
  424. package/src/client/services/file/file.service.js +72 -0
  425. package/src/client/services/instance/instance.management.js +78 -0
  426. package/src/client/services/instance/instance.service.js +97 -0
  427. package/src/client/services/ipfs/ipfs.service.js +73 -0
  428. package/src/client/services/object-layer/object-layer.service.js +93 -0
  429. package/src/client/services/test/test.service.js +73 -0
  430. package/src/client/services/user/user.management.js +56 -0
  431. package/src/client/services/user/user.service.js +108 -0
  432. package/src/client/ssr/Render.js +237 -0
  433. package/src/client/ssr/body/404.js +73 -0
  434. package/src/client/ssr/body/500.js +72 -0
  435. package/src/client/ssr/body/CacheControl.js +114 -0
  436. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
  437. package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
  438. package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
  439. package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
  440. package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
  441. package/src/client/ssr/head/Css.js +241 -0
  442. package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
  443. package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
  444. package/src/client/ssr/head/CyberiaScripts.js +6 -0
  445. package/src/client/ssr/head/DefaultScripts.js +6 -0
  446. package/src/client/ssr/head/Microdata.js +11 -0
  447. package/src/client/ssr/head/Production.js +1 -0
  448. package/src/client/ssr/head/Pwa.js +146 -0
  449. package/src/client/ssr/head/Seo.js +15 -0
  450. package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
  451. package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
  452. package/src/client/ssr/offline/Maintenance.js +63 -0
  453. package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
  454. package/src/client/ssr/pages/404.js +12 -0
  455. package/src/client/ssr/pages/500.js +12 -0
  456. package/src/client/ssr/pages/Test.js +198 -0
  457. package/src/client/ssr/pages/maintenance.js +14 -0
  458. package/src/client/ssr/pages/offline.js +21 -0
  459. package/src/client/sw/default.sw.js +108 -0
  460. package/src/client/sw/template.sw.js +84 -0
  461. package/src/client.build.js +22 -0
  462. package/src/client.dev.js +24 -0
  463. package/src/db/DataBaseProvider.js +98 -0
  464. package/src/db/mariadb/MariaDB.js +66 -0
  465. package/src/db/mongo/MongooseDB.js +70 -0
  466. package/src/index.js +198 -0
  467. package/src/mailer/EmailRender.js +116 -0
  468. package/src/mailer/MailerProvider.js +213 -0
  469. package/src/monitor.js +24 -0
  470. package/src/proxy.js +22 -0
  471. package/src/runtime/express/Express.js +256 -0
  472. package/src/runtime/lampp/Dockerfile +50 -0
  473. package/src/runtime/lampp/Lampp.js +343 -0
  474. package/src/server/auth.js +689 -0
  475. package/src/server/backup.js +96 -0
  476. package/src/server/client-build-docs.js +205 -0
  477. package/src/server/client-build-live.js +109 -0
  478. package/src/server/client-build.js +690 -0
  479. package/src/server/client-dev-server.js +87 -0
  480. package/src/server/client-formatted.js +87 -0
  481. package/src/server/client-icons.js +108 -0
  482. package/src/server/conf.js +1071 -0
  483. package/src/server/crypto.js +210 -0
  484. package/src/server/dns.js +276 -0
  485. package/src/server/downloader.js +74 -0
  486. package/src/server/json-schema.js +77 -0
  487. package/src/server/logger.js +197 -0
  488. package/src/server/network.js +72 -0
  489. package/src/server/object-layer.js +294 -0
  490. package/src/server/peer.js +69 -0
  491. package/src/server/process.js +171 -0
  492. package/src/server/proxy.js +110 -0
  493. package/src/server/runtime.js +170 -0
  494. package/src/server/ssr.js +127 -0
  495. package/src/server/start.js +161 -0
  496. package/src/server/tls.js +251 -0
  497. package/src/server/valkey.js +293 -0
  498. package/src/server.js +25 -0
  499. package/src/ws/IoInterface.js +139 -0
  500. package/src/ws/IoServer.js +88 -0
  501. package/src/ws/core/channels/core.ws.chat.js +23 -0
  502. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  503. package/src/ws/core/channels/core.ws.stream.js +31 -0
  504. package/src/ws/core/core.ws.connection.js +62 -0
  505. package/src/ws/core/core.ws.emit.js +53 -0
  506. package/src/ws/core/core.ws.server.js +76 -0
  507. package/src/ws/core/management/core.ws.chat.js +8 -0
  508. package/src/ws/core/management/core.ws.mailer.js +16 -0
  509. package/src/ws/core/management/core.ws.stream.js +8 -0
  510. package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
  511. package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
  512. package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
  513. package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
  514. package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
  515. package/src/ws/cyberia/cyberia.ws.server.js +67 -0
  516. package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
  517. package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
  518. package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
  519. package/src/ws/default/channels/default.ws.main.js +16 -0
  520. package/src/ws/default/default.ws.connection.js +22 -0
  521. package/src/ws/default/default.ws.emit.js +14 -0
  522. package/src/ws/default/default.ws.server.js +20 -0
  523. package/src/ws/default/management/default.ws.main.js +8 -0
  524. package/test/api.test.js +53 -0
  525. package/test/crypto.test.js +117 -0
@@ -0,0 +1,1253 @@
1
+ import Sortable from 'sortablejs';
2
+ import { getId, range, uniqueArray } from '../core/CommonJs.js';
3
+ import { htmls, s } from '../core/VanillaJs.js';
4
+ import { getProxyPath } from '../core/Router.js';
5
+ import { ElementsCyberia } from './ElementsCyberia.js';
6
+ import { Css, Themes, borderChar, dynamicCol } from '../core/Css.js';
7
+ import { EventsUI } from '../core/EventsUI.js';
8
+ import { Modal, renderViewTitle } from '../core/Modal.js';
9
+ import { Translate } from '../core/Translate.js';
10
+ import { DisplayComponent, QuestComponent, SkillCyberiaData, Stat, getK } from './CommonCyberia.js';
11
+ import { BtnIcon } from '../core/BtnIcon.js';
12
+ import { SocketIo } from '../core/SocketIo.js';
13
+ import { PixiCyberia } from './PixiCyberia.js';
14
+ import { loggerFactory } from '../core/Logger.js';
15
+ import { CharacterCyberia } from './CharacterCyberia.js';
16
+ import { SkillCyberia } from './SkillCyberia.js';
17
+ import { QuestManagementCyberia } from './QuestCyberia.js';
18
+ import { NotificationManager } from '../core/NotificationManager.js';
19
+ import { CyberiaItemService } from '../../services/cyberia-item/cyberia-item.service.js';
20
+ import { LoadingAnimation } from '../core/LoadingAnimation.js';
21
+
22
+ const logger = loggerFactory(import.meta);
23
+
24
+ const ItemModal = {
25
+ Render: async function (
26
+ options = {
27
+ idModal: '',
28
+ item: { type: '', id: '' },
29
+ bagId: '',
30
+ itemData: {},
31
+ context: '',
32
+ storageBotId: '',
33
+ },
34
+ ) {
35
+ const { idModal, item, bagId, itemData, storageBotId } = options;
36
+ const id0 = `${idModal}-section-0`;
37
+ const id1 = `${idModal}-section-1`;
38
+
39
+ setTimeout(async () => {
40
+ htmls(`.${id0}-render-col-a`, this.RenderStat(Stat.get[item.id](), { 'item type': item.type }));
41
+ switch (options.context) {
42
+ case 'seller':
43
+ {
44
+ const elementOwnerType = 'user';
45
+ const elementOwnerId = 'main';
46
+ const sellFactor = 0.5;
47
+ const itemStat = Stat.get[itemData.id]();
48
+ const { basePrice } = itemStat;
49
+ let countCurrentItem = 0;
50
+ switch (item.type) {
51
+ case 'weapon':
52
+ {
53
+ countCurrentItem = ElementsCyberia.Data[elementOwnerType][elementOwnerId].weapon.tree.filter(
54
+ (i) => i.id === item.id,
55
+ ).length;
56
+ }
57
+
58
+ break;
59
+
60
+ default:
61
+ break;
62
+ }
63
+
64
+ htmls(
65
+ `.${id0}-render-col-b`,
66
+ html`<div class="section-mp item-modal-container">
67
+ ${await BtnIcon.Render({
68
+ label: html`
69
+ <div class="in fll">${Translate.Render('buy')}</div>
70
+ <div class="in flr">
71
+ ${ElementsCyberia.Data[elementOwnerType][elementOwnerId].coin} /
72
+ <span class="total-price-buy-${item.type}-${idModal}">${basePrice}</span>
73
+ <img
74
+ class="inl icon-img-btn-item-modal"
75
+ src="${getProxyPath()}assets/coin/coin/animation.gif"
76
+ />
77
+ </div>
78
+ `,
79
+ type: 'button',
80
+ class: `btn-buy-${item.type}-${idModal} inl wfa`,
81
+ })}
82
+ <div class="fl">
83
+ <div class="in flr">
84
+ x<input
85
+ type="number"
86
+ value="1"
87
+ min="0"
88
+ max="10"
89
+ class="item-modal-quantity-input buy-btn-quantity-input-${item.type}-${idModal}"
90
+ />
91
+ / 10
92
+ </div>
93
+ </div>
94
+ </div>
95
+
96
+ <div class="section-mp item-modal-container">
97
+ ${await BtnIcon.Render({
98
+ label: html`
99
+ <div class="in fll">${Translate.Render('sell')}</div>
100
+ <div class="in flr">
101
+ <span class="total-price-sell-${item.type}-${idModal}">${basePrice * sellFactor}</span>
102
+ / ${basePrice * countCurrentItem * sellFactor}
103
+ <img
104
+ class="inl icon-img-btn-item-modal"
105
+ src="${getProxyPath()}assets/coin/coin/animation.gif"
106
+ />
107
+ </div>
108
+ `,
109
+ type: 'button',
110
+ class: `btn-sell-${item.type}-${idModal} inl wfa`,
111
+ })}
112
+ <div class="fl">
113
+ <div class="in flr">
114
+ x<input
115
+ type="number"
116
+ value="1"
117
+ min="0"
118
+ max="${countCurrentItem}"
119
+ class="item-modal-quantity-input sell-btn-quantity-input-${item.type}-${idModal}"
120
+ />
121
+ / ${countCurrentItem}
122
+ </div>
123
+ </div>
124
+ </div> `,
125
+ );
126
+ const onChangeQuantityBuyItemInput = () => {
127
+ htmls(
128
+ `.total-price-buy-${item.type}-${idModal}`,
129
+ s(`.buy-btn-quantity-input-${item.type}-${idModal}`).value * basePrice,
130
+ );
131
+ };
132
+ s(`.buy-btn-quantity-input-${item.type}-${idModal}`).onblur = onChangeQuantityBuyItemInput;
133
+ s(`.buy-btn-quantity-input-${item.type}-${idModal}`).oninput = onChangeQuantityBuyItemInput;
134
+ EventsUI.onClick(`.btn-buy-${item.type}-${idModal}`, async () => {
135
+ if (ElementsCyberia.Data[elementOwnerType][elementOwnerId].coin < basePrice) {
136
+ NotificationManager.Push({
137
+ html: Translate.Render('insufficient-cash'),
138
+ status: 'error',
139
+ });
140
+ return;
141
+ }
142
+ const result = await CyberiaItemService.post({ id: `buy/${storageBotId}/${item.type}/${item.id}` });
143
+ if (result.status === 'success') {
144
+ ElementsCyberia.Data[elementOwnerType][elementOwnerId].coin -= basePrice;
145
+ Slot.coin.update({ bagId: 'cyberia-bag', type: elementOwnerType, id: elementOwnerId });
146
+
147
+ ElementsCyberia.Data[elementOwnerType][elementOwnerId][item.type].tree.push({ id: item.id });
148
+ if (
149
+ !ElementsCyberia.Data[elementOwnerType][elementOwnerId].components[item.type].find(
150
+ (c) => c.displayId === item.id,
151
+ )
152
+ ) {
153
+ ElementsCyberia.Data[elementOwnerType][elementOwnerId].components[item.type].push(
154
+ DisplayComponent.get[item.id](),
155
+ );
156
+ }
157
+ Slot[item.type].update({
158
+ bagId: 'cyberia-bag',
159
+ displayId: item.id,
160
+ type: elementOwnerType,
161
+ id: elementOwnerId,
162
+ });
163
+ }
164
+ });
165
+
166
+ const onChangeQuantitySellItemInput = () => {
167
+ htmls(
168
+ `.total-price-sell-${item.type}-${idModal}`,
169
+ s(`.sell-btn-quantity-input-${item.type}-${idModal}`).value * basePrice * sellFactor,
170
+ );
171
+ };
172
+ s(`.sell-btn-quantity-input-${item.type}-${idModal}`).onblur = onChangeQuantitySellItemInput;
173
+ s(`.sell-btn-quantity-input-${item.type}-${idModal}`).oninput = onChangeQuantitySellItemInput;
174
+ EventsUI.onClick(`.btn-sell-${item.type}-${idModal}`, () => {});
175
+ }
176
+ break;
177
+
178
+ case 'reward': {
179
+ break;
180
+ }
181
+
182
+ default:
183
+ {
184
+ if (['resources', 'coin', 'quest'].includes(item.type)) break;
185
+ htmls(
186
+ `.${id0}-render-col-b`,
187
+ html`${await BtnIcon.Render({
188
+ label: renderViewTitle({
189
+ 'ui-icon': `equip.png`,
190
+ text: html`${Translate.Render('equip')}`,
191
+ top: 2,
192
+ topText: 0,
193
+ }),
194
+ type: 'button',
195
+ class: `btn-equip-${item.type}-${idModal} section-mp-btn inl wfa`,
196
+ })}
197
+ ${await BtnIcon.Render({
198
+ label: renderViewTitle({
199
+ 'ui-icon': `unequip.png`,
200
+ text: html`${Translate.Render('unequip')}`,
201
+ top: 2,
202
+ topText: 0,
203
+ }),
204
+ type: 'button',
205
+ class: `btn-unequip-${item.type}-${idModal} section-mp-btn inl wfa`,
206
+ })} `,
207
+ );
208
+ EventsUI.onClick(`.btn-equip-${item.type}-${idModal}`, () => {
209
+ const payload = BagCyberia.Tokens[bagId].owner;
210
+ payload[item.type] = item;
211
+ this.Equip[item.type](payload);
212
+ });
213
+ EventsUI.onClick(`.btn-unequip-${item.type}-${idModal}`, () => {
214
+ const payload = BagCyberia.Tokens[bagId].owner;
215
+ payload[item.type] = item;
216
+ this.Unequip[item.type](payload);
217
+ });
218
+ }
219
+ break;
220
+ }
221
+
222
+ htmls(
223
+ `.${id1}-render-col-a`,
224
+ html`
225
+ <img
226
+ class="in item-modal-img"
227
+ src="${getProxyPath()}assets/${item.type}/${item.id}/${item.type === 'skin'
228
+ ? `08/0.${DisplayComponent.get[item.id]().extension}`
229
+ : `animation.gif`}"
230
+ />
231
+ `,
232
+ );
233
+ });
234
+ return html`
235
+ ${dynamicCol({ containerSelector: id0, id: id0, type: 'a-50-b-50', limit: 500 })}
236
+ <div class="fl ${id0}">
237
+ <div class="in fll ${id0}-col-a">
238
+ <div class="in item-modal-section-cell section-mp ${id0}-render-col-a"></div>
239
+ </div>
240
+ <div class="in fll ${id0}-col-b">
241
+ <div class="in item-modal-section-cell section-mp ${id0}-render-col-b"></div>
242
+ </div>
243
+ </div>
244
+ ${dynamicCol({ containerSelector: id1, id: id1, type: 'a-50-b-50', limit: 500 })}
245
+ <div class="fl ${id1}">
246
+ <div class="in fll ${id1}-col-a">
247
+ <div class="in item-modal-section-cell section-mp ${id1}-render-col-a"></div>
248
+ </div>
249
+ <div class="in fll ${id1}-col-b">
250
+ <div class="in item-modal-section-cell section-mp ${id1}-render-col-b"></div>
251
+ </div>
252
+ </div>
253
+ `;
254
+ },
255
+ Equip: {
256
+ skill: function ({ type, id, skill, disabledSubEquip }) {
257
+ console.log('Equip skill', { type, id, skill });
258
+ ElementsCyberia.Data[type][id].skill.keys[SkillCyberiaData[skill.id].type] = skill.id;
259
+ SocketIo.Emit(type, {
260
+ status: 'update-skill',
261
+ element: { skill: ElementsCyberia.Data[type][id].skill },
262
+ });
263
+ const currentWeapon = ElementsCyberia.Data[type][id].components.weapon.find((w) => w.current);
264
+ if (currentWeapon && currentWeapon.displayId !== skill.id)
265
+ switch (currentWeapon.displayId) {
266
+ case 'hatchet':
267
+ {
268
+ ItemModal.Unequip.weapon({ type, id, weapon: skill, disabledSubEquip: true });
269
+ }
270
+
271
+ break;
272
+
273
+ case 'atlas_pistol_mk2_bullet':
274
+ {
275
+ ItemModal.Unequip.weapon({ type, id, weapon: { id: 'atlas_pistol_mk2' }, disabledSubEquip: true });
276
+ }
277
+ break;
278
+
279
+ default:
280
+ break;
281
+ }
282
+ if (!disabledSubEquip)
283
+ switch (skill.id) {
284
+ case 'hatchet':
285
+ {
286
+ this.weapon({ type, id, weapon: skill, disabledSubEquip: true });
287
+ }
288
+ break;
289
+ case 'atlas_pistol_mk2_bullet':
290
+ {
291
+ this.weapon({ type, id, weapon: { id: 'atlas_pistol_mk2' }, disabledSubEquip: true });
292
+ }
293
+ break;
294
+
295
+ default:
296
+ break;
297
+ }
298
+ CharacterCyberia.RenderCharacterCyberiaSkillSLot({ type, id, skillKey: SkillCyberiaData[skill.id].type });
299
+ SkillCyberia.setMainKeysSkillCyberia();
300
+ },
301
+ skin: function ({ type, id, skin }) {
302
+ ElementsCyberia.Data[type][id].components.skin = ElementsCyberia.Data[type][id].components.skin.map(
303
+ (skinData) => {
304
+ skinData.enabled = skinData.displayId === skin.id;
305
+ skinData.current = skinData.displayId === skin.id;
306
+ return skinData;
307
+ },
308
+ );
309
+ ElementsCyberia.Data[type][id] = Stat.set(type, ElementsCyberia.Data[type][id]);
310
+ PixiCyberia.setDisplayComponent({ type, id });
311
+ CharacterCyberia.renderCharacterCyberiaStat();
312
+ SocketIo.Emit(type, {
313
+ status: 'update-skin-position',
314
+ element: { components: { skin: ElementsCyberia.Data[type][id].components.skin } },
315
+ direction: ElementsCyberia.LocalDataScope[type][id].lastDirection,
316
+ updateStat: true,
317
+ });
318
+ CharacterCyberia.RenderCharacterCyberiaSLot({ type, id, componentType: 'skin' });
319
+ },
320
+ weapon: function ({ type, id, weapon, disabledSubEquip }) {
321
+ const currentWeapon = ElementsCyberia.Data[type][id].components.weapon.find((c) => c.current);
322
+ if (currentWeapon) {
323
+ ItemModal.Unequip.weapon({ type, id, weapon: { id: currentWeapon.displayId }, disabledSubEquip });
324
+ }
325
+ ElementsCyberia.Data[type][id].components.weapon = ElementsCyberia.Data[type][id].components.weapon.map(
326
+ (weaponData) => {
327
+ weaponData.enabled = weaponData.displayId === weapon.id;
328
+ weaponData.current = weaponData.displayId === weapon.id;
329
+ return weaponData;
330
+ },
331
+ );
332
+ ElementsCyberia.Data[type][id] = Stat.set(type, ElementsCyberia.Data[type][id]);
333
+ if (!disabledSubEquip)
334
+ switch (weapon.id) {
335
+ case 'hatchet':
336
+ {
337
+ this.skill({ type, id, skill: weapon, disabledSubEquip: true });
338
+ }
339
+ break;
340
+ case 'atlas_pistol_mk2':
341
+ {
342
+ this.skill({ type, id, skill: { id: 'atlas_pistol_mk2_bullet' }, disabledSubEquip: true });
343
+ }
344
+ break;
345
+ default:
346
+ break;
347
+ }
348
+ PixiCyberia.setDisplayComponent({ type, id });
349
+ CharacterCyberia.renderCharacterCyberiaStat();
350
+ SocketIo.Emit(type, {
351
+ status: 'update-item',
352
+ itemType: 'weapon',
353
+ element: { components: { weapon: ElementsCyberia.Data[type][id].components.weapon } },
354
+ });
355
+ CharacterCyberia.RenderCharacterCyberiaSLot({ type, id, componentType: 'weapon' });
356
+ },
357
+ breastplate: function ({ type, id, breastplate }) {
358
+ ElementsCyberia.Data[type][id].components.breastplate = ElementsCyberia.Data[type][id].components.breastplate.map(
359
+ (breastplateData) => {
360
+ breastplateData.enabled = breastplateData.displayId === breastplate.id;
361
+ breastplateData.current = breastplateData.displayId === breastplate.id;
362
+ return breastplateData;
363
+ },
364
+ );
365
+ ElementsCyberia.Data[type][id] = Stat.set(type, ElementsCyberia.Data[type][id]);
366
+ PixiCyberia.setDisplayComponent({ type, id });
367
+ CharacterCyberia.renderCharacterCyberiaStat();
368
+ SocketIo.Emit(type, {
369
+ status: 'update-item',
370
+ itemType: 'breastplate',
371
+ element: { components: { breastplate: ElementsCyberia.Data[type][id].components.breastplate } },
372
+ });
373
+ CharacterCyberia.RenderCharacterCyberiaSLot({ type, id, componentType: 'breastplate' });
374
+ },
375
+ },
376
+ Unequip: {
377
+ skill: function ({ type, id, skill, disabledSubEquip }) {
378
+ console.log('Unequip skill', { type, id, skill });
379
+ ElementsCyberia.Data[type][id].skill.keys[SkillCyberiaData[skill.id].type] = null;
380
+ if (!disabledSubEquip)
381
+ switch (skill.id) {
382
+ case 'hatchet':
383
+ {
384
+ this.weapon({ type, id, weapon: skill, disabledSubEquip: true });
385
+ }
386
+ break;
387
+ case 'atlas_pistol_mk2_bullet':
388
+ {
389
+ this.weapon({ type, id, weapon: { id: 'atlas_pistol_mk2' }, disabledSubEquip: true });
390
+ }
391
+ break;
392
+ default:
393
+ break;
394
+ }
395
+ SocketIo.Emit(type, {
396
+ status: 'update-skill',
397
+ element: { skill: ElementsCyberia.Data[type][id].skill },
398
+ });
399
+ CharacterCyberia.RenderCharacterCyberiaSkillSLot({ type, id, skillKey: SkillCyberiaData[skill.id].type });
400
+ SkillCyberia.setMainKeysSkillCyberia();
401
+ },
402
+ skin: function ({ type, id, skin }) {
403
+ ElementsCyberia.Data[type][id].components.skin = ElementsCyberia.Data[type][id].components.skin.map(
404
+ (skinData) => {
405
+ // skinData.enabled = skinData.displayId === (skin?.id ? skin.id : 'anon');
406
+ // skinData.current = skinData.displayId === (skin?.id ? skin.id : 'anon');
407
+ skinData.enabled = skinData.displayId === 'anon';
408
+ skinData.current = skinData.displayId === 'anon';
409
+ return skinData;
410
+ },
411
+ );
412
+ ElementsCyberia.Data[type][id] = Stat.set(type, ElementsCyberia.Data[type][id]);
413
+ PixiCyberia.setDisplayComponent({ type, id });
414
+ CharacterCyberia.renderCharacterCyberiaStat();
415
+ SocketIo.Emit(type, {
416
+ status: 'update-skin-position',
417
+ element: { components: { skin: ElementsCyberia.Data[type][id].components.skin } },
418
+ direction: ElementsCyberia.LocalDataScope[type][id].lastDirection,
419
+ updateStat: true,
420
+ });
421
+ CharacterCyberia.RenderCharacterCyberiaSLot({ type, id, componentType: 'skin' });
422
+ },
423
+ weapon: function ({ type, id, weapon, disabledSubEquip }) {
424
+ ElementsCyberia.Data[type][id].components.weapon = ElementsCyberia.Data[type][id].components.weapon.map(
425
+ (weaponData) => {
426
+ // weaponData.enabled = weapon?.id ? weaponData.displayId === weapon.id : false;
427
+ // weaponData.current = weapon?.id ? weaponData.displayId === weapon.id : false;
428
+ weaponData.enabled = false;
429
+ weaponData.current = false;
430
+ return weaponData;
431
+ },
432
+ );
433
+ ElementsCyberia.Data[type][id] = Stat.set(type, ElementsCyberia.Data[type][id]);
434
+ if (!disabledSubEquip)
435
+ switch (weapon.id) {
436
+ case 'hatchet':
437
+ {
438
+ this.skill({ type, id, skill: weapon, disabledSubEquip: true });
439
+ }
440
+ break;
441
+ case 'atlas_pistol_mk2':
442
+ {
443
+ this.skill({ type, id, skill: { id: 'atlas_pistol_mk2_bullet' }, disabledSubEquip: true });
444
+ }
445
+ break;
446
+ default:
447
+ break;
448
+ }
449
+ PixiCyberia.setDisplayComponent({ type, id });
450
+ CharacterCyberia.renderCharacterCyberiaStat();
451
+ SocketIo.Emit(type, {
452
+ status: 'update-item',
453
+ itemType: 'weapon',
454
+ element: { components: { weapon: ElementsCyberia.Data[type][id].components.weapon } },
455
+ });
456
+ CharacterCyberia.RenderCharacterCyberiaSLot({ type, id, componentType: 'weapon' });
457
+ },
458
+ breastplate: function ({ type, id, breastplate }) {
459
+ ElementsCyberia.Data[type][id].components.breastplate = ElementsCyberia.Data[type][id].components.breastplate.map(
460
+ (breastplateData) => {
461
+ // breastplateData.enabled = breastplate?.id ? breastplateData.displayId === breastplate.id : false;
462
+ // breastplateData.current = breastplate?.id ? breastplateData.displayId === breastplate.id : false;
463
+ breastplateData.enabled = false;
464
+ breastplateData.current = false;
465
+ return breastplateData;
466
+ },
467
+ );
468
+ ElementsCyberia.Data[type][id] = Stat.set(type, ElementsCyberia.Data[type][id]);
469
+ PixiCyberia.setDisplayComponent({ type, id });
470
+ CharacterCyberia.renderCharacterCyberiaStat();
471
+ SocketIo.Emit(type, {
472
+ status: 'update-item',
473
+ itemType: 'breastplate',
474
+ element: { components: { breastplate: ElementsCyberia.Data[type][id].components.breastplate } },
475
+ });
476
+ CharacterCyberia.RenderCharacterCyberiaSLot({ type, id, componentType: 'breastplate' });
477
+ },
478
+ },
479
+ RenderStat: function (statData, options) {
480
+ // TODO: xp, and level feature
481
+ const displayStats = [
482
+ 'id',
483
+ 'itemType',
484
+ 'dim',
485
+ 'vel',
486
+ 'maxLife',
487
+ 'life',
488
+ 'deadTime',
489
+ 'timeLife',
490
+ 'damage',
491
+ 'heal',
492
+ 'lifeRegeneration',
493
+ 'lifeRegenerationVel',
494
+ 'cooldown',
495
+ 'cooldownIncubation',
496
+ 'basePrice',
497
+ 'behavior',
498
+ 'timestamp',
499
+ ];
500
+ let statsRender = '';
501
+ if (options)
502
+ for (const statKey of Object.keys(options)) {
503
+ statsRender += html` <div class="in fll stat-table-cell stat-table-cell-key">
504
+ <div class="in section-mp">${statKey}</div>
505
+ </div>
506
+ <div class="in fll stat-table-cell">
507
+ <div class="in section-mp">${options[statKey] ?? '-'}</div>
508
+ </div>`;
509
+ }
510
+ for (const statKey of Object.keys(statData)) {
511
+ if (!displayStats.includes(statKey)) continue;
512
+ statsRender += html` <div class="in fll stat-table-cell stat-table-cell-key">
513
+ <div class="in section-mp">${statKey}</div>
514
+ </div>
515
+ <div class="in fll stat-table-cell">
516
+ <div class="in section-mp" ${statKey === 'basePrice' ? `style="top: -10px"` : ''}>
517
+ ${statData[statKey]}
518
+ ${statKey === 'basePrice'
519
+ ? html` <img
520
+ class="inl coin-slot-icon-img"
521
+ style="top: 6px"
522
+ src="${getProxyPath()}assets/coin/coin/animation.gif"
523
+ />`
524
+ : ''}
525
+ </div>
526
+ </div>`;
527
+ }
528
+ return html` <div class="in section-mp">
529
+ <div class="in sub-title-item-modal">
530
+ <img class="inl header-icon-item-modal" src="${getProxyPath()}assets/ui-icons/stats.png" /> Stats
531
+ </div>
532
+ </div>
533
+ <div class="in section-mp"><div class="fl">${statsRender}</div></div>`;
534
+ },
535
+ };
536
+
537
+ const SlotEvents = {};
538
+
539
+ const Slot = {
540
+ resource: {
541
+ render: function ({ bagId, slotId, displayId, disabledCount }) {
542
+ SlotEvents[slotId] = {};
543
+ if (!s(`.${slotId}`)) return;
544
+ const count = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
545
+ BagCyberia.Tokens[bagId].owner.id
546
+ ].resource.tree.find((s) => s.id === displayId).quantity;
547
+ const componentData = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
548
+ BagCyberia.Tokens[bagId].owner.id
549
+ ].components.resource.find((s) => s.displayId === displayId);
550
+ htmls(
551
+ `.${slotId}`,
552
+ html`
553
+ <div class="abs bag-slot-count">
554
+ <div class="abs center ${disabledCount ? 'hide' : ''}">
555
+ x<span class="bag-slot-value-${bagId}-${displayId}">${getK(count)}</span>
556
+ </div>
557
+ </div>
558
+ <img
559
+ class="abs center bag-slot-img"
560
+ src="${getProxyPath()}assets/resources/${displayId}/08/0.${componentData.extension}"
561
+ />
562
+ <div class="abs bag-slot-type-text">resource</div>
563
+ <div class="abs bag-slot-name-text">${displayId}</div>
564
+ `,
565
+ );
566
+ SlotEvents[slotId].onClick = async (e) => {
567
+ const { barConfig } = await Themes[Css.currentTheme]();
568
+ await Modal.Render({
569
+ id: `modal-resources-${slotId}`,
570
+ barConfig,
571
+ title: renderViewTitle({
572
+ img: `${getProxyPath()}assets/resources/${displayId}/animation.gif`,
573
+ text: html`${displayId}`,
574
+ }),
575
+ html: html`${await ItemModal.Render({
576
+ bagId,
577
+ idModal: `modal-resources-${slotId}`,
578
+ item: { type: 'resources', id: displayId },
579
+ })}`,
580
+ mode: 'view',
581
+ slideMenu: 'modal-menu',
582
+ maximize: true,
583
+ });
584
+ };
585
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
586
+ },
587
+ renderBagCyberiaSlots: function ({ bagId, indexBagCyberia, displayId }) {
588
+ const setQuestItem = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
589
+ BagCyberia.Tokens[bagId].owner.id
590
+ ].resource.tree.map((r) => r.id);
591
+ for (const id of setQuestItem) {
592
+ if (displayId && displayId !== id) continue;
593
+ const slotId = `${bagId}-${indexBagCyberia}`;
594
+ this.render({ bagId, slotId, displayId: id });
595
+ indexBagCyberia++;
596
+ }
597
+ return indexBagCyberia;
598
+ },
599
+ update: async ({ bagId, displayId, type, id }) => {
600
+ if (!s(`.modal-bag`)) return;
601
+ if (!s(`.bag-slot-value-${bagId}-${displayId}`)) {
602
+ BagCyberia.indexBagCyberia = await Slot.resource.renderBagCyberiaSlots({
603
+ bagId,
604
+ indexBagCyberia: BagCyberia.Tokens[bagId].indexBagCyberia,
605
+ displayId,
606
+ });
607
+ }
608
+ const count = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
609
+ BagCyberia.Tokens[bagId].owner.id
610
+ ].resource.tree.find((s) => s.id === displayId).quantity;
611
+ htmls(`.bag-slot-value-${bagId}-${displayId}`, getK(count));
612
+ },
613
+ },
614
+ questItem: {
615
+ render: function ({ bagId, slotId, displayId, disabledCount }) {
616
+ SlotEvents[slotId] = { displayId: `${displayId}` };
617
+ if (!s(`.${slotId}`)) return;
618
+ let count = 0;
619
+
620
+ if (!disabledCount)
621
+ count = QuestManagementCyberia.countQuestItems({ ...BagCyberia.Tokens[bagId].owner, displayId });
622
+
623
+ if (count === 0) return;
624
+
625
+ htmls(
626
+ `.${slotId}`,
627
+ html`
628
+ <div class="abs bag-slot-count">
629
+ <div class="abs center ${disabledCount ? 'hide' : ''}">
630
+ x<span class="bag-slot-value-${slotId} bag-slot-value-${bagId}-${displayId}">${getK(count)}</span>
631
+ </div>
632
+ </div>
633
+ <img class="abs center bag-slot-img" src="${getProxyPath()}assets/quest/${displayId}/animation.gif" />
634
+ <div class="abs bag-slot-type-text">quest item</div>
635
+ <div class="abs bag-slot-name-text">${displayId}</div>
636
+ `,
637
+ );
638
+ SlotEvents[slotId].onClick = async (e) => {
639
+ const { barConfig } = await Themes[Css.currentTheme]();
640
+ await Modal.Render({
641
+ id: `modal-quest-${slotId}`,
642
+ barConfig,
643
+ title: renderViewTitle({
644
+ img: `${getProxyPath()}assets/quest/${displayId}/animation.gif`,
645
+ text: html`${displayId}`,
646
+ }),
647
+ html: html`${await ItemModal.Render({
648
+ bagId,
649
+ idModal: `modal-quest-${slotId}`,
650
+ item: { type: 'quest', id: displayId },
651
+ })}`,
652
+ mode: 'view',
653
+ slideMenu: 'modal-menu',
654
+ maximize: true,
655
+ });
656
+ };
657
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
658
+ },
659
+ renderBagCyberiaSlots: function ({ bagId, indexBagCyberia }) {
660
+ const setQuestItem = uniqueArray(
661
+ ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][BagCyberia.Tokens[bagId].owner.id].model.quests
662
+ ? ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][BagCyberia.Tokens[bagId].owner.id].model.quests
663
+ .map((q) =>
664
+ q.displaySearchObjects
665
+ .filter((s) => QuestComponent.componentsScope[s.id].questKeyContext === 'displaySearchObjects')
666
+ .map((s) => s.id),
667
+ )
668
+ .flat()
669
+ : [],
670
+ );
671
+
672
+ for (const displayId of setQuestItem) {
673
+ if (s(`.bag-slot-value-${bagId}-${displayId}`)) continue;
674
+ const slotId = `${bagId}-${indexBagCyberia}`;
675
+ this.render({ bagId, slotId, displayId });
676
+ indexBagCyberia++;
677
+ }
678
+ return indexBagCyberia;
679
+ },
680
+ update: async ({ bagId, displayId, type, id }) => {
681
+ const value = QuestManagementCyberia.countQuestItems({ type, id, displayId });
682
+ if (value > 0 && !s(`.bag-slot-value-${bagId}-${displayId}`)) {
683
+ BagCyberia.indexBagCyberia = await Slot.questItem.renderBagCyberiaSlots({
684
+ bagId,
685
+ indexBagCyberia: BagCyberia.Tokens[bagId].indexBagCyberia,
686
+ displayId,
687
+ });
688
+ } else if (value === 0 && s(`.bag-slot-value-${bagId}-${displayId}`)) {
689
+ htmls(`.${Object.keys(SlotEvents).find((slotId) => SlotEvents[slotId].displayId === displayId)}`, '');
690
+ } else if (s(`.bag-slot-value-${bagId}-${displayId}`))
691
+ htmls(`.bag-slot-value-${bagId}-${displayId}`, getK(value));
692
+ },
693
+ },
694
+ coin: {
695
+ render: ({ bagId, slotId, quantity }) => {
696
+ SlotEvents[slotId] = {};
697
+ htmls(
698
+ `.${slotId}`,
699
+ html` <div class="abs bag-slot-count">
700
+ <div class="abs center">x<span class="bag-slot-value-${slotId}">${getK(quantity)}</span></div>
701
+ </div>
702
+ <img class="abs center bag-slot-img" src="${getProxyPath()}assets/coin/coin/animation.gif" />
703
+ <div class="abs bag-slot-type-text">currency</div>
704
+ <div class="abs bag-slot-name-text">coin</div>`,
705
+ );
706
+ SlotEvents[slotId].onClick = async (e) => {
707
+ const { barConfig } = await Themes[Css.currentTheme]();
708
+ await Modal.Render({
709
+ id: `modal-coin-${slotId}`,
710
+ barConfig,
711
+ title: renderViewTitle({
712
+ img: `${getProxyPath()}assets/coin/coin/animation.gif`,
713
+ text: html`coin`,
714
+ }),
715
+ html: html`${await ItemModal.Render({
716
+ bagId,
717
+ idModal: `modal-coin-${slotId}`,
718
+ item: { type: 'coin', id: 'coin' },
719
+ })}`,
720
+ mode: 'view',
721
+ slideMenu: 'modal-menu',
722
+ maximize: true,
723
+ });
724
+ };
725
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
726
+ },
727
+ renderBagCyberiaSlots: ({ bagId, indexBagCyberia, quantity }) => {
728
+ const slotId = `${bagId}-${indexBagCyberia}`;
729
+ Slot.coin.render({
730
+ bagId,
731
+ slotId,
732
+ quantity:
733
+ quantity !== undefined
734
+ ? quantity
735
+ : ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][BagCyberia.Tokens[bagId].owner.id].coin,
736
+ });
737
+ if (!ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][BagCyberia.Tokens[bagId].owner.id].coin) {
738
+ const bagId = 'cyberia-bag';
739
+ if (s(`.${bagId}-${indexBagCyberia}`)) s(`.${bagId}-${indexBagCyberia}`).classList.add('hide');
740
+ }
741
+ indexBagCyberia++;
742
+ return indexBagCyberia;
743
+ },
744
+ update: ({ bagId, type, id }) => {
745
+ if (type === 'user' && id === 'main') {
746
+ const bagId = 'cyberia-bag';
747
+ if (s(`.${bagId}-0`))
748
+ if (!ElementsCyberia.Data[type][id].coin) s(`.${bagId}-0`).classList.add('hide');
749
+ else if (s(`.${bagId}-0`).classList.contains('hide')) s(`.${bagId}-0`).classList.remove('hide');
750
+ }
751
+
752
+ if (s(`.bag-slot-value-${bagId}-0`))
753
+ htmls(`.bag-slot-value-${bagId}-0`, getK(ElementsCyberia.Data[type][id].coin));
754
+ },
755
+ },
756
+ skin: {
757
+ render: function ({ bagId, slotId, displayId, disabledCount }) {
758
+ SlotEvents[slotId] = {};
759
+ if (!s(`.${slotId}`)) return;
760
+ const count = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
761
+ BagCyberia.Tokens[bagId].owner.id
762
+ ].skin.tree.filter((s) => s.id === displayId).length;
763
+ const componentData = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
764
+ BagCyberia.Tokens[bagId].owner.id
765
+ ].components.skin.find((s) => s.displayId === displayId);
766
+ htmls(
767
+ `.${slotId}`,
768
+ html`
769
+ <div class="abs bag-slot-count">
770
+ <div class="abs center ${disabledCount ? 'hide' : ''}">
771
+ x<span class="bag-slot-value-${slotId}">${getK(count)}</span>
772
+ </div>
773
+ </div>
774
+ <img
775
+ class="abs center bag-slot-img"
776
+ src="${getProxyPath()}assets/skin/${displayId}/08/0.${componentData.extension}"
777
+ />
778
+ <div class="abs bag-slot-type-text">skin</div>
779
+ <div class="abs bag-slot-name-text">${displayId}</div>
780
+ `,
781
+ );
782
+ if (['ghost'].includes(displayId)) s(`.${slotId}`).classList.add('hide');
783
+ SlotEvents[slotId].onClick = async (e) => {
784
+ const { barConfig } = await Themes[Css.currentTheme]();
785
+ await Modal.Render({
786
+ id: `modal-skin-${slotId}`,
787
+ barConfig,
788
+ title: renderViewTitle({
789
+ img: `${getProxyPath()}assets/skin/${displayId}/08/0.${componentData.extension}`,
790
+ text: html`${displayId}`,
791
+ }),
792
+ html: html`${await ItemModal.Render({
793
+ bagId,
794
+ idModal: `modal-skin-${slotId}`,
795
+ item: { type: 'skin', id: displayId },
796
+ })}`,
797
+ mode: 'view',
798
+ slideMenu: 'modal-menu',
799
+ maximize: true,
800
+ });
801
+ };
802
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
803
+ },
804
+ renderBagCyberiaSlots: function ({ bagId, indexBagCyberia }) {
805
+ for (const displayId of uniqueArray(
806
+ ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
807
+ BagCyberia.Tokens[bagId].owner.id
808
+ ].components.skin.map((s) => s.displayId),
809
+ )) {
810
+ const slotId = `${bagId}-${indexBagCyberia}`;
811
+ this.render({ bagId, displayId, slotId });
812
+ indexBagCyberia++;
813
+ }
814
+ return indexBagCyberia;
815
+ },
816
+ },
817
+ weapon: {
818
+ render: function ({ bagId, slotId, displayId, disabledCount, itemData, context, storageBotId, quantity }) {
819
+ SlotEvents[slotId] = {};
820
+ if (!s(`.${slotId}`)) return;
821
+ const count = quantity
822
+ ? quantity
823
+ : ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
824
+ BagCyberia.Tokens[bagId].owner.id
825
+ ].weapon.tree.filter((i) => i.id === displayId).length;
826
+
827
+ let basePrice;
828
+ if (itemData) {
829
+ const itemStat = Stat.get[itemData.id]();
830
+ basePrice = itemStat.basePrice;
831
+ }
832
+ const componentData = DisplayComponent.get[displayId]();
833
+ htmls(
834
+ `.${slotId}`,
835
+ html`
836
+ <div class="abs bag-slot-count">
837
+ <div class="abs center ${disabledCount ? 'hide' : ''}">
838
+ x<span class="bag-slot-value-${slotId} bag-slot-value-${bagId}-${displayId}">${getK(count)}</span>
839
+ </div>
840
+ ${basePrice
841
+ ? html`
842
+ <div class="abs center" style="width: 100px">
843
+ x
844
+ <span class="bag-slot-value-${slotId}">${getK(basePrice)}</span
845
+ ><img class="inl coin-slot-icon-img" src="${getProxyPath()}assets/coin/coin/animation.gif" />
846
+ </div>
847
+ `
848
+ : ''}
849
+ </div>
850
+ <img
851
+ class="abs center bag-slot-img"
852
+ src="${getProxyPath()}assets/weapon/${displayId}/06/0.${componentData.extension}"
853
+ />
854
+ <div class="abs bag-slot-type-text">weapon</div>
855
+ <div class="abs bag-slot-name-text">${displayId}</div>
856
+ `,
857
+ );
858
+ SlotEvents[slotId].onClick = async (e) => {
859
+ const { barConfig } = await Themes[Css.currentTheme]();
860
+ await Modal.Render({
861
+ id: `modal-weapon-${slotId}`,
862
+ barConfig,
863
+ title: renderViewTitle({
864
+ img: `${getProxyPath()}assets/weapon/${displayId}/animation.gif`,
865
+ text: html`${displayId}`,
866
+ }),
867
+ html: html`${await ItemModal.Render({
868
+ bagId,
869
+ idModal: `modal-weapon-${slotId}`,
870
+ item: { type: 'weapon', id: displayId },
871
+ itemData,
872
+ context,
873
+ storageBotId,
874
+ })}`,
875
+ mode: 'view',
876
+ slideMenu: 'modal-menu',
877
+ maximize: true,
878
+ });
879
+ };
880
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
881
+ },
882
+ renderBagCyberiaSlots: function ({ bagId, indexBagCyberia }) {
883
+ for (const displayId of uniqueArray(
884
+ ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][BagCyberia.Tokens[bagId].owner.id].weapon.tree.map(
885
+ (i) => i.id,
886
+ ),
887
+ )) {
888
+ const slotId = `${bagId}-${indexBagCyberia}`;
889
+ this.render({ bagId, slotId, displayId });
890
+ indexBagCyberia++;
891
+ }
892
+ return indexBagCyberia;
893
+ },
894
+ update: async ({ bagId, displayId, type, id }) => {
895
+ if (!s(`.modal-bag`)) return;
896
+ if (!s(`.bag-slot-value-${bagId}-${displayId}`)) {
897
+ BagCyberia.indexBagCyberia = await Slot.weapon.renderBagCyberiaSlots({
898
+ bagId,
899
+ indexBagCyberia: BagCyberia.Tokens[bagId].indexBagCyberia,
900
+ displayId,
901
+ });
902
+ }
903
+ const count = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
904
+ BagCyberia.Tokens[bagId].owner.id
905
+ ].weapon.tree.filter((s) => s.id === displayId).length;
906
+ htmls(`.bag-slot-value-${bagId}-${displayId}`, getK(count));
907
+ },
908
+ },
909
+ breastplate: {
910
+ render: function ({ bagId, slotId, displayId, disabledCount }) {
911
+ SlotEvents[slotId] = {};
912
+ if (!s(`.${slotId}`)) return;
913
+ const count = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
914
+ BagCyberia.Tokens[bagId].owner.id
915
+ ].breastplate.tree.filter((i) => i.id === displayId).length;
916
+ htmls(
917
+ `.${slotId}`,
918
+ html`
919
+ <div class="abs bag-slot-count">
920
+ <div class="abs center ${disabledCount ? 'hide' : ''}">
921
+ x<span class="bag-slot-value-${slotId}">${getK(count)}</span>
922
+ </div>
923
+ </div>
924
+ <img class="abs center bag-slot-img" src="${getProxyPath()}assets/breastplate/${displayId}/animation.gif" />
925
+ <div class="abs bag-slot-type-text">breastplate</div>
926
+ <div class="abs bag-slot-name-text">${displayId}</div>
927
+ `,
928
+ );
929
+ SlotEvents[slotId].onClick = async (e) => {
930
+ const { barConfig } = await Themes[Css.currentTheme]();
931
+ await Modal.Render({
932
+ id: `modal-breastplate-${slotId}`,
933
+ barConfig,
934
+ title: renderViewTitle({
935
+ img: `${getProxyPath()}assets/breastplate/${displayId}/animation.gif`,
936
+ text: html`${displayId}`,
937
+ }),
938
+ html: html`${await ItemModal.Render({
939
+ bagId,
940
+ idModal: `modal-breastplate-${slotId}`,
941
+ item: { type: 'breastplate', id: displayId },
942
+ })}`,
943
+ mode: 'view',
944
+ slideMenu: 'modal-menu',
945
+ maximize: true,
946
+ });
947
+ };
948
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
949
+ },
950
+ renderBagCyberiaSlots: function ({ bagId, indexBagCyberia }) {
951
+ for (const displayId of uniqueArray(
952
+ ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
953
+ BagCyberia.Tokens[bagId].owner.id
954
+ ].breastplate.tree.map((i) => i.id),
955
+ )) {
956
+ const slotId = `${bagId}-${indexBagCyberia}`;
957
+ this.render({ bagId, slotId, displayId });
958
+ indexBagCyberia++;
959
+ }
960
+ return indexBagCyberia;
961
+ },
962
+ },
963
+ skill: {
964
+ render: function ({ bagId, slotId, displayId, disabledCount }) {
965
+ SlotEvents[slotId] = {};
966
+ if (!s(`.${slotId}`)) return;
967
+ const count = ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][
968
+ BagCyberia.Tokens[bagId].owner.id
969
+ ].skill.tree.filter((s) => s.id === displayId).length;
970
+ htmls(
971
+ `.${slotId}`,
972
+ html`
973
+ <div class="abs bag-slot-count">
974
+ <div class="abs center ${disabledCount ? 'hide' : ''}">
975
+ x<span class="bag-slot-value-${slotId}">${getK(count)}</span>
976
+ </div>
977
+ </div>
978
+ <img
979
+ class="abs center bag-slot-img"
980
+ src="${getProxyPath()}assets/${SkillCyberiaData[displayId].folder}/${displayId}/animation.gif"
981
+ />
982
+ <div class="abs bag-slot-type-text">${SkillCyberiaData[displayId].type}<br />skill</div>
983
+ <div class="abs bag-slot-name-text">${displayId}</div>
984
+ `,
985
+ );
986
+ SlotEvents[slotId].onClick = async (e) => {
987
+ const { barConfig } = await Themes[Css.currentTheme]();
988
+ await Modal.Render({
989
+ id: `modal-skill-${slotId}`,
990
+ barConfig,
991
+ title: renderViewTitle({
992
+ img: `${getProxyPath()}assets/${SkillCyberiaData[displayId].folder}/${displayId}/animation.gif`,
993
+ text: html`${displayId}`,
994
+ }),
995
+ html: html`${await ItemModal.Render({
996
+ bagId,
997
+ idModal: `modal-skill-${slotId}`,
998
+ item: { type: 'skill', id: displayId },
999
+ })}`,
1000
+ mode: 'view',
1001
+ slideMenu: 'modal-menu',
1002
+ maximize: true,
1003
+ });
1004
+ };
1005
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
1006
+ },
1007
+ renderBagCyberiaSlots: function ({ bagId, indexBagCyberia }) {
1008
+ for (const displayId of uniqueArray(
1009
+ ElementsCyberia.Data[BagCyberia.Tokens[bagId].owner.type][BagCyberia.Tokens[bagId].owner.id].skill.tree.map(
1010
+ (s) => s.id,
1011
+ ),
1012
+ )) {
1013
+ const slotId = `${bagId}-${indexBagCyberia}`;
1014
+ this.render({ bagId, slotId, displayId });
1015
+ indexBagCyberia++;
1016
+ }
1017
+ return indexBagCyberia;
1018
+ },
1019
+ },
1020
+ xp: {
1021
+ renderBagCyberiaSlots: ({ bagId, indexBagCyberia }) => {
1022
+ htmls(
1023
+ `.${bagId}-${indexBagCyberia}`,
1024
+ html` <div class="abs bag-slot-count">
1025
+ <div class="abs center">x<span class="bag-slot-value-${bagId}-${indexBagCyberia}">0</span></div>
1026
+ </div>
1027
+ <div class="abs center text-icon">XP</div>
1028
+ <div class="abs bag-slot-type-text">experience</div>
1029
+ <div class="abs bag-slot-name-text">level 0</div>`,
1030
+ );
1031
+ indexBagCyberia++;
1032
+ return indexBagCyberia;
1033
+ },
1034
+ },
1035
+ wallet: {
1036
+ renderBagCyberiaSlots: ({ bagId, indexBagCyberia }) => {
1037
+ htmls(
1038
+ `.${bagId}-${indexBagCyberia}`,
1039
+ html` <div class="abs bag-slot-count">
1040
+ <div class="abs center">x<span class="bag-slot-value-${bagId}-${indexBagCyberia}">1</span></div>
1041
+ </div>
1042
+ <img class="abs center bag-slot-img" src="${getProxyPath()}assets/ui-icons/wallet.png" />
1043
+ <div class="abs bag-slot-type-text">wallet</div>
1044
+ <div class="abs bag-slot-name-text">simple leather</div>`,
1045
+ );
1046
+ const slotId = `${bagId}-${indexBagCyberia}`;
1047
+ SlotEvents[slotId] = {};
1048
+ SlotEvents[slotId].onClick = async (e) => {
1049
+ s(`.main-btn-wallet`).click();
1050
+ };
1051
+ EventsUI.onClick(`.${slotId}`, SlotEvents[slotId].onClick);
1052
+
1053
+ indexBagCyberia++;
1054
+ return indexBagCyberia;
1055
+ },
1056
+ },
1057
+ };
1058
+ const defaultOwner = { type: 'user', id: 'main' };
1059
+ const BagCyberia = {
1060
+ Tokens: { 'cyberia-bag': { owner: defaultOwner } },
1061
+ Render: async function (options) {
1062
+ const bagId = options && 'id' in options ? options.id : getId(this.Tokens, 'slot-');
1063
+ const totalSlots = 20;
1064
+ if (!options.owner) options.owner = defaultOwner;
1065
+ this.Tokens[bagId] = { bagId, totalSlots, ...options };
1066
+ setTimeout(async () => {
1067
+ if (!options.disableSortable)
1068
+ this.Tokens[bagId].sortable = new Sortable(s(`.${bagId}`), {
1069
+ animation: 150,
1070
+ group: `bag-sortable`,
1071
+ forceFallback: true,
1072
+ fallbackOnBody: true,
1073
+ store: {
1074
+ /**
1075
+ * Get the order of elements. Called once during initialization.
1076
+ * @param {Sortable} sortable
1077
+ * @returns {Array}
1078
+ */
1079
+ get: function (sortable) {
1080
+ const order = localStorage.getItem(sortable.options.group.name);
1081
+ return order ? order.split('|') : [];
1082
+ },
1083
+
1084
+ /**
1085
+ * Save the order of elements. Called onEnd (when the item is dropped).
1086
+ * @param {Sortable} sortable
1087
+ */
1088
+ set: function (sortable) {
1089
+ const order = sortable.toArray();
1090
+ localStorage.setItem(sortable.options.group.name, order.join('|'));
1091
+ },
1092
+ },
1093
+ // chosenClass: 'css-class',
1094
+ // ghostClass: 'css-class',
1095
+ // Element dragging ended
1096
+ onEnd: function (/**Event*/ evt) {
1097
+ try {
1098
+ // console.log('Sortable onEnd', evt);
1099
+ // console.log('evt.oldIndex', evt.oldIndex);
1100
+ // console.log('evt.newIndex', evt.newIndex);
1101
+
1102
+ const toElementsCyberia = {
1103
+ srcElement: evt.originalEvent.srcElement,
1104
+ target: evt.originalEvent.target,
1105
+ toElement: evt.originalEvent.toElement,
1106
+ };
1107
+
1108
+ const { item } = evt; // parentElement parentNode children(array)
1109
+
1110
+ const dataBagCyberiaFrom = {
1111
+ type: Array.from(item.children)[2].innerHTML,
1112
+ id: Array.from(item.children)[3].innerHTML,
1113
+ };
1114
+ const dataBagCyberiaTo = {};
1115
+
1116
+ let dataClassBagCyberiaFrom = [];
1117
+ let dataClassBagCyberiaTo = [];
1118
+
1119
+ for (const toElementKey of Object.keys(toElementsCyberia)) {
1120
+ try {
1121
+ dataClassBagCyberiaTo = dataClassBagCyberiaTo.concat(
1122
+ Array.from(toElementsCyberia[toElementKey].parentNode.classList),
1123
+ );
1124
+ } catch (error) {
1125
+ logger.warn(error);
1126
+ }
1127
+ try {
1128
+ dataClassBagCyberiaTo = dataClassBagCyberiaTo.concat(
1129
+ Array.from(toElementsCyberia[toElementKey].parentElement.classList),
1130
+ );
1131
+ } catch (error) {
1132
+ logger.warn(error);
1133
+ }
1134
+ try {
1135
+ dataClassBagCyberiaTo = dataClassBagCyberiaTo.concat(
1136
+ Array.from(toElementsCyberia[toElementKey].parentNode.parentNode.classList),
1137
+ );
1138
+ } catch (error) {
1139
+ logger.warn(error);
1140
+ }
1141
+ try {
1142
+ dataClassBagCyberiaTo = dataClassBagCyberiaTo.concat(
1143
+ Array.from(toElementsCyberia[toElementKey].parentElement.parentElement.classList),
1144
+ );
1145
+ } catch (error) {
1146
+ logger.warn(error);
1147
+ }
1148
+ }
1149
+
1150
+ dataClassBagCyberiaTo = uniqueArray(dataClassBagCyberiaTo);
1151
+
1152
+ logger.info('Sortable BagCyberia From:', { dataClassBagCyberiaFrom, dataBagCyberiaFrom });
1153
+ logger.info('Sortable BagCyberia To:', { dataClassBagCyberiaTo, dataBagCyberiaTo });
1154
+ if (dataBagCyberiaFrom.type.split('<br>')[1])
1155
+ dataBagCyberiaFrom.type = dataBagCyberiaFrom.type.split('<br>')[1];
1156
+
1157
+ if (
1158
+ Object.values(dataClassBagCyberiaTo).find(
1159
+ (c) => c.startsWith(`character-`) || c.startsWith('main-skill-slot'),
1160
+ ) &&
1161
+ ['skin', 'weapon', 'breastplate', 'skill'].includes(dataBagCyberiaFrom.type)
1162
+ ) {
1163
+ const payLoadEquip = options.owner;
1164
+ payLoadEquip[dataBagCyberiaFrom.type] = { id: dataBagCyberiaFrom.id };
1165
+ if (s(`.character-container-view`)) {
1166
+ htmls(`.character-container-view`, html`<div class="abs center character-preview-loading"></div>`);
1167
+ LoadingAnimation.img.play(`.character-preview-loading`, 'points');
1168
+ }
1169
+ ItemModal.Equip[dataBagCyberiaFrom.type](payLoadEquip);
1170
+ return;
1171
+ }
1172
+
1173
+ const slotId = Array.from(evt.item.classList).pop();
1174
+ // console.log('slotId', slotId);
1175
+ if (evt.oldIndex === evt.newIndex) SlotEvents[slotId].onClick();
1176
+
1177
+ // var itemEl = evt.item; // dragged HTMLElement
1178
+ // evt.to; // target list
1179
+ // evt.from; // previous list
1180
+ // evt.oldIndex; // element's old index within old parent
1181
+ // evt.newIndex; // element's new index within new parent
1182
+ // evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements
1183
+ // evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements
1184
+ // evt.clone; // the clone element
1185
+ // evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
1186
+ } catch (error) {
1187
+ logger.error(error, error.stack);
1188
+ }
1189
+ },
1190
+ });
1191
+
1192
+ this.Tokens[bagId].indexBagCyberia = 0;
1193
+
1194
+ if (!options.empty) {
1195
+ this.Tokens[bagId].indexBagCyberia = await Slot.coin.renderBagCyberiaSlots({
1196
+ bagId,
1197
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1198
+ });
1199
+ // this.Tokens[bagId].indexBagCyberia = await Slot.xp.renderBagCyberiaSlots({ bagId, indexBagCyberia: this.Tokens[bagId].indexBagCyberia });
1200
+ this.Tokens[bagId].indexBagCyberia = await Slot.skin.renderBagCyberiaSlots({
1201
+ bagId,
1202
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1203
+ });
1204
+ this.Tokens[bagId].indexBagCyberia = await Slot.skill.renderBagCyberiaSlots({
1205
+ bagId,
1206
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1207
+ });
1208
+ this.Tokens[bagId].indexBagCyberia = await Slot.weapon.renderBagCyberiaSlots({
1209
+ bagId,
1210
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1211
+ });
1212
+ this.Tokens[bagId].indexBagCyberia = await Slot.breastplate.renderBagCyberiaSlots({
1213
+ bagId,
1214
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1215
+ });
1216
+ // this.Tokens[bagId].indexBagCyberia = await Slot.wallet.renderBagCyberiaSlots({ bagId, indexBagCyberia: this.Tokens[bagId].indexBagCyberia });
1217
+ this.Tokens[bagId].indexBagCyberia = await Slot.questItem.renderBagCyberiaSlots({
1218
+ bagId,
1219
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1220
+ });
1221
+ this.Tokens[bagId].indexBagCyberia = await Slot.resource.renderBagCyberiaSlots({
1222
+ bagId,
1223
+ indexBagCyberia: this.Tokens[bagId].indexBagCyberia,
1224
+ });
1225
+ }
1226
+ });
1227
+ return html`
1228
+ <div class="fl ${bagId}">
1229
+ ${range(0, totalSlots - 1)
1230
+ .map(
1231
+ (slot) => html`
1232
+ <div class="in fll bag-slot ${bagId}-${slot}" data-id="${slot}">
1233
+ <!-- slot ${slot} -->
1234
+ </div>
1235
+ `,
1236
+ )
1237
+ .join('')}
1238
+ </div>
1239
+ `;
1240
+ },
1241
+ updateAll: async function (options = { bagId: '', type: '', id: '' }) {
1242
+ const { bagId, type, id } = options;
1243
+ if (this.Tokens[bagId] && s(`.${this.Tokens[bagId].idModal}`)) {
1244
+ if (this.Tokens[bagId].sortable) this.Tokens[bagId].sortable.destroy();
1245
+ Modal.writeHTML({
1246
+ idModal: this.Tokens[bagId].idModal,
1247
+ html: await this.Render(this.Tokens[bagId]),
1248
+ });
1249
+ }
1250
+ },
1251
+ };
1252
+
1253
+ export { BagCyberia, Slot, SlotEvents, ItemModal };