124 lines
5.3 KiB
Markdown
124 lines
5.3 KiB
Markdown
# 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:**
|
|
```sh
|
|
git clone <repository_url>
|
|
cd discord-music-bot
|
|
```
|
|
2. **Install dependencies:**
|
|
```sh
|
|
pnpm install
|
|
```
|
|
3. **Configure Environment:**
|
|
Copy `.env.example` to `.env` and fill in your credentials:
|
|
```dotenv
|
|
# 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](https://console.cloud.google.com/).
|
|
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:
|
|
```sh
|
|
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`).
|
|
```sh
|
|
pnpm deploy # Check package.json for the exact deploy script (might be node/ts-node deploy-commands.ts)
|
|
```
|
|
|
|
6. **Start the Bot:**
|
|
```sh
|
|
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:
|
|
```sh
|
|
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](LICENSE) file for details.
|