Skip to content

fix: corrigir broadcast de blog e geração de NPCs (x-store-domain + merge de config) - #2

Merged
ZzPowerTech merged 2 commits into
mainfrom
claude/happy-franklin-e2958a
Jun 22, 2026
Merged

fix: corrigir broadcast de blog e geração de NPCs (x-store-domain + merge de config)#2
ZzPowerTech merged 2 commits into
mainfrom
claude/happy-franklin-e2958a

Conversation

@ZzPowerTech

Copy link
Copy Markdown
Owner

Resumo

Os dois bugs reportados — NPCs não sendo gerados e posts do blog não chegando como broadcast — tinham a mesma causa raiz: a API da CentralCart é multi-tenant e exige o header x-store-domain em toda chamada, mas ele estava chegando vazio em produção.

Evidência do servidor:

x-store-domain: (vazio)  →  HTTP 404 {"message":"Store not found"}

O api.store_domain estava vazio porque o plugin só fazia saveDefaultConfig(), que não mescla chaves novas em um config.yml já existente. Como store_domain e a seção blog: foram adicionados depois que o plugin já rodava, essas chaves nunca apareceram no servidor.

O que mudou

Causa raiz (corrige blog + NPCs)

  • CentralCartTopPlugin#mergeConfigDefaults()copyDefaults(true) mescla chaves novas em configs antigos, preservando os valores do usuário.
  • CentralCartApiService — passa a enviar x-store-domain na busca de top doadores e a logar o corpo do erro (antes só o código HTTP, diagnóstico cego).
  • BlogPostService — aborta cedo com erro explícito quando o domínio não está configurado (em vez de bater 404 três vezes).

Robustez do blog

  • BlogPostCheckTaskseeding na 1ª execução (não spamma posts antigos) e anúncio de todos os posts novos, não só o último. Título sanitizado (remove # do markdown e evita quebra do MiniMessage); fallback de layout se notification.lines faltar.

Refatoração

  • Novos DateTimeUtil e BlogNotifier; helpers em PluginUtils. A task automática e o /testblogpost agora compartilham o mesmo caminho de broadcast (remove duplicação).
  • build.gradlecopyJar sem nome de jar hardcoded (quebrava a cada bump); versão 1.1.0 → 1.2.0.

Docs

  • Adiciona CLAUDE.md, incluindo o gotcha de build: o org.gradle.java.home global aponta para JDK 25, que quebra o Gradle 8.8 — buildar com -Dorg.gradle.java.home="C:\Program Files\Java\jdk-21".

⚠️ Ação necessária pós-merge (config)

O código agora expõe a chave, mas o valor precisa ser preenchido:

  1. Atualizar o jar para 1.2.0 e reiniciar o servidor (o merge de config roda no boot e adiciona api.store_domain + seção blog ao config.yml).
  2. Editar config.yml: api.store_domain: "loja.austv.net" (e confirmar o api.token).
  3. /centralcartreload, depois validar com /testblogpost e /spawntopnpcs.

Notas para o revisor

  • O blog foi confirmado por evidência direta (testei a API: com domínio → 200; sem → 404).
  • Para os NPCs não há token de produção para teste local; a correção mira a mesma causa multi-tenant e instrumenta o log. Se /spawntopnpcs ainda falhar, o console agora mostra o corpo exato do erro ([Top] ... HTTP xxx — body: ...).
  • Build validado: compileJava e jar passam; plugin.yml expande para 1.2.0.
  • Sem testes automatizados no repo (validação via build + comandos no servidor).

🤖 Generated with Claude Code

…erge de config)

A API CentralCart é multi-tenant: toda chamada exige o header x-store-domain.
Ele estava vazio em produção porque o plugin só fazia saveDefaultConfig(), que
não mescla chaves novas em config.yml já existentes — então api.store_domain
(e a seção blog) nunca apareciam. Resultado: o blog batia 404 "Store not found"
e a busca de top doadores falhava antes de criar qualquer NPC.

Causa raiz:
- onEnable: mergeConfigDefaults() (copyDefaults) mescla chaves novas, preservando
  os valores já definidos pelo usuário
- CentralCartApiService: envia x-store-domain e loga o corpo do erro (antes só o código)
- BlogPostService: aborta cedo com erro claro quando o domínio não está configurado

Robustez do blog:
- BlogPostCheckTask: seeding na 1a execução e anúncio de todos os posts novos
  (não só o último); título sanitizado; fallback de layout se notification.lines faltar

Refatoração:
- novos DateTimeUtil e BlogNotifier; helpers em PluginUtils (remove duplicação entre
  task e comando de teste)
- build.gradle: copyJar sem nome de jar fixo; versão 1.1.0 -> 1.2.0

Docs:
- adiciona CLAUDE.md (inclui gotcha de build: JDK 21 vs Gradle 8.8/JDK 25 global)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown

Qodana Community for JVM

6 new problems were found

Inspection name Severity Problems
Constant values 🔶 Warning 6
View the detailed Qodana report

To be able to view the detailed Qodana report, you can either:

To get *.log files or any other Qodana artifacts, run the action with upload-result option set to true,
so that the action will upload the files as the job artifacts:

      - name: 'Qodana Scan'
        uses: JetBrains/qodana-action@v2025.2.3
        with:
          upload-result: true
Contact Qodana team

Contact us at qodana-support@jetbrains.com

…es e NPE em setExecutor)

- registerCommands: helper registerCommand() com null-check em getCommand()
  elimina os 10 avisos de NPE em setExecutor e loga se um comando faltar no plugin.yml
- BlogPostCheckTask / BlogNotifier: remove condições 'x == null' sempre falsas
  (getString com default e getStringList nunca retornam null no Bukkit)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@ZzPowerTech

Copy link
Copy Markdown
Owner Author

Qodana — 12 dos 18 avisos resolvidos no commit 019cf9a (os que estão no escopo deste PR):

  • 10× Nullability (setExecutor NPE em CentralCartTopPlugin) — extraí um helper registerCommand(name, executor) que faz null-check em getCommand() e loga um aviso se o comando faltar no plugin.yml, em vez de arriscar NPE.
  • 2× Constant values que eu havia introduzido — removi as condições sempre-falsas lastSeen == null (BlogPostCheckTask) e lines == null (BlogNotifier); getString com default e getStringList nunca retornam null no Bukkit.

Os 6 avisos restantes (Constant values) estão em arquivos não tocados por este PRMessagesManager, TopNpcManager (x2), MonthlyNpcUpdateTask, ScheduleInfoCommand, ReloadCommand. São pré-existentes; deixei-os fora para manter o PR focado na correção do blog/NPCs. Podem ser limpos num PR de manutenção separado.

🤖 Addressed by Claude Code

@ZzPowerTech
ZzPowerTech merged commit ebecf12 into main Jun 22, 2026
3 checks passed
@ZzPowerTech
ZzPowerTech deleted the claude/happy-franklin-e2958a branch June 22, 2026 21:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant