omegga 0.1.85 → 1.0.2

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 (467) hide show
  1. package/README.md +142 -62
  2. package/bin/omegga +10 -4
  3. package/dist/brickadia/config.d.ts +3 -0
  4. package/dist/brickadia/config.d.ts.map +1 -0
  5. package/dist/brickadia/config.js +61 -0
  6. package/dist/brickadia/config.js.map +1 -0
  7. package/dist/brickadia/presets.d.ts +65 -0
  8. package/dist/brickadia/presets.js +3 -0
  9. package/dist/brickadia/presets.js.map +1 -0
  10. package/dist/brickadia/server.d.ts +20 -0
  11. package/dist/brickadia/server.d.ts.map +1 -0
  12. package/dist/brickadia/server.js +188 -0
  13. package/dist/brickadia/server.js.map +1 -0
  14. package/dist/brickadia/types.d.ts +45 -0
  15. package/dist/brickadia/types.d.ts.map +1 -0
  16. package/dist/brickadia/types.js +3 -0
  17. package/dist/brickadia/types.js.map +1 -0
  18. package/dist/cli/auth.d.ts +20 -0
  19. package/dist/cli/auth.d.ts.map +1 -0
  20. package/dist/cli/auth.js +115 -0
  21. package/dist/cli/auth.js.map +1 -0
  22. package/dist/cli/config.d.ts +10 -0
  23. package/dist/cli/config.d.ts.map +1 -0
  24. package/dist/cli/config.js +72 -0
  25. package/dist/cli/config.js.map +1 -0
  26. package/dist/cli/index.d.ts +20 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +15 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/cli/installer.d.ts +1 -0
  31. package/dist/cli/installer.d.ts.map +1 -0
  32. package/dist/cli/installer.js +55 -0
  33. package/dist/cli/installer.js.map +1 -0
  34. package/dist/cli/plugin.d.ts +11 -0
  35. package/dist/cli/plugin.d.ts.map +1 -0
  36. package/dist/cli/plugin.js +598 -0
  37. package/dist/cli/plugin.js.map +1 -0
  38. package/dist/cli/terminal.d.ts +34 -0
  39. package/dist/cli/terminal.d.ts.map +1 -0
  40. package/dist/cli/terminal.js +395 -0
  41. package/dist/cli/terminal.js.map +1 -0
  42. package/dist/config/authorizer.d.ts +2 -0
  43. package/dist/config/authorizer.d.ts.map +1 -0
  44. package/dist/config/authorizer.js +38 -0
  45. package/dist/config/authorizer.js.map +1 -0
  46. package/dist/config/formats/format_js.d.ts +3 -0
  47. package/dist/config/formats/format_js.d.ts.map +1 -0
  48. package/dist/config/formats/format_js.js +10 -0
  49. package/dist/config/formats/format_js.js.map +1 -0
  50. package/dist/config/formats/format_yml.d.ts +3 -0
  51. package/dist/config/formats/format_yml.d.ts.map +1 -0
  52. package/dist/config/formats/format_yml.js +14 -0
  53. package/dist/config/formats/format_yml.js.map +1 -0
  54. package/dist/config/index.d.ts +18 -0
  55. package/dist/config/index.d.ts.map +1 -0
  56. package/dist/config/index.js +86 -0
  57. package/dist/config/index.js.map +1 -0
  58. package/dist/config/reader.d.ts +3 -0
  59. package/dist/config/reader.d.ts.map +1 -0
  60. package/dist/config/reader.js +30 -0
  61. package/dist/config/reader.js.map +1 -0
  62. package/dist/config/types.d.ts +37 -0
  63. package/dist/config/types.d.ts.map +1 -0
  64. package/dist/config/types.js +3 -0
  65. package/dist/config/types.js.map +1 -0
  66. package/dist/config/validator.d.ts +6 -0
  67. package/dist/config/validator.d.ts.map +1 -0
  68. package/dist/config/validator.js +26 -0
  69. package/dist/config/validator.js.map +1 -0
  70. package/dist/config/writer.d.ts +3 -0
  71. package/dist/config/writer.d.ts.map +1 -0
  72. package/dist/config/writer.js +25 -0
  73. package/dist/config/writer.js.map +1 -0
  74. package/dist/index.d.ts +22 -0
  75. package/dist/index.js +55 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/info/default_commands.json +28 -0
  78. package/dist/lib.d.ts +21 -0
  79. package/dist/lib.d.ts.map +1 -0
  80. package/dist/lib.js +54 -0
  81. package/dist/lib.js.map +1 -0
  82. package/dist/logger.d.ts +41 -0
  83. package/dist/logger.js +67 -0
  84. package/dist/logger.js.map +1 -0
  85. package/dist/main.d.ts +1 -0
  86. package/dist/main.d.ts.map +1 -0
  87. package/dist/main.js +284 -0
  88. package/dist/main.js.map +1 -0
  89. package/dist/omegga/auth.d.ts +6 -0
  90. package/dist/omegga/auth.d.ts.map +1 -0
  91. package/dist/omegga/auth.js +139 -0
  92. package/dist/omegga/auth.js.map +1 -0
  93. package/dist/omegga/commandInjector.d.ts +35 -0
  94. package/dist/omegga/commandInjector.d.ts.map +1 -0
  95. package/dist/omegga/commandInjector.js +234 -0
  96. package/dist/omegga/commandInjector.js.map +1 -0
  97. package/dist/omegga/index.d.ts +7 -0
  98. package/dist/omegga/index.d.ts.map +1 -0
  99. package/dist/omegga/index.js +43 -0
  100. package/dist/omegga/index.js.map +1 -0
  101. package/dist/omegga/logWrangler.d.ts +32 -0
  102. package/dist/omegga/logWrangler.d.ts.map +1 -0
  103. package/dist/omegga/logWrangler.js +279 -0
  104. package/dist/omegga/logWrangler.js.map +1 -0
  105. package/dist/omegga/matchers/auth.d.ts +9 -0
  106. package/dist/omegga/matchers/auth.d.ts.map +1 -0
  107. package/dist/omegga/matchers/auth.js +53 -0
  108. package/dist/omegga/matchers/auth.js.map +1 -0
  109. package/dist/omegga/matchers/chat.d.ts +9 -0
  110. package/dist/omegga/matchers/chat.d.ts.map +1 -0
  111. package/dist/omegga/matchers/chat.js +68 -0
  112. package/dist/omegga/matchers/chat.js.map +1 -0
  113. package/dist/omegga/matchers/command.d.ts +7 -0
  114. package/dist/omegga/matchers/command.d.ts.map +1 -0
  115. package/dist/omegga/matchers/command.js +39 -0
  116. package/dist/omegga/matchers/command.js.map +1 -0
  117. package/dist/omegga/matchers/exit.d.ts +3 -0
  118. package/dist/omegga/matchers/exit.d.ts.map +1 -0
  119. package/dist/omegga/matchers/exit.js +21 -0
  120. package/dist/omegga/matchers/exit.js.map +1 -0
  121. package/dist/omegga/matchers/index.d.ts +3 -0
  122. package/dist/omegga/matchers/index.d.ts.map +1 -0
  123. package/dist/omegga/matchers/index.js +39 -0
  124. package/dist/omegga/matchers/index.js.map +1 -0
  125. package/dist/omegga/matchers/init.d.ts +3 -0
  126. package/dist/omegga/matchers/init.d.ts.map +1 -0
  127. package/dist/omegga/matchers/init.js +26 -0
  128. package/dist/omegga/matchers/init.js.map +1 -0
  129. package/dist/omegga/matchers/interact.d.ts +4 -0
  130. package/dist/omegga/matchers/interact.js +39 -0
  131. package/dist/omegga/matchers/interact.js.map +1 -0
  132. package/dist/omegga/matchers/join.d.ts +4 -0
  133. package/dist/omegga/matchers/join.d.ts.map +1 -0
  134. package/dist/omegga/matchers/join.js +95 -0
  135. package/dist/omegga/matchers/join.js.map +1 -0
  136. package/dist/omegga/matchers/leave.d.ts +4 -0
  137. package/dist/omegga/matchers/leave.d.ts.map +1 -0
  138. package/dist/omegga/matchers/leave.js +59 -0
  139. package/dist/omegga/matchers/leave.js.map +1 -0
  140. package/dist/omegga/matchers/mapChange.d.ts +3 -0
  141. package/dist/omegga/matchers/mapChange.d.ts.map +1 -0
  142. package/dist/omegga/matchers/mapChange.js +38 -0
  143. package/dist/omegga/matchers/mapChange.js.map +1 -0
  144. package/dist/omegga/matchers/types.d.ts +5 -0
  145. package/dist/omegga/matchers/types.d.ts.map +1 -0
  146. package/dist/omegga/matchers/types.js +7 -0
  147. package/dist/omegga/matchers/types.js.map +1 -0
  148. package/dist/omegga/matchers/version.d.ts +3 -0
  149. package/dist/omegga/matchers/version.d.ts.map +1 -0
  150. package/dist/omegga/matchers/version.js +45 -0
  151. package/dist/omegga/matchers/version.js.map +1 -0
  152. package/dist/omegga/player.d.ts +71 -0
  153. package/dist/omegga/player.d.ts.map +1 -0
  154. package/dist/omegga/player.js +442 -0
  155. package/dist/omegga/player.js.map +1 -0
  156. package/dist/omegga/plugin/plugin_jsonrpc_stdio.d.ts +23 -0
  157. package/dist/omegga/plugin/plugin_jsonrpc_stdio.d.ts.map +1 -0
  158. package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +441 -0
  159. package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -0
  160. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.d.ts +129 -0
  161. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.d.ts.map +1 -0
  162. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +260 -0
  163. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -0
  164. package/dist/omegga/plugin/plugin_node_safe/worker.d.ts +1 -0
  165. package/dist/omegga/plugin/plugin_node_safe/worker.d.ts.map +1 -0
  166. package/dist/omegga/plugin/plugin_node_safe/worker.js +289 -0
  167. package/dist/omegga/plugin/plugin_node_safe/worker.js.map +1 -0
  168. package/dist/omegga/plugin/plugin_node_safe.d.ts +24 -0
  169. package/dist/omegga/plugin/plugin_node_safe.d.ts.map +1 -0
  170. package/dist/omegga/plugin/plugin_node_safe.js +397 -0
  171. package/dist/omegga/plugin/plugin_node_safe.js.map +1 -0
  172. package/dist/omegga/plugin/plugin_node_unsafe.d.ts +13 -0
  173. package/dist/omegga/plugin/plugin_node_unsafe.d.ts.map +1 -0
  174. package/dist/omegga/plugin/plugin_node_unsafe.js +178 -0
  175. package/dist/omegga/plugin/plugin_node_unsafe.js.map +1 -0
  176. package/dist/omegga/plugin.d.ts +86 -0
  177. package/dist/omegga/plugin.d.ts.map +1 -0
  178. package/dist/omegga/plugin.js +458 -0
  179. package/dist/omegga/plugin.js.map +1 -0
  180. package/dist/omegga/server.d.ts +149 -0
  181. package/dist/omegga/server.d.ts.map +1 -0
  182. package/dist/omegga/server.js +601 -0
  183. package/dist/omegga/server.js.map +1 -0
  184. package/dist/omegga/types.d.ts +48 -0
  185. package/dist/omegga/types.d.ts.map +1 -0
  186. package/dist/omegga/types.js +3 -0
  187. package/dist/omegga/types.js.map +1 -0
  188. package/dist/omegga/wrapper.d.ts +22 -0
  189. package/dist/omegga/wrapper.d.ts.map +1 -0
  190. package/dist/omegga/wrapper.js +75 -0
  191. package/dist/omegga/wrapper.js.map +1 -0
  192. package/dist/omeggaplugin.d.ts +1 -0
  193. package/dist/omeggaplugin.js +4 -0
  194. package/dist/omeggaplugin.js.map +1 -0
  195. package/dist/plugin.d.ts +781 -0
  196. package/dist/plugin.js +41 -0
  197. package/dist/plugin.js.map +1 -0
  198. package/dist/softconfig.d.ts +51 -0
  199. package/dist/softconfig.d.ts.map +1 -0
  200. package/dist/softconfig.js +82 -0
  201. package/dist/softconfig.js.map +1 -0
  202. package/dist/util/brick/checkBounds.d.ts +8 -0
  203. package/dist/util/brick/checkBounds.d.ts.map +1 -0
  204. package/dist/util/brick/checkBounds.js +22 -0
  205. package/dist/util/brick/checkBounds.js.map +1 -0
  206. package/dist/util/brick/constants.d.ts +18 -0
  207. package/dist/util/brick/constants.d.ts.map +1 -0
  208. package/dist/util/brick/constants.js +184 -0
  209. package/dist/util/brick/constants.js.map +1 -0
  210. package/dist/util/brick/getBounds.d.ts +4 -0
  211. package/dist/util/brick/getBounds.d.ts.map +1 -0
  212. package/dist/util/brick/getBounds.js +39 -0
  213. package/dist/util/brick/getBounds.js.map +1 -0
  214. package/dist/util/brick/getBrickSize.d.ts +3 -0
  215. package/dist/util/brick/getBrickSize.d.ts.map +1 -0
  216. package/dist/util/brick/getBrickSize.js +12 -0
  217. package/dist/util/brick/getBrickSize.js.map +1 -0
  218. package/dist/util/brick/getScaleAxis.d.ts +3 -0
  219. package/dist/util/brick/getScaleAxis.d.ts.map +1 -0
  220. package/dist/util/brick/getScaleAxis.js +38 -0
  221. package/dist/util/brick/getScaleAxis.js.map +1 -0
  222. package/dist/util/brick/index.d.ts +13 -0
  223. package/dist/util/brick/index.d.ts.map +1 -0
  224. package/dist/util/brick/index.js +29 -0
  225. package/dist/util/brick/index.js.map +1 -0
  226. package/dist/util/brick/rotate.d.ts +17 -0
  227. package/dist/util/brick/rotate.d.ts.map +1 -0
  228. package/dist/util/brick/rotate.js +38 -0
  229. package/dist/util/brick/rotate.js.map +1 -0
  230. package/dist/util/brick/setOwnership.d.ts +12 -0
  231. package/dist/util/brick/setOwnership.d.ts.map +1 -0
  232. package/dist/util/brick/setOwnership.js +21 -0
  233. package/dist/util/brick/setOwnership.js.map +1 -0
  234. package/dist/util/chat.d.ts +23 -0
  235. package/dist/util/chat.d.ts.map +1 -0
  236. package/dist/util/chat.js +50 -0
  237. package/dist/util/chat.js.map +1 -0
  238. package/dist/util/color.d.ts +13 -0
  239. package/dist/util/color.d.ts.map +1 -0
  240. package/dist/util/color.js +130 -0
  241. package/dist/util/color.js.map +1 -0
  242. package/dist/util/file.d.ts +5 -0
  243. package/dist/util/file.d.ts.map +1 -0
  244. package/dist/util/file.js +114 -0
  245. package/dist/util/file.js.map +1 -0
  246. package/dist/util/index.d.ts +162 -0
  247. package/dist/util/index.d.ts.map +1 -0
  248. package/dist/util/index.js +92 -0
  249. package/dist/util/index.js.map +1 -0
  250. package/dist/util/map.d.ts +6 -0
  251. package/dist/util/map.d.ts.map +1 -0
  252. package/dist/util/map.js +26 -0
  253. package/dist/util/map.js.map +1 -0
  254. package/dist/util/pattern.d.ts +1 -0
  255. package/dist/util/pattern.d.ts.map +1 -0
  256. package/dist/util/pattern.js +11 -0
  257. package/dist/util/pattern.js.map +1 -0
  258. package/dist/util/time.d.ts +4 -0
  259. package/dist/util/time.d.ts.map +1 -0
  260. package/dist/util/time.js +41 -0
  261. package/dist/util/time.js.map +1 -0
  262. package/dist/util/uuid.d.ts +2 -0
  263. package/dist/util/uuid.d.ts.map +1 -0
  264. package/dist/util/uuid.js +8 -0
  265. package/dist/util/uuid.js.map +1 -0
  266. package/dist/util/wsl.d.ts +1 -0
  267. package/dist/util/wsl.d.ts.map +1 -0
  268. package/dist/util/wsl.js +14 -0
  269. package/dist/util/wsl.js.map +1 -0
  270. package/dist/webserver/backend/api.d.ts +3 -0
  271. package/dist/webserver/backend/api.d.ts.map +1 -0
  272. package/dist/webserver/backend/api.js +685 -0
  273. package/dist/webserver/backend/api.js.map +1 -0
  274. package/dist/webserver/backend/calendar.d.ts +5 -0
  275. package/dist/webserver/backend/calendar.d.ts.map +1 -0
  276. package/dist/webserver/backend/calendar.js +21 -0
  277. package/dist/webserver/backend/calendar.js.map +1 -0
  278. package/dist/webserver/backend/database.d.ts +149 -0
  279. package/dist/webserver/backend/database.d.ts.map +1 -0
  280. package/dist/webserver/backend/database.js +575 -0
  281. package/dist/webserver/backend/database.js.map +1 -0
  282. package/dist/webserver/backend/index.d.ts +31 -0
  283. package/dist/webserver/backend/index.d.ts.map +1 -0
  284. package/dist/webserver/backend/index.js +189 -0
  285. package/dist/webserver/backend/index.js.map +1 -0
  286. package/dist/webserver/backend/metrics.d.ts +3 -0
  287. package/dist/webserver/backend/metrics.d.ts.map +1 -0
  288. package/dist/webserver/backend/metrics.js +203 -0
  289. package/dist/webserver/backend/metrics.js.map +1 -0
  290. package/dist/webserver/backend/types.d.ts +115 -0
  291. package/dist/webserver/backend/types.d.ts.map +1 -0
  292. package/dist/webserver/backend/types.js +3 -0
  293. package/dist/webserver/backend/types.js.map +1 -0
  294. package/dist/webserver/backend/util.d.ts +2 -0
  295. package/dist/webserver/backend/util.d.ts.map +1 -0
  296. package/dist/webserver/backend/util.js +78 -0
  297. package/dist/webserver/backend/util.js.map +1 -0
  298. package/dist/webserver/index.d.ts +2 -0
  299. package/dist/webserver/index.d.ts.map +1 -0
  300. package/dist/webserver/index.js +9 -0
  301. package/dist/webserver/index.js.map +1 -0
  302. package/{src/webserver/frontend → frontend}/app.html +0 -0
  303. package/{src/webserver/frontend → frontend}/assets/fonts/GlacialIndifferenceBold.ttf +0 -0
  304. package/{src/webserver/frontend → frontend}/assets/fonts/GlacialIndifferenceItalic.otf +0 -0
  305. package/{src/webserver/frontend → frontend}/assets/fonts/GlacialIndifferenceMedium.otf +0 -0
  306. package/{src/webserver/frontend → frontend}/assets/fonts/GlacialIndifferenceRegular.ttf +0 -0
  307. package/{src/webserver/frontend → frontend}/assets/fonts/RobotoBold.ttf +0 -0
  308. package/{src/webserver/frontend → frontend}/assets/fonts/RobotoItalic.ttf +0 -0
  309. package/{src/webserver/frontend → frontend}/assets/fonts/RobotoRegular.ttf +0 -0
  310. package/{src/webserver/frontend → frontend}/assets/img/auth_bg.webp +0 -0
  311. package/{src/webserver/frontend → frontend}/assets/img/dark_bg.webp +0 -0
  312. package/{src/webserver/frontend → frontend}/assets/img/turkey.webp +0 -0
  313. package/{src/webserver/frontend → frontend}/auth.html +0 -0
  314. package/index.js +10 -2
  315. package/package.json +44 -16
  316. package/public/app.bundle.js +537 -73
  317. package/public/app.bundle.js.map +1 -1
  318. package/public/app.css +727 -2
  319. package/public/app.css.map +1 -1
  320. package/public/auth.bundle.js +18 -18
  321. package/public/auth.bundle.js.map +1 -1
  322. package/public/auth.css +364 -2
  323. package/public/auth.css.map +1 -1
  324. package/templates/rpc/README.md +29 -0
  325. package/templates/rpc/doc.json +7 -0
  326. package/templates/rpc/omegga_plugin +0 -0
  327. package/templates/rpc/plugin.json +4 -0
  328. package/templates/rpc/setup.sh +3 -0
  329. package/templates/safe/README.md +29 -0
  330. package/templates/safe/access.json +1 -0
  331. package/templates/safe/doc.json +7 -0
  332. package/templates/safe/omegga.plugin.js +20 -0
  333. package/templates/safe/plugin.json +4 -0
  334. package/templates/safe/setup.sh +4 -0
  335. package/templates/safe-ts/.gitignore.rename +3 -0
  336. package/templates/safe-ts/README.md +29 -0
  337. package/templates/safe-ts/access.json +1 -0
  338. package/templates/safe-ts/doc.json +7 -0
  339. package/templates/safe-ts/omegga.d.ts +1311 -0
  340. package/templates/safe-ts/omegga.plugin.ts +29 -0
  341. package/templates/safe-ts/plugin.json +4 -0
  342. package/templates/safe-ts/setup.sh +4 -0
  343. package/templates/safe-ts/tsconfig.json +10 -0
  344. package/templates/unsafe/README.md +29 -0
  345. package/templates/unsafe/doc.json +7 -0
  346. package/templates/unsafe/omegga.main.js +15 -0
  347. package/templates/unsafe/plugin.json +4 -0
  348. package/templates/unsafe/setup.sh +4 -0
  349. package/.babelrc.json +0 -5
  350. package/.github/workflows/lint.yml +0 -26
  351. package/.prettierrc +0 -7
  352. package/.vscode/extensions.json +0 -5
  353. package/src/OMEGGA_LEGACY_INSTALL +0 -44
  354. package/src/brickadia/config.js +0 -42
  355. package/src/brickadia/server.js +0 -227
  356. package/src/cli/auth.js +0 -104
  357. package/src/cli/config.js +0 -77
  358. package/src/cli/index.js +0 -6
  359. package/src/cli/installer.js +0 -65
  360. package/src/cli/plugin.js +0 -575
  361. package/src/cli/terminal.js +0 -466
  362. package/src/config/authorizer.js +0 -37
  363. package/src/config/formats/format_js.js +0 -6
  364. package/src/config/formats/format_yml.js +0 -8
  365. package/src/config/index.js +0 -81
  366. package/src/config/reader.js +0 -27
  367. package/src/config/validator.js +0 -32
  368. package/src/config/writer.js +0 -20
  369. package/src/info/default_commands.json +0 -26
  370. package/src/lib.js +0 -23
  371. package/src/main.js +0 -332
  372. package/src/omegga/auth.js +0 -138
  373. package/src/omegga/commandInjector.js +0 -228
  374. package/src/omegga/index.js +0 -22
  375. package/src/omegga/logWrangler.js +0 -323
  376. package/src/omegga/matchers/auth.js +0 -49
  377. package/src/omegga/matchers/chat.js +0 -73
  378. package/src/omegga/matchers/command.js +0 -39
  379. package/src/omegga/matchers/exit.js +0 -19
  380. package/src/omegga/matchers/init.js +0 -23
  381. package/src/omegga/matchers/join.js +0 -115
  382. package/src/omegga/matchers/leave.js +0 -58
  383. package/src/omegga/matchers/mapChange.js +0 -37
  384. package/src/omegga/matchers/version.js +0 -45
  385. package/src/omegga/player.js +0 -585
  386. package/src/omegga/plugin/plugin_jsonrpc_stdio.js +0 -526
  387. package/src/omegga/plugin/plugin_node_safe/proxyOmegga.js +0 -117
  388. package/src/omegga/plugin/plugin_node_safe/worker.js +0 -238
  389. package/src/omegga/plugin/plugin_node_safe.js +0 -473
  390. package/src/omegga/plugin/plugin_node_unsafe.js +0 -177
  391. package/src/omegga/plugin.js +0 -565
  392. package/src/omegga/server.js +0 -658
  393. package/src/omegga/wrapper.js +0 -62
  394. package/src/softconfig.js +0 -64
  395. package/src/util/brick/checkBounds.js +0 -22
  396. package/src/util/brick/constants.js +0 -185
  397. package/src/util/brick/getBounds.js +0 -36
  398. package/src/util/brick/getBrickSize.js +0 -9
  399. package/src/util/brick/getScaleAxis.js +0 -31
  400. package/src/util/brick/index.js +0 -9
  401. package/src/util/brick/rotate.js +0 -43
  402. package/src/util/brick/setOwnership.js +0 -20
  403. package/src/util/chat.js +0 -28
  404. package/src/util/color.js +0 -143
  405. package/src/util/file.js +0 -119
  406. package/src/util/index.js +0 -28
  407. package/src/util/map.js +0 -28
  408. package/src/util/pattern.js +0 -14
  409. package/src/util/time.js +0 -46
  410. package/src/util/uuid.js +0 -8
  411. package/src/util/wsl.js +0 -9
  412. package/src/webserver/backend/api.js +0 -795
  413. package/src/webserver/backend/calendar.js +0 -15
  414. package/src/webserver/backend/database.js +0 -725
  415. package/src/webserver/backend/index.js +0 -206
  416. package/src/webserver/backend/metrics.js +0 -148
  417. package/src/webserver/backend/util.js +0 -75
  418. package/src/webserver/frontend/.eslintrc.yml +0 -26
  419. package/src/webserver/frontend/app.js +0 -78
  420. package/src/webserver/frontend/auth.js +0 -16
  421. package/src/webserver/frontend/components/Background.vue +0 -83
  422. package/src/webserver/frontend/components/Button.vue +0 -105
  423. package/src/webserver/frontend/components/ChatEntry.vue +0 -107
  424. package/src/webserver/frontend/components/ChatTime.vue +0 -40
  425. package/src/webserver/frontend/components/Dimmer.vue +0 -43
  426. package/src/webserver/frontend/components/Dropdown.vue +0 -145
  427. package/src/webserver/frontend/components/Footer.vue +0 -29
  428. package/src/webserver/frontend/components/Header.vue +0 -27
  429. package/src/webserver/frontend/components/InfiniteScroll.vue +0 -51
  430. package/src/webserver/frontend/components/Input.vue +0 -93
  431. package/src/webserver/frontend/components/ListInput.vue +0 -105
  432. package/src/webserver/frontend/components/Loader.vue +0 -98
  433. package/src/webserver/frontend/components/MainMenuButton.vue +0 -83
  434. package/src/webserver/frontend/components/Modal.vue +0 -44
  435. package/src/webserver/frontend/components/NavBar.vue +0 -24
  436. package/src/webserver/frontend/components/PlayerDropdown.vue +0 -210
  437. package/src/webserver/frontend/components/PopoutContent.vue +0 -32
  438. package/src/webserver/frontend/components/RoleDropdown.vue +0 -157
  439. package/src/webserver/frontend/components/Scroll.vue +0 -33
  440. package/src/webserver/frontend/components/Toggle.vue +0 -91
  441. package/src/webserver/frontend/components/index.js +0 -33
  442. package/src/webserver/frontend/css/font.scss +0 -53
  443. package/src/webserver/frontend/css/mixins.scss +0 -49
  444. package/src/webserver/frontend/css/style.scss +0 -166
  445. package/src/webserver/frontend/css/theme.scss +0 -64
  446. package/src/webserver/frontend/partials/NavHeader.vue +0 -55
  447. package/src/webserver/frontend/partials/Page.vue +0 -40
  448. package/src/webserver/frontend/partials/PageContent.vue +0 -31
  449. package/src/webserver/frontend/partials/SideNav.vue +0 -115
  450. package/src/webserver/frontend/partials/index.js +0 -4
  451. package/src/webserver/frontend/router.js +0 -83
  452. package/src/webserver/frontend/views/Auth.vue +0 -190
  453. package/src/webserver/frontend/views/History.vue +0 -462
  454. package/src/webserver/frontend/views/Home.vue +0 -251
  455. package/src/webserver/frontend/views/Main.vue +0 -69
  456. package/src/webserver/frontend/views/NotFound.vue +0 -10
  457. package/src/webserver/frontend/views/Players.vue +0 -425
  458. package/src/webserver/frontend/views/PlayersInspector.vue +0 -538
  459. package/src/webserver/frontend/views/Plugins.vue +0 -217
  460. package/src/webserver/frontend/views/PluginsInspector.vue +0 -418
  461. package/src/webserver/frontend/views/Server.vue +0 -167
  462. package/src/webserver/frontend/views/Users.vue +0 -538
  463. package/src/webserver/frontend/widgets/Chat.vue +0 -124
  464. package/src/webserver/frontend/widgets/Status.vue +0 -91
  465. package/src/webserver/frontend/widgets/index.js +0 -2
  466. package/src/webserver/frontend/widgets/tooltip.js +0 -108
  467. package/src/webserver/index.js +0 -4
