Compatibility
Minecraft: Java Edition
26.2
Platforms
Links
Tags
Creators
Details
Licensed ARR
Published yesterday
Updated 3 weeks ago
wckdDCLink
Bridge your Minecraft chat to Discord and viceversa!
Features
- Discord > Minecraft Linking
- Minecraft > Discord Linking via Required Linking
- Link Embeds
- Discord Roles Sync
- Data Migration from DiscordSRV
- MiniMessage Support
- Join/Leave Message
- Join/Leave suppression if not linked
Preview
Link Embed

Files
Config Version 2
# Bot token; from https://discord.com/developers/applications -> your app -> Bot -> Reset Token
# You must restart your server after changing this option
BotToken: ""
# The Discord server (guild) ID this bot operates in
GuildId: ""
# Channel routing for every message type this plugin can post.
# syntax is Channels: {"type": "numerical channel ID from Discord", "another type": "another channel ID"}
#
# Every message type below will go to "global" unless that specific type has its own
# entry defined. Leave a type's entry out entirely (or blank) to have it fall back to "global".
#
# Types:
# global - chat bridge, and the fallback for every other type below
# join - join messages
# leave - quit messages
# awards - advancement messages
# deaths - death messages
# watchdog - lag/hang alerts
# server - server start/stop announcements
# link - staff-only: where link/unlink confirmations post, for admin visibility
# into who's linked to whom. NOT where /link can be used - see
# LinkRequestChannelId further down for that.
#
# Run "/dclink reload" after changing this option to apply
Channels: {"global": ""}
# Console channel numerical ID (NOT name), leave blank to disable the console channel entirely.
# Deliberately NOT part of the Channels map above or command-executable from Discord - see
# the Security section in README.md for why.
ConsoleChannelId: ""
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Chat bridge
#
# ChatBridgeEnabled: whether to bridge chat at all
# ChatBridgeMinecraftToDiscordFormat: {player} {message} - only used when
# ChatBridgeUseWebhook is false (bot posts a formatted line instead)
# ChatBridgeDiscordToMinecraftFormat: {name} {message} - MiniMessage or legacy
# (&a) both work, auto-detected
# ChatBridgeUseWebhook: have chat messages post AS the player.
# Requires MESSAGE CONTENT INTENT enabled for this bot in the Discord Developer
# Portal (Bot -> Privileged Gateway Intents), or the bot will fail to start.
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ChatBridgeEnabled: true
ChatBridgeMinecraftToDiscordFormat: "**{player}**: {message}"
ChatBridgeDiscordToMinecraftFormat: "<blue>[Discord]</blue> <white>{name}</white><gray>: </gray><white>{message}</white>"
ChatBridgeUseWebhook: false
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Join/leave/advancement/death embeds
#
# {Join,Leave,Death,Advancement}EmbedColor: hex, no "#", used only when
# AnnouncementsUseEmbeds is true.
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
AnnouncementsUseEmbeds: true
JoinEmbedColor: "57F287"
LeaveEmbedColor: "ED4245"
DeathEmbedColor: "992D22"
AdvancementEmbedColor: "FEE75C"
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Join/leave messages
#
# JoinQuitEnabled: whether to post join/leave messages at all
# JoinFormat / QuitFormat: {player}
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
JoinQuitEnabled: true
JoinFormat: "**{player}** joined the server"
QuitFormat: "**{player}** left the server"
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Advancement (awards) messages
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
AdvancementsEnabled: true
AdvancementFormat: "**{player}** has made the advancement **{advancement}**"
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Death messages
#
# DeathFormat: {player} / {deathMessage} - deathMessage is the full vanilla
# death line ("Player was slain by Zombie"), so {player} is usually redundant
# unless you want to bold/mention them separately from the vanilla text.
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
DeathsEnabled: true
DeathFormat: "\u2620\ufe0f {deathMessage}"
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Server start/stop announcements
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ServerStartStopEnabled: true
ServerStartMessage: "đ˘ Server has started."
ServerStopMessage: "đ´ Server is shutting down."
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Server watchdog
#
# Monitors the time since your server's last game tick.
#
# WatchdogEnabled: whether the watchdog is enabled at all
# WatchdogTimeoutSeconds: seconds since the last tick before alerting (minimum 10)
# WatchdogMessageCount: how many times the alert repeats, in case you really
# want to make sure you catch it
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
WatchdogEnabled: true
WatchdogTimeoutSeconds: 30
WatchdogMessageCount: 3
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Console mirror
#
# ConsoleEnabled: whether the console mirror is on at all
# ConsoleMinLevel: INFO, WARN, or ERROR (Log4j level names) - only log records
# at/above this level get mirrored
# ConsoleFlushIntervalSeconds: how often buffered lines get sent as a batch
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ConsoleEnabled: true
ConsoleMinLevel: "WARN"
ConsoleFlushIntervalSeconds: 5
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Account linking
#
# LinkedFormat / UnlinkedFormat: {player} / {discordId} - posted to the
# "link" channel in the Channels map above (staff-only visibility log)
# LinkRequestChannelId: where /link and the "Get Code" button can be used.
# Leave blank to allow /link from any channel. This is a SEPARATE
# channel from the "link" entry in the Channels map above - that one is
# a staff-only log of who's linked to whom, this one is where players
# actually go to request a code.
# CodeLength / CodeExpiryMinutes / CooldownSeconds: how link codes behave
# ButtonId: component ID for the "Get Code" button posted by /postlinkembed
# EmbedColor / EmbedThumbnailUrl / EmbedImageUrl: styling for that embed
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
LinkEventsEnabled: true
LinkedFormat: "\u2705 **{player}** linked to <@{discordId}>"
UnlinkedFormat: "\u274c **{player}** unlinked their Discord account"
LinkRequestChannelId: ""
CodeLength: 6
CodeExpiryMinutes: 15
CooldownSeconds: 30
ButtonId: "dclink_getcode"
EmbedColor: "5865F2"
EmbedThumbnailUrl: ""
EmbedImageUrl: ""
AutoDeleteEnabled: true
AutoDeleteButtonReplySeconds: 15
ConnectAttemptLimiterEnabled: true
ConnectAttemptLimiterMaxAttempts: 5
ConnectAttemptLimiterWindowSeconds: 60
ConnectAttemptLimiterLockoutSeconds: 60
# Hide join/quit messages IN-GAME for players who haven't linked yet.
SuppressJoinQuitUntilLinked: false
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Booster detection
#
# Detection/placeholder only right now Requires SERVER MEMBERS INTENT
# enabled for this bot in the Discord Developer Portal.
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
BoosterDetectionEnabled: true
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Role sync
#
# RoleSyncEnabled: whether role sync is on at all
# RoleSyncIntervalMinutes: how often to re-apply Minecraft groups -> Discord
# roles as a safety net, on top of the real-time sync that happens on
# every change
# RoleSyncGroupToRole: luckperms_group_name: "discord_role_id" pairs
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
RoleSyncEnabled: false
RoleSyncIntervalMinutes: 10
RoleSyncGroupToRole:
# admin: "123456789012345678"
# donator: "123456789012345679"
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Nickname sync (Minecraft -> Discord only)
#
# Sets a linked player's Discord nickname to match their Minecraft name.
# Per-player opt-out via the "wckddclink.nicknamesync" permission
# (granted by default).
#
# NicknameSyncEnabled: whether nickname sync is on at all
# NicknameSyncCycleMinutes: minutes between re-applying nicknames for all
# online linked players, on top of the real-time sync that happens on
# link and on join
# NicknameSyncFormat: the nickname format (keep it under 32 characters -
# Discord's own limit - it gets truncated if you go over)
# %displayname% - player's display name
# %username% - player's username
# PlaceholderAPI placeholders are also supported
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
NicknameSyncEnabled: false
NicknameSyncCycleMinutes: 3
NicknameSyncFormat: "%username%"
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Ban sync
#
# Mirrors bans between Minecraft and Discord for linked accounts. Each
# direction is independently toggled. Requires GUILD_MODERATION intent
# (not privileged, added automatically) for the Discord -> Minecraft
# direction.
#
# BanSyncMinecraftToDiscord: ban a linked player's Discord account when
# they get banned on the Minecraft server
# BanSyncDiscordToMinecraft: ban a linked player on the Minecraft server
# when their Discord account gets banned
# BanSyncDiscordToMinecraftReason: the ban reason shown on the Minecraft
# side when a Discord ban is mirrored over
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
BanSyncMinecraftToDiscord: false
BanSyncDiscordToMinecraft: false
BanSyncDiscordToMinecraftReason: "&cYou have been banned until further notice because you were banned on our Discord server."
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Require linked account to play
#
# IMPORTANT: because our linking flow normally starts in Discord (/link
# there, then /connect in-game), a player denied here could never run
# /connect. So an unlinked player gets a FRESH code generated right in
# their kick message instead - no in-game step needed - and completes
# linking by sending that code straight to the bot in a DM. Requires
# DIRECT_MESSAGES + MESSAGE_CONTENT intents (added automatically when
# this is enabled) - MESSAGE_CONTENT is privileged, enable it in the
# Discord Developer Portal if it isn't already (needed for ChatBridge too).
#
# LinkingGateEnabled: whether the gate is on at all
# LinkingGateRequiredRoleId: a Discord role ID a linked account must also
# hold to be let in (Twitch-sub-style). Leave blank to only require
# being linked, no role check.
# LinkingGateBypassNames: Minecraft usernames that always get in regardless
# LinkingGateWhitelistedPlayersBypass: whether being on the server's
# vanilla whitelist is enough to skip this check entirely
# LinkingGateNotLinkedMessage / NotSubscriberMessage / StartingMessage: kick
# messages. Not-linked supports {BOT} (bot name), {CODE} (their fresh
# verification code), {INVITE} (LinkingGateInviteLink below)
# LinkingGateInviteLink: your Discord server's invite link, shown in the
# not-linked kick message
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
LinkingGateEnabled: false
LinkingGateRequiredRoleId: ""
LinkingGateBypassNames: []
LinkingGateWhitelistedPlayersBypass: true
LinkingGateNotLinkedMessage: "&7You must link your &9Discord&7 account to play.\n\n&7Send a DM to &b{BOT}&7 containing just &b{CODE}&7 to link your account.\n\n&7Discord Invite \u00bb &b{INVITE}"
LinkingGateNotSubscriberMessage: "&cYou're linked, but you don't have the required Discord role to play yet."
LinkingGateStartingMessage: "&cStill connecting to Discord to check your link status - try again in a minute."
LinkingGateInviteLink: ""
Messages
Discord:
Cooldown: "You're requesting codes too fast - please wait a bit and try again."
AlreadyLinked: "This Discord account is already linked to a Minecraft account."
CodeMessage: "Your code is **{code}**. In-game, run `/connect {code}` within {expiry} minutes."
WrongChannel: "Please use {channel} to request a link code."
EmbedTitle: "Link your Minecraft account"
EmbedDescriptionWithButton: "Click the button below to get a one-time code, then run `/connect <code>` in-game."
ButtonLabel: "Get Code"
LinkedConfirmation: "You're now linked to **{player}**! Chat bridge and role sync (if enabled) are active for this account."
Minecraft:
PlayersOnly: "&cOnly players can use this command."
ConnectUsage: "&cUsage: /connect <code>"
ConnectLockedOut: "&cToo many failed attempts. Try again in {seconds}s."
InvalidOrExpiredCode: "&cThat code is invalid or has expired. Request a new one in Discord."
AlreadyLinked: "&cYou're already linked to a Discord account."
LinkSuccess: "&aYour account is now linked to Discord!"
RdclUsage: "&cUsage: /dclink reload"
RdclReloaded: "&aDCLink configuration reloaded."
PostEmbedUsage: "&cUsage: /postlinkembed [channelId] (or set LinkChannelId in config.yml)"
PostedWithButton: "&aPosted the link embed."
ChannelNotFound: "&cThat channel wasn't found - check the ID and that the bot can see it."
PostEmbedError: "&cFailed to post the embed - check the console for details."
Commands
- postlinkembed <channel id> - posts an embed onto the designated channel
- connect <c0de> - used inside the game, lets players link their accounts
- link - used in discord, gives the player the code needed for linking
- wdclink reload - reloads the plugin after config changes are done (Default: OP)
- wdclink migrate - used for migrating DiscordSRV data to WCDL (Default: OP)
- wdclink unlink - unlinks players (Default: OP)
- wdclink whois - gets the players linked discord ID and name (Default: OP)
- wdclink syncroles - forcibly sync players roles (Default: OP)
- wdclink boosters - gives out a list of players who boosted discord (Default: OP)
Permissions
- wdclink.admin - Access to admin commands (Default: OP)
- wdclink.nicknamesync - whether to sync a players names or not (Default)
Placeholders (Placeholder API)
- %wdclink_linked% - If Player is Linked or not (yes|no)
- %wdclink_did% - Player Discord ID
- %wdclink_dname% - Player Discord Username
- %wdclink_dtag% - Player Discord Display Name
- %wdclink_davatar% - Discord Avatar URL
- %wdclink_booster% - If Player is a Booster or not (yes|no)
Ongoing Features
- boosters (WIP, currently gives placeholders for admins to use for other plugins)


