Discord-Linux Premium Store
Overview
Discord-Linux Premium Store is a Node.js application that integrates with Discord and Docker to manage premium user subscriptions. It automatically adjusts Docker container resources (CPU, memory, and swap) based on users' Discord roles, ensuring that premium subscribers receive upgraded resources while non-premium users are assigned default settings.
Features
- Discord Role-Based Resource Management: Automatically upgrades or downgrades Docker container resources based on specific Discord roles.
- MySQL Integration: Maps user IDs to Discord IDs for role verification.
- Cron Scheduling: Periodically checks and updates container settings every 30 minutes.
- Container Resource Management: Supports default and upgraded resource configurations for CPU, memory, and swap.
- Cache System: Maintains a JSON cache (
current_upgraded.json
) of upgraded containers for tracking. - Error Handling: Robust logging and error handling for database queries, Discord API calls, and Docker operations.
- Configurable Settings: Uses environment variables for flexible configuration.
Prerequisites
- Node.js: Version 14 or higher.
- Docker: Installed and running with access to containers (e.g., SSH containers).
- MySQL: A MySQL database with a
users
table containinguid
anddiscord_id
columns. - Discord Bot Token: A Discord bot with the necessary permissions and intents (
Guilds
andGuildMembers
).
Installation
-
Clone the Repository:
git clone <repository-url> cd discord-linux-premium-store
-
Install Dependencies:
npm install
-
Set Up Environment Variables: Create a
.env
file in the project root and configure the following: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 NO_EXPIRE_CHANNEL_IDS=comma_separated_no_expire_role_ids SQLHOST=your_mysql_host SQLUSER=your_mysql_user SQLDATABASE=your_mysql_database SQLPASSWORD=your_mysql_password DEFAULT_CPUS=1 DEFAULT_MEMORY=512 DEFAULT_SWAP=1024 UPGRADED_CPUS=2 UPGRADED_MEMORY=1024 UPGRADED_SWAP=2048 RESET_UNKNOWN_TO_DEFAULT=true
-
Set Up MySQL Database: Ensure the MySQL database is running and has a
users
table with at least the following schema:CREATE TABLE users ( uid VARCHAR(255) PRIMARY KEY, discord_id VARCHAR(255) NOT NULL );
-
Run the Application:
node index.js
How It Works
-
Discord Bot Initialization:
- The bot logs in using the provided
DISCORD_TOKEN
and connects to the specified Discord guild. - Required intents:
Guilds
andGuildMembers
.
- The bot logs in using the provided
-
Container Checking:
- A cron job runs every 30 minutes to check all running Docker containers.
- Only containers with names starting with
SSH
are processed. - For each container:
- The application retrieves the associated Discord ID from the MySQL database using the container name as the
uid
. - It inspects the container's current resource settings (CPU, memory, swap).
- It checks the user's Discord roles in the specified guild.
- The application retrieves the associated Discord ID from the MySQL database using the container name as the
-
Resource Management:
- Upgrading: If the user has the
standard
ormanualUpgrade
role and the container is not already upgraded, the container is updated to useUPGRADED_CPUS
,UPGRADED_MEMORY
, andUPGRADED_SWAP
. - Downgrading: If the user lacks the required roles but the container is upgraded, it is reverted to
DEFAULT_CPUS
,DEFAULT_MEMORY
, andDEFAULT_SWAP
. - No-Expire Roles: Containers for users with
noExpire
roles are tracked but not downgraded. - Unknown Limits: If a container has settings that match neither default nor upgraded configurations and
RESET_UNKNOWN_TO_DEFAULT
istrue
, it is reset to default settings.
- Upgrading: If the user has the
-
Caching:
- Upgraded containers are stored in
/var/www/html/current_upgraded.json
for tracking. - The cache is updated after each container check cycle.
- Upgraded containers are stored in
-
Delay Between Checks:
- A 3-second delay is added between container checks to prevent overwhelming the Docker API.
Configuration
The application uses environment variables for configuration. Key variables include:
- Discord Settings:
DISCORD_TOKEN
: The Discord bot token.GUILD_ID
: The ID of the Discord guild to monitor.ROLE_ID_STANDARD
: Role ID for standard premium users.ROLE_ID_MANUAL_UPGRADE
: Role ID for manually upgraded users.NO_EXPIRE_CHANNEL_IDS
: Comma-separated list of role IDs for users with non-expiring upgrades.
- MySQL Settings:
SQLHOST
,SQLUSER
,SQLDATABASE
,SQLPASSWORD
: MySQL connection details.
- Docker Resource Settings:
DEFAULT_CPUS
,DEFAULT_MEMORY
,DEFAULT_SWAP
: Default container resource limits.UPGRADED_CPUS
,UPGRADED_MEMORY
,UPGRADED_SWAP
: Upgraded container resource limits.
- Other:
RESET_UNKNOWN_TO_DEFAULT
: Whether to reset containers with unknown limits to default settings (true
orfalse
).CACHE_FILE
: Path to the JSON cache file (default:/var/www/html/current_upgraded.json
).
Dependencies
discord.js
: For interacting with the Discord API.dockerode
: For managing Docker containers.cron
: For scheduling container checks.mysql2
: For MySQL database queries.dotenv
: For loading environment variables.fs
: For cache file operations.
Usage
- Ensure the Discord bot is invited to the target guild with the necessary permissions.
- Populate the MySQL
users
table with user IDs and their corresponding Discord IDs. - Start the application. It will:
- Log in to Discord.
- Perform an initial container check.
- Schedule recurring checks every 30 minutes.
Logging
The application logs:
- Container inspection details (CPU, memory, swap).
- Discord role checks and user status.
- Actions taken (upgrading, downgrading, or resetting containers).
- Errors from Discord API, Docker API, or MySQL queries.
- Cache updates.