@omnizap-system/omnizap 2.5.12

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 (425) hide show
  1. package/.clusterfuzzlite/Dockerfile +10 -0
  2. package/.env.example +907 -0
  3. package/.github/codeql/codeql-config.yml +10 -0
  4. package/.github/dependabot.yml +35 -0
  5. package/.github/workflows/ci.yml +73 -0
  6. package/.github/workflows/codeql.yml +106 -0
  7. package/.github/workflows/db-migration-check.yml +98 -0
  8. package/.github/workflows/dependency-review.yml +22 -0
  9. package/.github/workflows/deploy.yml +95 -0
  10. package/.github/workflows/release.yml +106 -0
  11. package/.github/workflows/security-attest-provenance.yml +51 -0
  12. package/.github/workflows/security-gitleaks.yml +34 -0
  13. package/.github/workflows/security-runner-hardening.yml +31 -0
  14. package/.github/workflows/security-scorecard.yml +44 -0
  15. package/.github/workflows/security-zap-baseline.yml +44 -0
  16. package/.github/workflows/security-zap-full-scan.yml +43 -0
  17. package/.github/workflows/security-zizmor.yml +36 -0
  18. package/.github/workflows/wiki-sync.yml +44 -0
  19. package/.gitleaks.toml +15 -0
  20. package/.prettierrc +34 -0
  21. package/CODE_OF_CONDUCT.md +114 -0
  22. package/LICENSE +56 -0
  23. package/README.md +110 -0
  24. package/SECURITY.md +110 -0
  25. package/app/config/index.js +4 -0
  26. package/app/configParts/adminIdentity.js +92 -0
  27. package/app/configParts/baileysConfig.js +1818 -0
  28. package/app/configParts/groupUtils.js +692 -0
  29. package/app/configParts/loggerConfig.js +394 -0
  30. package/app/configParts/messagePersistenceService.js +305 -0
  31. package/app/connection/baileysCompatibility.test.js +40 -0
  32. package/app/connection/baileysDbAuthState.js +344 -0
  33. package/app/connection/socketController.js +2243 -0
  34. package/app/controllers/messageController.js +7 -0
  35. package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
  36. package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
  37. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
  38. package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
  39. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
  40. package/app/controllers/messageProcessingPipeline.js +699 -0
  41. package/app/modules/adminModule/AGENT.md +4056 -0
  42. package/app/modules/adminModule/adminAiHelpService.js +56 -0
  43. package/app/modules/adminModule/adminConfigRuntime.js +177 -0
  44. package/app/modules/adminModule/commandConfig.json +7122 -0
  45. package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
  46. package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
  47. package/app/modules/adminModule/groupEventHandlers.js +399 -0
  48. package/app/modules/aiModule/AGENT.md +547 -0
  49. package/app/modules/aiModule/aiAiHelpService.js +14 -0
  50. package/app/modules/aiModule/aiConfigRuntime.js +135 -0
  51. package/app/modules/aiModule/catCommand.js +967 -0
  52. package/app/modules/aiModule/commandConfig.json +981 -0
  53. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
  54. package/app/modules/gameModule/AGENT.md +196 -0
  55. package/app/modules/gameModule/commandConfig.json +366 -0
  56. package/app/modules/gameModule/diceCommand.js +42 -0
  57. package/app/modules/gameModule/gameAiHelpService.js +14 -0
  58. package/app/modules/gameModule/gameConfigRuntime.js +68 -0
  59. package/app/modules/menuModule/AGENT.md +205 -0
  60. package/app/modules/menuModule/commandConfig.json +366 -0
  61. package/app/modules/menuModule/common.js +316 -0
  62. package/app/modules/menuModule/menuAiHelpService.js +14 -0
  63. package/app/modules/menuModule/menuConfigRuntime.js +68 -0
  64. package/app/modules/menuModule/menus.js +66 -0
  65. package/app/modules/playModule/AGENT.md +321 -0
  66. package/app/modules/playModule/commandConfig.json +584 -0
  67. package/app/modules/playModule/playAiHelpService.js +14 -0
  68. package/app/modules/playModule/playCommand.js +1417 -0
  69. package/app/modules/playModule/playConfigRuntime.js +68 -0
  70. package/app/modules/quoteModule/AGENT.md +199 -0
  71. package/app/modules/quoteModule/commandConfig.json +366 -0
  72. package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
  73. package/app/modules/quoteModule/quoteCommand.js +842 -0
  74. package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
  75. package/app/modules/rpgPokemonModule/AGENT.md +229 -0
  76. package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
  77. package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
  78. package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
  79. package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
  80. package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
  81. package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
  82. package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
  83. package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
  84. package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
  85. package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
  86. package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
  87. package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
  88. package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
  89. package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
  90. package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
  91. package/app/modules/statsModule/AGENT.md +320 -0
  92. package/app/modules/statsModule/commandConfig.json +540 -0
  93. package/app/modules/statsModule/globalRankingCommand.js +64 -0
  94. package/app/modules/statsModule/rankingCommand.js +41 -0
  95. package/app/modules/statsModule/rankingCommon.js +1305 -0
  96. package/app/modules/statsModule/statsAiHelpService.js +14 -0
  97. package/app/modules/statsModule/statsConfigRuntime.js +68 -0
  98. package/app/modules/stickerModule/AGENT.md +692 -0
  99. package/app/modules/stickerModule/addStickerMetadata.js +239 -0
  100. package/app/modules/stickerModule/commandConfig.json +1216 -0
  101. package/app/modules/stickerModule/convertToWebp.js +367 -0
  102. package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
  103. package/app/modules/stickerModule/stickerCommand.js +446 -0
  104. package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
  105. package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
  106. package/app/modules/stickerModule/stickerTextCommand.js +653 -0
  107. package/app/modules/stickerPackModule/AGENT.md +215 -0
  108. package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
  109. package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
  110. package/app/modules/stickerPackModule/commandConfig.json +387 -0
  111. package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
  112. package/app/modules/stickerPackModule/domainEvents.js +52 -0
  113. package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
  114. package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
  115. package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
  116. package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
  117. package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
  118. package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
  119. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
  120. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
  121. package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
  122. package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
  123. package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
  124. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
  125. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
  126. package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
  127. package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
  128. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
  129. package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
  130. package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
  131. package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
  132. package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
  133. package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
  134. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
  135. package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
  136. package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
  137. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
  138. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
  139. package/app/modules/stickerPackModule/stickerPackService.js +733 -0
  140. package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
  141. package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
  142. package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
  143. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
  144. package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
  145. package/app/modules/systemMetricsModule/AGENT.md +193 -0
  146. package/app/modules/systemMetricsModule/commandConfig.json +344 -0
  147. package/app/modules/systemMetricsModule/pingCommand.js +399 -0
  148. package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
  149. package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
  150. package/app/modules/tiktokModule/AGENT.md +196 -0
  151. package/app/modules/tiktokModule/commandConfig.json +366 -0
  152. package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
  153. package/app/modules/tiktokModule/tiktokCommand.js +716 -0
  154. package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
  155. package/app/modules/userModule/AGENT.md +200 -0
  156. package/app/modules/userModule/commandConfig.json +386 -0
  157. package/app/modules/userModule/userAiHelpService.js +14 -0
  158. package/app/modules/userModule/userCommand.js +1155 -0
  159. package/app/modules/userModule/userConfigRuntime.js +68 -0
  160. package/app/modules/waifuPicsModule/AGENT.md +431 -0
  161. package/app/modules/waifuPicsModule/commandConfig.json +780 -0
  162. package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
  163. package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
  164. package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
  165. package/app/observability/metrics.js +766 -0
  166. package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
  167. package/app/services/ai/aiLearningRepository.js +400 -0
  168. package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
  169. package/app/services/ai/commandConfigEnrichmentService.js +452 -0
  170. package/app/services/ai/commandConfigValidationService.js +443 -0
  171. package/app/services/ai/commandToolBuilderService.js +192 -0
  172. package/app/services/ai/conversationRouterService.js +516 -0
  173. package/app/services/ai/geminiService.js +115 -0
  174. package/app/services/ai/geminiService.test.js +87 -0
  175. package/app/services/ai/globalModuleAiHelpService.js +1412 -0
  176. package/app/services/ai/globalToolCallingService.js +203 -0
  177. package/app/services/ai/messageCommandExecutionService.js +391 -0
  178. package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
  179. package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
  180. package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
  181. package/app/services/ai/moduleToolExecutorService.js +464 -0
  182. package/app/services/ai/moduleToolRegistryService.js +178 -0
  183. package/app/services/ai/toolCandidateSelectorService.js +781 -0
  184. package/app/services/auth/googleWebLinkService.js +80 -0
  185. package/app/services/auth/whatsappLoginLinkService.js +230 -0
  186. package/app/services/external/pokeApiService.js +398 -0
  187. package/app/services/group/groupMetadataService.js +311 -0
  188. package/app/services/infra/dbWriteQueue.js +874 -0
  189. package/app/services/infra/featureFlagService.js +131 -0
  190. package/app/services/infra/queueUtils.js +55 -0
  191. package/app/services/messaging/captchaService.js +491 -0
  192. package/app/services/messaging/messagePersistenceService.js +1 -0
  193. package/app/services/messaging/newsBroadcastService.js +347 -0
  194. package/app/services/sticker/stickerFocusService.js +347 -0
  195. package/app/services/sticker/stickerFocusService.test.js +43 -0
  196. package/app/store/aiPromptStore.js +38 -0
  197. package/app/store/conversationSessionStore.js +131 -0
  198. package/app/store/groupConfigStore.js +58 -0
  199. package/app/store/premiumUserStore.js +54 -0
  200. package/app/utils/antiLink/antiLinkModule.js +700 -0
  201. package/app/utils/http/getImageBufferModule.js +18 -0
  202. package/app/utils/json/jsonSanitizer.js +113 -0
  203. package/app/utils/json/jsonSanitizer.test.js +40 -0
  204. package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
  205. package/app/workers/aiLearningWorker.js +605 -0
  206. package/app/workers/commandConfigEnrichmentWorker.js +242 -0
  207. package/database/index.js +2075 -0
  208. package/database/init.js +151 -0
  209. package/database/migrations/.gitkeep +0 -0
  210. package/database/migrations/20260307_d0_hardening_down.sql +64 -0
  211. package/database/migrations/20260307_d0_hardening_up.sql +79 -0
  212. package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
  213. package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
  214. package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
  215. package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
  216. package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
  217. package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
  218. package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
  219. package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
  220. package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
  221. package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
  222. package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
  223. package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
  224. package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
  225. package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
  226. package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
  227. package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
  228. package/database/schema.sql +1186 -0
  229. package/docker-compose.yml +104 -0
  230. package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
  231. package/docs/audits/stickerCatalogController-symbols.md +58 -0
  232. package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
  233. package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
  234. package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
  235. package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
  236. package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
  237. package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
  238. package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
  239. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
  240. package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
  241. package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
  242. package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
  243. package/docs/seo/satellite-page-template.md +116 -0
  244. package/docs/seo/satellite-pages-phase1.json +364 -0
  245. package/docs/wiki/Home.md +120 -0
  246. package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
  247. package/docs/wiki/recent-changes-2026-03-08.md +47 -0
  248. package/ecosystem.prod.config.cjs +135 -0
  249. package/eslint.config.js +89 -0
  250. package/index.js +488 -0
  251. package/ml/clip_classifier/Dockerfile +18 -0
  252. package/ml/clip_classifier/README.md +118 -0
  253. package/ml/clip_classifier/adaptive_scoring.py +40 -0
  254. package/ml/clip_classifier/classifier.py +654 -0
  255. package/ml/clip_classifier/embedding_store.py +481 -0
  256. package/ml/clip_classifier/env_loader.py +15 -0
  257. package/ml/clip_classifier/llm_label_expander.py +144 -0
  258. package/ml/clip_classifier/main.py +213 -0
  259. package/ml/clip_classifier/requirements.txt +10 -0
  260. package/ml/clip_classifier/similarity_engine.py +74 -0
  261. package/new-logo.png +0 -0
  262. package/observability/alert-rules.yml +60 -0
  263. package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
  264. package/observability/grafana/dashboards/omnizap-overview.json +170 -0
  265. package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
  266. package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
  267. package/observability/loki-config.yml +38 -0
  268. package/observability/mysql-setup.sql +46 -0
  269. package/observability/prometheus.yml +35 -0
  270. package/observability/promtail-config.yml +84 -0
  271. package/observability/sticker-catalog-slo.md +83 -0
  272. package/observability/sticker-scale-hardening-rollout.md +128 -0
  273. package/package.json +144 -0
  274. package/public/apple-touch-icon.png +0 -0
  275. package/public/assets/css/commands-react.input.css +71 -0
  276. package/public/assets/css/create-pack-react.input.css +31 -0
  277. package/public/assets/css/home-react.input.css +106 -0
  278. package/public/assets/css/login-react.input.css +58 -0
  279. package/public/assets/css/stickers-react.input.css +18 -0
  280. package/public/assets/css/terms-react.input.css +115 -0
  281. package/public/assets/css/user-react.input.css +57 -0
  282. package/public/assets/images/brand-icon-192.png +0 -0
  283. package/public/assets/images/brand-logo-128.webp +0 -0
  284. package/public/assets/images/hero-banner-1280.jpg +0 -0
  285. package/public/comandos/commands-catalog.json +4517 -0
  286. package/public/css/api-docs.css +161 -0
  287. package/public/css/stickers-admin.css +1288 -0
  288. package/public/css/styles.css +679 -0
  289. package/public/css/systemadm/admin.css +474 -0
  290. package/public/css/systemadm/base.css +73 -0
  291. package/public/css/systemadm/components.css +662 -0
  292. package/public/css/systemadm/layout.css +229 -0
  293. package/public/css/systemadm/tokens.css +56 -0
  294. package/public/favicon-16x16.png +0 -0
  295. package/public/favicon-32x32.png +0 -0
  296. package/public/favicon.ico +0 -0
  297. package/public/js/apps/apiDocsApp.js +235 -0
  298. package/public/js/apps/commandsReactApp.js +528 -0
  299. package/public/js/apps/createPackApp.js +1646 -0
  300. package/public/js/apps/homeReactApp.js +942 -0
  301. package/public/js/apps/loginReactApp.js +496 -0
  302. package/public/js/apps/stickersAdminApp.js +1753 -0
  303. package/public/js/apps/stickersApp.js +3797 -0
  304. package/public/js/apps/termsReactApp.js +528 -0
  305. package/public/js/apps/userApp.js +2540 -0
  306. package/public/js/apps/userProfile/actions.js +66 -0
  307. package/public/js/apps/userReactApp.js +547 -0
  308. package/public/js/catalog.js +950 -0
  309. package/public/pages/api-docs.html +40 -0
  310. package/public/pages/aup.html +158 -0
  311. package/public/pages/comandos.html +41 -0
  312. package/public/pages/dpa.html +227 -0
  313. package/public/pages/home.html +45 -0
  314. package/public/pages/licenca.html +182 -0
  315. package/public/pages/login.html +40 -0
  316. package/public/pages/notice-and-takedown.html +234 -0
  317. package/public/pages/politica-de-privacidade.html +251 -0
  318. package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
  319. package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
  320. package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
  321. package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
  322. package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
  323. package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
  324. package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
  325. package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
  326. package/public/pages/stickers-admin.html +31 -0
  327. package/public/pages/stickers-create.html +41 -0
  328. package/public/pages/stickers.html +45 -0
  329. package/public/pages/suboperadores.html +237 -0
  330. package/public/pages/termos-de-uso-texto-integral.html +241 -0
  331. package/public/pages/termos-de-uso.html +41 -0
  332. package/public/pages/user-password-reset.html +32 -0
  333. package/public/pages/user-systemadm.html +508 -0
  334. package/public/pages/user.html +39 -0
  335. package/public/robots.txt +9 -0
  336. package/public/site.webmanifest +24 -0
  337. package/public/sitemap.xml +98 -0
  338. package/schemas/command-config.schema.json +582 -0
  339. package/scripts/baileys-compat-smoke.mjs +12 -0
  340. package/scripts/cache-bust.mjs +142 -0
  341. package/scripts/deploy.sh +916 -0
  342. package/scripts/email-broadcast-terms-update.mjs +170 -0
  343. package/scripts/enrich-command-discovery-fields.mjs +286 -0
  344. package/scripts/generate-command-config-schema.mjs +273 -0
  345. package/scripts/generate-commands-catalog.mjs +308 -0
  346. package/scripts/generate-module-agents.mjs +631 -0
  347. package/scripts/generate-seo-satellite-pages.mjs +400 -0
  348. package/scripts/github-deploy-notify.mjs +174 -0
  349. package/scripts/github-release-notify.mjs +219 -0
  350. package/scripts/release.sh +599 -0
  351. package/scripts/run-codeql-local.sh +116 -0
  352. package/scripts/run-prettier-all.mjs +25 -0
  353. package/scripts/security-smoketest.mjs +581 -0
  354. package/scripts/sticker-catalog-loadtest.mjs +210 -0
  355. package/scripts/sticker-worker-task.mjs +119 -0
  356. package/scripts/sync-readme-snapshot.mjs +133 -0
  357. package/scripts/validate-command-config-schema.mjs +130 -0
  358. package/scripts/validate-command-configs.mjs +15 -0
  359. package/scripts/wiki-sync.sh +191 -0
  360. package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
  361. package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
  362. package/server/auth/jwt/webJwtService.js +147 -0
  363. package/server/auth/stickerCatalogAuthContext.js +165 -0
  364. package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
  365. package/server/auth/userPassword/index.js +14 -0
  366. package/server/auth/userPassword/userPasswordAuthService.js +422 -0
  367. package/server/auth/userPassword/userPasswordCrypto.js +199 -0
  368. package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
  369. package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
  370. package/server/auth/validation/authSchemas.js +236 -0
  371. package/server/auth/webAccount/webAccountHandlers.js +1434 -0
  372. package/server/controllers/admin/adminBanService.js +138 -0
  373. package/server/controllers/admin/adminPanelHandlers.js +2083 -0
  374. package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
  375. package/server/controllers/admin/systemAdminController.js +201 -0
  376. package/server/controllers/email/emailAutomationController.js +239 -0
  377. package/server/controllers/metricsController.js +21 -0
  378. package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
  379. package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
  380. package/server/controllers/sticker/stickerCatalogController.js +4700 -0
  381. package/server/controllers/system/contactController.js +115 -0
  382. package/server/controllers/system/githubController.js +137 -0
  383. package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
  384. package/server/controllers/system/storageController.js +154 -0
  385. package/server/controllers/system/systemController.js +135 -0
  386. package/server/controllers/system/systemMetricsController.js +156 -0
  387. package/server/controllers/system/visitController.js +90 -0
  388. package/server/controllers/userController.js +145 -0
  389. package/server/email/emailAutomationRuntime.js +225 -0
  390. package/server/email/emailAutomationService.js +125 -0
  391. package/server/email/emailOutboxRepository.js +282 -0
  392. package/server/email/emailTemplateService.js +480 -0
  393. package/server/email/emailTransportService.js +156 -0
  394. package/server/http/clientIp.js +95 -0
  395. package/server/http/httpRequestUtils.js +262 -0
  396. package/server/http/httpRequestUtils.test.js +80 -0
  397. package/server/http/httpServer.js +180 -0
  398. package/server/http/requestContext.js +20 -0
  399. package/server/http/siteRoutingUtils.js +87 -0
  400. package/server/index.js +1 -0
  401. package/server/middleware/cachePolicy.js +26 -0
  402. package/server/middleware/cachePolicyHelpers.js +1 -0
  403. package/server/middleware/endpointRateLimit.js +181 -0
  404. package/server/middleware/rateLimit.js +70 -0
  405. package/server/middleware/requireAdminAuth.js +48 -0
  406. package/server/middleware/securityHeaders.js +97 -0
  407. package/server/routes/admin/systemAdminRouter.js +64 -0
  408. package/server/routes/email/emailAutomationRouter.js +46 -0
  409. package/server/routes/health/healthRouter.js +41 -0
  410. package/server/routes/indexRouter.js +234 -0
  411. package/server/routes/metrics/metricsRouter.js +58 -0
  412. package/server/routes/static/staticPageRouter.js +134 -0
  413. package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
  414. package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
  415. package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
  416. package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
  417. package/server/routes/sticker/catalogRouter.js +77 -0
  418. package/server/routes/sticker/stickerApiRouter.js +84 -0
  419. package/server/routes/sticker/stickerDataRouter.js +145 -0
  420. package/server/routes/sticker/stickerSiteRouter.js +43 -0
  421. package/server/routes/user/userApiPaths.js +66 -0
  422. package/server/routes/user/userRouter.js +65 -0
  423. package/server/utils/safePath.js +26 -0
  424. package/utils/logger/loggerModule.js +35 -0
  425. package/vite.config.mjs +38 -0
