diff --git a/.env.example b/.env.example index 636467e5..3ef399f7 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,2 @@ -MAIN_VITE_STEAMGRIDDB_API_KEY=YOUR_API_KEY -MAIN_VITE_ONLINEFIX_USERNAME=YOUR_USERNAME -MAIN_VITE_ONLINEFIX_PASSWORD=YOUR_PASSWORD - +MAIN_VITE_API_URL=API_URL +MAIN_VITE_AUTH_URL=AUTH_URL diff --git a/.eslintignore b/.eslintignore index a6f34fea..a4c40302 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,5 @@ node_modules dist out .gitignore +migration.stub +hydra-python-rpc/ diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 6ec93984..6da066af 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -26,4 +26,9 @@ module.exports = { }, ], }, + settings: { + react: { + version: "detect", + }, + }, }; diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 07de37f3..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve. Write in English, please -title: "[BUG]" -labels: bug -assignees: "" ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: - -1. Go to '...' -2. Click on '....' -3. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Additional context** - -- OS: [Windows 11/Linux Distro/Steam Deck] -- Hydra Version: -- Additional information and context of your problem: diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..204ef846 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,65 @@ +name: Bug Report +description: Create a report to help us improve. Write in English. +title: "[BUG] Write a title for your bug" +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thank you for creating a bug report to help us improve! + - type: textarea + id: bug-description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: bug-reproduce + attributes: + label: Steps to Reproduce + description: Steps to reproduce the behavior. For example, "1. Go to '...', 2. Click on '...', 3. See error" + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + validations: + required: false + - type: textarea + id: additional-info + attributes: + label: Additional information and data + description: | + Add screenshots and upload your logs file here. + Logs location on Windows: "%appdata%/hydra" + Logs location on Linux: "~/.config/hydra/" + validations: + required: true + - type: input + id: OS + attributes: + label: Operating System + description: Which operating system are you using (e.g., Windows 11/Linux Distro/Steam Deck)? + validations: + required: true + - type: input + id: hydra-version + attributes: + label: Hydra Version + description: Please provide the version of Hydra you are using. + validations: + required: true + - type: checkboxes + id: terms + attributes: + label: Before opening this Issue + options: + - label: I have searched the issues of this repository and believe that this is not a duplicate. + required: true + - label: I am aware that Hydra team does not offer any support or help regarding the downloaded games. + required: true + - label: I have read the [Frequently Asked Questions (FAQ)](https://github.com/hydralauncher/hydra/wiki/FAQ). + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 1a651d9f..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for Hydra. Write in English, please -title: "[REQUEST]" -labels: enhancement -assignees: "" ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..295cee45 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,37 @@ +name: Feature Request +description: Request a new feature. +title: "[REQUEST] " +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to suggest a new feature! + - type: textarea + id: problem-related + attributes: + label: Is your feature request related to a problem? Please describe. + description: A clear and concise description of what the problem is. + validations: + required: true + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: false diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md new file mode 100644 index 00000000..3653dd16 --- /dev/null +++ b/.github/pull-request-template.md @@ -0,0 +1,12 @@ + + +**When submitting this pull request, I confirm the following (please check the boxes):** + +- [ ] I have read and understood the [Contributor Guidelines](https://github.com/hydralauncher/hydra?tab=readme-ov-file#ways-you-can-contribute). +- [ ] I have checked that there are no duplicate pull requests related to this request. +- [ ] I have considered, and confirm that this submission is valuable to others. +- [ ] I accept that this submission may not be used and the pull request may be closed at the discretion of the maintainers. + +**Fill in the PR content:** + +- diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2862e97..a11ae546 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,8 +1,10 @@ name: Build -on: - push: - branches: main +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: pull_request jobs: build: @@ -19,7 +21,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 20.11.1 + node-version: 20.18.0 - name: Install dependencies run: yarn @@ -33,32 +35,58 @@ jobs: run: pip install -r requirements.txt - name: Build with cx_Freeze - run: python torrent-client/setup.py build + run: python python_rpc/setup.py build - name: Build Linux if: matrix.os == 'ubuntu-latest' - run: yarn build:linux + run: | + sudo apt-get update + sudo apt-get install -y libarchive-tools + yarn build:linux env: - MAIN_VITE_STEAMGRIDDB_API_KEY: ${{ secrets.STEAMGRIDDB_API_KEY }} - MAIN_VITE_ONLINEFIX_USERNAME: ${{ secrets.ONLINEFIX_USERNAME }} - MAIN_VITE_ONLINEFIX_PASSWORD: ${{ secrets.ONLINEFIX_PASSWORD }} + MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }} + MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }} + RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }} + RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} + MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }} - name: Build Windows if: matrix.os == 'windows-latest' run: yarn build:win env: - MAIN_VITE_STEAMGRIDDB_API_KEY: ${{ secrets.STEAMGRIDDB_API_KEY }} - MAIN_VITE_ONLINEFIX_USERNAME: ${{ secrets.ONLINEFIX_USERNAME }} - MAIN_VITE_ONLINEFIX_PASSWORD: ${{ secrets.ONLINEFIX_PASSWORD }} + MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }} + MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }} + RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }} + RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} + MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }} + + - name: Test Upload build + env: + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} + S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }} + S3_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }} + S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} + S3_BUILDS_BUCKET_NAME: ${{ secrets.S3_BUILDS_BUCKET_NAME }} + BUILDS_URL: ${{ secrets.BUILDS_URL }} + BUILD_WEBHOOK_URL: ${{ secrets.BUILD_WEBHOOK_URL }} + GITHUB_ACTOR: ${{ github.actor }} + + run: node scripts/upload-build.cjs - name: Create artifact uses: actions/upload-artifact@v4 with: name: Build-${{ matrix.os }} path: | - dist/*.exe + dist/*-portable.exe dist/*.zip dist/*.dmg dist/*.deb @@ -66,21 +94,4 @@ jobs: dist/*.tar.gz dist/*.yml dist/*.blockmap - - - name: Release - uses: softprops/action-gh-release@v1 - with: - draft: true - files: | - dist/*.exe - dist/*.zip - dist/*.dmg - dist/*.AppImage - dist/*.snap - dist/*.deb - dist/*.rpm - dist/*.tar.gz - dist/*.yml - dist/*.blockmap - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + dist/*.pacman diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index af4cbae7..0a17b329 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,6 +1,10 @@ name: Lint -on: [pull_request] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: pull_request jobs: lint: @@ -13,7 +17,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 20.11.1 + node-version: 20.18.0 - name: Install dependencies run: yarn @@ -26,3 +30,6 @@ jobs: - name: Lint run: yarn lint + + - name: Format check + run: yarn format-check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..99a89245 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,108 @@ +name: Release + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + push: + branches: main + +jobs: + build: + strategy: + matrix: + os: [windows-latest, ubuntu-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.18.0 + + - name: Install dependencies + run: yarn + + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: 3.9 + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Build with cx_Freeze + run: python python_rpc/setup.py build + + - name: Build Linux + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install -y libarchive-tools + yarn build:linux + env: + MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} + MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }} + MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }} + RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }} + RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} + MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }} + + - name: Build Windows + if: matrix.os == 'windows-latest' + run: yarn build:win + env: + MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} + MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }} + MAIN_VITE_ANALYTICS_API_URL: ${{ vars.MAIN_VITE_ANALYTICS_API_URL }} + RENDERER_VITE_INTERCOM_APP_ID: ${{ vars.RENDERER_VITE_INTERCOM_APP_ID }} + RENDERER_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} + MAIN_VITE_EXTERNAL_RESOURCES_URL: ${{ vars.EXTERNAL_RESOURCES_URL }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + RENDERER_VITE_SENTRY_DSN: ${{ vars.SENTRY_DSN }} + + - name: Create artifact + uses: actions/upload-artifact@v4 + with: + name: Build-${{ matrix.os }} + path: | + dist/win-unpacked/** + dist/*-portable.exe + dist/*.zip + dist/*.dmg + dist/*.deb + dist/*.rpm + dist/*.tar.gz + dist/*.yml + dist/*.blockmap + dist/*.pacman + + - name: Release + uses: softprops/action-gh-release@v2 + with: + draft: true + files: | + dist/*.exe + dist/*.zip + dist/*.dmg + dist/*.AppImage + dist/*.snap + dist/*.deb + dist/*.rpm + dist/*.tar.gz + dist/*.yml + dist/*.blockmap + dist/*.pacman + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 69af659f..f9f32977 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ -.vscode -node_modules -hydra-download-manager -fastlist.exe +.vscode/ +node_modules/ __pycache__ dist out @@ -9,4 +7,12 @@ out *.log* .env .vite +ludusavi/ +hydra-python-rpc/ +aria2/ +.python-version +# Sentry Config File +.env.sentry-build-plugin + +*storybook.log diff --git a/.husky/pre-commit b/.husky/pre-commit index debb5023..b4da9a05 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1 @@ -yarn lint -yarn typecheck +yarn format diff --git a/.husky/pre-push b/.husky/pre-push index b4da9a05..debb5023 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1 +1,2 @@ -yarn format +yarn lint +yarn typecheck diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..d1cdf2f0 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict = true \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 9c6b791d..05d298a1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ out dist +seeds pnpm-lock.yaml LICENSE.md tsconfig.json diff --git a/README.md b/README.md index 2162b75b..f873a671 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,30 @@
- Hydra is a game launcher with its own embedded bittorrent client and a self-managed repack scraper. + Hydra is a game launcher with its own embedded bittorrent client.
[](https://github.com/hydralauncher/hydra/actions) [](https://github.com/hydralauncher/hydra/releases) -[](README.pt-BR.md) -[](README.md) -[](README.ru.md) -[](README.uk-UA.md) -[](README.be.md) +[](./docs/README.pt-BR.md) +[](./README.md) +[](./docs/README.ru.md) +[](./docs/README.uk-UA.md) +[](./docs/README.be.md) +[](./docs/README.es.md) +[](./docs/README.fr.md) +[](./docs/README.de.md) +[](./docs/README.it.md) +[](./docs/README.cs.md) +[](./docs/README.da.md) +[](./docs/README.nb.md) +[](./docs/README.et.md)  @@ -25,11 +33,12 @@ ## Table of Contents +- [Table of Contents](#table-of-contents) - [About](#about) - [Features](#features) - [Installation](#installation) -- [Contributing](#contributing) - - [Join our Telegram](#join-our-telegram) +- [Contributing](#-contributing) + - [Join our Telegram](#-join-our-telegram) - [Fork and clone your repository](#fork-and-clone-your-repository) - [Ways you can contribute](#ways-you-can-contribute) - [Project Structure](#project-structure) @@ -45,20 +54,19 @@ - [Build the bittorrent client](#build-the-bittorrent-client) - [Build the Electron application](#build-the-electron-application) - [Contributors](#contributors) +- [License](#license) ## About -**Hydra** is a **Game Launcher** with its own embedded **BitTorrent Client** and a **self-managed repack scraper**. +**Hydra** is a **Game Launcher** with its own embedded **BitTorrent Client**.- Hydra - гэта гульнявы лаўнчар з уласным убудаваным кліентам BitTorrent і самастойным scraper`ам для рэпакаў. + Hydra - гэта гульнявы лаўнчар з уласным убудаваным кліентам BitTorrent.
[](https://github.com/hydralauncher/hydra/actions) [](https://github.com/hydralauncher/hydra/releases) [](README.pt-BR.md) -[](README.md) +[](../README.md) [](README.ru.md) [](README.uk-UA.md) [](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) - ++ Hydra je herní launcher s vlastním vestavěným Bittorrent klientem. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](../README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra er en spil launcher med sin egen indbyggede bittorrent klient. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](../README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.et.md) + + + ++ Hydra ist ein Launcher für Spiele mit einem eigenen eingebetteten BitTorrent-Client. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](../README.md) +[](README.be.md) +[](README.pl.md) +[](README.pt-BR.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra es un launcher de juegos con su propio cliente de bittorrent. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](../README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra on mängulauncher oma sisseehitatud bittorrenti kliendiga. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](../README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra est un lanceur de jeux avec son propre client bittorrent intégré. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](../README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra è un game launcher con il proprio client bittorrent. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra er en spill launcher sin egen innebygt bittorrent klient. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](../README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.nb.md) +[](README.et.md) + + + ++ Hydra - to program uruchamiający gry z własnym wbudowanym klientem bittorrent. +
+ +[](https://github.com/hydralauncher/hydra/actions) +[](https://github.com/hydralauncher/hydra/releases) + +[](README.pt-BR.md) +[](README.md) +[](README.ru.md) +[](README.uk-UA.md) +[](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) + + + +- Hydra é um Launcher de Jogos com seu próprio cliente de bittorrent integrado e um wrapper autogerenciado para busca de repacks. + Hydra é um Launcher de Jogos com seu próprio cliente de bittorrent integrado.
[](https://github.com/hydralauncher/hydra/actions) [](https://github.com/hydralauncher/hydra/releases) [](README.pt-BR.md) -[](README.md) +[](../README.md) [](README.ru.md) [](README.uk-UA.md) [](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) - - +- Hydra - это игровой лаунчер с собственным встроенным клиентом BitTorrent и самостоятельным scraper`ом для репаков. + Hydra - это игровой лаунчер с собственным встроенным клиентом BitTorrent.
[](https://github.com/hydralauncher/hydra/actions) [](https://github.com/hydralauncher/hydra/releases) [](README.pt-BR.md) -[](README.md) +[](../README.md) [](README.ru.md) [](README.uk-UA.md) [](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) - +- Hydra - це ігровий лаунчер з власним вбудованим bittorrent-клієнтом і самокерованим збирачем репаків. + Hydra - це ігровий лаунчер з власним вбудованим bittorrent-клієнтом.
[](https://github.com/hydralauncher/hydra/actions) [](https://github.com/hydralauncher/hydra/releases) [](README.pt-BR.md) -[](README.md) +[](../README.md) [](README.ru.md) [](README.uk-UA.md) [](README.be.md) +[](README.es.md) +[](README.fr.md) +[](README.de.md) +[](README.it.md) +[](README.cs.md) +[](README.da.md) +[](README.nb.md) +[](README.et.md) - +