feat: detecta jogo possuido nao instalado (is_game_owned) p/ modo DLC automatico #1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "maicon"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Detecta automaticamente, sem toggle manual, se o jogo ja e do usuario mesmo sem estar instalado, combinando 4 sinais locais do Steam por OR (appmanifest.acf, registry.vdf, localconfig.vdf, sharedconfig.vdf).
Erra para o lado de possuido (OR entre as fontes) porque tratar um jogo possuido como nao-possuido trava a execucao do jogo base.
Generated with Claude Code
Cliente: - is_activated() nao invalida por expiracao (so falta de ativacao/hardware) - check_status_cached() offline sempre mantem acesso - _on_license_verified() nao bloqueia quando invalido apenas por expiracao; banimento/revogacao/hardware diferente ainda bloqueiam Servidor: - /api/manifests/keys e _require_license aceitam status {active, expired} para chaves expiradas continuarem recebendo as manifest keys Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>O download salvava os .manifest em data_root()/.manifests (pasta unica compartilhada), mas a ativacao os procura em games/{app_id}/.manifests. Resultado: 0 manifests copiados para o depotcache -> Steam acusa "Configuracao de conteudo invalida" ao instalar. Agora o download usa output_dir=games/{app_id}, casando com a ativacao (mesmo padrao do lua_import_tab). Tambem: parse_manifests_for_gids passa a reconhecer o nome real "{depot}_{gid}.manifest" (2 partes), alem de "{app}_{depot}_{gid}". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>Causa: repo Fairyvmos/BlankTMing publica DecryptionKey criptografada (96 bytes / 192 hex). Depot key valida do Steam = 32 bytes / 64 hex. O app injetava a key invalida no config.vdf e .lua -> Steam baixava mas nao descriptografava ("conteudo ainda criptografado"). - is_valid_depot_key(): valida 64 hex; parse_key_vdf filtra invalidas - fetch_from_github_repo: se o repo nao tem depot key valida, retorna None para o fluxo "auto" seguir para outra fonte (luagen/ryuu/hubcap) - activate_opensteamtool: ignora keys invalidas ja registradas e avisa Tambem reverte a mudanca de output_dir do download_tab: fetch_and_prepare ja aninha games/{app_id} internamente; o correto e output_dir=data_root() (a versao anterior causava aninhamento duplo). Os "0 copiados" originais eram apenas os bugs de regex + magic byte, ja corrigidos. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>Manifests no depotcache sao nomeados por depot id (447041_*.manifest), nao por app id (447040). A remocao so procurava prefixo {app_id}_, entao NUNCA removia os manifests do jogo -> ficavam orfaos no depotcache. Para jogos que o usuario JA POSSUI, esses artefatos orfaos (manifests antigos + depot keys no config.vdf) conflitam com o download legitimo do Steam: botao de pausar/retomar desabilitado e status preso em "instalando". - remove_from_steam_library agora recebe depot_ids e remove os manifests de cada depot, alem de limpar as DecryptionKey do config.vdf - vdf_manager.remove_depot_keys_from_config(): remove keys orfas - main.py passa os depot_ids do game_manager na remocao Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>Ativar um jogo que o usuario ja possui/instalou gera conflito com o download legitimo (botao travado / preso em "instalando"). Agora o app detecta o appmanifest_{app_id}.acf nas bibliotecas e avisa antes de ativar. - steam_emulator.is_game_installed(app_id): checa ACF em todas as libs - activate_opensteamtool: loga aviso e mostra toast sticky (fora de batch) recomendando instalar direto pela Steam Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>- find_install_dir_from_manifest filtrava por {app_id}_ mas manifests sao nomeados por depot id -> nunca casava (retornava Game_{app_id}). Agora varre qualquer .manifest (mesmo bug de depot-id-vs-app-id ja corrigido na remocao/deploy). Afeta todos os jogos, nao so o WD2. - GITHUB_REPOS reordenado: Auiowu e tymolu233 (keys validas 64 hex) antes do Fairyvmos (keys criptografadas, so fallback de manifests). Melhora a cobertura de jogos futuros sem depender do depotkeys.json. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>08a68a54d7toac98811da6Ao clicar "Instalar" na Steam, o alvo de unlock (WD2) ganha um appmanifest_{app_id}.acf em estado de download. is_game_installed contava a mera presenca do .acf -> caia no modo DLC -> pulava depotcache/config.vdf -> base nunca provisionado -> nao baixa/nao lanca (usuario reportou "depotcache nao copiado"). Agora so conta como instalado se StateFlags tem bit 4 (FullyInstalled) e nao bit 2 (UpdateRequired). Jogo baixando -> ativacao completa (unlock). bump 1.0.14. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>687e896dfbto9f80759680- validate_manifest: aceita o magic real dos manifests do Steam (PROTOBUF_PAYLOAD_MAGIC 0x71F617D0). Antes exigia 0x00000002 e rejeitava todos os manifests -> depotcache ficava vazio ("0 copiados"). - parse_manifests_for_gids: aceita nomes de 2 partes (depot_gid.manifest) gerados por DDM/ManifestHub/CDN, alem do formato antigo de 3 partes. - fetch_and_prepare: resultado parcial de steamcdn/depotdl (menos manifests que chaves) nao encerra mais a busca; tenta as fontes seguintes e usa o HubcapDB (manifests completos + DLCs), com fallback para o melhor parcial. - ordem automatica sem ryuu; usa apenas a chave do hubcap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>bc8948c) ee1713bb35Implementa as 5 melhorias levantadas na revisao pos-incidente das chaves cifradas. 1. Deploy automatico do license server (era a causa do updater quebrado): - license_server/deploy.sh: build + redeploy idempotente no build server, roda health check, so recria o container se a imagem mudou. Tira FORGEJO_URL do env-file para o default do codigo (IP novo) ser a fonte unica de verdade -> nao repete o drift pve->friday. - Jenkinsfile: stage 'Deploy License Server' (so na branch maicon). 2. Testes no CI: - Jenkinsfile: stage 'Test' roda pytest em container antes do build. - Corrige 2 testes de test_downloader desatualizados (mock de _urlopen mudou de .read() para bytes diretos no refactor). - Adiciona TestDepotKeyValidation travando a regressao das chaves de 192 hex (Fairyvmos). 42/42 passando. 3. Seguranca do license server: - JWT_SECRET rotacionado (era 'change-me-in-production' -> permitia FORJAR token de qualquer admin). Senha do admin local trocada (era admin/admin; login real e via AD, conta 'maicon' intacta). - CORS: allow_origins=['*']+credentials (invalido e aberto) -> origem publica do servico via CORS_ORIGINS. 4. Integridade do update: - upload_release.sh sobe <asset>.sha256; /api/updates/latest anexa o campo sha256; o updater ja valida (expected_sha256). Degrada para null em releases sem o hash. 5. Limpeza do ryuu: KNOWN_KEYS, keyring_helper.get_all_keys e strings mortas de traducao (ryuu/luagen). Dockerfile: pip --timeout/--retries (wheel do cryptography estourava rede). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y2JmFTpher2KiUuvNr4YqxJogos de terceiros (Ubisoft/Uplay) publicam no listofdlc appids que nao sao conteudo: sao entitlements cuja unica funcao e entregar uma CD key externa (appinfo com legacykeylinkedexternally / legacykeyproofofpurchase). Injetar posse desses appids no .lua quebra o jogo: antes de abrir, o Steam busca a CD key no servidor, o servidor nega (nao ha licenca real) e o launch morre com GameAction [AppID 460930, ActionID 2] : LaunchApp failed with GettingLegacyKey with "15" (15 = k_EResultAccessDenied) O jogo nem chega a iniciar e desmarcar a DLC na UI do Steam NAO resolve -- quem dispara a busca da chave e a POSSE injetada, nao o checkbox. Caso real: Ghost Recon Wildlands (460930). Dos 42 appids do listofdlc, 24 sao so chave (594560 "WW Uplay Activation", 601290-601303 pre-order, e os gemeos "Ubisoft Connect" dos pacotes cosmeticos: 4784390/4784410/4784430/4784450). Cada pacote tem DOIS appids -- 4784380 Cold Eye Pack (conteudo) e 4784390 Cold Eye Pack Ubisoft Connect (so chave) -- e o gerador injetava os dois. - app_has_legacy_cd_key(): consulta api.steamcmd.net e retorna None quando nao da para determinar. - filter_legacy_key_app_ids(): aplicado em downloader._finalize (pega todas as fontes) e no import manual de .lua. Appid indeterminado e MANTIDO -- so sai o que foi confirmado -- e os dois casos aparecem no log. - addtoken do appid descartado tambem sai (usa o cache, sem rede). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126Y7XBCmByPnatoDJiiBatO gerador emitia setManifestid para TODOS os depots, inclusive os do jogo base de quem comprou o jogo. O pin congela o depot no manifest que a fonte tinha no dia da ativacao: no PC do Maicon o Wildlands ficou com 460932/460934/460935 presos em manifests de 29/07 enquanto a build publica era de 19/08 12:50 (a Ubisoft atualizou justamente esses 3 depots). Para conteudo NAO possuido o pin continua obrigatorio -- sem ele o Steam resolve o manifest mais novo pelo PICS, nao consegue baixa-lo e a instalacao quebra. So muda para o que a conta licencia de verdade. - steam_licenses.py (novo): le appcache/packageinfo.vdf (magic 0x06565528) e devolve os appids que a conta licencia. E a unica fonte OFFLINE confiavel de "isto foi comprado". Cache por mtime; erro de parse/arquivo ausente devolve set() vazio = "nao sei". - downloader.get_depot_owner_map(): {depot: appid dono} pelo appinfo (depot com dlcappid pertence a DLC, o resto ao jogo). - generate_lua_for_opensteamtool(unpinned_depots=...): omite o setManifestid desses depots e deixa um comentario no .lua explicando. - steam_emulator._depots_do_usuario() cruza os dois e loga [POSSE] no resultado da ativacao. Qualquer falha => set() vazio => fixa tudo (comportamento antigo). Conferido com o packageinfo.vdf real do PC do Maicon: dos 30 depots do 460930, 28 sao do jogo comprado (sem pin) e 2 sao das DLCs que ele nao possui -- 573831 Narco Road e 573832 Fallen Ghosts -- que seguem fixadas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126Y7XBCmByPnatoDJiiBatView command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.