@@ -0,0 +1,316 @@
1
+ import { getWaifuPicsUsageText } from '../waifuPicsModule/waifuPicsCommand.js';
2
+
3
+ export const buildMenuCaption = (senderName, commandPrefix) => `
4
+ Olá, ${senderName}. Seja bem-vindo(a)!
5
+
6
+ ━━━━━━━━━━━━━━━━━━━━
7
+ 📌 MENU PRINCIPAL
8
+ ━━━━━━━━━━━━━━━━━━━━
9
+
10
+ Selecione uma categoria para visualizar os comandos disponíveis:
11
+
12
+ • 🖼️ Figurinhas
13
+ → ${commandPrefix}menu figurinhas
14
+ 💡 Exemplo: ${commandPrefix}menu figurinhas
15
+
16
+ • 🎵 Mídia
17
+ → ${commandPrefix}menu midia
18
+ 💡 Exemplo: ${commandPrefix}menu midia
19
+
20
+ • 💬 Quotes
21
+ → ${commandPrefix}menu quote
22
+ 💡 Exemplo: ${commandPrefix}menu quote
23
+
24
+ • 🤖 Inteligência Artificial
25
+ → ${commandPrefix}menu ia
26
+ 💡 Exemplo: ${commandPrefix}menu ia
27
+
28
+ • 📊 Estatísticas
29
+ → ${commandPrefix}menu stats
30
+ 💡 Exemplo: ${commandPrefix}menu stats
31
+
32
+ • 🌸 Anime
33
+ → ${commandPrefix}menu anime
34
+ 💡 Exemplo: ${commandPrefix}menu anime
35
+
36
+ • 🎮 Brincadeiras
37
+ → ${commandPrefix}dado
38
+ 💡 Exemplo: ${commandPrefix}dado
39
+
40
+ • 🛡️ Administração
41
+ → ${commandPrefix}menuadm
42
+ 💡 Exemplo: ${commandPrefix}menuadm
43
+
44
+ ━━━━━━━━━━━━━━━━━━━━
45
+ 📊 STATUS DO SISTEMA
46
+ ━━━━━━━━━━━━━━━━━━━━
47
+
48
+ → ${commandPrefix}ping
49
+ 💡 Exemplo: ${commandPrefix}ping
50
+ Sistema em evolução (beta)
51
+
52
+ ━━━━━━━━━━━━━━━━━━━━
53
+ 🌐 PROJETO OPEN SOURCE
54
+ ━━━━━━━━━━━━━━━━━━━━
55
+
56
+ GitHub:
57
+ https://github.com/Omnizap-System/omnizap
58
+
59
+ Site oficial:
60
+ https://omnizap.shop/
61
+ `;
62
+
63
+ export const buildStickerMenu = (commandPrefix) => `
64
+ ━━━━━━━━━━━━━━━━━━━━
65
+ 🖼️ FIGURINHAS
66
+ ━━━━━━━━━━━━━━━━━━━━
67
+
68
+ Imagem ou GIF
69
+ • Responda uma mídia com:
70
+ → ${commandPrefix}sticker | ${commandPrefix}s
71
+ 💡 Exemplo: (na legenda da mídia) ${commandPrefix}s
72
+
73
+ • Ou envie com legenda usando o mesmo comando.
74
+
75
+ ━━━━━━━━━━━━━━━━━━━━
76
+ 📝 TEXTO
77
+ ━━━━━━━━━━━━━━━━━━━━
78
+
79
+ • Texto padrão (preto):
80
+ → ${commandPrefix}stickertext | ${commandPrefix}st
81
+ 💡 Exemplo: ${commandPrefix}st Bom dia, equipe
82
+
83
+ • Texto alternativo (branco):
84
+ → ${commandPrefix}stickertextwhite | ${commandPrefix}stw
85
+ 💡 Exemplo: ${commandPrefix}stw Bora trabalhar
86
+
87
+ ━━━━━━━━━━━━━━━━━━━━
88
+ ✨ TEXTO PISCANTE
89
+ ━━━━━━━━━━━━━━━━━━━━
90
+
91
+ → ${commandPrefix}stickertextblink | ${commandPrefix}stb
92
+ 💡 Exemplo: ${commandPrefix}stb bom dia -verde
93
+
94
+ ━━━━━━━━━━━━━━━━━━━━
95
+ 🔁 CONVERSÃO
96
+ ━━━━━━━━━━━━━━━━━━━━
97
+
98
+ • Responda uma figurinha com:
99
+ → ${commandPrefix}toimg
100
+ 💡 Exemplo: responda uma figurinha com ${commandPrefix}toimg
101
+
102
+ Resultado:
103
+ – Figurinha estática → imagem
104
+ – Figurinha animada → vídeo
105
+
106
+ ━━━━━━━━━━━━━━━━━━━━
107
+ 📦 STICKER PACKS
108
+ ━━━━━━━━━━━━━━━━━━━━
109
+
110
+ → ${commandPrefix}pack create "Meu Pack"
111
+ 💡 Exemplo: ${commandPrefix}pack create "Memes da Firma"
112
+
113
+ → ${commandPrefix}pack add <pack>
114
+ 💡 Exemplo: ${commandPrefix}pack add "Memes da Firma"
115
+
116
+ → ${commandPrefix}pack list
117
+ 💡 Exemplo: ${commandPrefix}pack list
118
+
119
+ → ${commandPrefix}pack send <pack>
120
+ 💡 Exemplo: ${commandPrefix}pack send "Memes da Firma"
121
+ `;
122
+
123
+ export const buildMediaMenu = (commandPrefix) => `
124
+ ━━━━━━━━━━━━━━━━━━━━
125
+ 🎵 MÍDIA
126
+ ━━━━━━━━━━━━━━━━━━━━
127
+
128
+ → ${commandPrefix}play <link ou termo> (áudio)
129
+ 💡 Exemplo: ${commandPrefix}play Coldplay Yellow
130
+
131
+ → ${commandPrefix}playvid <link ou termo> (vídeo)
132
+ 💡 Exemplo: ${commandPrefix}playvid Imagine Dragons Believer
133
+
134
+ → ${commandPrefix}tiktok <link> (TikTok HD)
135
+ 💡 Exemplo: ${commandPrefix}tiktok https://www.tiktok.com/@usuario/video/123
136
+ `;
137
+
138
+ export const buildQuoteMenu = (commandPrefix) => `
139
+ ━━━━━━━━━━━━━━━━━━━━
140
+ 💬 QUOTES
141
+ ━━━━━━━━━━━━━━━━━━━━
142
+
143
+ → ${commandPrefix}quote
144
+ 💡 Exemplo: responda uma mensagem com ${commandPrefix}quote
145
+ Responda uma mensagem ou envie um texto.
146
+ `;
147
+
148
+ export const buildAnimeMenu = (commandPrefix) => `
149
+ ━━━━━━━━━━━━━━━━━━━━
150
+ 🌸 ANIME
151
+ ━━━━━━━━━━━━━━━━━━━━
152
+
153
+ ${getWaifuPicsUsageText(commandPrefix)}
154
+ `;
155
+
156
+ export const buildAiMenu = (commandPrefix) => `
157
+ ━━━━━━━━━━━━━━━━━━━━
158
+ 🤖 INTELIGÊNCIA ARTIFICIAL
159
+ ━━━━━━━━━━━━━━━━━━━━
160
+
161
+ → ${commandPrefix}cat <mensagem ou pergunta> [--audio]
162
+ 💡 Exemplo: ${commandPrefix}cat Explique buraco negro em 1 minuto
163
+ Responda ou envie uma imagem com legenda.
164
+
165
+ → ${commandPrefix}catimg <prompt>
166
+ 💡 Exemplo: ${commandPrefix}catimg um gato astronauta na lua
167
+ Geração ou edição de imagens por IA.
168
+
169
+ → ${commandPrefix}catprompt <novo prompt>
170
+ 💡 Exemplo: ${commandPrefix}catprompt Responda em português e direto ao ponto
171
+
172
+ → ${commandPrefix}catprompt reset
173
+ 💡 Exemplo: ${commandPrefix}catprompt reset
174
+ `;
175
+
176
+ export const buildStatsMenu = (commandPrefix) => `
177
+ ━━━━━━━━━━━━━━━━━━━━
178
+ 📊 ESTATÍSTICAS
179
+ ━━━━━━━━━━━━━━━━━━━━
180
+
181
+ → ${commandPrefix}ranking
182
+ 💡 Exemplo: ${commandPrefix}ranking
183
+ Ranking do grupo (top 5)
184
+
185
+ → ${commandPrefix}rankingglobal
186
+ 💡 Exemplo: ${commandPrefix}rankingglobal
187
+ Ranking geral do bot
188
+
189
+ → ${commandPrefix}ping
190
+ 💡 Exemplo: ${commandPrefix}ping
191
+ Status do sistema
192
+
193
+ → ${commandPrefix}user perfil <id|telefone>
194
+ 💡 Exemplo: ${commandPrefix}user perfil 5511999999999
195
+ Resumo rápido de um usuário
196
+ `;
197
+
198
+ export const buildStickerBlinkCaption = (commandPrefix) => `
199
+ ━━━━━━━━━━━━━━━━━━━━
200
+ ✨ FIGURINHAS — TEXTO PISCANTE
201
+ ━━━━━━━━━━━━━━━━━━━━
202
+
203
+ → ${commandPrefix}stickertextblink | ${commandPrefix}stb
204
+ 💡 Exemplo: ${commandPrefix}stb foco total -azul
205
+
206
+ Para definir cor, use “-cor” ao final:
207
+ 💡 Exemplo:
208
+ → ${commandPrefix}stb bom dia -verde
209
+
210
+ Cores disponíveis:
211
+ -branco, -preto, -vermelho, -verde, -azul, -amarelo, -rosa, -roxo, -laranja
212
+ `;
213
+
214
+ export const buildAdminMenu = (commandPrefix = '/') => `
215
+ ━━━━━━━━━━━━━━━━━━━━
216
+ 🛡️ ADMINISTRAÇÃO
217
+ ━━━━━━━━━━━━━━━━━━━━
218
+
219
+ Membros
220
+ → ${commandPrefix}add @user
221
+ 💡 Exemplo: ${commandPrefix}add @joao
222
+
223
+ → ${commandPrefix}ban @user
224
+ 💡 Exemplo: ${commandPrefix}ban @maria
225
+
226
+ → ${commandPrefix}up @user
227
+ 💡 Exemplo: ${commandPrefix}up @carlos
228
+
229
+ → ${commandPrefix}down @user
230
+ 💡 Exemplo: ${commandPrefix}down @carlos
231
+
232
+ Grupo
233
+ → ${commandPrefix}setsubject <texto>
234
+ 💡 Exemplo: ${commandPrefix}setsubject Avisos do Projeto
235
+
236
+ → ${commandPrefix}setdesc <texto>
237
+ 💡 Exemplo: ${commandPrefix}setdesc Grupo oficial da equipe
238
+
239
+ → ${commandPrefix}setgroup <announcement|not_announcement|locked|unlocked>
240
+ 💡 Exemplo: ${commandPrefix}setgroup announcement
241
+
242
+ → ${commandPrefix}invite
243
+ 💡 Exemplo: ${commandPrefix}invite
244
+
245
+ → ${commandPrefix}revoke
246
+ 💡 Exemplo: ${commandPrefix}revoke
247
+
248
+ → ${commandPrefix}leave
249
+ 💡 Exemplo: ${commandPrefix}leave
250
+
251
+ Solicitações
252
+ → ${commandPrefix}requests
253
+ 💡 Exemplo: ${commandPrefix}requests
254
+
255
+ → ${commandPrefix}updaterequests <approve|reject> @user
256
+ 💡 Exemplo: ${commandPrefix}updaterequests approve @joao
257
+
258
+ → ${commandPrefix}autorequests <on|off|status>
259
+ 💡 Exemplo: ${commandPrefix}autorequests status
260
+
261
+ Gerais
262
+ → ${commandPrefix}newgroup <título> <users>
263
+ 💡 Exemplo: ${commandPrefix}newgroup "Time Produto" @ana @carlos
264
+
265
+ → ${commandPrefix}join <convite>
266
+ 💡 Exemplo: ${commandPrefix}join https://chat.whatsapp.com/ABCDE12345
267
+
268
+ → ${commandPrefix}info [grupo]
269
+ 💡 Exemplo: ${commandPrefix}info
270
+
271
+ → ${commandPrefix}metadata [grupo]
272
+ 💡 Exemplo: ${commandPrefix}metadata
273
+
274
+ → ${commandPrefix}groups
275
+ 💡 Exemplo: ${commandPrefix}groups
276
+
277
+ Outros
278
+ → ${commandPrefix}temp <segundos>
279
+ 💡 Exemplo: ${commandPrefix}temp 60
280
+
281
+ → ${commandPrefix}addmode <all_member_add|admin_add>
282
+ 💡 Exemplo: ${commandPrefix}addmode admin_add
283
+
284
+ → ${commandPrefix}welcome <on|off|set>
285
+ 💡 Exemplo: ${commandPrefix}welcome on
286
+
287
+ → ${commandPrefix}farewell <on|off|set>
288
+ 💡 Exemplo: ${commandPrefix}farewell on
289
+
290
+ → ${commandPrefix}premium <add|remove|list>
291
+ 💡 Exemplo: ${commandPrefix}premium list
292
+
293
+ → ${commandPrefix}nsfw <on|off|status>
294
+ 💡 Exemplo: ${commandPrefix}nsfw status
295
+
296
+ → ${commandPrefix}autosticker <on|off|status>
297
+ 💡 Exemplo: ${commandPrefix}autosticker on
298
+
299
+ → ${commandPrefix}stickermode <on|off|status>
300
+ 💡 Exemplo: ${commandPrefix}stickermode on
301
+
302
+ → ${commandPrefix}chatwindow <on|off|status> [min]
303
+ 💡 Exemplo: ${commandPrefix}chatwindow on 15
304
+
305
+ → ${commandPrefix}stickermsglimit <minutos|status|reset>
306
+ 💡 Exemplo: ${commandPrefix}stickermsglimit 60
307
+
308
+ → ${commandPrefix}noticias <on|off|status>
309
+ 💡 Exemplo: ${commandPrefix}noticias on
310
+
311
+ → ${commandPrefix}prefix <novo|status|reset>
312
+ 💡 Exemplo: ${commandPrefix}prefix !
313
+
314
+ → ${commandPrefix}captcha <on|off|status>
315
+ 💡 Exemplo: ${commandPrefix}captcha on
316
+ `;
@@ -0,0 +1,14 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createModuleAiHelpWrapper } from '../../services/ai/moduleAiHelpWrapperFactory.js';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+
8
+ export const menuAiHelpWrapper = createModuleAiHelpWrapper({
9
+ moduleKey: 'menu',
10
+ moduleLabel: 'comandos de menu',
11
+ envPrefix: 'MENU_AI_HELP',
12
+ moduleDirPath: __dirname,
13
+ moduleNameFallback: 'menuModule',
14
+ });
@@ -0,0 +1,68 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ import { createModuleCommandConfigRuntime } from '../../services/ai/moduleCommandConfigRuntimeService.js';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ const CONFIG_PATH = path.join(__dirname, 'commandConfig.json');
9
+
10
+ const DEFAULT_TEXTS = {
11
+ usage_header: '',
12
+ };
13
+
14
+ const runtime = createModuleCommandConfigRuntime({
15
+ configPath: CONFIG_PATH,
16
+ fallbackConfig: {
17
+ module: 'menuModule',
18
+ commands: [],
19
+ textos: DEFAULT_TEXTS,
20
+ },
21
+ });
22
+
23
+ const renderUsageMethod = (method, commandPrefix) => String(method || '').replaceAll('<prefix>', String(commandPrefix || '/'));
24
+
25
+ const resolveUsageLines = (entry, variant) => {
26
+ if (!entry || typeof entry !== 'object') return [];
27
+
28
+ const usageMessages = entry?.mensagens_uso && typeof entry.mensagens_uso === 'object' ? entry.mensagens_uso : null;
29
+
30
+ if (usageMessages) {
31
+ const variantKey = typeof variant === 'string' ? variant.trim() : '';
32
+ const picked = (variantKey && usageMessages[variantKey]) || usageMessages.default || null;
33
+ if (Array.isArray(picked)) {
34
+ return picked.filter(Boolean).map((value) => String(value));
35
+ }
36
+ if (typeof picked === 'string' && picked.trim()) {
37
+ return [picked.trim()];
38
+ }
39
+ }
40
+
41
+ const methods = Array.isArray(entry?.metodos_de_uso) ? entry.metodos_de_uso : [];
42
+ return methods.filter(Boolean).map((value) => String(value));
43
+ };
44
+
45
+ export const getMenuModuleConfig = () => runtime.getModuleConfig();
46
+
47
+ export const resolveMenuCommandName = (command) => runtime.resolveCommandName(command);
48
+ export const getMenuCommandEntry = (command) => runtime.getCommandEntry(command);
49
+ export const listEnabledMenuCommands = () => runtime.listEnabledCommands();
50
+
51
+ export const getMenuTextConfig = () => {
52
+ const config = getMenuModuleConfig();
53
+ const raw = config?.textos && typeof config.textos === 'object' ? config.textos : {};
54
+ return {
55
+ ...DEFAULT_TEXTS,
56
+ ...raw,
57
+ };
58
+ };
59
+
60
+ export const getMenuUsageText = (command, { commandPrefix = '/', header, variant } = {}) => {
61
+ const entry = getMenuCommandEntry(command);
62
+ const methods = resolveUsageLines(entry, variant);
63
+ if (!methods.length) return '';
64
+
65
+ const prefixHeader = typeof header === 'string' ? header : getMenuTextConfig().usage_header || DEFAULT_TEXTS.usage_header;
66
+ const lines = methods.map((method) => renderUsageMethod(method, commandPrefix));
67
+ return prefixHeader ? [prefixHeader, ...lines].join('\n') : lines.join('\n');
68
+ };
@@ -0,0 +1,66 @@
1
+ import logger from '#logger';
2
+ import { buildAnimeMenu, buildAiMenu, buildMediaMenu, buildMenuCaption, buildQuoteMenu, buildStatsMenu, buildStickerMenu, buildAdminMenu } from './common.js';
3
+ import getImageBuffer from '../../utils/http/getImageBufferModule.js';
4
+ import { sendAndStore } from '../../services/messaging/messagePersistenceService.js';
5
+
6
+ const MENU_IMAGE_ENV = 'IMAGE_MENU';
7
+ const sanitizeLogValue = (value) =>
8
+ String(value ?? '')
9
+ .replace(/[\r\n\t]+/g, ' ')
10
+ .replace(/\s+/g, ' ')
11
+ .trim();
12
+
13
+ const sendMenuImage = async (sock, remoteJid, messageInfo, expirationMessage, caption) => {
14
+ const imageUrl = process.env[MENU_IMAGE_ENV];
15
+ if (!imageUrl) {
16
+ logger.error('IMAGE_MENU environment variable not set.');
17
+ await sendAndStore(sock, remoteJid, { text: 'Ocorreu um erro ao carregar o menu.' }, { quoted: messageInfo, ephemeralExpiration: expirationMessage });
18
+ return;
19
+ }
20
+
21
+ try {
22
+ const imageBuffer = await getImageBuffer(imageUrl);
23
+ await sendAndStore(
24
+ sock,
25
+ remoteJid,
26
+ {
27
+ image: imageBuffer,
28
+ caption,
29
+ },
30
+ { quoted: messageInfo, ephemeralExpiration: expirationMessage },
31
+ );
32
+ } catch (error) {
33
+ logger.error('Error fetching menu image.', {
34
+ error: sanitizeLogValue(error?.message) || 'unknown_error',
35
+ });
36
+ await sendAndStore(sock, remoteJid, { text: 'Ocorreu um erro ao carregar a imagem do menu.' }, { quoted: messageInfo, ephemeralExpiration: expirationMessage });
37
+ }
38
+ };
39
+
40
+ export async function handleMenuCommand(sock, remoteJid, messageInfo, expirationMessage, senderName, commandPrefix, args = []) {
41
+ const category = args?.[0]?.toLowerCase();
42
+ const categoryMap = new Map([
43
+ ['figurinhas', (prefix) => buildStickerMenu(prefix)],
44
+ ['sticker', (prefix) => buildStickerMenu(prefix)],
45
+ ['stickers', (prefix) => buildStickerMenu(prefix)],
46
+ ['midia', (prefix) => buildMediaMenu(prefix)],
47
+ ['media', (prefix) => buildMediaMenu(prefix)],
48
+ ['quote', (prefix) => buildQuoteMenu(prefix)],
49
+ ['quotes', (prefix) => buildQuoteMenu(prefix)],
50
+ ['ia', (prefix) => buildAiMenu(prefix)],
51
+ ['ai', (prefix) => buildAiMenu(prefix)],
52
+ ['stats', (prefix) => buildStatsMenu(prefix)],
53
+ ['estatisticas', (prefix) => buildStatsMenu(prefix)],
54
+ ['estatistica', (prefix) => buildStatsMenu(prefix)],
55
+ ['anime', (prefix) => buildAnimeMenu(prefix)],
56
+ ]);
57
+
58
+ const buildCategory = categoryMap.get(category);
59
+ const caption = buildCategory ? buildCategory(commandPrefix).trim() : buildMenuCaption(senderName, commandPrefix).trim();
60
+
61
+ await sendMenuImage(sock, remoteJid, messageInfo, expirationMessage, caption);
62
+ }
63
+
64
+ export async function handleMenuAdmCommand(sock, remoteJid, messageInfo, expirationMessage, commandPrefix) {
65
+ await sendMenuImage(sock, remoteJid, messageInfo, expirationMessage, buildAdminMenu(commandPrefix).trim());
66
+ }