# MyMC Premium Store ## Overview MyMC Premium Store is a Discord bot that manages Docker containers for Minecraft servers, automatically adjusting container resources (CPU, memory, and swap) based on users' Discord roles. The bot checks for role changes every 5 minutes and updates container configurations accordingly, supporting default, upgraded, and super-upgraded tiers. NOTE: This repo is for educational purposes, and the code is written specifically for our system, however, you may fork it and use it for any need you may have. ## Features - **Role-Based Resource Allocation**: Adjusts Docker container resources (CPUs, memory, swap) based on Discord roles (`standard`, `manualUpgrade`, `superUpgrade`). - **Periodic Checks**: Runs every 5 minutes via a cron job to ensure container settings match user roles. - **Container Configuration Updates**: Updates PM2 process configurations within containers by copying appropriate `startServer.json` files (`startServer_downgrade.json`, `startServer_upgrade.json`, or `startServer_superUpgrade.json`). - **Safety Mechanisms**: - Handles unknown container limits by optionally resetting to default settings. - Implements command execution timeouts to prevent hanging operations. - **Logging**: Detailed console logs for container status, role checks, and configuration updates. ## Prerequisites - **Node.js**: Version 16 or higher. - **Docker**: Installed and running, with the bot having access to the Docker socket. - **Discord Bot Token**: A valid Discord bot token with `Guilds` and `GuildMembers` intents. - **Environment Variables**: Configured via a `.env` file (see [Configuration](#configuration)). - **PM2**: Used inside containers for process management. - **Configuration Files**: `startServer_downgrade.json`, `startServer_upgrade.json`, and `startServer_superUpgrade.json` must exist in the same directory as the bot script. ## Installation 1. Clone the repository: ```bash git clone git@git.ssh.surf:hypermc/mymc-premium.git cd mymc-premium ``` 2. Install dependencies: ```bash npm install discord.js dockerode cron dotenv ``` 3. Create a `.env` file in the project root (see [Configuration](#configuration)). 4. Ensure Docker is running and the bot has access to the Docker socket (`/var/run/docker.sock`). 5. Place the required `startServer_*.json` files in the project directory. 6. Start the bot: ```bash node index.js ``` ## Configuration Create a `.env` file in the project root with the following variables: ```env DISCORD_TOKEN=your_discord_bot_token GUILD_ID=your_discord_guild_id ROLE_ID_STANDARD=standard_role_id ROLE_ID_MANUAL_UPGRADE=manual_upgrade_role_id ROLE_ID_SUPER_UPGRADE=super_upgrade_role_id DEFAULT_CPUS=1 DEFAULT_MEMORY=512 DEFAULT_SWAP=1024 UPGRADED_CPUS=2 UPGRADED_MEMORY=1024 UPGRADED_SWAP=2048 SUPER_UPGRADED_CPUS=4 SUPER_UPGRADED_MEMORY=2048 SUPER_UPGRADED_SWAP=4096 RESET_UNKNOWN_TO_DEFAULT=true EXEC_TIMEOUT=10000 ``` - **DISCORD_TOKEN**: Discord bot token. - **GUILD_ID**: ID of the Discord server (guild) to monitor. - **ROLE_ID_***: Discord role IDs for each tier. - **DEFAULT_***: Resource limits for default tier (CPUs, memory in MiB, swap in MiB). - **UPGRADED_***: Resource limits for upgraded tier. - **SUPER_UPGRADED_***: Resource limits for super-upgraded tier. - **RESET_UNKNOWN_TO_DEFAULT**: If `true`, resets containers with unknown limits to default settings. - **EXEC_TIMEOUT**: Timeout (in milliseconds) for Docker exec commands. ## Usage - The bot logs in to Discord and performs an initial container check on startup. - Every 5 minutes, it checks all running containers with names starting with `mc_` (e.g., `mc_1234567890`, where `1234567890` is the Discord user ID). - For each container: - Verifies current resource limits (CPUs, memory, swap). - Checks the user's Discord roles in the specified guild. - Updates container resources and configuration files if the role-based tier doesn't match the current settings: - **Super Upgrade**: Applies if the user has the `superUpgrade` role. - **Standard/Manual Upgrade**: Applies if the user has `standard` or `manualUpgrade` roles. - **Default**: Applies if the user has no relevant roles. - Copies the appropriate `startServer_*.json` file to the container and restarts the PM2 process. - Logs all actions, including errors, to the console. ## Container Naming Containers must be named with the prefix `mc_` followed by the Discord user ID (e.g., `mc_1234567890`). ## Configuration Files The bot uses the following JSON files to configure PM2 processes inside containers: - `startServer_downgrade.json`: For default tier. - `startServer_upgrade.json`: For standard/manual upgrade tier. - `startServer_superUpgrade.json`: For super-upgraded tier. These files must be present in the bot's working directory and contain valid PM2 configuration for the Minecraft server. ## Error Handling - **Docker Errors**: Logs errors during container listing, inspection, or updates. - **Discord Errors**: Logs errors when fetching guild or member data. - **Timeout Errors**: Commands exceeding `EXEC_TIMEOUT` are terminated and logged. - **File Copy Errors**: Logs failures when copying configuration files. - **PM2 Errors**: Logs errors during PM2 process deletion or startup, but attempts to continue operations where possible. ## Logging The bot provides detailed console logs for: - Container details (name, user ID, current resources). - Role check results. - Actions taken (upgrade, downgrade, reset, or no action). - Errors during any operation.