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,1420 @@
1
+ import { CyberiaQuestService } from '../../services/cyberia-quest/cyberia-quest.service.js';
2
+ import { Auth } from '../core/Auth.js';
3
+ import { BtnIcon } from '../core/BtnIcon.js';
4
+ import { range, s4, timer } from '../core/CommonJs.js';
5
+ import {
6
+ Css,
7
+ Themes,
8
+ dynamicCol,
9
+ getSectionsStringData,
10
+ renderBubbleDialog,
11
+ renderCssAttr,
12
+ typeWriteSectionsString,
13
+ } from '../core/Css.js';
14
+ import { EventsUI } from '../core/EventsUI.js';
15
+ import { Keyboard } from '../core/Keyboard.js';
16
+ import { LoadingAnimation } from '../core/LoadingAnimation.js';
17
+ import { loggerFactory } from '../core/Logger.js';
18
+ import { Modal, renderViewTitle } from '../core/Modal.js';
19
+ import { SocketIo } from '../core/SocketIo.js';
20
+ import { Translate } from '../core/Translate.js';
21
+ import { append, getLang, htmls, s, sa } from '../core/VanillaJs.js';
22
+ import { BagCyberia, Slot } from './BagCyberia.js';
23
+ import { CharacterCyberia } from './CharacterCyberia.js';
24
+ import { CyberiaShopStorage, QuestComponent, isElementCollision } from './CommonCyberia.js';
25
+ import { ElementsCyberia } from './ElementsCyberia.js';
26
+ import { InteractionPanelCyberia } from './InteractionPanelCyberia.js';
27
+ import { MainUserCyberia } from './MainUserCyberia.js';
28
+ import { MatrixCyberia } from './MatrixCyberia.js';
29
+ import { PixiCyberia } from './PixiCyberia.js';
30
+ import { PointAndClickMovementCyberia } from './PointAndClickMovementCyberia.js';
31
+ import { SocketIoCyberia } from './SocketIoCyberia.js';
32
+ import { WorldCyberiaManagement } from './WorldCyberia.js';
33
+ import { getProxyPath } from '../core/Router.js';
34
+
35
+ const logger = loggerFactory(import.meta);
36
+
37
+ const QuestManagementCyberia = {
38
+ IntervalQuestDetector: null,
39
+ questClosePanels: [],
40
+ Data: {},
41
+ Load: async function ({ type, id }) {
42
+ const radius = 5;
43
+ const typeTarget = 'bot';
44
+ this.questClosePanels = [];
45
+
46
+ // const instanceDisplayIdQuest = uniqueArray(
47
+ // WorldCyberiaManagement.Data[type][id].model.world.instance
48
+ // .map((instance) =>
49
+ // instance.bots
50
+ // .filter((b) => b.behavior === 'quest-passive' || b.behavior === 'item-quest')
51
+ // .map((b) => b.displayIds.map((s) => s.id))
52
+ // .flat(),
53
+ // )
54
+ // .flat(),
55
+ // );
56
+
57
+ if (this.IntervalQuestDetector) clearInterval(this.IntervalQuestDetector);
58
+
59
+ if (WorldCyberiaManagement.Data[type] && WorldCyberiaManagement.Data[type][id]) {
60
+ this.IntervalQuestDetector = setInterval(async () => {
61
+ const panels = [];
62
+ const displayIdCount = {};
63
+ const handBlock = {};
64
+ handBlock[typeTarget] = {};
65
+ if (
66
+ !WorldCyberiaManagement.Data[type] ||
67
+ !WorldCyberiaManagement.Data[type][id] ||
68
+ !WorldCyberiaManagement.Data[type][id].model.world
69
+ )
70
+ return clearInterval(this.IntervalQuestDetector);
71
+ for (const elementTargetId of Object.keys(ElementsCyberia.Data[typeTarget])) {
72
+ const idPanel = `action-panel-${typeTarget}-${elementTargetId}`;
73
+ if (s(`.${idPanel}`) || !(elementTargetId in PixiCyberia.Data[typeTarget])) continue;
74
+ const displayId = ElementsCyberia.getCurrentSkinDisplayId({ type: typeTarget, id: elementTargetId });
75
+
76
+ // if (!Object.keys(QuestComponent.componentsScope).includes(displayId)) continue;
77
+ // if (!instanceDisplayIdQuest.includes(displayId)) continue;
78
+
79
+ const respawn = 5000;
80
+ const isCollision = isElementCollision({
81
+ A: {
82
+ dim: ElementsCyberia.Data[typeTarget][elementTargetId].dim * radius,
83
+ x:
84
+ ElementsCyberia.Data[typeTarget][elementTargetId].x -
85
+ (ElementsCyberia.Data[typeTarget][elementTargetId].dim * radius) / 2,
86
+ y:
87
+ ElementsCyberia.Data[typeTarget][elementTargetId].y -
88
+ (ElementsCyberia.Data[typeTarget][elementTargetId].dim * radius) / 2,
89
+ },
90
+ B: ElementsCyberia.Data[type][id],
91
+ dimPaintByCell: MatrixCyberia.Data.dimPaintByCell,
92
+ });
93
+
94
+ if (!(displayId in displayIdCount)) displayIdCount[displayId] = 0;
95
+ else displayIdCount[displayId]++;
96
+
97
+ const quests = QuestComponent.getQuestByDisplayId({ displayId }).filter(
98
+ (quest) =>
99
+ !ElementsCyberia.Data.user['main'].model.quests.find(
100
+ (_quest) => quest.id === _quest.id && _quest.complete === true,
101
+ ),
102
+ );
103
+
104
+ if (quests.length === 0) quests.push(undefined);
105
+
106
+ let indexQuest = -1;
107
+ for (const questData of quests) {
108
+ indexQuest++;
109
+
110
+ if (
111
+ QuestComponent.componentsScope[displayId] &&
112
+ QuestComponent.componentsScope[displayId].questKeyContext === 'provide' &&
113
+ indexQuest !== displayIdCount[displayId]
114
+ )
115
+ continue;
116
+
117
+ const idPanel = `action-panel-${typeTarget}-${elementTargetId}`;
118
+ const currentQuestData = questData
119
+ ? ElementsCyberia.Data.user['main'].model.quests.find((q) => q.id === questData.id)
120
+ : undefined;
121
+ const currentItemData = currentQuestData
122
+ ? currentQuestData.displaySearchObjects.find(
123
+ (o) => o.id === displayId && o.step === currentQuestData.currentStep,
124
+ )
125
+ : undefined;
126
+
127
+ const enabledQuestPanel = currentItemData && currentItemData.current < currentItemData.quantity;
128
+ const enabledShopPanel =
129
+ questData && QuestComponent.componentsScope[displayId].questKeyContext === 'seller';
130
+
131
+ if (
132
+ ((questData &&
133
+ (QuestComponent.componentsScope[displayId].questKeyContext !== 'displaySearchObjects' ||
134
+ enabledQuestPanel)) ||
135
+ (!['user-hostile', 'pet', 'generic-people'].includes(
136
+ ElementsCyberia.Data[typeTarget][elementTargetId].behavior,
137
+ ) &&
138
+ MainUserCyberia.lastArrowElement &&
139
+ MainUserCyberia.lastArrowElement.type === typeTarget &&
140
+ MainUserCyberia.lastArrowElement.id === elementTargetId)) &&
141
+ (!questData || (questData && !s(`.modal-panel-quest-${questData.id}`))) &&
142
+ (!this.questClosePanels.includes(idPanel) ||
143
+ (this.questClosePanels.includes(idPanel) && enabledQuestPanel)) &&
144
+ isCollision
145
+ ) {
146
+ const enableShortDescription =
147
+ questData &&
148
+ QuestComponent.componentsScope[displayId].questKeyContext === 'provide' &&
149
+ Translate.Data[`${questData.id}-shortDescription`];
150
+
151
+ const enableDefaultDialog =
152
+ QuestComponent.componentsScope[displayId] &&
153
+ QuestComponent.componentsScope[displayId].defaultDialog &&
154
+ Translate.Data[`quest-${displayId}-defaultDialog`];
155
+
156
+ // const targetElement = { type: typeTarget, id: elementTargetId };
157
+ // logger.warn('quest provider detector', targetElement);
158
+ panels.push(idPanel);
159
+ if (questData)
160
+ ElementsCyberia.LocalDataScope[typeTarget][elementTargetId].quest = {
161
+ idPanel,
162
+ id: questData.id,
163
+ };
164
+ await InteractionPanelCyberia.PanelRender.action({
165
+ idPanel,
166
+ type: typeTarget,
167
+ id: elementTargetId,
168
+ html: async () => {
169
+ const interactionPanelQuestId = questData ? `interaction-panel-${questData.id}` : undefined;
170
+ setTimeout(async () => {
171
+ if (questData) {
172
+ const renderBubbleLinesSectionString = async ({
173
+ containerSelector,
174
+ translateData,
175
+ containerLine,
176
+ }) => {
177
+ s(`.${idPanel}`).style.transition = '.3s';
178
+ const currentSectionIndex = 0; // split for '.'
179
+ const offsetWidth = s(containerSelector).offsetWidth;
180
+ const { phraseArray, sectionsIndex } = getSectionsStringData(
181
+ offsetWidth * 0.5,
182
+ translateData[getLang()] ? translateData[getLang()] : translateData['en'],
183
+ );
184
+ typeWriteSectionsString({
185
+ container: containerLine,
186
+ phraseArray,
187
+ rangeArraySectionIndex: sectionsIndex[currentSectionIndex],
188
+ });
189
+
190
+ let currentTopAnimation = parseFloat(
191
+ // window.getComputedStyle(s(`.${idPanel}`)).top.replace('px', ''),
192
+ s(`.${idPanel}`).style.top.replace('px', ''),
193
+ );
194
+
195
+ for (const toTopAnimationIndex of range(0, phraseArray.length - 1)) {
196
+ await timer(800);
197
+ currentTopAnimation -= 15;
198
+ if (!s(`.${idPanel}`)) break;
199
+ s(`.${idPanel}`).style.top = `${currentTopAnimation}px`;
200
+ }
201
+ };
202
+ if (s(`.typeWriter-render-shortDescription-${questData.id}`)) {
203
+ htmls(`.typeWriter-render-shortDescription-${questData.id}`, '');
204
+ renderBubbleLinesSectionString({
205
+ containerSelector: `.${idPanel}`,
206
+ translateData: Translate.Data[`${questData.id}-shortDescription`],
207
+ containerLine: `typeWriter-render-shortDescription-${questData.id}`,
208
+ });
209
+ }
210
+ // typeWriter({
211
+ // id: `${questData.id}-shortDescription-typeWriter`,
212
+ // html: questData
213
+ // ? html`${Translate.Render(`${questData.id}-shortDescription`)}`
214
+ // : html`Hi! Hi! Hi! Hi! Hi!`,
215
+ // container: `typeWriter-render-shortDescription-${questData.id}`,
216
+ // });
217
+ if (s(`.typeWriter-render-defaultDialog-${displayId}`)) {
218
+ htmls(`.typeWriter-render-defaultDialog-${displayId}`, '');
219
+ renderBubbleLinesSectionString({
220
+ containerSelector: `.${idPanel}`,
221
+ translateData: Translate.Data[`quest-${displayId}-defaultDialog`],
222
+ containerLine: `typeWriter-render-defaultDialog-${displayId}`,
223
+ });
224
+ }
225
+ // typeWriter({
226
+ // id: `quest-${displayId}-defaultDialog-typeWriter`,
227
+ // html: questData
228
+ // ? html`${Translate.Render(`quest-${displayId}-defaultDialog`)}`
229
+ // : html`Hi! Hi! Hi! Hi! Hi!`,
230
+ // container: `typeWriter-render-defaultDialog-${displayId}`,
231
+ // });
232
+ }
233
+
234
+ s(`.action-panel-close-${idPanel}`).onclick = async () => {
235
+ this.questClosePanels.push(idPanel);
236
+ await InteractionPanelCyberia.PanelRender.removeActionPanel(idPanel);
237
+ };
238
+ if (s(`.action-panel-ok-${idPanel}`))
239
+ s(`.action-panel-ok-${idPanel}`).onclick = async () => {
240
+ const currentQuestData = ElementsCyberia.Data.user['main'].model.quests.find(
241
+ (q) => q.id === questData.id,
242
+ );
243
+ if (!currentQuestData) {
244
+ s(`.action-panel-ok-${idPanel}`).classList.add('hide');
245
+ if (QuestComponent.componentsScope[displayId].questKeyContext === 'seller') return;
246
+ await this.takeQuest({ questData });
247
+ }
248
+ };
249
+
250
+ if (s(`.action-panel-hand-${idPanel}`))
251
+ s(`.action-panel-hand-${idPanel}`).onclick = async () => {
252
+ if (handBlock[typeTarget][elementTargetId]) return;
253
+
254
+ if (enabledShopPanel) {
255
+ // TODO: cyberia-shop-bag
256
+ await this.RenderModal({ questData, interactionPanelQuestId, elementTargetId });
257
+ return;
258
+ }
259
+ const currentQuestDataIndex = ElementsCyberia.Data.user['main'].model.quests.findIndex(
260
+ (q) => q.id === questData.id,
261
+ );
262
+ if (currentQuestDataIndex >= 0) {
263
+ let currentStep =
264
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].currentStep;
265
+ const displayIdIndex = ElementsCyberia.Data.user['main'].model.quests[
266
+ currentQuestDataIndex
267
+ ].displaySearchObjects.findIndex((o) => o.id === displayId && o.step === currentStep);
268
+ if (displayIdIndex >= 0) {
269
+ const itemData =
270
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex]
271
+ .displaySearchObjects[displayIdIndex];
272
+
273
+ // const displayStepData =
274
+ // QuestComponent.Data[questData.id]().provide.displayIds[0].stepData[currentStep];
275
+
276
+ // <pre>${JSON.stringify(displayStepData.talkingDialog, null, 4)}</pre>
277
+
278
+ // if (displayStepData.talkingDialog)
279
+ // await QuestManagementCyberia.talkingDialog({
280
+ // displayStepData,
281
+ // questData,
282
+ // typeTarget,
283
+ // elementTargetId,
284
+ // });
285
+
286
+ if (itemData.current < itemData.quantity) {
287
+ handBlock[typeTarget][elementTargetId] = true;
288
+ setTimeout(() => {
289
+ delete handBlock[typeTarget][elementTargetId];
290
+ }, respawn);
291
+ if (QuestComponent.componentsScope[displayId].questKeyContext === 'displaySearchObjects')
292
+ SocketIoCyberia.disconnect({ type: typeTarget, id: elementTargetId });
293
+ SocketIo.Emit('user', {
294
+ status: 'take-quest-item',
295
+ element: { type: typeTarget, id: elementTargetId },
296
+ questData: { id: questData.id },
297
+ });
298
+ try {
299
+ await this.updateQuestItemProgressDisplay({
300
+ interactionPanelQuestId,
301
+ currentQuestDataIndex,
302
+ currentStep,
303
+ displayId,
304
+ questData,
305
+ searchObjectIndex: displayIdIndex,
306
+ });
307
+ } catch (error) {
308
+ logger.error(error);
309
+ }
310
+ }
311
+ }
312
+ }
313
+ };
314
+
315
+ if (questData) {
316
+ s(`.action-panel-dude-${idPanel}`).onclick = async () =>
317
+ await this.RenderModal({ questData, interactionPanelQuestId });
318
+ }
319
+ });
320
+ const okButtonDisabled =
321
+ !questData ||
322
+ ElementsCyberia.Data.user['main'].model.quests.find((q) => q.id === questData.id) ||
323
+ QuestComponent.componentsScope[displayId].questKeyContext !== 'provide';
324
+ const idKeyboardEvent = 'quest-key-event-ok' + idPanel;
325
+ const instanceKeyBoardEventOk = () => {
326
+ // if (okButtonDisabled) delete Keyboard.Event[idKeyboardEvent];
327
+ // else
328
+ Keyboard.Event[idKeyboardEvent] = {
329
+ a: () =>
330
+ s(`.action-panel-ok-${idPanel}`) // && !Modal.viewModalOpen()
331
+ ? s(`.action-panel-ok-${idPanel}`).click()
332
+ : null,
333
+ A: () =>
334
+ s(`.action-panel-ok-${idPanel}`) // && !Modal.viewModalOpen()
335
+ ? s(`.action-panel-ok-${idPanel}`).click()
336
+ : null,
337
+ };
338
+ };
339
+ instanceKeyBoardEventOk();
340
+
341
+ const dudeButtonEnabled =
342
+ questData && QuestComponent.componentsScope[displayId].questKeyContext === 'provide';
343
+ {
344
+ const idKeyboardEvent = 'quest-key-event-dude' + idPanel;
345
+ // if (!dudeButtonEnabled) delete Keyboard.Event[idKeyboardEvent];
346
+ // else
347
+ Keyboard.Event[idKeyboardEvent] = {
348
+ s: () =>
349
+ s(`.action-panel-dude-${idPanel}`) // && !Modal.viewModalOpen()
350
+ ? s(`.action-panel-dude-${idPanel}`).click()
351
+ : null,
352
+ S: () =>
353
+ s(`.action-panel-dude-${idPanel}`) // && !Modal.viewModalOpen()
354
+ ? s(`.action-panel-dude-${idPanel}`).click()
355
+ : null,
356
+ };
357
+ }
358
+
359
+ const actionButtonEnabled = questData && (enabledQuestPanel || enabledShopPanel);
360
+
361
+ {
362
+ const idKeyboardEvent = 'quest-key-event-hand' + idPanel;
363
+ // if (!actionButtonEnabled) delete Keyboard.Event[idKeyboardEvent];
364
+ // else
365
+ Keyboard.Event[idKeyboardEvent] = {
366
+ a: () => {
367
+ if (actionButtonEnabled)
368
+ s(`.action-panel-hand-${idPanel}`) // && !Modal.viewModalOpen()
369
+ ? s(`.action-panel-hand-${idPanel}`).click()
370
+ : null;
371
+ },
372
+ A: () => {
373
+ if (actionButtonEnabled)
374
+ s(`.action-panel-hand-${idPanel}`) // && !Modal.viewModalOpen()
375
+ ? s(`.action-panel-hand-${idPanel}`).click()
376
+ : null;
377
+ },
378
+ };
379
+ }
380
+
381
+ return await renderBubbleDialog({
382
+ id: idPanel,
383
+ html: async () => html`
384
+ <div class="in quest-provider-head">
385
+ <span style="color: #d5b019"
386
+ >${ElementsCyberia.getDisplayTitle({ type: typeTarget, id: elementTargetId })}</span
387
+ >
388
+ <span style="color: #2d2d2d"
389
+ >${ElementsCyberia.getDisplayName({ type: typeTarget, id: elementTargetId })}</span
390
+ >${questData &&
391
+ (QuestComponent.componentsScope[displayId].questKeyContext === 'provide' ||
392
+ QuestComponent.componentsScope[displayId].questKeyContext === 'seller') &&
393
+ (enableDefaultDialog || enableShortDescription)
394
+ ? ':'
395
+ : ''}
396
+ </div>
397
+ <div
398
+ class="in quest-short-description ${enableDefaultDialog || enableShortDescription
399
+ ? ''
400
+ : 'hide'}"
401
+ >
402
+ ${enableShortDescription
403
+ ? html`<div class="typeWriter-render-shortDescription-${questData.id}"></div>`
404
+ : enableDefaultDialog
405
+ ? html`<div class="typeWriter-render-defaultDialog-${displayId}"></div>`
406
+ : ''}
407
+ </div>
408
+ <div class="fl">
409
+ ${await BtnIcon.Render({
410
+ class: `in fll action-panel-bar-btn-container action-panel-hand-${idPanel} ${
411
+ actionButtonEnabled ? '' : 'hide'
412
+ }`,
413
+ label: html`${currentItemData && currentItemData.actionIcon
414
+ ? html`
415
+ <img
416
+ class="abs center action-panel-img-icon"
417
+ src="${getProxyPath()}${currentItemData.actionIcon}"
418
+ />
419
+ `
420
+ : html`<img
421
+ class="abs center action-panel-img-icon"
422
+ src="${getProxyPath()}${questData && questData.actionIcon
423
+ ? questData.actionIcon
424
+ : 'assets/ui-icons/hand.png'}"
425
+ />`}
426
+ <div class="abs quest-keyboard-bubble-info">A</div>`,
427
+ })}
428
+ ${await BtnIcon.Render({
429
+ class: `in fll action-panel-bar-btn-container action-panel-ok-${idPanel} ${
430
+ okButtonDisabled ? 'hide' : ''
431
+ }`,
432
+ label: html`<img
433
+ class="abs center action-panel-img-icon"
434
+ src="${getProxyPath()}assets/ui-icons/ok.png"
435
+ />
436
+ <div class="abs quest-keyboard-bubble-info">A</div>`,
437
+ })}
438
+ ${await BtnIcon.Render({
439
+ class: `in fll action-panel-bar-btn-container action-panel-dude-${idPanel} ${
440
+ dudeButtonEnabled ? '' : 'hide'
441
+ }`,
442
+ label: html`<img
443
+ class="abs center action-panel-img-icon"
444
+ src="${getProxyPath()}assets/ui-icons/dude.png"
445
+ />
446
+ <div class="abs quest-keyboard-bubble-info">S</div>`,
447
+ })}
448
+ ${await BtnIcon.Render({
449
+ class: `in fll action-panel-bar-btn-container action-panel-close-${idPanel}`,
450
+ label: html`<img
451
+ class="abs center action-panel-img-icon"
452
+ src="${getProxyPath()}assets/ui-icons/close.png"
453
+ />
454
+ <div class="abs quest-keyboard-bubble-info">F</div>`,
455
+ })}
456
+ </div>
457
+ `,
458
+ });
459
+ },
460
+ });
461
+ }
462
+ }
463
+ }
464
+
465
+ // for (const idPanel of Object.keys(InteractionPanelCyberia.PanelRender.actionPanelTokens)) {
466
+ // if (!panels.includes(idPanel)) {
467
+ // // console.error('remove');
468
+ // // await InteractionPanelCyberia.PanelRender.removeActionPanel(idPanel);
469
+ // }
470
+ // }
471
+ // if (panels.length === 0) {
472
+ // Keyboard.Event['focus'] = {
473
+ // f: MainUserCyberia.focusTarget,
474
+ // F: MainUserCyberia.focusTarget,
475
+ // };
476
+ // }
477
+ }, 1250);
478
+
479
+ // Keyboard.Event['focus'] = {
480
+ // f: MainUserCyberia.focusTarget,
481
+ // F: MainUserCyberia.focusTarget,
482
+ // };
483
+
484
+ await this.triggerQuestAvailableRender({ type, id });
485
+ }
486
+ PointAndClickMovementCyberia.TargetEvent['quest-event'] = async ({ type, id }) => {
487
+ if (type !== 'user' && id !== 'main')
488
+ this.questClosePanels = this.questClosePanels.filter((p) => p !== `action-panel-${type}-${id}`);
489
+ };
490
+ },
491
+ talkingDialog: ({ displayStepData, questData, typeTarget, elementTargetId }) => {
492
+ return new Promise(async (resolve) => {
493
+ const idModal = `modal-quest-dialog-${questData.id}`;
494
+ const { barConfig } = await Themes[Css.currentTheme]();
495
+ barConfig.buttons.maximize.disabled = true;
496
+ barConfig.buttons.minimize.disabled = true;
497
+ barConfig.buttons.restore.disabled = true;
498
+ barConfig.buttons.close.disabled = true;
499
+ await Modal.Render({
500
+ id: idModal,
501
+ barConfig,
502
+ title: renderViewTitle({
503
+ // 'ui-icon': questData.icon.id,
504
+ // assetFolder: questData.icon.folder,
505
+ 'ui-icon': 'quest.png',
506
+ text: html`${Translate.Render(`${questData.id}-title`)}`,
507
+ }),
508
+ maximize: true,
509
+ mode: 'view',
510
+ slideMenu: 'modal-menu',
511
+ html: async () => {
512
+ return html`
513
+ <style>
514
+ .${idModal}-element-0-body,
515
+ .${idModal}-element-1-body {
516
+ overflow: hidden;
517
+ }
518
+ </style>
519
+ <div class="in ${idModal}-talking-loading-container" style="min-height: 300px;">
520
+ <div class="abs center ${idModal}-talking-loading"></div>
521
+ </div>
522
+ <div class="abs" style="top: 80px; width: 100%;">
523
+ <div class="fl">
524
+ <div class="in fll" style="width: 50%;">
525
+ <div class="${idModal}-element-0 hide"></div>
526
+ </div>
527
+ <div class="in fll" style="width: 50%;">
528
+ <div class="${idModal}-element-1 hide"></div>
529
+ </div>
530
+ </div>
531
+ </div>
532
+ <div class="in render-bubble-${questData.id}" style="padding: 10px"></div>
533
+ `;
534
+ },
535
+ });
536
+
537
+ append(
538
+ 'body',
539
+ html` <div class="abs button-quest-modal-forward button-quest-modal-forward-${questData.id}">
540
+ <img class="abs center button-quest-modal-img" src="${getProxyPath()}assets/ui-icons/forward.png" />
541
+ </div>`,
542
+ );
543
+
544
+ s(`.button-quest-modal-forward-${questData.id}`).onclick = async () => {
545
+ s(`.button-quest-modal-forward-${questData.id}`).remove();
546
+ if (s(`.btn-close-${idModal}`)) s(`.btn-close-${idModal}`).click();
547
+ await timer(500);
548
+ resolve();
549
+ };
550
+
551
+ {
552
+ const closeTalkingDialog = () => {
553
+ if (Keyboard.Event[`quest-close-forward-${questData.id}`])
554
+ delete Keyboard.Event[`quest-close-forward-${questData.id}`];
555
+ if (s(`.button-quest-modal-forward-${questData.id}`))
556
+ s(`.button-quest-modal-forward-${questData.id}`).click();
557
+ };
558
+ Keyboard.Event[`quest-close-forward-${questData.id}`] = {
559
+ F: closeTalkingDialog,
560
+ f: closeTalkingDialog,
561
+ };
562
+ }
563
+
564
+ LoadingAnimation.img.play(`.${idModal}-talking-loading`, 'points');
565
+ const mainType = displayStepData.customMainDisplayId ? 'bot' : 'user';
566
+
567
+ CharacterCyberia.renderCharacterCyberiaPreView({
568
+ type: mainType,
569
+ id: displayStepData.customMainDisplayId
570
+ ? ElementsCyberia.findIdFromDisplayId(mainType, displayStepData.customMainDisplayId)
571
+ : 'main',
572
+ container: `${idModal}-element-0`,
573
+ positionId: '06',
574
+ displayId: displayStepData.customMainDisplayId,
575
+ });
576
+
577
+ const targetType = displayStepData.customTargetDisplayId
578
+ ? displayStepData.customTargetDisplayId === 'user-main'
579
+ ? 'user'
580
+ : 'bot'
581
+ : typeTarget;
582
+
583
+ await CharacterCyberia.renderCharacterCyberiaPreView({
584
+ type: targetType,
585
+ id: displayStepData.customTargetDisplayId
586
+ ? displayStepData.customTargetDisplayId === 'user-main'
587
+ ? 'main'
588
+ : ElementsCyberia.findIdFromDisplayId(targetType, displayStepData.customTargetDisplayId)
589
+ : elementTargetId,
590
+ container: `${idModal}-element-1`,
591
+ positionId: '04',
592
+ displayId: displayStepData.customTargetDisplayId,
593
+ });
594
+
595
+ s(`.${idModal}-talking-loading-container`).remove();
596
+ s(`.${idModal}-element-0`).classList.remove('hide');
597
+ s(`.${idModal}-element-1`).classList.remove('hide');
598
+
599
+ const offsetWidth = s(`.${idModal}`).offsetWidth;
600
+ const triangleWidth = 60;
601
+ const dialogQuestIdSalt = s4() + s4() + s4();
602
+
603
+ htmls(
604
+ `.render-bubble-${questData.id}`,
605
+ html`<div class="fl" style="width: 85%; margin: auto">
606
+ ${await renderBubbleDialog({
607
+ id: `${idModal}-element-bubble-${dialogQuestIdSalt}-a`,
608
+ // triangleType: 'left',
609
+ html: async () =>
610
+ html` <div
611
+ class="in typeWriteSectionsString typeWriteSectionsString-${idModal}-${dialogQuestIdSalt}-a"
612
+ ></div>`,
613
+ classSelectors: 'in fll',
614
+ bubbleCss: 'width: 80%',
615
+ triangleWidth,
616
+ trianglePositionCss: `bottom: -45px; left: 25%;`,
617
+ triangleCss: `border-left: none`,
618
+ })}${await renderBubbleDialog({
619
+ id: `${idModal}-element-bubble-${dialogQuestIdSalt}-b`,
620
+ // triangleType: 'left',
621
+ html: async () =>
622
+ html` <div
623
+ class="in typeWriteSectionsString typeWriteSectionsString-${idModal}-${dialogQuestIdSalt}-b"
624
+ ></div>`,
625
+ classSelectors: 'in flr hide',
626
+ bubbleCss: 'width: 80%',
627
+ triangleWidth,
628
+ trianglePositionCss: `bottom: -45px; right: 25%;`,
629
+ triangleCss: `border-right: none`,
630
+ })}
631
+ </div>`,
632
+ );
633
+
634
+ // const renderTranslateData = Translate.Render(
635
+ // `${questData.id}-completeDialog-step-${
636
+ // QuestComponent.Data[questData.id]().provide.displayIds[0].id
637
+ // }-${currentStep}-${currentDialogIndex}`,
638
+ // );
639
+
640
+ let currentDialogIndex = -1;
641
+ let currentBubbleId = 'a';
642
+ const renderTalkingDialog = async () => {
643
+ currentDialogIndex++;
644
+ const translateData = displayStepData.talkingDialog[currentDialogIndex].dialog;
645
+ const { phraseArray, sectionsIndex } = getSectionsStringData(
646
+ Modal.mobileModal() ? offsetWidth * 0.2 : offsetWidth * 0.3,
647
+ translateData[s('html').lang] ? translateData[s('html').lang] : translateData['en'],
648
+ );
649
+ let currentPhraseArrayIndex = -1;
650
+ const renderPhrase = async () => {
651
+ if (!s(`.typeWriteSectionsString-${idModal}-${dialogQuestIdSalt}-${currentBubbleId}`)) return;
652
+ currentPhraseArrayIndex++;
653
+ htmls(`.typeWriteSectionsString-${idModal}-${dialogQuestIdSalt}-${currentBubbleId}`, '');
654
+ await typeWriteSectionsString({
655
+ container: `typeWriteSectionsString-${idModal}-${dialogQuestIdSalt}-${currentBubbleId}`,
656
+ phraseArray,
657
+ rangeArraySectionIndex: sectionsIndex[currentPhraseArrayIndex],
658
+ });
659
+ await timer(1500);
660
+ if (currentPhraseArrayIndex + 1 < sectionsIndex.length) await renderPhrase();
661
+ };
662
+ await renderPhrase();
663
+ if (currentDialogIndex + 1 < displayStepData.talkingDialog.length) {
664
+ if (s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-a`).classList.contains('hide'))
665
+ s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-a`).classList.remove('hide');
666
+ else s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-a`).classList.add('hide');
667
+
668
+ if (s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-b`).classList.contains('hide'))
669
+ s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-b`).classList.remove('hide');
670
+ else s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-b`).classList.add('hide');
671
+
672
+ if (s(`.bubble-dialog-${idModal}-element-bubble-${dialogQuestIdSalt}-a`).classList.contains('hide'))
673
+ currentBubbleId = 'b';
674
+ else currentBubbleId = 'a';
675
+
676
+ await renderTalkingDialog();
677
+ }
678
+ };
679
+ await renderTalkingDialog();
680
+ s(`.button-quest-modal-forward-${questData.id}`).click();
681
+ });
682
+ },
683
+ onChangeCurrentQuestAvailable: {},
684
+ triggerQuestAvailableRender: async function ({ type, id }) {
685
+ // TODO: cyberia-shop-bag - enabled this ui feature
686
+ logger.warn('triggerQuestAvailableRender');
687
+ // re render available quests
688
+ const quests = WorldCyberiaManagement.Data[type][id].model.world.quests;
689
+ for (const event of Object.keys(this.onChangeCurrentQuestAvailable)) {
690
+ const { id, selector } = this.onChangeCurrentQuestAvailable[event];
691
+ if (s(selector)) {
692
+ let listRenderQuest = html``;
693
+ let index = -1;
694
+ for (const questMetaData of quests) {
695
+ index++;
696
+ listRenderQuest += await QuestCyberia.RenderPanelQuest({ id: `${id}-${index}`, questMetaData });
697
+ }
698
+ // htmls(selector, listRenderQuest);
699
+ htmls(selector, '');
700
+ }
701
+ }
702
+ },
703
+ RenderModal: async function ({ questData, interactionPanelQuestId, completeStep, completeQuest, elementTargetId }) {
704
+ questData = {
705
+ ...QuestComponent.Data[questData.id](),
706
+ ...questData,
707
+ };
708
+
709
+ const idPanel = this.getIdPanelByQuestId({ questData });
710
+ if (idPanel) await InteractionPanelCyberia.PanelRender.removeActionPanel(idPanel);
711
+
712
+ const currentQuestData = ElementsCyberia.Data.user['main'].model.quests.find((q) => q.id === questData.id);
713
+ let currentStep = 0;
714
+ if (currentQuestData) currentStep = currentQuestData.currentStep;
715
+ const { barConfig } = await Themes[Css.currentTheme]();
716
+ const idModal = `modal-panel-quest-${questData.id}`;
717
+ const displayIdIndex = 0;
718
+ const componentData = QuestComponent.components.find(
719
+ (s) => s.displayId === questData.provide.displayIds[displayIdIndex].id,
720
+ );
721
+
722
+ let completeQuestStatic = false;
723
+ if (currentQuestData && !completeQuest)
724
+ completeQuestStatic = QuestComponent.verifyCompleteQuest({ questData: currentQuestData });
725
+
726
+ const renderMainText = html`${completeQuest !== undefined || completeQuestStatic
727
+ ? Translate.Render(`${questData.id}-successDescription`)
728
+ : completeStep !== undefined
729
+ ? Translate.Render(`${questData.id}-completeDialog-step-${componentData.displayId}-${currentStep}`)
730
+ : currentStep > 0
731
+ ? Translate.Render(`${questData.id}-completeDialog-step-${componentData.displayId}-${currentStep - 1}`)
732
+ : Translate.Render(`${questData.id}-description`)}`;
733
+
734
+ const mainDisplayId =
735
+ completeQuest !== undefined || completeQuestStatic
736
+ ? componentData.displayId
737
+ : completeStep !== undefined
738
+ ? questData.provide.displayIds[displayIdIndex].stepData[currentStep].displayId
739
+ : currentStep > 0
740
+ ? questData.provide.displayIds[displayIdIndex].stepData[currentStep - 1].displayId
741
+ : componentData.displayId;
742
+
743
+ const elementType = 'bot';
744
+ const elementId = mainDisplayId
745
+ ? Object.keys(ElementsCyberia.Data.bot).find(
746
+ (botId) => ElementsCyberia.getCurrentSkinDisplayId({ id: botId, type: elementType }) === mainDisplayId,
747
+ )
748
+ : undefined;
749
+
750
+ const renderMainImage =
751
+ completeQuest !== undefined || completeQuestStatic
752
+ ? html` <img
753
+ class="in quest-provide-img"
754
+ src="${getProxyPath()}assets/skin/${componentData.displayId}/08/0.${componentData.extension}"
755
+ />`
756
+ : completeStep !== undefined
757
+ ? html` <img
758
+ class="in quest-provide-img"
759
+ src="${getProxyPath()}${questData.provide.displayIds[displayIdIndex].stepData[currentStep].image}"
760
+ ${getProxyPath()}${questData.provide.displayIds[displayIdIndex].stepData[currentStep].imageStyle
761
+ ? `style="${renderCssAttr({
762
+ style: questData.provide.displayIds[displayIdIndex].stepData[currentStep].imageStyle,
763
+ })}"`
764
+ : ''}
765
+ />`
766
+ : currentStep > 0
767
+ ? html` <img
768
+ class="in quest-provide-img"
769
+ src="${getProxyPath()}${questData.provide.displayIds[displayIdIndex].stepData[currentStep - 1].image}"
770
+ ${getProxyPath()}${questData.provide.displayIds[displayIdIndex].stepData[currentStep - 1].imageStyle
771
+ ? `style="${renderCssAttr({
772
+ style: questData.provide.displayIds[displayIdIndex].stepData[currentStep - 1].imageStyle,
773
+ })}"`
774
+ : ''}
775
+ />`
776
+ : html` <img
777
+ class="in quest-provide-img"
778
+ src="${getProxyPath()}assets/skin/${componentData.displayId}/08/0.${componentData.extension}"
779
+ />`;
780
+
781
+ const translateData =
782
+ completeQuest !== undefined || completeQuestStatic
783
+ ? questData.successDescription
784
+ : completeStep !== undefined
785
+ ? questData.provide.displayIds[displayIdIndex].stepData[currentStep].completeDialog
786
+ : currentStep > 0
787
+ ? questData.provide.displayIds[displayIdIndex].stepData[currentStep - 1].completeDialog
788
+ : questData.description;
789
+
790
+ const questContext = QuestComponent.componentsScope[mainDisplayId];
791
+
792
+ // console.warn({ mainDisplayId, questData, questContext });
793
+
794
+ const idSalt = s4() + s4();
795
+ let currentSectionIndex = 0;
796
+
797
+ const bubbleMainText = async () => {
798
+ setTimeout(() => {
799
+ const offsetWidth = s(`.${idModal}`).offsetWidth;
800
+ const { phraseArray, sectionsIndex } = getSectionsStringData(
801
+ offsetWidth * 0.07,
802
+ translateData[s('html').lang] ? translateData[s('html').lang] : translateData['en'],
803
+ );
804
+
805
+ const updateArrowAction = () => {
806
+ if (sectionsIndex.length > 1 && s(`.dialog-step-container-${questData.id}`).classList.contains('hide')) {
807
+ s(`.dialog-step-container-${questData.id}`).classList.remove('hide');
808
+ htmls(`.dialog-step-container-total-${questData.id}`, sectionsIndex.length);
809
+ }
810
+ htmls(`.dialog-step-container-current-${questData.id}`, currentSectionIndex + 1);
811
+ if (currentSectionIndex === 0 && currentSectionIndex === sectionsIndex.length - 1) {
812
+ s(`.quest-bubble-icon-arrow-left`).style.display = 'none';
813
+ s(`.quest-bubble-icon-arrow-right`).style.display = 'none';
814
+ return;
815
+ }
816
+ if (currentSectionIndex === 0) {
817
+ s(`.quest-bubble-icon-arrow-left`).style.opacity = '0';
818
+ s(`.quest-bubble-icon-arrow-left`).style.cursor = 'default';
819
+ } else {
820
+ s(`.quest-bubble-icon-arrow-left`).style.opacity = null;
821
+ s(`.quest-bubble-icon-arrow-left`).style.cursor = null;
822
+ }
823
+ if (currentSectionIndex === sectionsIndex.length - 1) {
824
+ s(`.quest-bubble-icon-arrow-right`).style.opacity = '0';
825
+ s(`.quest-bubble-icon-arrow-right`).style.cursor = 'default';
826
+ } else {
827
+ s(`.quest-bubble-icon-arrow-right`).style.opacity = null;
828
+ s(`.quest-bubble-icon-arrow-right`).style.cursor = null;
829
+ }
830
+ };
831
+
832
+ const typeWriteRender = async () => {
833
+ updateArrowAction();
834
+ await typeWriteSectionsString({
835
+ container: `typeWriteSectionsString-${questData.id}-${idSalt}`,
836
+ phraseArray,
837
+ rangeArraySectionIndex: sectionsIndex[currentSectionIndex],
838
+ });
839
+ };
840
+
841
+ s(`.quest-bubble-icon-arrow-right`).onclick = () => {
842
+ if (currentSectionIndex === sectionsIndex.length - 1) return;
843
+ htmls(`.typeWriteSectionsString-${questData.id}-${idSalt}`, '');
844
+ currentSectionIndex++;
845
+ typeWriteRender();
846
+ };
847
+ s(`.quest-bubble-icon-arrow-left`).onclick = () => {
848
+ if (currentSectionIndex === 0) return;
849
+ htmls(`.typeWriteSectionsString-${questData.id}-${idSalt}`, '');
850
+ currentSectionIndex--;
851
+ typeWriteRender();
852
+ };
853
+ typeWriteRender();
854
+ });
855
+ return await renderBubbleDialog({
856
+ id: `${idModal}-bubble-description`,
857
+ triangleType: 'right',
858
+ html: async () =>
859
+ html`
860
+ <div class="fl">
861
+ ${await BtnIcon.Render({
862
+ class: `in flr action-panel-bar-btn-container quest-bubble-icon-arrow-right`,
863
+ label: html`<img
864
+ class="abs center action-panel-img-icon"
865
+ src="${getProxyPath()}assets/ui-icons/arrow-right.png"
866
+ />
867
+ <!-- <div class="abs quest-keyboard-bubble-info"></div> -->`,
868
+ })}
869
+ ${await BtnIcon.Render({
870
+ class: `in flr action-panel-bar-btn-container quest-bubble-icon-arrow-left`,
871
+ label: html`<img
872
+ class="abs center action-panel-img-icon"
873
+ src="${getProxyPath()}assets/ui-icons/arrow-left.png"
874
+ />
875
+ <!-- <div class="abs quest-keyboard-bubble-info"></div> -->`,
876
+ })}
877
+ </div>
878
+ <div class="fl">
879
+ <div class="in flr">
880
+ <div class="dialog-step-container dialog-step-container-${questData.id} hide">
881
+ <span class="dialog-step-container-current-${questData.id}"></span> /
882
+ <span class="dialog-step-container-total-${questData.id}"></span>
883
+ </div>
884
+ </div>
885
+ </div>
886
+ <div class="in typeWriteSectionsString typeWriteSectionsString-${questData.id}-${idSalt}"></div>
887
+ `,
888
+ classSelectors: 'in',
889
+ });
890
+ };
891
+ const CyberiaQuestSections = {
892
+ sellerStorage: async () => {
893
+ const bagId = 'cyberia-seller-bag';
894
+ let indexBag = -1;
895
+ setTimeout(() => {
896
+ for (const componentType of Object.keys(CyberiaShopStorage)) {
897
+ const itemShopData = CyberiaShopStorage[componentType].filter((s) =>
898
+ s.sellers.find((s0) => s0.id === mainDisplayId),
899
+ );
900
+ for (const itemData of itemShopData) {
901
+ indexBag++;
902
+ Slot[componentType].render({
903
+ bagId,
904
+ slotId: `${bagId}-${indexBag}`,
905
+ displayId: itemData.id,
906
+ disabledCount: true,
907
+ itemData,
908
+ context: 'seller',
909
+ storageBotId: elementTargetId,
910
+ });
911
+ }
912
+ }
913
+ });
914
+ return html`${await BagCyberia.Render({
915
+ disableSortable: true,
916
+ id: bagId,
917
+ idModal: 'modal-seller',
918
+ owner: {
919
+ type: elementType,
920
+ id: elementId,
921
+ },
922
+ empty: true,
923
+ })}`;
924
+ },
925
+ progress: async () => {
926
+ setTimeout(() => {
927
+ for (const step of range(0, questData.maxStep + 1)) {
928
+ s(`.quest-step-box-${questData.id}-${step}`).onclick = () => {
929
+ for (const step0 of range(0, questData.maxStep + 1)) {
930
+ if (step === step0) {
931
+ s(`.quest-step-box-${questData.id}-${step0}`).classList.remove(`quest-step-box-disable`);
932
+ if (s(`.step-progress-container-${questData.id}-${step0}`))
933
+ s(`.step-progress-container-${questData.id}-${step0}`).classList.remove(`hide`);
934
+ } else if (
935
+ !s(`.quest-step-box-${questData.id}-${step0}`).classList.contains(`quest-step-box-disable`)
936
+ ) {
937
+ s(`.quest-step-box-${questData.id}-${step0}`).classList.add(`quest-step-box-disable`);
938
+ if (s(`.step-progress-container-${questData.id}-${step0}`))
939
+ s(`.step-progress-container-${questData.id}-${step0}`).classList.add(`hide`);
940
+ }
941
+ }
942
+ };
943
+ }
944
+
945
+ if (completeStep || completeQuest) {
946
+ const questId = `${questData.id}`;
947
+ setTimeout(() => {
948
+ const currentQuestDataIndex = ElementsCyberia.Data.user['main'].model.quests.findIndex(
949
+ (q) => q.id === questId,
950
+ );
951
+ const questData = ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex];
952
+ const { currentStep } = questData;
953
+ const { maxStep } = QuestComponent.Data[questData.id]();
954
+ for (const i of range(0, currentStep - 1)) {
955
+ s(`.quest-step-box-${questData.id}-${i}`).classList.remove('gray');
956
+ s(`.quest-step-check-img-${questData.id}-${i}`).classList.remove('hide');
957
+ }
958
+
959
+ s(`.quest-step-box-${questData.id}-${currentStep}`).classList.remove('gray');
960
+
961
+ const completeQuest = QuestComponent.verifyCompleteQuest({
962
+ questData: ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex],
963
+ });
964
+
965
+ if (completeQuest) {
966
+ const currentStep = maxStep + 1;
967
+ s(`.quest-step-check-img-${questData.id}-${currentStep - 1}`).classList.remove('hide');
968
+ s(`.quest-step-check-img-${questData.id}-${currentStep}`).classList.remove('hide');
969
+ s(`.quest-step-box-${questData.id}-${currentStep}`).classList.remove('gray');
970
+ s(`.quest-step-box-${questData.id}-${currentStep}`).click();
971
+ } else {
972
+ s(`.quest-step-box-${questData.id}-${currentStep}`).click();
973
+ }
974
+ }, 1000);
975
+ }
976
+
977
+ if (completeQuestStatic) s(`.quest-step-box-${questData.id}-${currentStep + 1}`).click();
978
+ });
979
+ return html` <div class="in section-mp quest-modal-container" style="max-width: 450px">
980
+ <div class="in sub-title-item-modal">
981
+ <img class="inl header-icon-item-modal" src="${getProxyPath()}assets/ui-icons/stats.png" /> Progress
982
+ </div>
983
+
984
+ <div class="in section-mp" style="text-align: center;">
985
+ ${range(0, questData.maxStep)
986
+ .map(
987
+ (i) => html`
988
+ ${i !== 0 && i % 4 === 0 ? html`<br />` : ''}
989
+ <div
990
+ class="inl quest-step-box quest-step-box-${questData.id}-${i} ${i === currentStep
991
+ ? ''
992
+ : `quest-step-box-disable`} ${!completeQuestStatic && currentStep < i ? 'gray' : ''}"
993
+ >
994
+ <img class="abs center quest-step-background-img" src="${getProxyPath()}assets/util/step.png" />
995
+ <div class="abs center">${i + 1}</div>
996
+ <img
997
+ class="abs quest-step-check-img quest-step-check-img-${questData.id}-${i} ${!completeQuestStatic &&
998
+ currentStep <= i
999
+ ? 'hide'
1000
+ : ''}"
1001
+ src="${getProxyPath()}assets/ui-icons/check.png"
1002
+ />
1003
+ </div>
1004
+ `,
1005
+ )
1006
+ .join('')}
1007
+ <div
1008
+ class="inl quest-step-box quest-step-box-${questData.id}-${questData.maxStep +
1009
+ 1} quest-step-box-disable ${!completeQuestStatic ? 'gray' : ''}"
1010
+ >
1011
+ <img class="abs center quest-step-background-img" src="${getProxyPath()}assets/ui-icons/star.png" />
1012
+ <img
1013
+ class="abs quest-step-check-img quest-step-check-img-${questData.id}-${questData.maxStep +
1014
+ 1} ${!completeQuestStatic ? 'hide' : ''}"
1015
+ src="${getProxyPath()}assets/ui-icons/check.png"
1016
+ />
1017
+ </div>
1018
+ </div>
1019
+
1020
+ <div class="in section-mp">
1021
+ ${range(0, questData.maxStep)
1022
+ .map(
1023
+ (i) => html`
1024
+ <div class="in step-progress-container-${questData.id}-${i} ${i === currentStep ? '' : 'hide'}">
1025
+ ${questData.displaySearchObjects
1026
+ .map((q) => {
1027
+ if (q.step !== i) return '';
1028
+ if (currentQuestData) {
1029
+ const searchItemData = currentQuestData.displaySearchObjects.find(
1030
+ (s) => s.id === q.id && s.step === i,
1031
+ );
1032
+
1033
+ if (searchItemData) q.current = searchItemData.current;
1034
+ }
1035
+ const searchObjectQuestSpriteData = QuestComponent.components.find((s) => s.displayId === q.id);
1036
+
1037
+ return html`<div class="fl">
1038
+ <div class="in fll" style="width: 60%">
1039
+ <div class="in fll quest-modal-panel-containers-quest-img">
1040
+ <img
1041
+ class="in quest-interaction-panel-icon-img"
1042
+ src="${getProxyPath()}assets/${searchObjectQuestSpriteData.assetFolder}/${searchObjectQuestSpriteData.displayId}/${searchObjectQuestSpriteData.position}/0.${searchObjectQuestSpriteData.extension}"
1043
+ />
1044
+ </div>
1045
+ ${q.id}
1046
+ </div>
1047
+ <div class="in fll" style="width: 40%">
1048
+ <span class="modal-${questData.id}-${q.id}-${q.step}-current">${q.current}</span>
1049
+ /
1050
+ <span> ${q.quantity}</span>
1051
+ </div>
1052
+ </div> `;
1053
+ })
1054
+ .join('')}
1055
+ </div>
1056
+ `,
1057
+ )
1058
+ .join('')}
1059
+
1060
+ <br />
1061
+ </div>
1062
+ </div>`;
1063
+ },
1064
+ rewards: async () => {
1065
+ return html` <div class="in section-mp quest-modal-container" style="max-width: 450px">
1066
+ <div class="in sub-title-item-modal">
1067
+ <img class="inl header-icon-item-modal" src="${getProxyPath()}assets/ui-icons/star.png" />
1068
+ ${Translate.Render('reward')}
1069
+ </div>
1070
+ <div class="in section-mp">
1071
+ ${questData.reward
1072
+ .map((r, i) => {
1073
+ const type = r.type;
1074
+ const index = i;
1075
+ const bagId = questData.id + '-reward-slot';
1076
+ const { quantity, id } = r;
1077
+ setTimeout(() => {
1078
+ BagCyberia.Tokens[bagId] = { owner: { id: elementTargetId, type: 'bot' } };
1079
+ const slotId = `${bagId}-${index}`;
1080
+ Slot[type].render({
1081
+ slotId,
1082
+ displayId: id,
1083
+ // disabledCount,
1084
+ // itemData,
1085
+ context: 'reward',
1086
+ // storageBotId,
1087
+ quantity,
1088
+ });
1089
+ });
1090
+ return html`<div class="inl bag-slot ${bagId}-${index}"></div>`;
1091
+ })
1092
+ .join('')}
1093
+ </div>
1094
+ <br />
1095
+ </div>`;
1096
+ },
1097
+ btnTakeQuest: async () => {
1098
+ return html` <div class="in section-mp">
1099
+ ${await BtnIcon.Render({
1100
+ label: html`${renderViewTitle({
1101
+ 'ui-icon': `close.png`,
1102
+ text: html`${Translate.Render('dismiss-quest')}`,
1103
+ top: 2,
1104
+ topText: 0,
1105
+ })}`,
1106
+ type: 'button',
1107
+ class: `inl wfa section-mp-btn btn-dismiss-quest-${idModal} ${
1108
+ ElementsCyberia.Data.user['main'].model.quests.find((q) => q.id === questData.id) ? '' : 'hide'
1109
+ }`,
1110
+ style: 'max-width: 450px',
1111
+ })}
1112
+ ${await BtnIcon.Render({
1113
+ label: html`${renderViewTitle({
1114
+ 'ui-icon': `ok.png`,
1115
+ text: html`${Translate.Render('take-quest')}`,
1116
+ top: 2,
1117
+ topText: 0,
1118
+ })}`,
1119
+ type: 'button',
1120
+ class: `inl wfa section-mp-btn btn-ok-quest-${idModal} ${
1121
+ !ElementsCyberia.Data.user['main'].model.quests.find((q) => q.id === questData.id) ? '' : 'hide'
1122
+ }`,
1123
+ style: 'max-width: 450px',
1124
+ })}
1125
+ </div>`;
1126
+ },
1127
+ };
1128
+
1129
+ await Modal.Render({
1130
+ id: idModal,
1131
+ barConfig,
1132
+ title: renderViewTitle({
1133
+ // 'ui-icon': questData.icon.id,
1134
+ // assetFolder: questData.icon.folder,
1135
+ 'ui-icon': 'quest.png',
1136
+ text: html`${Translate.Render(`${questData.id}-title`)}`,
1137
+ }),
1138
+ html: html`<div class="in section-mp">
1139
+ ${dynamicCol({
1140
+ id: `quest-dynamic-${questData.id}`,
1141
+ containerSelector: `quest-dynamic-${questData.id}`,
1142
+ type: 'a-50-b-50',
1143
+ limit: 500,
1144
+ })}
1145
+ <div class="fl quest-dynamic-${questData.id}">
1146
+ <div class="in fll quest-dynamic-${questData.id}-col-a">
1147
+ ${questContext && questContext.questKeyContext === 'seller'
1148
+ ? html`${await CyberiaQuestSections.sellerStorage()}`
1149
+ : html`${await CyberiaQuestSections.progress()} ${await CyberiaQuestSections.rewards()}
1150
+ ${await CyberiaQuestSections.btnTakeQuest()}`}
1151
+ </div>
1152
+ <div class="in fll quest-dynamic-${questData.id}-col-b">
1153
+ <div class="in section-mp">
1154
+ <div class="fl">
1155
+ <div class="in fll" style="width: 50%">
1156
+ <div class="in" style="height: 60px"></div>
1157
+ ${completeQuest !== undefined || completeQuestStatic
1158
+ ? questData.successDescriptionBubble
1159
+ ? await bubbleMainText()
1160
+ : renderMainText
1161
+ : completeStep !== undefined
1162
+ ? questData.provide.displayIds[displayIdIndex].stepData[currentStep].bubble
1163
+ ? await bubbleMainText()
1164
+ : renderMainText
1165
+ : currentStep > 0
1166
+ ? questData.provide.displayIds[displayIdIndex].stepData[currentStep - 1].bubble
1167
+ ? await bubbleMainText()
1168
+ : renderMainText
1169
+ : questData.descriptionBubble
1170
+ ? await bubbleMainText()
1171
+ : renderMainText}
1172
+ </div>
1173
+
1174
+ <div class="in fll" style="width: 50%">
1175
+ <div class="in" style="height: 60px">
1176
+ ${mainDisplayId && elementId
1177
+ ? html` <div class="abs center">
1178
+ ${ElementsCyberia.getDisplayTitle({
1179
+ type: elementType,
1180
+ id: elementId,
1181
+ htmlTemplate: true,
1182
+ })}
1183
+ <br />
1184
+ ${ElementsCyberia.getDisplayName({
1185
+ type: elementType,
1186
+ id: elementId,
1187
+ htmlTemplate: true,
1188
+ })}
1189
+ </div>`
1190
+ : ''}
1191
+ </div>
1192
+ ${renderMainImage}
1193
+ </div>
1194
+ </div>
1195
+ </div>
1196
+ </div>
1197
+ </div>
1198
+ </div> `,
1199
+ maximize: true,
1200
+ mode: 'view',
1201
+ slideMenu: 'modal-menu',
1202
+ });
1203
+
1204
+ Keyboard.Event[`quest-close-modal`] = {
1205
+ F: async () => {
1206
+ s(`.btn-close-${idModal}`) ? s(`.btn-close-${idModal}`).click() : null;
1207
+ await InteractionPanelCyberia.PanelRender.removeAllActionPanel();
1208
+ },
1209
+ f: async () => {
1210
+ s(`.btn-close-${idModal}`) ? s(`.btn-close-${idModal}`).click() : null;
1211
+ await InteractionPanelCyberia.PanelRender.removeAllActionPanel();
1212
+ },
1213
+ };
1214
+
1215
+ EventsUI.onClick(`.btn-dismiss-quest-${idModal}`, async () => {
1216
+ ElementsCyberia.Data.user['main'].model.quests = ElementsCyberia.Data.user['main'].model.quests.filter(
1217
+ (q) => q.id !== questData.id,
1218
+ );
1219
+
1220
+ if (s(`.quest-interaction-panel-${interactionPanelQuestId}`))
1221
+ s(`.quest-interaction-panel-${interactionPanelQuestId}`).remove();
1222
+ const result = Auth.getToken()
1223
+ ? await CyberiaQuestService.post({ id: `abandon/${questData.sagaId}/${questData.id}` })
1224
+ : await CyberiaQuestService.post({
1225
+ id: `abandon-anon/${questData.sagaId}/${questData.id}`,
1226
+ body: { socketId: SocketIo.socket.id },
1227
+ });
1228
+ if (result.status === 'success') {
1229
+ await InteractionPanelCyberia.PanelRender.removeAllActionPanel();
1230
+ delete InteractionPanelCyberia.PanelRender.questTokens[interactionPanelQuestId];
1231
+ await InteractionPanelCyberia.PanelRender.restoreQuestPanelRender();
1232
+ }
1233
+ s(`.btn-close-${idModal}`).click();
1234
+ });
1235
+
1236
+ EventsUI.onClick(`.btn-ok-quest-${idModal}`, async () => {
1237
+ s(`.btn-dismiss-quest-${idModal}`).classList.remove('hide');
1238
+ s(`.btn-ok-quest-${idModal}`).classList.add('hide');
1239
+ await this.takeQuest({ questData });
1240
+ s(`.btn-close-${idModal}`).click();
1241
+ });
1242
+ Modal.Data[idModal].onCloseListener['immunity-off-quest-modal-dialog'] = () => {
1243
+ SocketIo.Emit('user', {
1244
+ status: 'immunity-off-quest-modal-dialog',
1245
+ });
1246
+ ElementsCyberia.LocalDataScope['user']['main'].immunityQuestModalDialog = false;
1247
+ };
1248
+ },
1249
+ updateQuestItemProgressDisplay: async function ({
1250
+ interactionPanelQuestId,
1251
+ currentQuestDataIndex,
1252
+ currentStep,
1253
+ displayId,
1254
+ questData,
1255
+ searchObjectIndex,
1256
+ }) {
1257
+ setTimeout(InteractionPanelCyberia.PanelRender.removeAllActionPanel);
1258
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].displaySearchObjects[searchObjectIndex]
1259
+ .current++;
1260
+ Slot.questItem.update({ bagId: 'cyberia-bag', displayId, type: 'user', id: 'main' });
1261
+ if (s(`.quest-interaction-panel-${interactionPanelQuestId}`))
1262
+ htmls(
1263
+ `.${questData.id}-${displayId}-${currentStep}-current`,
1264
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].displaySearchObjects[searchObjectIndex]
1265
+ .current,
1266
+ );
1267
+
1268
+ if (s(`.modal-panel-quest-${questData.id}`))
1269
+ htmls(
1270
+ `.modal-${questData.id}-${displayId}-${currentStep}-current`,
1271
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].displaySearchObjects[searchObjectIndex]
1272
+ .current,
1273
+ );
1274
+
1275
+ const completeStep = QuestComponent.verifyCompleteQuestStep({
1276
+ questData: ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex],
1277
+ });
1278
+ if (completeStep) {
1279
+ SocketIo.Emit('user', {
1280
+ status: 'immunity-on-quest-modal-dialog',
1281
+ questData: { id: questData.id },
1282
+ });
1283
+ ElementsCyberia.LocalDataScope['user']['main'].immunityQuestModalDialog = true;
1284
+ const questId = `${questData.id}`;
1285
+ setTimeout(() => {
1286
+ const currentQuestDataIndex = ElementsCyberia.Data.user['main'].model.quests.findIndex((q) => q.id === questId);
1287
+ const { maxStep } = QuestComponent.Data[questId]();
1288
+ if (ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].currentStep < maxStep) {
1289
+ sa(
1290
+ `.quest-panel-step-${questId}-${ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].currentStep}`,
1291
+ ).forEach((el) => el.classList.add('hide'));
1292
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].currentStep++;
1293
+ sa(
1294
+ `.quest-panel-step-${questId}-${ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].currentStep}`,
1295
+ ).forEach((el) => el.classList.remove('hide'));
1296
+ htmls(
1297
+ `.quest-interaction-panel-current-step-${questId}`,
1298
+ ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex].currentStep + 1,
1299
+ );
1300
+ }
1301
+ });
1302
+ const displayStepData = QuestComponent.Data[questData.id]().provide.displayIds[0].stepData[currentStep];
1303
+
1304
+ if (displayStepData.talkingDialog) {
1305
+ try {
1306
+ await QuestManagementCyberia.talkingDialog({
1307
+ displayStepData,
1308
+ questData,
1309
+ typeTarget: 'bot',
1310
+ elementTargetId: ElementsCyberia.findIdFromDisplayId('bot', displayId),
1311
+ });
1312
+ } catch (error) {
1313
+ logger.error(error);
1314
+ }
1315
+ }
1316
+
1317
+ const completeQuest = QuestComponent.verifyCompleteQuest({
1318
+ questData: ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex],
1319
+ });
1320
+ if (completeQuest) {
1321
+ try {
1322
+ await this.RenderModal({
1323
+ questData,
1324
+ interactionPanelQuestId,
1325
+ completeQuest,
1326
+ });
1327
+ } catch (error) {
1328
+ logger.error(error);
1329
+ }
1330
+ } else {
1331
+ for (const { id } of ElementsCyberia.Data.user['main'].model.quests[currentQuestDataIndex]
1332
+ .displaySearchObjects) {
1333
+ Slot.questItem.update({ bagId: 'cyberia-bag', displayId: id, type: 'user', id: 'main' });
1334
+ }
1335
+
1336
+ try {
1337
+ await this.RenderModal({
1338
+ questData,
1339
+ interactionPanelQuestId,
1340
+ completeStep,
1341
+ });
1342
+ } catch (error) {
1343
+ logger.error(error);
1344
+ }
1345
+ }
1346
+ }
1347
+ },
1348
+ takeQuest: async function ({ questData }) {
1349
+ questData = QuestComponent.Data[questData.id]();
1350
+ const interactionPanelQuestId = questData ? `interaction-panel-${questData.id}` : undefined;
1351
+ const questIndex = ElementsCyberia.Data.user['main'].model.quests.findIndex((q) => q.id === questData.id);
1352
+ if (questIndex >= 0) ElementsCyberia.Data.user['main'].model.quests[questIndex] = questData;
1353
+ else ElementsCyberia.Data.user['main'].model.quests.push(questData);
1354
+ if (Auth.getToken()) {
1355
+ const result = await CyberiaQuestService.post({ id: `take/${questData.sagaId}/${questData.id}` });
1356
+ } else {
1357
+ const result = await CyberiaQuestService.post({
1358
+ id: `take-anon/${questData.sagaId}/${questData.id}`,
1359
+ body: { socketId: SocketIo.socket.id },
1360
+ });
1361
+ }
1362
+ await InteractionPanelCyberia.PanelRender.quest({
1363
+ id: interactionPanelQuestId,
1364
+ questData,
1365
+ disabledRender: true,
1366
+ });
1367
+ await InteractionPanelCyberia.PanelRender.restoreQuestPanelRender();
1368
+ await InteractionPanelCyberia.PanelRender.removeAllActionPanel();
1369
+ },
1370
+ getIdPanelByQuestId: function ({ questData }) {
1371
+ for (const elementTargetId of Object.keys(ElementsCyberia.LocalDataScope['bot'])) {
1372
+ if (
1373
+ ElementsCyberia.LocalDataScope['bot'][elementTargetId].quest &&
1374
+ ElementsCyberia.LocalDataScope['bot'][elementTargetId].quest.id === questData.id
1375
+ )
1376
+ return ElementsCyberia.LocalDataScope['bot'][elementTargetId].quest.idPanel;
1377
+ }
1378
+ },
1379
+ countQuestItems: function ({ type, id, displayId }) {
1380
+ let globalCount = 0;
1381
+ for (const questData of ElementsCyberia.Data[type][id].model.quests) {
1382
+ let count = 0;
1383
+ for (const itemData of questData.displaySearchObjects) {
1384
+ if (itemData.id === displayId) count += itemData.current;
1385
+ if (itemData.delivery && itemData.current >= itemData.quantity) count = 0;
1386
+ }
1387
+ globalCount += count;
1388
+ }
1389
+
1390
+ return globalCount;
1391
+ },
1392
+ };
1393
+
1394
+ const QuestCyberia = {
1395
+ RenderPanelQuest: async function ({ id, questMetaData }) {
1396
+ const dataScope = { id, questMetaData, QuestComponent: QuestComponent.Data[questMetaData.id] };
1397
+ return html` <div class="in section-mp ">
1398
+ <div class="in section-mp">
1399
+ <div class="in sub-title-modal">${Translate.Render(`${questMetaData.id}-title`)}</div>
1400
+ <div class="in section-mp">${Translate.Render(`${questMetaData.id}-description`)}</div>
1401
+ </div>
1402
+ <div class="in section-mp">
1403
+ <div class="in sub-title-modal">metadata</div>
1404
+ <div class="in"><pre>${JSON.stringify(dataScope, null, 4)}</pre></div>
1405
+ </div>
1406
+ </div>`;
1407
+ },
1408
+ Render: async function ({ idModal }) {
1409
+ QuestManagementCyberia.onChangeCurrentQuestAvailable[idModal] = {
1410
+ selector: '.current-render-quest',
1411
+ id: 'current-render-quest',
1412
+ };
1413
+ setTimeout(async () => {
1414
+ await QuestManagementCyberia.triggerQuestAvailableRender({ type: 'user', id: 'main' });
1415
+ });
1416
+ return html`<div class="in current-render-quest"></div>`;
1417
+ },
1418
+ };
1419
+
1420
+ export { QuestManagementCyberia, QuestCyberia };