2025-04-20 00:18:39 +08:00

Discord Music Bot (TypeScript)

Discord music bot template written in TypeScript using discord.js and shoukaku, with Lavalink support.

Features

  • Slash commands (e.g., /ping, /join, /play, /leave)
  • shoukaku integration for robust Lavalink audio playback
  • Modular command and event handlers written in TypeScript
  • Basic Docker support (Dockerfile, docker-compose.yml)

Prerequisites

  • Node.js (>=16 recommended, check package.json for specific engine requirements)
  • pnpm (recommended) or npm
  • TypeScript (typescript package, usually installed as a dev dependency)
  • A Discord application with bot token and client ID
  • A running Lavalink server

Setup

  1. Clone the repository:

    git clone <repository_url>
    cd discord-music-bot
    
  2. Install dependencies:

    pnpm install
    
  3. Configure Environment: Copy .env.example to .env and fill in your credentials:

    # Discord Bot Token (Required)
    DISCORD_TOKEN=your_discord_bot_token
    
    # Discord Application Client ID (Required for command deployment)
    CLIENT_ID=your_discord_application_id
    
    # Discord Guild ID (Optional, for deploying commands to a specific test server)
    # GUILD_ID=your_guild_id_here
    
    # Lavalink Configuration (Required)
    LAVALINK_HOST=lavalink # Or 127.0.0.1 if running locally without Docker Compose
    LAVALINK_PORT=2333
    LAVALINK_PASSWORD=your_lavalink_password
    # LAVALINK_SECURE=false # Set to true if Lavalink uses SSL/WSS
    
    # Logging Level (Optional, defaults typically to 'info')
    # LOG_LEVEL=info
    
    # YouTube OAuth Token (Optional, needed for YouTube Music via specific plugins)
    # See note below on how to obtain this.
    YOUTUBE_OAUTH_TOKEN=your_youtube_oauth_token_here
    

    Note on YouTube OAuth Token: The YOUTUBE_OAUTH_TOKEN is required by some Lavalink plugins (like the youtube-plugin potentially used here) to access YouTube Music tracks directly. Obtaining this involves:

    1. Go to the Google Cloud Console.
    2. Create a new project or select an existing one.
    3. Navigate to "APIs & Services" -> "Credentials".
    4. Click "Create Credentials" -> "OAuth client ID".
    5. Select Application type: "TVs and Limited Input devices".
    6. Give it a name (e.g., "Lavalink YouTube Music Access").
    7. Click "Create". You'll get a Client ID and Client Secret (you likely won't need the secret directly for the token flow).
    8. Follow the on-screen instructions or Google's documentation for the "OAuth 2.0 for TV and Limited Input devices" flow. This usually involves visiting a specific URL with your client ID, getting a user code, authorizing the application on a separate device/browser logged into your Google account, and then exchanging the device code for a refresh token.
    9. Paste the obtained refresh token as the value for YOUTUBE_OAUTH_TOKEN in your .env file.
  4. Build TypeScript (if needed): Many setups use ts-node for development, but for production, you might need to compile:

    pnpm build # Check package.json for the exact build script
    
  5. Register Slash Commands: Run the deployment script (ensure CLIENT_ID and DISCORD_TOKEN are set in .env).

    pnpm deploy # Check package.json for the exact deploy script (might be node/ts-node deploy-commands.ts)
    
  6. Start the Bot:

    pnpm start # Check package.json for the exact start script (might run compiled JS or use ts-node)
    

Docker

A Dockerfile and docker-compose.yml are provided for containerized deployment.

  • Ensure your .env file is configured correctly.
  • Build and run with Docker Compose:
    docker-compose up --build -d # Use -d to run in detached mode
    
  • The docker-compose.yml includes both the bot service and a Lavalink service.

Project Structure

.
├── src/                      # Source code directory
│   ├── commands/             # Slash command modules (.ts)
│   ├── events/               # Discord.js and Shoukaku event handlers (.ts)
│   ├── structures/           # Custom structures or base classes (e.g., Shoukaku event handlers)
│   ├── utils/                # Utility functions (e.g., logger.ts)
│   └── index.ts              # Main application entry point
├── plugins/                  # Lavalink plugins (e.g., youtube-plugin-*.jar)
├── tests/                    # Test files
├── .env.example              # Example environment variables
├── .gitignore
├── application.yml           # Lavalink server configuration
├── deploy-commands.ts        # Script to register slash commands
├── docker-compose.yml        # Docker Compose configuration for bot + Lavalink
├── Dockerfile                # Dockerfile for building the bot image
├── LICENSE                   # Project License (GPLv3)
├── package.json              # Node.js project manifest
├── tsconfig.json             # TypeScript compiler options
└── update-plugin.sh          # Script to update Lavalink plugins (example)

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

Description
Discord bot made in Rust using serenity and lavalink-rs
Readme GPL-3.0 3.2 MiB
Languages
TypeScript 89.2%
JavaScript 5.8%
Shell 2.9%
Dockerfile 2.1%