Skip to content

feat(light): abrir o Monky Light com duplo clique, sem linha de comando - #894

Merged
lucastaonline merged 1 commit into
feat/light-functionalfrom
feat/light-standalone
Nov 9, 2026
Merged

lucastaonline merged 1 commit into
feat/light-functionalfrom
feat/light-standalone

Conversation

@JelielSantos

Copy link
Copy Markdown
Collaborator

Parte da #658. Empilhado sobre o #893 (base feat/light-functional): depois do merge do #893 eu faço rebase para a main e troco a base.

Com isso o Light abre com duplo clique e conecta sem linha de comando.

Para quem usa

  • Primeira abertura: a janela "Conectar a um servidor" pede o link de convite (ou endereço), o apelido e, se precisar, a senha.
  • Próximas aberturas: conecta direto ao último servidor, só com a bandeja.
  • Trocar de servidor: o item Trocar de servidor… na bandeja reabre a janela.
  • Recusas que a janela resolve reabrem a janela no campo certo, com a explicação: senha errada, apelido em uso ou apelido recusado.

Como funciona

  • runStandalone (independente de plataforma): decide entre reusar a conexão salva e abrir a janela, valida o que o núcleo recusaria e repete enquanto a bandeja pedir outro servidor ou o servidor recusar algo corrigível. Janela, alerta, perfil e núcleo entram como ganchos, então o fluxo é testado com dublês (monky-light-standalone-test).
  • Janela nativa: Win32 com IsDialogMessage (Tab, Enter e Esc) e foco no campo do problema; NSAlert com campos no macOS.
  • Perfil próprio de aplicativo: %LOCALAPPDATA%\Monky Light\Profile ou ~/Library/Application Support/Monky Light/Profile; MONKY_LIGHT_PROFILE permite usar uma pasta descartável em desenvolvimento e QA.
  • O que é salvo: só server (ws(s)://) e nickname. Um convite é reduzido ao endereço, porque a chave do servidor fica fixada no primeiro contato; a senha fica só em memória, como o README já determinava.
  • HeadlessConfiguration::console = false: sem ConsoleControl e sem stdout, os eventos vão só para a bandeja. Sem isso, o núcleo trataria a falta de leitor como motivo para sair (teste 27).
  • Windows: solta o console quando ele foi criado só para este processo (GetConsoleProcessList == 1). O executável continua sendo de console, então o duplo clique ainda mostra um console por um instante. Passar para o subsistema GUI quebraria os cenários de console que já foram qualificados, por isso deixei de fora.
  • Linha de comando: qualquer argumento mantém o comportamento atual.

Sem mudança de protocolo: não é major.

Testes (Windows x64, local)

  • npm run test:light:native: 36 aprovados, 4 ignorados por plataforma. Novo monky-light-standalone-test: primeira abertura, reuso, troca de servidor, recusa de senha e de apelido, cancelamento, perfil travado e regras do apelido em unidades UTF-16. Também perfil com server/nickname e item de menu só no modo aplicativo.
  • npm run test:light:voice: 31 aprovados, 1 ignorado.
  • Smoke manual com o executável e a janela reais (fora da suíte), com MONKY_LIGHT_PROFILE descartável e a janela preenchida via Win32:
    • endereço inválido mantém a janela aberta;
    • com o endereço válido, o usuário entra no servidor;
    • o perfil salva só servidor e apelido;
    • a segunda abertura conecta sem janela.
  • O smoke do hook de PTT do feat(light): bandeja com apertar para falar, indicador de fala e volume por participante #893 continua passando.

Ainda falta: a janela e o fluxo no macOS real, e o roteiro manual do QA.md §6.31–6.39.

🤖 Generated with Claude Code

Sem argumentos, o Light abre só com a bandeja: na primeira vez uma janela
nativa (Win32 / NSAlert) pede o link de convite ou endereço, o apelido e a
senha opcional; nas próximas conecta direto ao último servidor. A bandeja
ganha `Trocar de servidor…`, que reabre a janela no mesmo processo.

- Perfil próprio de aplicativo (%LOCALAPPDATA%\Monky Light\Profile ou
  ~/Library/Application Support/Monky Light/Profile), com MONKY_LIGHT_PROFILE
  para desenvolvimento e QA.
- Só o endereço ws(s):// e o apelido vão para o perfil: um convite é reduzido
  ao endereço e a senha fica apenas em memória.
- A janela confere o que o núcleo recusaria, e as recusas que ela resolve
  (AUTH_INVALID_PASSWORD, NICKNAME_ALREADY_EXISTS, NICKNAME_INVALID) a reabrem
  no campo certo, em vez de só um alerta.
- Sem leitor de console, o núcleo não usa stdin/stdout e a falta deles não o
  encerra; no Windows o console criado pelo duplo clique é solto.
- O fluxo é independente de plataforma (`runStandalone`) e tem teste próprio.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants