Even Better Whitelist

A professional whitelist workflow with Discord actions, dual VPN/Proxy detection, GeoIP, optional captcha, Discord account linking, and statistics. Built for production servers.

32

Even Better Whitelist

EvenBetterWhitelist - Plugin

Discord

A modern whitelist system for Minecraft Paper 1.21.x with Discord integration. When a player attempts to join and is not whitelisted, a structured request is posted to your Discord channel. Admins can accept, deny, or ban directly from Discord using buttons.

Minecraft

Paper

Discord

Java

Installation Steps

1. Place `WhitelistPluginButBetter-1.0.0.jar` in your server's `plugins/` folder 2. Start/restart your server 3. Edit `plugins/WhitelistPluginButBetter/config.yml` 4. Download GeoLite2-City.mmdb and place it in the plugin folder 5. Reload with `/wlp reload` or restart the server

🤖 Discord Bot Setup

1. Create a Discord Application

1. Go to Privileged Gateway Intents 2. Click "New Application" and give it a name 3. Go to "Bot" section and click "Add Bot" 4. Copy the Privileged Gateway Intents (keep this secret!) 5. Enable these Privileged Gateway Intents: - Message Content Intent

2. Invite the Bot

1. Go to "OAuth2" → "URL Generator" 2. Select scopes: `bot`, `applications.commands` 3. Select permissions: `Send Messages`, `Embed Links`, `Read Message History` 4. Copy the generated URL and open it to invite the bot

3. Get Your IDs

Enable Developer Mode in Discord (Settings → Advanced → Developer Mode)

- Admin User ID: Right-click your server → Copy Server ID - Admin User ID: Right-click the channel → Copy Channel ID - Admin User ID: Right-click yourself → Copy User ID

4. (Optional) Create a Webhook

1. Right-click your channel → Edit Channel 2. Go to Integrations → Webhooks 3. Create a webhook and copy the URL

⚙️ Configuration

```yaml discord: bot-token: "YOUR_BOT_TOKEN_HERE" webhook-url: "YOUR_WEBHOOK_URL_HERE" server-id: "YOUR_SERVER_ID_HERE" channel-id: "YOUR_CHANNEL_ID_HERE" admin-user-ids: "USER_ID_1,USER_ID_2" ping-admins: true

cooldowns: deny-cooldown: 60 # Minutes before denied player can try again pending-cooldown: 5 # Minutes between join attempts while pending ip-cooldown: 10 # Minutes before same IP can make new request

geoip: enabled: true database-path: "plugins/WhitelistPluginButBetter/GeoLite2-City.mmdb" ```

See the full config.yml for all options!

📝 Commands

| Command | Description | |---------|-------------| | `/wlp accept <player>` | Accept a pending whitelist request | | `/wlp deny <player>` | Deny a pending whitelist request | | `/wlp pending` | View all pending requests | | `/wlp list [page]` | View whitelisted players | | `/wlp add <player>` | Manually add a player to whitelist | | `/wlp remove <player>` | Remove a player from whitelist | | `/wlp info <player>` | View detailed player info | | `/wlp status` | View plugin status | | `/wlp reload` | Reload configuration |

🔐 Permissions

| Permission | Description | Default | |------------|-------------|---------| | `whitelistplugin.admin` | Access to all commands | OP | | `whitelistplugin.bypass` | Bypass whitelist check | OP |

Discord Embed Preview

When a player tries to join, admins receive an embed like this:

``` ┌─────────────────────────────────────────┐ │ New Whitelist Request │ ├─────────────────────────────────────────┤ │ Player: Steve │ │ UUID: 069a79f4-... │ │ IP: ||192.168.1.1|| │ │ Location: New York, United States │ │ Client: fabric │ │ Language: en_US │ │ Requested: 2024-01-15 14:30 UTC │ │ │ │ Same IP as: Alex (1 other request) │ │ │ │ [Accept] [Deny] [Ban] │ └─────────────────────────────────────────┘ ```

🗂️ File Structure

``` plugins/WhitelistPluginButBetter/ ├── config.yml # Main configuration ├── whitelist.json # Whitelisted players ├── pending-requests.json # Pending requests ├── denied-players.json # Denied players (for cooldowns) ├── requests.log # Action log └── GeoLite2-City.mmdb # GeoIP database (you provide this) ```

Troubleshooting

Bot not responding to buttons?

- Make sure the bot token is correct - Ensure the bot has permissions in the channel - Check console for connection errors

GeoIP not working?

- Download GeoLite2-City.mmdb from MaxMind - Place it in the plugin folder - Check the path in config.yml

Players not being kicked?

- Make sure the plugin is loaded (`/plugins`) - Check if player has `whitelistplugin.bypass` permission - Look for errors in console

Seeing Private IP (10.x.x.x, 192.168.x.x)?

This happens when using a reverse proxy (BungeeCord, Velocity, TCPShield, etc.)

For BungeeCord: 1. Set `bungeecord: true` in `spigot.yml` 2. Restart the server

For Velocity: 1. Edit `config/paper-global.yml` 2. Set `proxies.velocity.enabled: true` 3. Set the `secret` to match Velocity's forwarding secret 4. Restart the server

For TCPShield/Other: Follow your proxy's documentation for IP forwarding.

Client/Language shows "N/A (Pre-login)"?

This is expected! The plugin intercepts players before they fully connect, so client brand and locale data isn't available yet. This is a Minecraft limitation, not a bug.

The data we DO capture (IP, UUID, GeoIP location) is still very useful for identifying players and alts!

📜 License

All Rights Reserved.Any modifications without informing is illegal.

Made for the Minecraft community!

ADS