@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.
- package/.clusterfuzzlite/Dockerfile +10 -0
- package/.env.example +907 -0
- package/.github/codeql/codeql-config.yml +10 -0
- package/.github/dependabot.yml +35 -0
- package/.github/workflows/ci.yml +73 -0
- package/.github/workflows/codeql.yml +106 -0
- package/.github/workflows/db-migration-check.yml +98 -0
- package/.github/workflows/dependency-review.yml +22 -0
- package/.github/workflows/deploy.yml +95 -0
- package/.github/workflows/release.yml +106 -0
- package/.github/workflows/security-attest-provenance.yml +51 -0
- package/.github/workflows/security-gitleaks.yml +34 -0
- package/.github/workflows/security-runner-hardening.yml +31 -0
- package/.github/workflows/security-scorecard.yml +44 -0
- package/.github/workflows/security-zap-baseline.yml +44 -0
- package/.github/workflows/security-zap-full-scan.yml +43 -0
- package/.github/workflows/security-zizmor.yml +36 -0
- package/.github/workflows/wiki-sync.yml +44 -0
- package/.gitleaks.toml +15 -0
- package/.prettierrc +34 -0
- package/CODE_OF_CONDUCT.md +114 -0
- package/LICENSE +56 -0
- package/README.md +110 -0
- package/SECURITY.md +110 -0
- package/app/config/index.js +4 -0
- package/app/configParts/adminIdentity.js +92 -0
- package/app/configParts/baileysConfig.js +1818 -0
- package/app/configParts/groupUtils.js +692 -0
- package/app/configParts/loggerConfig.js +394 -0
- package/app/configParts/messagePersistenceService.js +305 -0
- package/app/connection/baileysCompatibility.test.js +40 -0
- package/app/connection/baileysDbAuthState.js +344 -0
- package/app/connection/socketController.js +2243 -0
- package/app/controllers/messageController.js +7 -0
- package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
- package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
- package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
- package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
- package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
- package/app/controllers/messageProcessingPipeline.js +699 -0
- package/app/modules/adminModule/AGENT.md +4056 -0
- package/app/modules/adminModule/adminAiHelpService.js +56 -0
- package/app/modules/adminModule/adminConfigRuntime.js +177 -0
- package/app/modules/adminModule/commandConfig.json +7122 -0
- package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
- package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
- package/app/modules/adminModule/groupEventHandlers.js +399 -0
- package/app/modules/aiModule/AGENT.md +547 -0
- package/app/modules/aiModule/aiAiHelpService.js +14 -0
- package/app/modules/aiModule/aiConfigRuntime.js +135 -0
- package/app/modules/aiModule/catCommand.js +967 -0
- package/app/modules/aiModule/commandConfig.json +981 -0
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
- package/app/modules/gameModule/AGENT.md +196 -0
- package/app/modules/gameModule/commandConfig.json +366 -0
- package/app/modules/gameModule/diceCommand.js +42 -0
- package/app/modules/gameModule/gameAiHelpService.js +14 -0
- package/app/modules/gameModule/gameConfigRuntime.js +68 -0
- package/app/modules/menuModule/AGENT.md +205 -0
- package/app/modules/menuModule/commandConfig.json +366 -0
- package/app/modules/menuModule/common.js +316 -0
- package/app/modules/menuModule/menuAiHelpService.js +14 -0
- package/app/modules/menuModule/menuConfigRuntime.js +68 -0
- package/app/modules/menuModule/menus.js +66 -0
- package/app/modules/playModule/AGENT.md +321 -0
- package/app/modules/playModule/commandConfig.json +584 -0
- package/app/modules/playModule/playAiHelpService.js +14 -0
- package/app/modules/playModule/playCommand.js +1417 -0
- package/app/modules/playModule/playConfigRuntime.js +68 -0
- package/app/modules/quoteModule/AGENT.md +199 -0
- package/app/modules/quoteModule/commandConfig.json +366 -0
- package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
- package/app/modules/quoteModule/quoteCommand.js +842 -0
- package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/AGENT.md +229 -0
- package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
- package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
- package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
- package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
- package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
- package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
- package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
- package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
- package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
- package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
- package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
- package/app/modules/statsModule/AGENT.md +320 -0
- package/app/modules/statsModule/commandConfig.json +540 -0
- package/app/modules/statsModule/globalRankingCommand.js +64 -0
- package/app/modules/statsModule/rankingCommand.js +41 -0
- package/app/modules/statsModule/rankingCommon.js +1305 -0
- package/app/modules/statsModule/statsAiHelpService.js +14 -0
- package/app/modules/statsModule/statsConfigRuntime.js +68 -0
- package/app/modules/stickerModule/AGENT.md +692 -0
- package/app/modules/stickerModule/addStickerMetadata.js +239 -0
- package/app/modules/stickerModule/commandConfig.json +1216 -0
- package/app/modules/stickerModule/convertToWebp.js +367 -0
- package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
- package/app/modules/stickerModule/stickerCommand.js +446 -0
- package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
- package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
- package/app/modules/stickerModule/stickerTextCommand.js +653 -0
- package/app/modules/stickerPackModule/AGENT.md +215 -0
- package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
- package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
- package/app/modules/stickerPackModule/commandConfig.json +387 -0
- package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
- package/app/modules/stickerPackModule/domainEvents.js +52 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
- package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
- package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
- package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
- package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
- package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
- package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
- package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
- package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
- package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
- package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
- package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
- package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
- package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
- package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
- package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
- package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
- package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
- package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
- package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
- package/app/modules/stickerPackModule/stickerPackService.js +733 -0
- package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
- package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
- package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
- package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
- package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
- package/app/modules/systemMetricsModule/AGENT.md +193 -0
- package/app/modules/systemMetricsModule/commandConfig.json +344 -0
- package/app/modules/systemMetricsModule/pingCommand.js +399 -0
- package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
- package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
- package/app/modules/tiktokModule/AGENT.md +196 -0
- package/app/modules/tiktokModule/commandConfig.json +366 -0
- package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
- package/app/modules/tiktokModule/tiktokCommand.js +716 -0
- package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
- package/app/modules/userModule/AGENT.md +200 -0
- package/app/modules/userModule/commandConfig.json +386 -0
- package/app/modules/userModule/userAiHelpService.js +14 -0
- package/app/modules/userModule/userCommand.js +1155 -0
- package/app/modules/userModule/userConfigRuntime.js +68 -0
- package/app/modules/waifuPicsModule/AGENT.md +431 -0
- package/app/modules/waifuPicsModule/commandConfig.json +780 -0
- package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
- package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
- package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
- package/app/observability/metrics.js +766 -0
- package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
- package/app/services/ai/aiLearningRepository.js +400 -0
- package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
- package/app/services/ai/commandConfigEnrichmentService.js +452 -0
- package/app/services/ai/commandConfigValidationService.js +443 -0
- package/app/services/ai/commandToolBuilderService.js +192 -0
- package/app/services/ai/conversationRouterService.js +516 -0
- package/app/services/ai/geminiService.js +115 -0
- package/app/services/ai/geminiService.test.js +87 -0
- package/app/services/ai/globalModuleAiHelpService.js +1412 -0
- package/app/services/ai/globalToolCallingService.js +203 -0
- package/app/services/ai/messageCommandExecutionService.js +391 -0
- package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
- package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
- package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
- package/app/services/ai/moduleToolExecutorService.js +464 -0
- package/app/services/ai/moduleToolRegistryService.js +178 -0
- package/app/services/ai/toolCandidateSelectorService.js +781 -0
- package/app/services/auth/googleWebLinkService.js +80 -0
- package/app/services/auth/whatsappLoginLinkService.js +230 -0
- package/app/services/external/pokeApiService.js +398 -0
- package/app/services/group/groupMetadataService.js +311 -0
- package/app/services/infra/dbWriteQueue.js +874 -0
- package/app/services/infra/featureFlagService.js +131 -0
- package/app/services/infra/queueUtils.js +55 -0
- package/app/services/messaging/captchaService.js +491 -0
- package/app/services/messaging/messagePersistenceService.js +1 -0
- package/app/services/messaging/newsBroadcastService.js +347 -0
- package/app/services/sticker/stickerFocusService.js +347 -0
- package/app/services/sticker/stickerFocusService.test.js +43 -0
- package/app/store/aiPromptStore.js +38 -0
- package/app/store/conversationSessionStore.js +131 -0
- package/app/store/groupConfigStore.js +58 -0
- package/app/store/premiumUserStore.js +54 -0
- package/app/utils/antiLink/antiLinkModule.js +700 -0
- package/app/utils/http/getImageBufferModule.js +18 -0
- package/app/utils/json/jsonSanitizer.js +113 -0
- package/app/utils/json/jsonSanitizer.test.js +40 -0
- package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
- package/app/workers/aiLearningWorker.js +605 -0
- package/app/workers/commandConfigEnrichmentWorker.js +242 -0
- package/database/index.js +2075 -0
- package/database/init.js +151 -0
- package/database/migrations/.gitkeep +0 -0
- package/database/migrations/20260307_d0_hardening_down.sql +64 -0
- package/database/migrations/20260307_d0_hardening_up.sql +79 -0
- package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
- package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
- package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
- package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
- package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
- package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
- package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
- package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
- package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
- package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
- package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
- package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
- package/database/schema.sql +1186 -0
- package/docker-compose.yml +104 -0
- package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
- package/docs/audits/stickerCatalogController-symbols.md +58 -0
- package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
- package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
- package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
- package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
- package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
- package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
- package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
- package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
- package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
- package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
- package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
- package/docs/seo/satellite-page-template.md +116 -0
- package/docs/seo/satellite-pages-phase1.json +364 -0
- package/docs/wiki/Home.md +120 -0
- package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
- package/docs/wiki/recent-changes-2026-03-08.md +47 -0
- package/ecosystem.prod.config.cjs +135 -0
- package/eslint.config.js +89 -0
- package/index.js +488 -0
- package/ml/clip_classifier/Dockerfile +18 -0
- package/ml/clip_classifier/README.md +118 -0
- package/ml/clip_classifier/adaptive_scoring.py +40 -0
- package/ml/clip_classifier/classifier.py +654 -0
- package/ml/clip_classifier/embedding_store.py +481 -0
- package/ml/clip_classifier/env_loader.py +15 -0
- package/ml/clip_classifier/llm_label_expander.py +144 -0
- package/ml/clip_classifier/main.py +213 -0
- package/ml/clip_classifier/requirements.txt +10 -0
- package/ml/clip_classifier/similarity_engine.py +74 -0
- package/new-logo.png +0 -0
- package/observability/alert-rules.yml +60 -0
- package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
- package/observability/grafana/dashboards/omnizap-overview.json +170 -0
- package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
- package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
- package/observability/loki-config.yml +38 -0
- package/observability/mysql-setup.sql +46 -0
- package/observability/prometheus.yml +35 -0
- package/observability/promtail-config.yml +84 -0
- package/observability/sticker-catalog-slo.md +83 -0
- package/observability/sticker-scale-hardening-rollout.md +128 -0
- package/package.json +144 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/css/commands-react.input.css +71 -0
- package/public/assets/css/create-pack-react.input.css +31 -0
- package/public/assets/css/home-react.input.css +106 -0
- package/public/assets/css/login-react.input.css +58 -0
- package/public/assets/css/stickers-react.input.css +18 -0
- package/public/assets/css/terms-react.input.css +115 -0
- package/public/assets/css/user-react.input.css +57 -0
- package/public/assets/images/brand-icon-192.png +0 -0
- package/public/assets/images/brand-logo-128.webp +0 -0
- package/public/assets/images/hero-banner-1280.jpg +0 -0
- package/public/comandos/commands-catalog.json +4517 -0
- package/public/css/api-docs.css +161 -0
- package/public/css/stickers-admin.css +1288 -0
- package/public/css/styles.css +679 -0
- package/public/css/systemadm/admin.css +474 -0
- package/public/css/systemadm/base.css +73 -0
- package/public/css/systemadm/components.css +662 -0
- package/public/css/systemadm/layout.css +229 -0
- package/public/css/systemadm/tokens.css +56 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/js/apps/apiDocsApp.js +235 -0
- package/public/js/apps/commandsReactApp.js +528 -0
- package/public/js/apps/createPackApp.js +1646 -0
- package/public/js/apps/homeReactApp.js +942 -0
- package/public/js/apps/loginReactApp.js +496 -0
- package/public/js/apps/stickersAdminApp.js +1753 -0
- package/public/js/apps/stickersApp.js +3797 -0
- package/public/js/apps/termsReactApp.js +528 -0
- package/public/js/apps/userApp.js +2540 -0
- package/public/js/apps/userProfile/actions.js +66 -0
- package/public/js/apps/userReactApp.js +547 -0
- package/public/js/catalog.js +950 -0
- package/public/pages/api-docs.html +40 -0
- package/public/pages/aup.html +158 -0
- package/public/pages/comandos.html +41 -0
- package/public/pages/dpa.html +227 -0
- package/public/pages/home.html +45 -0
- package/public/pages/licenca.html +182 -0
- package/public/pages/login.html +40 -0
- package/public/pages/notice-and-takedown.html +234 -0
- package/public/pages/politica-de-privacidade.html +251 -0
- package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
- package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
- package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
- package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
- package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
- package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
- package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
- package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
- package/public/pages/stickers-admin.html +31 -0
- package/public/pages/stickers-create.html +41 -0
- package/public/pages/stickers.html +45 -0
- package/public/pages/suboperadores.html +237 -0
- package/public/pages/termos-de-uso-texto-integral.html +241 -0
- package/public/pages/termos-de-uso.html +41 -0
- package/public/pages/user-password-reset.html +32 -0
- package/public/pages/user-systemadm.html +508 -0
- package/public/pages/user.html +39 -0
- package/public/robots.txt +9 -0
- package/public/site.webmanifest +24 -0
- package/public/sitemap.xml +98 -0
- package/schemas/command-config.schema.json +582 -0
- package/scripts/baileys-compat-smoke.mjs +12 -0
- package/scripts/cache-bust.mjs +142 -0
- package/scripts/deploy.sh +916 -0
- package/scripts/email-broadcast-terms-update.mjs +170 -0
- package/scripts/enrich-command-discovery-fields.mjs +286 -0
- package/scripts/generate-command-config-schema.mjs +273 -0
- package/scripts/generate-commands-catalog.mjs +308 -0
- package/scripts/generate-module-agents.mjs +631 -0
- package/scripts/generate-seo-satellite-pages.mjs +400 -0
- package/scripts/github-deploy-notify.mjs +174 -0
- package/scripts/github-release-notify.mjs +219 -0
- package/scripts/release.sh +599 -0
- package/scripts/run-codeql-local.sh +116 -0
- package/scripts/run-prettier-all.mjs +25 -0
- package/scripts/security-smoketest.mjs +581 -0
- package/scripts/sticker-catalog-loadtest.mjs +210 -0
- package/scripts/sticker-worker-task.mjs +119 -0
- package/scripts/sync-readme-snapshot.mjs +133 -0
- package/scripts/validate-command-config-schema.mjs +130 -0
- package/scripts/validate-command-configs.mjs +15 -0
- package/scripts/wiki-sync.sh +191 -0
- package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
- package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
- package/server/auth/jwt/webJwtService.js +147 -0
- package/server/auth/stickerCatalogAuthContext.js +165 -0
- package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
- package/server/auth/userPassword/index.js +14 -0
- package/server/auth/userPassword/userPasswordAuthService.js +422 -0
- package/server/auth/userPassword/userPasswordCrypto.js +199 -0
- package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
- package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
- package/server/auth/validation/authSchemas.js +236 -0
- package/server/auth/webAccount/webAccountHandlers.js +1434 -0
- package/server/controllers/admin/adminBanService.js +138 -0
- package/server/controllers/admin/adminPanelHandlers.js +2083 -0
- package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
- package/server/controllers/admin/systemAdminController.js +201 -0
- package/server/controllers/email/emailAutomationController.js +239 -0
- package/server/controllers/metricsController.js +21 -0
- package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
- package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
- package/server/controllers/sticker/stickerCatalogController.js +4700 -0
- package/server/controllers/system/contactController.js +115 -0
- package/server/controllers/system/githubController.js +137 -0
- package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
- package/server/controllers/system/storageController.js +154 -0
- package/server/controllers/system/systemController.js +135 -0
- package/server/controllers/system/systemMetricsController.js +156 -0
- package/server/controllers/system/visitController.js +90 -0
- package/server/controllers/userController.js +145 -0
- package/server/email/emailAutomationRuntime.js +225 -0
- package/server/email/emailAutomationService.js +125 -0
- package/server/email/emailOutboxRepository.js +282 -0
- package/server/email/emailTemplateService.js +480 -0
- package/server/email/emailTransportService.js +156 -0
- package/server/http/clientIp.js +95 -0
- package/server/http/httpRequestUtils.js +262 -0
- package/server/http/httpRequestUtils.test.js +80 -0
- package/server/http/httpServer.js +180 -0
- package/server/http/requestContext.js +20 -0
- package/server/http/siteRoutingUtils.js +87 -0
- package/server/index.js +1 -0
- package/server/middleware/cachePolicy.js +26 -0
- package/server/middleware/cachePolicyHelpers.js +1 -0
- package/server/middleware/endpointRateLimit.js +181 -0
- package/server/middleware/rateLimit.js +70 -0
- package/server/middleware/requireAdminAuth.js +48 -0
- package/server/middleware/securityHeaders.js +97 -0
- package/server/routes/admin/systemAdminRouter.js +64 -0
- package/server/routes/email/emailAutomationRouter.js +46 -0
- package/server/routes/health/healthRouter.js +41 -0
- package/server/routes/indexRouter.js +234 -0
- package/server/routes/metrics/metricsRouter.js +58 -0
- package/server/routes/static/staticPageRouter.js +134 -0
- package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
- package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
- package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
- package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
- package/server/routes/sticker/catalogRouter.js +77 -0
- package/server/routes/sticker/stickerApiRouter.js +84 -0
- package/server/routes/sticker/stickerDataRouter.js +145 -0
- package/server/routes/sticker/stickerSiteRouter.js +43 -0
- package/server/routes/user/userApiPaths.js +66 -0
- package/server/routes/user/userRouter.js +65 -0
- package/server/utils/safePath.js +26 -0
- package/utils/logger/loggerModule.js +35 -0
- package/vite.config.mjs +38 -0
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { createRoot } from 'react-dom/client';
|
|
3
|
+
import htm from 'htm';
|
|
4
|
+
|
|
5
|
+
const html = htm.bind(React.createElement);
|
|
6
|
+
|
|
7
|
+
const CATALOG_URL = '/comandos/commands-catalog.json';
|
|
8
|
+
|
|
9
|
+
const _RequirementIcon = ({ type, active }) => {
|
|
10
|
+
if (!active) return null;
|
|
11
|
+
const config = {
|
|
12
|
+
group: { icon: '👥', label: 'Grupo' },
|
|
13
|
+
admin: { icon: '👮', label: 'Admin' },
|
|
14
|
+
owner: { icon: '👑', label: 'Owner' },
|
|
15
|
+
google_login: { icon: '📧', label: 'Google' },
|
|
16
|
+
nsfw: { icon: '🔞', label: 'NSFW' },
|
|
17
|
+
media: { icon: '🖼️', label: 'Mídia' },
|
|
18
|
+
reply: { icon: '↩️', label: 'Resposta' },
|
|
19
|
+
};
|
|
20
|
+
const { icon, label } = config[type] || { icon: '❓', label: type };
|
|
21
|
+
return html`
|
|
22
|
+
<span className="flex items-center gap-1.5 bg-base-300/50 px-2 py-1 rounded-lg text-[10px] font-bold text-base-content/70 border border-base-300" title=${label}>
|
|
23
|
+
<span>${icon}</span>
|
|
24
|
+
<span>${label}</span>
|
|
25
|
+
</span>
|
|
26
|
+
`;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const CommandDetailsPage = ({ command, onClose, devMode }) => {
|
|
30
|
+
if (!command) return null;
|
|
31
|
+
const [copyStatus, setCopyStatus] = useState({});
|
|
32
|
+
|
|
33
|
+
const handleCopy = (text, id) => {
|
|
34
|
+
navigator.clipboard.writeText(text);
|
|
35
|
+
setCopyStatus({ ...copyStatus, [id]: true });
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
setCopyStatus({ ...copyStatus, [id]: false });
|
|
38
|
+
}, 2000);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
window.scrollTo(0, 0);
|
|
43
|
+
document.title = `/${command.name} - Detalhes do Comando | OmniZap`;
|
|
44
|
+
return () => {
|
|
45
|
+
document.title = 'Comandos do Bot para WhatsApp | OmniZap';
|
|
46
|
+
};
|
|
47
|
+
}, [command]);
|
|
48
|
+
|
|
49
|
+
return html`
|
|
50
|
+
<div className="min-h-screen bg-[#020617] text-white selection:bg-primary selection:text-primary-content animate-in fade-in duration-700 overflow-x-hidden">
|
|
51
|
+
<div className="fixed inset-0 pointer-events-none overflow-hidden">
|
|
52
|
+
<div className="absolute -top-[10%] -left-[10%] w-[40%] h-[40%] bg-primary/10 blur-[120px] rounded-full animate-pulse"></div>
|
|
53
|
+
<div className="absolute top-[20%] -right-[10%] w-[30%] h-[30%] bg-secondary/10 blur-[100px] rounded-full"></div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div className="sticky top-0 z-50 bg-[#020617]/60 backdrop-blur-xl border-b border-white/5">
|
|
57
|
+
<div className="container mx-auto px-4 h-16 flex items-center justify-between">
|
|
58
|
+
<button onClick=${onClose} className="btn btn-ghost group pl-0 hover:bg-transparent">
|
|
59
|
+
<div className="w-10 h-10 rounded-xl bg-white/5 border border-white/10 flex items-center justify-center group-hover:bg-primary group-hover:text-primary-content group-hover:border-primary transition-all duration-300">
|
|
60
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M15 19l-7-7 7-7" /></svg>
|
|
61
|
+
</div>
|
|
62
|
+
<span className="hidden sm:inline text-xs font-black uppercase tracking-widest ml-3 opacity-50 group-hover:opacity-100 transition-opacity">Voltar ao Catálogo</span>
|
|
63
|
+
</button>
|
|
64
|
+
|
|
65
|
+
<div className="flex items-center gap-3">
|
|
66
|
+
<div className="text-right">
|
|
67
|
+
<p className="text-[10px] font-black uppercase tracking-[0.2em] text-primary">${command.category_label}</p>
|
|
68
|
+
<p className="text-[8px] font-bold opacity-30 uppercase tracking-widest hidden sm:block">Ref. Doc V3.5</p>
|
|
69
|
+
</div>
|
|
70
|
+
<div className="w-10 h-10 rounded-xl bg-primary/10 flex items-center justify-center text-xl border border-primary/20 shadow-[0_0_20px_rgba(34,197,94,0.1)]">${command.category_icon || '🧩'}</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<main className="container mx-auto max-w-4xl px-4 py-8 lg:py-16 relative z-10">
|
|
76
|
+
<div className="space-y-12">
|
|
77
|
+
<header className="space-y-6 text-center sm:text-left">
|
|
78
|
+
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-[10px] font-black uppercase tracking-widest">
|
|
79
|
+
<span className="w-1.5 h-1.5 rounded-full bg-primary animate-pulse"></span>
|
|
80
|
+
Documentação Oficial
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<div className="space-y-4">
|
|
84
|
+
<div className="flex flex-wrap items-center justify-center sm:justify-start gap-4">
|
|
85
|
+
<h1 className="text-5xl sm:text-6xl lg:text-8xl font-black tracking-tighter text-white">/<span className="text-transparent bg-clip-text bg-gradient-to-r from-primary to-emerald-400">${command.name}</span></h1>
|
|
86
|
+
${command.premium && html` <div className="badge badge-warning h-10 px-6 font-black text-[10px] uppercase tracking-[0.2em] shadow-[0_0_30px_rgba(251,191,36,0.2)] border-none">Premium</div> `}
|
|
87
|
+
</div>
|
|
88
|
+
<p className="text-lg sm:text-xl lg:text-2xl text-white/60 leading-relaxed font-medium max-w-3xl mx-auto sm:mx-0">${command.descricao}</p>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div className="flex flex-wrap justify-center sm:justify-start gap-2 pt-2">
|
|
92
|
+
<${_RequirementIcon} type="group" active=${command.requirements?.group} />
|
|
93
|
+
<${_RequirementIcon} type="admin" active=${command.requirements?.admin} />
|
|
94
|
+
<${_RequirementIcon} type="owner" active=${command.requirements?.owner} />
|
|
95
|
+
<${_RequirementIcon} type="google_login" active=${command.requirements?.google_login} />
|
|
96
|
+
<${_RequirementIcon} type="nsfw" active=${command.requirements?.nsfw} />
|
|
97
|
+
<${_RequirementIcon} type="media" active=${command.requirements?.media} />
|
|
98
|
+
<${_RequirementIcon} type="reply" active=${command.requirements?.reply} />
|
|
99
|
+
</div>
|
|
100
|
+
</header>
|
|
101
|
+
|
|
102
|
+
<section className="space-y-6">
|
|
103
|
+
<div className="flex items-center gap-4">
|
|
104
|
+
<h3 className="text-[10px] font-black uppercase tracking-[0.4em] text-white/20">Como usar agora</h3>
|
|
105
|
+
<div className="flex-1 h-px bg-white/5"></div>
|
|
106
|
+
</div>
|
|
107
|
+
<div className="grid gap-4">
|
|
108
|
+
${(command.metodos_de_uso || []).map(
|
|
109
|
+
(usage, idx) => html`
|
|
110
|
+
<div key=${idx} className="group relative">
|
|
111
|
+
<div className="absolute inset-0 bg-primary/5 blur-xl opacity-0 group-hover:opacity-100 transition-opacity rounded-[2.5rem]"></div>
|
|
112
|
+
<div className="relative flex flex-col sm:flex-row items-stretch sm:items-center gap-4 p-1 rounded-[2rem] bg-white/[0.03] border border-white/5 group-hover:border-primary/30 transition-all duration-300">
|
|
113
|
+
<code className="flex-1 px-6 py-5 sm:py-6 font-mono text-sm sm:text-base text-primary/80 break-all"> ${usage} </code>
|
|
114
|
+
<button onClick=${() => handleCopy(usage, `usage-${idx}`)} className=${`px-8 py-4 sm:py-6 rounded-2xl sm:rounded-r-[1.8rem] sm:rounded-l-none font-black text-[10px] uppercase tracking-widest transition-all ${copyStatus[`usage-${idx}`] ? 'bg-success text-white' : 'bg-white/5 hover:bg-primary hover:text-primary-content'}`}>${copyStatus[`usage-${idx}`] ? 'Copiado!' : 'Copiar'}</button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
`,
|
|
118
|
+
)}
|
|
119
|
+
</div>
|
|
120
|
+
</section>
|
|
121
|
+
|
|
122
|
+
${command.arguments?.length > 0 &&
|
|
123
|
+
html`
|
|
124
|
+
<section className="space-y-6">
|
|
125
|
+
<div className="flex items-center gap-4">
|
|
126
|
+
<h3 className="text-[10px] font-black uppercase tracking-[0.4em] text-white/20">Configurações e Argumentos</h3>
|
|
127
|
+
<div className="flex-1 h-px bg-white/5"></div>
|
|
128
|
+
</div>
|
|
129
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
130
|
+
${command.arguments.map(
|
|
131
|
+
(arg) => html`
|
|
132
|
+
<div key=${arg.name} className="group p-6 rounded-[2rem] bg-white/[0.02] border border-white/5 hover:border-primary/20 transition-all duration-300">
|
|
133
|
+
<div className="flex items-start justify-between mb-4">
|
|
134
|
+
<div className="space-y-1">
|
|
135
|
+
<h4 className="text-lg font-black text-white group-hover:text-primary transition-colors">${arg.name}</h4>
|
|
136
|
+
<span className="inline-block text-[9px] font-bold text-white/30 font-mono uppercase tracking-widest bg-white/5 px-2 py-0.5 rounded"> Type: ${arg.type} </span>
|
|
137
|
+
</div>
|
|
138
|
+
<span className=${`text-[8px] font-black uppercase px-3 py-1 rounded-full border ${arg.required ? 'bg-error/10 text-error border-error/20' : 'bg-white/5 text-white/30 border-white/10'}`}> ${arg.required ? 'Obrigatório' : 'Opcional'} </span>
|
|
139
|
+
</div>
|
|
140
|
+
<p className="text-sm text-white/50 font-medium leading-relaxed">${arg.description}</p>
|
|
141
|
+
</div>
|
|
142
|
+
`,
|
|
143
|
+
)}
|
|
144
|
+
</div>
|
|
145
|
+
</section>
|
|
146
|
+
`}
|
|
147
|
+
|
|
148
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6 pt-6">
|
|
149
|
+
<section className="p-8 rounded-[2.5rem] bg-white/[0.02] border border-white/5 space-y-6 relative overflow-hidden group">
|
|
150
|
+
<div className="absolute -right-8 -bottom-8 w-32 h-32 bg-primary/5 blur-2xl rounded-full group-hover:bg-primary/10 transition-colors"></div>
|
|
151
|
+
<h3 className="text-[10px] font-black uppercase tracking-[0.3em] text-white/30 relative z-10">Specs Técnicas</h3>
|
|
152
|
+
<div className="grid grid-cols-2 gap-y-8 relative z-10">
|
|
153
|
+
<div>
|
|
154
|
+
<p className="text-[9px] font-bold uppercase text-white/20 mb-1 tracking-widest">Versão</p>
|
|
155
|
+
<p className="text-base font-black text-white">${command.technical?.version || '1.0.0'}</p>
|
|
156
|
+
</div>
|
|
157
|
+
<div>
|
|
158
|
+
<p className="text-[9px] font-bold uppercase text-white/20 mb-1 tracking-widest">Estabilidade</p>
|
|
159
|
+
<p className="text-base font-black text-emerald-400">${command.technical?.stability || 'Stable'}</p>
|
|
160
|
+
</div>
|
|
161
|
+
<div>
|
|
162
|
+
<p className="text-[9px] font-bold uppercase text-white/20 mb-1 tracking-widest">Risco</p>
|
|
163
|
+
<p className="text-base font-black ${command.technical?.risk_level !== 'low' ? 'text-rose-500' : 'text-emerald-400'}">${command.technical?.risk_level?.toUpperCase() || 'LOW'}</p>
|
|
164
|
+
</div>
|
|
165
|
+
<div>
|
|
166
|
+
<p className="text-[9px] font-bold uppercase text-white/20 mb-1 tracking-widest">ID Sistema</p>
|
|
167
|
+
<p className="text-[10px] font-mono font-bold text-white/40 truncate">${command.id}</p>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</section>
|
|
171
|
+
|
|
172
|
+
${command.technical?.collected_data?.length > 0 &&
|
|
173
|
+
html`
|
|
174
|
+
<section className="p-8 rounded-[2.5rem] bg-white/[0.02] border border-white/5 space-y-6 relative overflow-hidden group">
|
|
175
|
+
<div className="absolute -right-8 -bottom-8 w-32 h-32 bg-emerald-500/5 blur-2xl rounded-full group-hover:bg-emerald-500/10 transition-colors"></div>
|
|
176
|
+
<h3 className="text-[10px] font-black uppercase tracking-[0.3em] text-white/30 relative z-10">Privacidade e Dados</h3>
|
|
177
|
+
<div className="flex flex-wrap gap-2 relative z-10">${command.technical.collected_data.map((data) => html` <span key=${data} className="text-[10px] font-bold bg-white/5 px-4 py-2 rounded-xl border border-white/10 text-white/60">${data}</span> `)}</div>
|
|
178
|
+
<p className="text-[9px] text-white/20 font-medium leading-relaxed italic relative z-10">* Estes dados são processados apenas para execução do comando.</p>
|
|
179
|
+
</section>
|
|
180
|
+
`}
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
${devMode &&
|
|
184
|
+
html`
|
|
185
|
+
<section className="space-y-6 animate-in slide-in-from-bottom-8 duration-1000">
|
|
186
|
+
<div className="flex items-center gap-4">
|
|
187
|
+
<h3 className="text-[10px] font-black uppercase tracking-[0.4em] text-warning/30">Developer Metadata</h3>
|
|
188
|
+
<div className="flex-1 h-px bg-warning/10"></div>
|
|
189
|
+
</div>
|
|
190
|
+
<div className="relative group">
|
|
191
|
+
<div className="absolute inset-0 bg-warning/5 blur-3xl opacity-20"></div>
|
|
192
|
+
<div className="relative bg-[#020617] border border-warning/10 rounded-[2.5rem] overflow-hidden">
|
|
193
|
+
<div className="bg-warning/5 px-8 py-3 border-b border-warning/10 flex items-center justify-between">
|
|
194
|
+
<span className="text-[9px] font-black uppercase tracking-widest text-warning/60 font-mono">command_schema.json</span>
|
|
195
|
+
<button onClick=${() => handleCopy(JSON.stringify(command, null, 2), 'raw-json')} className=${`text-[9px] font-black uppercase tracking-widest transition-colors ${copyStatus['raw-json'] ? 'text-success' : 'text-warning/40 hover:text-warning'}`}>${copyStatus['raw-json'] ? 'Copiado!' : 'Copiar JSON'}</button>
|
|
196
|
+
</div>
|
|
197
|
+
<pre className="p-8 font-mono text-[10px] sm:text-[11px] text-warning/70 overflow-x-auto max-h-[400px] scrollbar-thin scrollbar-thumb-warning/20">
|
|
198
|
+
${JSON.stringify(command, null, 2)}
|
|
199
|
+
</pre
|
|
200
|
+
>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
</section>
|
|
204
|
+
`}
|
|
205
|
+
|
|
206
|
+
<div className="pt-12 pb-20 text-center">
|
|
207
|
+
<button onClick=${onClose} className="group relative inline-flex items-center justify-center">
|
|
208
|
+
<div className="absolute inset-0 bg-primary/20 blur-2xl group-hover:bg-primary/40 transition-colors rounded-2xl"></div>
|
|
209
|
+
<div className="relative bg-primary text-primary-content px-12 py-5 rounded-2xl font-black text-xs uppercase tracking-[0.3em] shadow-2xl hover:scale-105 active:scale-95 transition-all">Voltar ao Catálogo</div>
|
|
210
|
+
</button>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</main>
|
|
214
|
+
</div>
|
|
215
|
+
`;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const App = () => {
|
|
219
|
+
const [catalog, setCatalog] = useState(null);
|
|
220
|
+
const [search, setSearch] = useState('');
|
|
221
|
+
const [loading, setLoading] = useState(true);
|
|
222
|
+
const [activeModule, setActiveModule] = useState('all');
|
|
223
|
+
const [selectedCommand, setSelectedCommand] = useState(null);
|
|
224
|
+
const [devMode, setDevMode] = useState(false);
|
|
225
|
+
const carouselRef = React.useRef(null);
|
|
226
|
+
const searchInputRef = React.useRef(null);
|
|
227
|
+
|
|
228
|
+
const scrollCarousel = (direction) => {
|
|
229
|
+
if (!carouselRef.current) return;
|
|
230
|
+
const scrollAmount = 300;
|
|
231
|
+
carouselRef.current.scrollBy({
|
|
232
|
+
left: direction === 'left' ? -scrollAmount : scrollAmount,
|
|
233
|
+
behavior: 'smooth',
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Keyboard shortcut for search
|
|
238
|
+
useEffect(() => {
|
|
239
|
+
const handleKeyDown = (e) => {
|
|
240
|
+
if (e.key === '/' && document.activeElement !== searchInputRef.current) {
|
|
241
|
+
e.preventDefault();
|
|
242
|
+
searchInputRef.current?.focus();
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
246
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
247
|
+
}, []);
|
|
248
|
+
|
|
249
|
+
useEffect(() => {
|
|
250
|
+
fetch(CATALOG_URL)
|
|
251
|
+
.then((r) => r.json())
|
|
252
|
+
.then((data) => {
|
|
253
|
+
setCatalog(data);
|
|
254
|
+
setLoading(false);
|
|
255
|
+
|
|
256
|
+
const hash = window.location.hash;
|
|
257
|
+
if (hash.startsWith('#/cmd/')) {
|
|
258
|
+
const cmdName = hash.replace('#/cmd/', '');
|
|
259
|
+
const allCmds = data.categories.flatMap((c) => c.commands.map((cmd) => ({ ...cmd, cat: c })));
|
|
260
|
+
const found = allCmds.find((c) => c.name === cmdName);
|
|
261
|
+
if (found) {
|
|
262
|
+
setSelectedCommand({ ...found, category_icon: found.cat.icon, category_label: found.cat.label });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
})
|
|
266
|
+
.catch((err) => {
|
|
267
|
+
console.error('Failed to load commands', err);
|
|
268
|
+
setLoading(false);
|
|
269
|
+
});
|
|
270
|
+
}, []);
|
|
271
|
+
|
|
272
|
+
useEffect(() => {
|
|
273
|
+
const handleHash = () => {
|
|
274
|
+
if (!catalog) return;
|
|
275
|
+
const hash = window.location.hash;
|
|
276
|
+
if (hash.startsWith('#/cmd/')) {
|
|
277
|
+
const cmdName = hash.replace('#/cmd/', '');
|
|
278
|
+
const allCmds = catalog.categories.flatMap((c) => c.commands.map((cmd) => ({ ...cmd, cat: c })));
|
|
279
|
+
const found = allCmds.find((c) => c.name === cmdName);
|
|
280
|
+
if (found) {
|
|
281
|
+
setSelectedCommand({ ...found, category_icon: found.cat.icon, category_label: found.cat.label });
|
|
282
|
+
}
|
|
283
|
+
} else if (hash === '' || hash === '#/') {
|
|
284
|
+
setSelectedCommand(null);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
window.addEventListener('hashchange', handleHash);
|
|
288
|
+
return () => window.removeEventListener('hashchange', handleHash);
|
|
289
|
+
}, [catalog]);
|
|
290
|
+
|
|
291
|
+
const openDetails = (cmd, cat) => {
|
|
292
|
+
const commandWithCat = { ...cmd, category_icon: cat.icon, category_label: cat.label };
|
|
293
|
+
setSelectedCommand(commandWithCat);
|
|
294
|
+
window.location.hash = `#/cmd/${cmd.name}`;
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
const closeDetails = () => {
|
|
298
|
+
setSelectedCommand(null);
|
|
299
|
+
window.location.hash = '/';
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
useEffect(() => {
|
|
303
|
+
const observer =
|
|
304
|
+
typeof globalThis.IntersectionObserver === 'function'
|
|
305
|
+
? new globalThis.IntersectionObserver(
|
|
306
|
+
(entries) => {
|
|
307
|
+
entries.forEach((entry) => {
|
|
308
|
+
if (entry.isIntersecting) {
|
|
309
|
+
entry.target.classList.add('is-visible');
|
|
310
|
+
observer.unobserve(entry.target);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
},
|
|
314
|
+
{ threshold: 0.05, rootMargin: '0px 0px -50px 0px' },
|
|
315
|
+
)
|
|
316
|
+
: null;
|
|
317
|
+
|
|
318
|
+
document.querySelectorAll('[data-reveal]').forEach((el, i) => {
|
|
319
|
+
el.style.setProperty('--reveal-delay', `${Math.min(i * 20, 200)}ms`);
|
|
320
|
+
if (observer) {
|
|
321
|
+
observer.observe(el);
|
|
322
|
+
} else {
|
|
323
|
+
el.classList.add('is-visible');
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
return () => {
|
|
328
|
+
if (observer) observer.disconnect();
|
|
329
|
+
};
|
|
330
|
+
}, [catalog, search, activeModule, selectedCommand]);
|
|
331
|
+
|
|
332
|
+
const filteredCategories = useMemo(() => {
|
|
333
|
+
if (!catalog) return [];
|
|
334
|
+
const query = search.toLowerCase().trim();
|
|
335
|
+
|
|
336
|
+
return catalog.categories
|
|
337
|
+
.map((cat) => {
|
|
338
|
+
if (activeModule !== 'all' && cat.key !== activeModule) return null;
|
|
339
|
+
|
|
340
|
+
const commands = cat.commands.filter((cmd) => cmd.name.toLowerCase().includes(query) || cmd.descricao.toLowerCase().includes(query) || (cmd.aliases && cmd.aliases.some((a) => a.toLowerCase().includes(query))) || (cmd.discovery?.keywords && cmd.discovery.keywords.some((k) => k.toLowerCase().includes(query))));
|
|
341
|
+
|
|
342
|
+
if (!commands.length) return null;
|
|
343
|
+
return { ...cat, commands };
|
|
344
|
+
})
|
|
345
|
+
.filter(Boolean);
|
|
346
|
+
}, [catalog, search, activeModule]);
|
|
347
|
+
|
|
348
|
+
const modules = useMemo(() => {
|
|
349
|
+
if (!catalog) return [];
|
|
350
|
+
return catalog.categories.map((cat) => ({
|
|
351
|
+
id: cat.key,
|
|
352
|
+
label: cat.label,
|
|
353
|
+
count: cat.commands.length,
|
|
354
|
+
}));
|
|
355
|
+
}, [catalog]);
|
|
356
|
+
|
|
357
|
+
if (selectedCommand) {
|
|
358
|
+
return html`<${CommandDetailsPage} command=${selectedCommand} onClose=${closeDetails} devMode=${devMode} />`;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return html`
|
|
362
|
+
<div className="min-h-screen bg-base-100 font-sans selection:bg-primary selection:text-primary-content overflow-x-hidden">
|
|
363
|
+
<header className="sticky top-0 z-50 border-b border-base-200 bg-base-100/80 backdrop-blur-xl">
|
|
364
|
+
<div className="container mx-auto px-4">
|
|
365
|
+
<div className="flex h-16 items-center justify-between gap-4">
|
|
366
|
+
<div className="flex-1">
|
|
367
|
+
<a href="/" className="flex items-center gap-2.5 hover:opacity-80 transition-opacity">
|
|
368
|
+
<img src="/assets/images/brand-logo-128.webp" className="w-8 h-8 rounded-xl shadow-sm" alt="Logo" />
|
|
369
|
+
<span className="text-base sm:text-lg font-black tracking-tight">OmniZap<span className="text-primary">.</span></span>
|
|
370
|
+
</a>
|
|
371
|
+
</div>
|
|
372
|
+
<div className="flex items-center gap-3">
|
|
373
|
+
<a href="/login/" className="btn btn-primary btn-sm h-9 min-h-0 rounded-xl font-bold px-4 text-[10px] uppercase"> Adicionar Bot </a>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
</header>
|
|
378
|
+
|
|
379
|
+
<main className="container mx-auto px-4 py-12 lg:py-20">
|
|
380
|
+
<section className="text-center space-y-6 mb-12">
|
|
381
|
+
<div data-reveal="fade-up" className="inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/10 border border-primary/20 text-primary text-[10px] font-bold uppercase tracking-widest">Biblioteca V3.5</div>
|
|
382
|
+
<h1 data-reveal="fade-up" className="text-4xl lg:text-6xl font-black tracking-tight text-balance leading-[1.1]">
|
|
383
|
+
Comandos de <br />
|
|
384
|
+
<span className="text-transparent bg-clip-text bg-gradient-to-r from-primary to-secondary text-nowrap">Alta Performance</span>.
|
|
385
|
+
</h1>
|
|
386
|
+
|
|
387
|
+
<div data-reveal="fade-up" className="max-w-4xl mx-auto space-y-8 pt-4">
|
|
388
|
+
<div className="flex flex-col lg:flex-row gap-4 items-center">
|
|
389
|
+
<div className="relative group flex-1 w-full">
|
|
390
|
+
<div className="absolute inset-y-0 left-5 flex items-center pointer-events-none text-base-content/30 group-focus-within:text-primary transition-colors">
|
|
391
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /></svg>
|
|
392
|
+
</div>
|
|
393
|
+
<input ref=${searchInputRef} type="text" placeholder="Pressione '/' para buscar..." className="w-full bg-base-200/50 border border-base-300 focus:border-primary/50 focus:bg-base-200 outline-none rounded-3xl h-14 lg:h-16 pl-14 pr-12 font-medium transition-all text-sm lg:text-base shadow-xl shadow-black/5" value=${search} onInput=${(e) => setSearch(e.target.value)} />
|
|
394
|
+
${search &&
|
|
395
|
+
html`
|
|
396
|
+
<button onClick=${() => setSearch('')} className="absolute right-4 top-1/2 -translate-y-1/2 btn btn-ghost btn-circle btn-xs opacity-50 hover:opacity-100">
|
|
397
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M6 18L18 6M6 6l12 12" /></svg>
|
|
398
|
+
</button>
|
|
399
|
+
`}
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
<div className="flex items-center gap-3 bg-base-200/50 px-4 py-2 rounded-2xl border border-base-300 self-stretch lg:self-auto justify-between lg:justify-center h-14 lg:h-16 shadow-xl shadow-black/5">
|
|
403
|
+
<div className="flex flex-col -gap-1 text-left">
|
|
404
|
+
<span className="text-[10px] font-black uppercase tracking-widest text-primary">Modo Dev</span>
|
|
405
|
+
<span className="text-[8px] font-bold opacity-30 uppercase tracking-tighter">Specs Técnicas</span>
|
|
406
|
+
</div>
|
|
407
|
+
<input type="checkbox" className="toggle toggle-primary toggle-sm" checked=${devMode} onChange=${(e) => setDevMode(e.target.checked)} />
|
|
408
|
+
</div>
|
|
409
|
+
</div>
|
|
410
|
+
|
|
411
|
+
<div className="relative group/carousel max-w-5xl mx-auto">
|
|
412
|
+
<button onClick=${() => scrollCarousel('left')} className="hidden lg:flex absolute -left-12 top-1/2 -translate-y-1/2 w-10 h-10 items-center justify-center rounded-xl bg-base-200 border border-base-300 text-base-content/50 hover:text-primary hover:border-primary/30 transition-all z-10 shadow-xl">
|
|
413
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M15 19l-7-7 7-7" /></svg>
|
|
414
|
+
</button>
|
|
415
|
+
|
|
416
|
+
<div ref=${carouselRef} className="w-full overflow-x-auto no-scrollbar snap-x snap-mandatory scroll-smooth">
|
|
417
|
+
<div className="flex flex-nowrap gap-2 pb-4 px-4 w-fit mx-auto">
|
|
418
|
+
<button onClick=${() => setActiveModule('all')} className=${`snap-start px-5 py-2.5 rounded-xl text-[10px] font-bold uppercase tracking-wider transition-all border shrink-0 flex items-center gap-2 ${activeModule === 'all' ? 'bg-primary text-primary-content border-primary shadow-lg shadow-primary/20' : 'bg-base-200/50 border-base-300 text-base-content/40 hover:border-primary/30'}`}>
|
|
419
|
+
Todos
|
|
420
|
+
<span className=${`px-1.5 py-0.5 rounded-md text-[8px] ${activeModule === 'all' ? 'bg-primary-content/20' : 'bg-base-300'}`}> ${catalog?.categories.reduce((acc, c) => acc + c.commands.length, 0)} </span>
|
|
421
|
+
</button>
|
|
422
|
+
${modules.map(
|
|
423
|
+
(mod) => html`
|
|
424
|
+
<button key=${mod.id} onClick=${() => setActiveModule(mod.id)} className=${`snap-start px-5 py-2.5 rounded-xl text-[10px] font-bold uppercase tracking-wider transition-all border shrink-0 flex items-center gap-2 ${activeModule === mod.id ? 'bg-primary text-primary-content border-primary shadow-lg shadow-primary/20' : 'bg-base-200/50 border-base-300 text-base-content/40 hover:border-primary/30'}`}>
|
|
425
|
+
${mod.label}
|
|
426
|
+
<span className=${`px-1.5 py-0.5 rounded-md text-[8px] ${activeModule === mod.id ? 'bg-primary-content/20' : 'bg-base-300'}`}> ${mod.count} </span>
|
|
427
|
+
</button>
|
|
428
|
+
`,
|
|
429
|
+
)}
|
|
430
|
+
</div>
|
|
431
|
+
</div>
|
|
432
|
+
|
|
433
|
+
<button onClick=${() => scrollCarousel('right')} className="hidden lg:flex absolute -right-12 top-1/2 -translate-y-1/2 w-10 h-10 items-center justify-center rounded-xl bg-base-200 border border-base-300 text-base-content/50 hover:text-primary hover:border-primary/30 transition-all z-10 shadow-xl">
|
|
434
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M9 5l7 7-7 7" /></svg>
|
|
435
|
+
</button>
|
|
436
|
+
</div>
|
|
437
|
+
</div>
|
|
438
|
+
</section>
|
|
439
|
+
|
|
440
|
+
${loading
|
|
441
|
+
? html`
|
|
442
|
+
<div className="flex flex-col items-center justify-center py-20 gap-4 opacity-30">
|
|
443
|
+
<span className="loading loading-ring loading-lg text-primary"></span>
|
|
444
|
+
<span className="text-[10px] font-black uppercase tracking-widest">Carregando Biblioteca</span>
|
|
445
|
+
</div>
|
|
446
|
+
`
|
|
447
|
+
: html`
|
|
448
|
+
<div className="space-y-16">
|
|
449
|
+
${filteredCategories.length === 0
|
|
450
|
+
? html`
|
|
451
|
+
<div className="text-center py-24 glass-card rounded-[3rem]">
|
|
452
|
+
<div className="text-4xl mb-4 opacity-20">🔍</div>
|
|
453
|
+
<p className="text-base-content/30 font-bold">Nenhum comando encontrado.</p>
|
|
454
|
+
<button
|
|
455
|
+
onClick=${() => {
|
|
456
|
+
setSearch('');
|
|
457
|
+
setActiveModule('all');
|
|
458
|
+
}}
|
|
459
|
+
className="btn btn-primary btn-sm mt-4 rounded-xl"
|
|
460
|
+
>
|
|
461
|
+
Limpar Filtros
|
|
462
|
+
</button>
|
|
463
|
+
</div>
|
|
464
|
+
`
|
|
465
|
+
: filteredCategories.map(
|
|
466
|
+
(cat) => html`
|
|
467
|
+
<div key=${cat.module} className="space-y-8">
|
|
468
|
+
<div data-reveal="fade-right" className="flex items-center gap-4 px-2">
|
|
469
|
+
<span className="text-2xl">${cat.icon || '🧩'}</span>
|
|
470
|
+
<h2 className="text-xl font-black uppercase tracking-widest text-base-content/80">${cat.label}</h2>
|
|
471
|
+
<div className="flex-1 h-px bg-base-content/5"></div>
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 gap-4 sm:gap-6">
|
|
475
|
+
${cat.commands.map(
|
|
476
|
+
(cmd) => html`
|
|
477
|
+
<article key=${cmd.key} data-reveal="fade-up" onClick=${() => openDetails(cmd, cat)} className="glass-card group relative rounded-[2rem] p-6 flex flex-col gap-5 hover:scale-[1.02] hover:-translate-y-1 hover:border-primary/40 transition-all duration-500 cursor-pointer overflow-hidden active:scale-95">
|
|
478
|
+
<div className="absolute -right-4 -top-4 text-6xl opacity-[0.03] group-hover:opacity-[0.08] group-hover:scale-125 transition-all duration-700 pointer-events-none select-none">${cat.icon || '🧩'}</div>
|
|
479
|
+
|
|
480
|
+
<div className="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500"></div>
|
|
481
|
+
|
|
482
|
+
<div className="relative space-y-3">
|
|
483
|
+
<div className="flex items-center justify-between gap-2">
|
|
484
|
+
<div className="flex items-center gap-2">
|
|
485
|
+
<span className="w-2 h-2 rounded-full bg-primary shadow-[0_0_8px_rgba(34,197,94,0.6)] animate-pulse"></span>
|
|
486
|
+
<code className="text-xl font-black tracking-tighter text-base-content group-hover:text-primary transition-colors">/${cmd.name}</code>
|
|
487
|
+
</div>
|
|
488
|
+
${cmd.premium && html` <span className="badge badge-warning badge-xs font-black text-[8px] px-2 py-1.5 h-auto shadow-lg shadow-warning/20">PREMIUM</span> `}
|
|
489
|
+
</div>
|
|
490
|
+
<p className="text-[10px] font-black uppercase tracking-[0.2em] text-primary/40">${cat.label}</p>
|
|
491
|
+
</div>
|
|
492
|
+
|
|
493
|
+
<div className="relative">
|
|
494
|
+
<p className="text-xs text-base-content/50 font-medium leading-relaxed line-clamp-2 min-h-[2.5rem]">${cmd.descricao}</p>
|
|
495
|
+
</div>
|
|
496
|
+
|
|
497
|
+
<div className="relative flex flex-wrap gap-2">${cmd.requirements?.admin && html` <span className="flex items-center gap-1 bg-base-300/50 px-2 py-1 rounded-lg text-[9px] font-bold text-base-content/60 border border-base-300 group-hover:border-primary/20 transition-colors" title="Requer Admin"> <span>👮</span> Admin </span> `} ${cmd.requirements?.group && html` <span className="flex items-center gap-1 bg-base-300/50 px-2 py-1 rounded-lg text-[9px] font-bold text-base-content/60 border border-base-300 group-hover:border-primary/20 transition-colors" title="Requer Grupo"> <span>👥</span> Grupo </span> `} ${cmd.requirements?.nsfw && html` <span className="flex items-center gap-1 bg-error/10 px-2 py-1 rounded-lg text-[9px] font-bold text-error border border-error/20" title="Conteúdo Adulto"> <span>🔞</span> NSFW </span> `}</div>
|
|
498
|
+
|
|
499
|
+
<div className="relative pt-4 mt-auto border-t border-base-content/5 flex items-center justify-between group/btn">
|
|
500
|
+
<span className="text-[10px] font-black uppercase tracking-widest text-base-content/20 group-hover:text-primary/50 transition-colors">Documentação</span>
|
|
501
|
+
<div className="w-8 h-8 rounded-full bg-base-200 flex items-center justify-center group-hover:bg-primary group-hover:text-primary-content transition-all transform group-hover:rotate-45">
|
|
502
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M5 12h14M12 5l7 7-7 7" /></svg>
|
|
503
|
+
</div>
|
|
504
|
+
</div>
|
|
505
|
+
</article>
|
|
506
|
+
`,
|
|
507
|
+
)}
|
|
508
|
+
</div>
|
|
509
|
+
</div>
|
|
510
|
+
`,
|
|
511
|
+
)}
|
|
512
|
+
</div>
|
|
513
|
+
`}
|
|
514
|
+
</main>
|
|
515
|
+
|
|
516
|
+
<footer className="mt-20 py-16 border-t border-base-200 bg-base-200/20">
|
|
517
|
+
<div className="container mx-auto px-4 text-center">
|
|
518
|
+
<p className="text-[10px] font-bold uppercase tracking-[0.4em] text-base-content/20">© 2026 OMNIZAP SYSTEM · COMMANDS LIBRARY V3.5</p>
|
|
519
|
+
</div>
|
|
520
|
+
</footer>
|
|
521
|
+
</div>
|
|
522
|
+
`;
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
const rootElement = document.getElementById('commands-react-root');
|
|
526
|
+
if (rootElement) {
|
|
527
|
+
createRoot(rootElement).render(html`<${App} />`);
|
|
528
|
+
}
|