From 4cedb7d254675985d735ae7578cd3e13111cf97c Mon Sep 17 00:00:00 2001 From: FeriVOQ <36544651+ferivoq@users.noreply.github.com> Date: Mon, 25 Dec 2023 01:38:27 +0100 Subject: [PATCH] Uploaded files --- API/Dockerfile | 13 + API/README.md | 56 +++ API/index.js | 38 ++ API/package-lock.json | 678 ++++++++++++++++++++++++++++++++++++ API/package.json | 16 + Downloader/README.md | 82 +++++ Downloader/build.bat | 4 + Downloader/icon.ico | Bin 0 -> 31550 bytes Downloader/main.py | 71 ++++ Downloader/requirements.txt | 1 + README.md | 20 ++ 11 files changed, 979 insertions(+) create mode 100644 API/Dockerfile create mode 100644 API/README.md create mode 100644 API/index.js create mode 100644 API/package-lock.json create mode 100644 API/package.json create mode 100644 Downloader/README.md create mode 100644 Downloader/build.bat create mode 100644 Downloader/icon.ico create mode 100644 Downloader/main.py create mode 100644 Downloader/requirements.txt create mode 100644 README.md diff --git a/API/Dockerfile b/API/Dockerfile new file mode 100644 index 0000000..20306d2 --- /dev/null +++ b/API/Dockerfile @@ -0,0 +1,13 @@ +FROM node:16-alpine + +RUN npm install -g nodemon +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . + +EXPOSE 4000 + +CMD [ "npm", "run", "dev" ] \ No newline at end of file diff --git a/API/README.md b/API/README.md new file mode 100644 index 0000000..b8d9eb6 --- /dev/null +++ b/API/README.md @@ -0,0 +1,56 @@ +# Rumbleverse Download API + +This repository contains the source code for the Rumbleverse Download API, an Express.js application designed to serve downloadable builds of Rumbleverse. The API provides an easy-to-use interface for listing and downloading different versions of the game. + +## Features + +- **Static File Serving:** The API serves zip files containing different builds of Rumbleverse. +- **Version Listing:** It dynamically lists available versions based on the files present in the `versions` directory. +- **Cross-Origin Resource Sharing (CORS):** Enabled CORS to allow requests from different domains. +- **Docker Support:** Includes a Dockerfile for easy deployment and containerization. + +## Setup + +1. **Prerequisites:** + - Node.js + - NPM (Node Package Manager) + - Docker (optional for containerized deployment) + +2. **Installation:** + - Clone the repository. + - Run `npm install` to install the required Node.js packages. + +3. **Adding Builds:** + - Place your Rumbleverse build files in the `versions` directory. For downloading builds join into our Discord Server. https://discord.gg/HU3YUaFcAG + - Ensure each build is compressed as a `.zip` file. + +4. **Configuration:** + - Modify the domain in the `getVersionsData` function to point to your own domain. + - Example: Replace `https://rvapi.ferivoq.me/versions/${encodeURIComponent(file)}` with your domain. + +5. **Docker Setup (Optional):** + - Build the Docker image using `docker build -t rumbleverse-api .` + - Run the container using `docker run -p 4000:4000 rumbleverse-api` + +6. **Running the API:** + - Start the server using `npm run dev` or with your preferred process manager. + - Access the API at `http://localhost:4000`. + +## API Endpoints + +- `GET /api`: Returns a JSON object listing all available Rumbleverse versions with download links. +- `GET /`: A simple endpoint that returns the text 'Rumbleverse Download API'. +- Static files are served under `/versions`. + +## Dockerfile + +A Dockerfile is included for building a Docker image of the API. This allows for easy deployment and scaling. + +## Contribution + +Contributions to the project are welcome. Please ensure you follow the existing code style and include proper documentation for your changes. + +--- + +Note: This documentation assumes basic familiarity with Node.js, Express.js, and Docker. Ensure you update the domain in the API as per your deployment needs. + diff --git a/API/index.js b/API/index.js new file mode 100644 index 0000000..b5a04ff --- /dev/null +++ b/API/index.js @@ -0,0 +1,38 @@ +const express = require('express'); +const cors = require('cors'); +const fs = require('fs'); +const path = require('path'); + +const app = express(); +app.use(cors()); + +const getVersionsData = () => { + const versionsDirectory = path.join(__dirname, 'versions'); + const files = fs.readdirSync(versionsDirectory); + + return files + .filter(file => file.endsWith('.zip')) + .map(file => { + const name = file.replace('.zip', ''); + return { + name: name, + link: `https://rvapi.ferivoq.me/versions/${encodeURIComponent(file)}` + }; + }); +}; + +app.use('/versions', express.static(path.join(__dirname, 'versions'))); + +app.get('/api', (req, res) => { + const data = { versions: getVersionsData() }; + res.json(data); +}); + +app.get('/', (req, res) => { + res.send('Rumbleverse Download API'); +}); + +const PORT = 4000; +app.listen(PORT, () => { + console.log(`Server is running on port http://localhost:${PORT}`); +}); diff --git a/API/package-lock.json b/API/package-lock.json new file mode 100644 index 0000000..341c742 --- /dev/null +++ b/API/package-lock.json @@ -0,0 +1,678 @@ +{ + "name": "rumbleverse-install-api", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rumbleverse-install-api", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/API/package.json b/API/package.json new file mode 100644 index 0000000..018b4de --- /dev/null +++ b/API/package.json @@ -0,0 +1,16 @@ +{ + "name": "rumbleverse-install-api", + "version": "1.0.0", + "description": "An api for installing the old RumbleVerse Builds", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "nodemon -L index.js" + }, + "author": "FeriVOQ", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2" + } +} diff --git a/Downloader/README.md b/Downloader/README.md new file mode 100644 index 0000000..247746b --- /dev/null +++ b/Downloader/README.md @@ -0,0 +1,82 @@ +# RumbleVerse Build Downloader + +## Overview + +This script is designed to automate the process of downloading and installing builds for RumbleVerse. It fetches available builds from a specified API, allows the user to select a build, downloads the chosen build, and optionally unzips the downloaded file to a specified directory. + +## Features + +- Fetches available builds from a given API URL. +- Displays a list of available builds for user selection. +- Downloads the selected build to a specified directory. +- Optional unzipping of the downloaded build. + +## Requirements + +To run this script, you need Python installed on your system. Additionally, the following Python packages are required: + +- `requests` +- `zipfile` (built-in, no installation required) +- `os` (built-in, no installation required) +- `time` (built-in, no installation required) + +These dependencies are listed in the `requirements.txt` file. + +## Installation + +1. Clone the repository or download the script. +2. Install the required Python packages: + + ```bash + pip install -r requirements.txt + + +## Usage + +1. Run the script in a Python environment: + + ```bash + pip install -r requirements.txt + +2. Follow the on-screen prompts to select and download a build. + +## Configuration + +Before running the script, ensure the API URL is correctly set to point to the RumbleVerse builds API. The default API URL is set in the script, but it can be modified to point to a different endpoint if needed. + +### Setting the API URL + +1. In the script, locate the following line: + + ```python + API_URL = "https://rvapi.ferivoq.me/api/" + +Replace the URL with the desired API endpoint. Ensure that the new API URL points to a valid and accessible API that provides RumbleVerse build information in a compatible format. + +## Building to .exe + +For building an .exe file you will need Windows. +Run the `build.bat` file and it will do it's job. + +## Contributing + +We warmly welcome contributions to this project. Whether it's improving the code, fixing bugs, or adding new features, your help is appreciated. + +### Guidelines for Contributing +1. **Fork the Repository**: Start by forking the repository and then cloning your fork to your local machine. +2. **Create a New Branch**: For each new feature or fix, create a new branch based on the latest version of the main branch. +3. **Code Conventions**: Follow the existing code style and conventions. Write clean, readable, and well-documented code. +4. **Test Your Changes**: Ensure that your changes do not break existing functionality. Test the script thoroughly. +5. **Submit a Pull Request**: Push your changes to your fork and submit a pull request to the main repository. Provide a clear description of the changes and the purpose of the pull request. + +## License + +This script is released under the MIT License. + +### MIT License Summary +- **Permission**: The software and its associated documentation files can be used, copied, modified, merged, published, distributed, sublicensed, and/or sold. +- **Conditions**: Appropriate credit must be given, and the MIT License text must be included in substantial portions of the software. +- **Limitations**: The software is provided 'as is', without warranty of any kind. + +For more details, refer to the full [MIT License](https://opensource.org/licenses/MIT). + diff --git a/Downloader/build.bat b/Downloader/build.bat new file mode 100644 index 0000000..13328b4 --- /dev/null +++ b/Downloader/build.bat @@ -0,0 +1,4 @@ +@ECHO OFF +py -3 -m pip install pyinstaller --quiet --disable-pip-version-check +py -3 -m pip install -r requirements.txt --quiet --disable-pip-version-check +pyinstaller --onefile --name RumbleVerseInstaller --icon icon.ico main.py \ No newline at end of file diff --git a/Downloader/icon.ico b/Downloader/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3c2a7e6ef4c2dd4d1bbf31b787ea4e74600a4d97 GIT binary patch literal 31550 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 B