@@ -1,725 +0,0 @@
1
- const path = require('path');
2
-
3
- const Datastore = require('nedb-promises');
4
- const bcrypt = require('bcrypt');
5
- const chokidar = require('chokidar');
6
-
7
- const soft = require('../../softconfig.js');
8
- const {
9
- pattern: { explode },
10
- time: { parseBrickadiaTime },
11
- } = require('../../util/index.js');
12
-
13
- const Calendar = require('./calendar.js');
14
- const { EventEmitter } = require('events');
15
-
16
- // TODO: online users graph
17
- // TODO: player online times
18
- // TODO: bricks over time graph
19
- // TODO: minute server status for metrics
20
- // TODO: chat messages per min/hour/day check
21
-
22
- let serverInstance;
23
-
24
- // generate a punchcard (days x week)
25
- const createPunchcard = () =>
26
- Array.from({ length: 7 }).map(() => Array.from({ length: 24 }).fill(0));
27
-
28
- // the database keeps track of metrics for omegga
29
- class Database extends EventEmitter {
30
- constructor(options, omegga) {
31
- super();
32
- this.options = options;
33
- this.omegga = omegga;
34
- this.calendar = new Calendar();
35
-
36
- // database
37
- const dbOpts = {
38
- autoload: true,
39
- // case insensitive string comparison
40
- compareStrings: (a, b) =>
41
- a.localeCompare(b, 'en', { ignorePunctuation: true }),
42
- };
43
-
44
- // create all the stores
45
- this.stores = {
46
- users: Datastore.create({
47
- filename: path.join(omegga.dataPath, soft.USER_STORE),
48
- ...dbOpts,
49
- }),
50
- chat: Datastore.create({
51
- filename: path.join(omegga.dataPath, soft.CHAT_STORE),
52
- ...dbOpts,
53
- }),
54
- players: Datastore.create({
55
- filename: path.join(omegga.dataPath, soft.PLAYER_STORE),
56
- ...dbOpts,
57
- }),
58
- status: Datastore.create({
59
- filename: path.join(omegga.dataPath, soft.STATUS_STORE),
60
- ...dbOpts,
61
- }),
62
- server: Datastore.create({
63
- filename: path.join(omegga.dataPath, soft.SERVER_STORE),
64
- ...dbOpts,
65
- }),
66
- };
67
- }
68
-
69
- // make sure all the databases have valid store versions
70
- async doMigrations() {
71
- // current store versions
72
- const storeVersions = {
73
- users: 1,
74
- chat: 1,
75
- players: 1,
76
- status: 1,
77
- server: 1,
78
-
79
- // example version
80
- dummy: 10,
81
- };
82
-
83
- // migrations to/from certain store versions
84
- const migrations = {
85
- users: [],
86
- chat: [],
87
- players: [],
88
- status: [],
89
- server: [],
90
-
91
- // example migration list (all version upgrades go up by 1)
92
- dummy: [
93
- {
94
- version: 1, // target version
95
- upgrade: async _store => {}, // upgrade function (does not include updating version)
96
- },
97
- ],
98
- };
99
-
100
- // loop through all stores to find if any need version upgrades
101
- await Promise.all(
102
- Object.entries(this.stores).map(async ([name, store]) => {
103
- const versionEntry = await store.findOne({ type: 'storeVersion' });
104
- const expected = storeVersions[name];
105
- // if the version was not found, insert it
106
- if (!versionEntry) {
107
- store.insert({ type: 'storeVersion', version: expected });
108
-
109
- // if the version was not what was expected
110
- } else if (expected !== versionEntry.version) {
111
- // while the version is below the expected version
112
- let { version } = versionEntry;
113
- for (; version < expected; version++) {
114
- // find an available migration
115
- const migration = migrations[name].find(v => v.version === version);
116
-
117
- // no migration found, ignore
118
- if (!migration) break;
119
-
120
- // run the upgrade
121
- migration.upgrade(store);
122
- }
123
-
124
- // update the stored version
125
- await store.update({ _id: versionEntry._id }, { version });
126
- }
127
- })
128
- );
129
- }
130
-
131
- // get the running instance id of this omegga
132
- async getInstanceId() {
133
- if (serverInstance) return serverInstance._id;
134
-
135
- const doc = await this.stores.server.insert({
136
- type: 'app:start',
137
- date: Date.now(),
138
- });
139
-
140
- serverInstance = doc;
141
-
142
- // create a calendar of all previous chat messages
143
- const dates = (await this.stores.chat.find({ type: 'chat' })).map(
144
- c => c.created
145
- );
146
- for (const d of dates) {
147
- this.calendar.addDate(d);
148
- }
149
-
150
- const watcher = chokidar.watch(
151
- path.join(this.omegga.configPath, 'BanList.json'),
152
- { persistent: false }
153
- );
154
- watcher
155
- .on('add', () => setTimeout(this.syncBanList.bind(this), 500))
156
- .on('change', () =>
157
- setTimeout(() => {
158
- this.syncBanList();
159
- this.emit('update.bans');
160
- }, 500)
161
- );
162
- setTimeout(this.syncBanList.bind(this), 500);
163
-
164
- const handleKick = (kicked, kicker, reason) => {
165
- // time the event listener should expire
166
- const eventExpire = Date.now() + 100;
167
-
168
- // detect a single leave
169
- this.omegga.once('leave', async leavingPlayer => {
170
- const now = Date.now();
171
- // if a player leaves more than 100ms from the kick command, it's bugged
172
- if (now > eventExpire) return;
173
-
174
- if (leavingPlayer.id === kicked.id) {
175
- const entry = {
176
- type: 'kickHistory',
177
- kicked: kicked.id,
178
- kickerId: kicker.id,
179
- created: now,
180
- reason,
181
- };
182
-
183
- // depending on implementation, this could potentially be a kick event
184
- await this.stores.players.update(
185
- entry,
186
- { $set: entry },
187
- { upsert: true }
188
- );
189
- }
190
- });
191
- };
192
-
193
- // game version is not known at init so we have to check version at command time
194
- // alternatively,
195
- // kick history detection for a4 is based on the chat command
196
- this.omegga.on('cmd:kick', (name, ...args) => {
197
- if (this.omegga.version !== 'a4') return;
198
-
199
- const target = args.join(' ');
200
- const reason = 'no reason given';
201
-
202
- // find the player doing the kicking
203
- const kickerPlayer = this.omegga.getPlayer(name);
204
-
205
- // kicker does not exist
206
- if (!kickerPlayer) return;
207
-
208
- // player is not capable of kicking
209
- if (!kickerPlayer.getPermissions()['Players.Kick']) return;
210
-
211
- // find the kicked player
212
- const kickedPlayer = this.omegga.findPlayerByName(target);
213
- if (!kickedPlayer) return;
214
-
215
- handleKick(kickedPlayer, kickerPlayer, reason);
216
- });
217
-
218
- // for a5 is based on the chat event
219
- this.omegga.on('kick', (kicked, kicker, reason) => {
220
- if (this.omegga.version !== 'a5') return;
221
-
222
- const kickedPlayer = this.omegga.findPlayerByName(kicked);
223
- const kickerPlayer = this.omegga.findPlayerByName(kicker);
224
-
225
- // couldn't find kicked or kicker player
226
- if (!kickedPlayer || !kickerPlayer) return;
227
-
228
- handleKick(kickedPlayer, kickerPlayer, reason);
229
- });
230
-
231
- return doc._id;
232
- }
233
-
234
- // synchronize the ban list with the one in the database
235
- syncBanList() {
236
- let banList = this.omegga.getBanList();
237
- if (!banList) return;
238
- banList = banList.banList;
239
-
240
- // upsert all bans
241
- for (const banned in banList) {
242
- const entry = {
243
- type: 'banHistory',
244
- banned,
245
- bannerId: banList[banned].bannerId,
246
- created: parseBrickadiaTime(banList[banned].created),
247
- expires: parseBrickadiaTime(banList[banned].expires),
248
- reason: banList[banned].reason,
249
- };
250
-
251
- this.stores.players.update(entry, { $set: entry }, { upsert: true });
252
- }
253
- }
254
-
255
- // determine if this user would be the first user (admin user)
256
- async isFirstUser() {
257
- return (await this.stores.users.count({ type: 'user' })) === 0;
258
- }
259
-
260
- // hash a password
261
- async hash(password) {
262
- return await bcrypt.hash(password, 10);
263
- }
264
-
265
- // create an admin user account, username can be blank (no password)
266
- async createAdminUser(username, password) {
267
- const hash = await this.hash(password);
268
-
269
- // create an owner user
270
- const user = this.stores.users.insert({
271
- // this is a user
272
- type: 'user',
273
- created: Date.now(),
274
- lastOnline: Date.now(),
275
-
276
- // credentials
277
- username,
278
- hash,
279
-
280
- // permissions
281
- isOwner: true,
282
- roles: [],
283
-
284
- // brickadia player uuid
285
- playerId: '',
286
- });
287
- return user;
288
- }
289
-
290
- // determine if a user with this name exists
291
- async userExists(username) {
292
- return (await this.stores.users.count({ type: 'user', username })) > 0;
293
- }
294
-
295
- // create a regular user account
296
- async createUser(username, password) {
297
- if (await this.userExists(username)) throw new Error('user already exists');
298
-
299
- const hash = await this.hash(password);
300
- // create an owner user
301
- const user = this.stores.users.insert({
302
- // this is a user
303
- type: 'user',
304
- created: Date.now(),
305
- lastOnline: 0,
306
-
307
- // credentials
308
- username,
309
- hash,
310
-
311
- // permissions
312
- isOwner: false,
313
- roles: [],
314
-
315
- // brickadia player uuid
316
- playerId: '',
317
- });
318
- return user;
319
- }
320
-
321
- // set a user's password
322
- async userPasswd(username, password) {
323
- const hash = await this.hash(password);
324
-
325
- if (!this.userExists(username)) throw new Error('user does not exist');
326
-
327
- await this.stores.users.update(
328
- { type: 'user', username },
329
- { $set: { hash } }
330
- );
331
- }
332
-
333
- // get a user from credentials
334
- async authUser(username, password) {
335
- const user = await this.stores.users.findOne({ username });
336
- // user not found
337
- if (!user || user.isBanned) return null;
338
-
339
- // make sure the user's password hash is valid
340
- if (await bcrypt.compare(password, user.hash)) {
341
- // update last online status
342
- await this.stores.users.update(
343
- { _id: user._id },
344
- { $set: { lastOnline: Date.now() } }
345
- );
346
- return user;
347
- }
348
-
349
- // wrong password
350
- return null;
351
- }
352
-
353
- // find a user by object id
354
- async findUserById(id) {
355
- return await this.stores.users.findOne({
356
- $or: [
357
- // the owner has no username, so everyone is the owner
358
- { type: 'user', username: '', isOwner: true },
359
-
360
- // the user exists and has an id
361
- { type: 'user', _id: id },
362
- ],
363
- });
364
- }
365
-
366
- // get a list of roles
367
- getRoles() {
368
- return this.stores.server.find({ type: 'role' });
369
- }
370
-
371
- // add a chat message to the chat log store
372
- async addChatLog(action, user, message) {
373
- this.calendar.addDate(Date.now());
374
- return await this.stores.chat.insert({
375
- type: 'chat',
376
- created: Date.now(),
377
- instanceId: await this.getInstanceId(),
378
- action,
379
- user,
380
- ...(message ? { message } : {}),
381
- });
382
- }
383
-
384
- // get recent chat activity
385
- async getChats({ count = 50, sameServer, before, after } = {}) {
386
- return await this.stores.chat
387
- .find({
388
- type: 'chat',
389
- ...(sameServer ? { instanceId: await this.getInstanceId() } : {}),
390
- created: before
391
- ? { $lt: before }
392
- : after
393
- ? { $gt: after }
394
- : { $lt: Date.now() },
395
- })
396
- .sort({ created: !before && after ? 1 : -1 })
397
- .limit(count)
398
- .exec();
399
- }
400
-
401
- // get paginated players
402
- async getPlayers({
403
- count = 50,
404
- search = '',
405
- page = 0,
406
- sort = 'name',
407
- direction = '1',
408
- limitId = undefined,
409
- } = {}) {
410
- const pattern = explode(search);
411
-
412
- // the query used for finding which players are available
413
- const query = {
414
- type: 'userHistory',
415
- // only filter if there's a query
416
- $and: [
417
- // if a limitId is passed in, the id must be in it
418
- ...(limitId ? [{ id: { $in: limitId } }] : []),
419
-
420
- // if there's a search, the search matches...
421
- ...(search.length > 0
422
- ? [
423
- {
424
- $or: [
425
- // id was pasted in
426
- { id: search },
427
- // user's current name
428
- { name: { $regex: pattern } },
429
- // user's past name
430
- {
431
- nameHistory: { $elemMatch: { name: { $regex: pattern } } },
432
- },
433
- ],
434
- },
435
- ]
436
- : []),
437
- ],
438
- };
439
-
440
- // the query used for finding a specific player
441
- const exactQuery = {
442
- type: 'userHistory',
443
- // only filter if there's a query
444
- $or: [
445
- // id was pasted in
446
- { id: search },
447
- // user's current name
448
- { name: search },
449
- ],
450
- };
451
-
452
- // count players and query players
453
- const [total, players, exactResult] = await Promise.all([
454
- this.stores.players.count(query),
455
- this.stores.players
456
- .find(query)
457
- // TODO: add other sorts and sort directions
458
- .sort({ [sort]: direction })
459
- .skip(count * page)
460
- .limit(count)
461
- .exec(),
462
-
463
- // exact match detection
464
- search.length > 0 && page === 0
465
- ? this.stores.players.find(exactQuery)
466
- : [],
467
- ]);
468
-
469
- // add exact matches to the beginning
470
- if (exactResult.length > 0) {
471
- // remove duplicates
472
- for (const res of exactResult) {
473
- const index = players.findIndex(p => p._id === res._id);
474
- players.splice(index, 1);
475
- }
476
-
477
- // add results to the beginning
478
- players.splice(0, 0, ...exactResult);
479
- }
480
-
481
- return {
482
- pages: Math.ceil(total / count),
483
- total,
484
- players,
485
- };
486
- }
487
-
488
- // get paginated users
489
- async getUsers({
490
- count = 50,
491
- search = '',
492
- page = 0,
493
- sort = 'name',
494
- direction = '1',
495
- } = {}) {
496
- const pattern = explode(search);
497
-
498
- // the query used for finding which players are available
499
- const query = {
500
- type: 'user',
501
- // only filter if there's a query
502
- ...(search.length > 0
503
- ? {
504
- $or: [
505
- // id was pasted in
506
- { playerId: search },
507
- // user's current name
508
- { name: { $regex: pattern } },
509
- ],
510
- }
511
- : {}),
512
- };
513
-
514
- // count players and query players
515
- const [total, users] = await Promise.all([
516
- this.stores.users.count(query),
517
- this.stores.users
518
- .find(query)
519
- // TODO: add other sorts and sort directions
520
- .sort({ [sort]: direction })
521
- .skip(count * page)
522
- .limit(count)
523
- .exec(),
524
- ]);
525
-
526
- return {
527
- pages: Math.ceil(total / count),
528
- total,
529
- users,
530
- };
531
- }
532
-
533
- // get an individual player, ban and kick history, and notes
534
- async getPlayer(id) {
535
- const [player, banHistory, kickHistory, notes] = await Promise.all([
536
- this.stores.players.findOne({ type: 'userHistory', id }),
537
- this.stores.players
538
- .find({ type: 'banHistory', banned: id })
539
- .sort({ created: -1 })
540
- .limit(25)
541
- .exec(),
542
- this.stores.players
543
- .find({ type: 'kickHistory', kicked: id })
544
- .sort({ created: -1 })
545
- .limit(25)
546
- .exec(),
547
- this.stores.players
548
- .find({ type: 'note', id })
549
- .sort({ created: -1 })
550
- .limit(25)
551
- .exec(),
552
- ]);
553
-
554
- if (!player) return null;
555
-
556
- return { ...player, banHistory, kickHistory, notes };
557
- }
558
-
559
- // add a user to the visit history, returns true if this is a first visit
560
- async addVisit(user) {
561
- const existing = await this.stores.players.findOne({
562
- type: 'userHistory',
563
- id: user.id,
564
- });
565
- const now = Date.now();
566
- const instanceId = await this.getInstanceId();
567
- if (!existing) {
568
- // create the player
569
- // TODO: add some form of admin note tool for moderators to leave notes
570
- // on troublesome players + warnings
571
- await this.stores.players.insert({
572
- type: 'userHistory',
573
- // base brickadia user info
574
- id: user.id,
575
- name: user.name,
576
- // list of names and when they were first used
577
- nameHistory: [{ name: user.name, date: now }],
578
- // list of ips this player has been on
579
- ips: [],
580
- // first time player was seen
581
- created: now,
582
- // last time player was seen
583
- lastSeen: now,
584
- // last server this player has been on
585
- lastInstanceId: instanceId,
586
- // number of status checks this player has observed
587
- heartbeats: 0,
588
- // number of sessions (at least an hour apart) this player has had
589
- sessions: 1,
590
- // number of instances (times omegga was started) this player has joined
591
- instances: 1,
592
- });
593
- return true;
594
- } else {
595
- await this.stores.players.update(
596
- { _id: existing._id },
597
- {
598
- $inc: {
599
- // increment number of sessions if the player hasn't been seen for an hour
600
- sessions: existing.lastSeen < now - 60 * 60 * 1000 ? 1 : 0,
601
- // increment the number of instances this player has joined
602
- instances: existing.lastInstanceId === instanceId ? 1 : 0,
603
- },
604
-
605
- $set: {
606
- // update last seen time and user name
607
- lastSeen: now,
608
- name: user.name,
609
-
610
- // set the last joined instance
611
- lastInstanceId: instanceId,
612
- },
613
-
614
- // add the name to the history if it was not already in it
615
- ...(existing.nameHistory.some(h => h.name === user.name)
616
- ? {}
617
- : {
618
- $addToSet: { nameHistory: { name: user.name, date: now } },
619
- }),
620
- }
621
- );
622
- return false;
623
- }
624
- }
625
-
626
- // use data from minutely heartbeats to fuel metrics
627
- async addHeartbeat(data) {
628
- const now = Date.now();
629
-
630
- // add the heartbeat to the server status store
631
- await this.stores.status.insert({
632
- type: 'heartbeat',
633
- created: now,
634
- bricks: data.bricks,
635
- players: data.players,
636
- });
637
-
638
- // update player heartbeats and last seens
639
- await this.stores.players.update(
640
- {
641
- // all players in the status update
642
- id: { $in: data.players },
643
- },
644
- {
645
- // update last seen
646
- $set: { lastSeen: now },
647
- // increment heartbeats
648
- $inc: { heartbeats: 1 },
649
- },
650
- { multi: true }
651
- );
652
-
653
- // get all players in the status update
654
- const players = await this.stores.players.find({
655
- id: { $in: data.players },
656
- });
657
-
658
- await Promise.all(
659
- players
660
- // find players without the discovered ip
661
- .filter(p => !(p.ips || []).includes(data.ips[p.id]))
662
- // insert the IP into the player's ip list
663
- .map(p =>
664
- this.stores.players.update(
665
- { _id: p._id },
666
- {
667
- $addToSet: { ips: data.ips[p.id] },
668
- }
669
- )
670
- )
671
- );
672
- }
673
-
674
- // update player online-time punchcard
675
- async updatePlayerPunchcard(numNewPlayers) {
676
- // get date, utc hour, and utc day
677
- const now = new Date();
678
- const time = now.getTime();
679
- const hour = now.getUTCHours();
680
- const day = now.getUTCDay();
681
- const month = now.getUTCMonth();
682
- const year = now.getUTCFullYear();
683
-
684
- // find the punchcard
685
- const card = await this.stores.status.findOne({
686
- type: 'punchcard',
687
- kind: 'playerCount',
688
- month,
689
- year,
690
- });
691
-
692
- // create a new punchcard if one does not exist for this month
693
- if (!card) {
694
- const punchcard = createPunchcard();
695
- punchcard[day][hour] = numNewPlayers;
696
- // insert it
697
- await this.stores.status.insert({
698
- type: 'punchcard',
699
- kind: 'playerCount',
700
- created: time,
701
- updated: time,
702
- month,
703
- year,
704
- punchcard,
705
- });
706
-
707
- // if the card exists, check if it was already updated this hour
708
- } else {
709
- // add the players to this slot
710
- card.punchcard[day][hour] += numNewPlayers;
711
- // update the punchcard
712
- await this.stores.status.update(
713
- { _id: card._id },
714
- {
715
- $set: {
716
- punchcard: card.punchcard,
717
- updated: time,
718
- },
719
- }
720
- );
721
- }
722
- }
723
- }
724
-
725
- module.exports = Database;