Synccord
A Discord Bot for your Minecraftserver.
Quick challenge
How far can you run before the mobs catch you?
Minecraft check
Confirm your run
Complete the quick check to get your code.
Synccord
🇬🇧 English
Synccord is an all-in-one integration plugin that connects your Paper/Spigot server with a Discord guild:
✅ Account linking via codes (MC ↔ Discord) with SQLite storage
🔁 Role sync between Discord roles and LuckPerms groups
💬 Full chat bridge (Minecraft ↔ Discord) + join/leave/death embeds
🧾 Ticket system with buttons, modals, LiteBans hook & transcripts
📊 Live server status embed (TPS, MSPT, players, IPs) with offline detection
👥 Online player list embed that updates automatically
📜 Rule acceptance flow with code word & auto-role
🧩 PlaceholderAPI expansion (synccord_…) for stats, link state & Discord info
⚙️ Everything configurable via config.yml, lang/de.yml, rules.yml
🪲 Debug mode with detailed log messages
📈 bStats support
Features in detail 🔗 Account linking (MC ↔ Discord)
Code-based linking:
On the Minecraft side a code is generated.
On Discord you confirm the code via Slash-/Button flow.
Links are stored in SQLite (linked_users table) – no YAML spam.
Commands:
/dcfind <player> – show linked Discord ID + tag for a Minecraft player
/unlinkdiscord <player> – remove an existing link (Minecraft, admin)
/linkmc … & /unlinkmc … – Discord slash commands to link/unlink from Discord
Placeholders & Lang-keys show link status, last link time, remaining code time, etc.
🎭 RoleSync (Discord ↔ LuckPerms)
Discord → Minecraft:
role-link: in config.yml maps Discord role IDs → LuckPerms groups.
On player join, Synccord looks up the linked Discord member and syncs groups.
Groups are added/removed so that Discord role setup and in-game groups always match.
Extensive debug logs: which role/group combination is checked, added, removed, or unchanged.
Errors (missing guild id / role / member) are localized via lang/de.yml.
(LuckPerms is a hard dependency.)
💬 Chat bridge & Join/Leave/Death embeds
Minecraft → Discord:
All chat messages go into the configured discord.chat-channel-id.
Uses PlaceholderAPI to format player name, prefix, status, etc.
Configurable format in config.yml (chat.format-to-discord).
Discord → Minecraft:
Messages from the configured channel are sent into the Minecraft chat.
Supports placeholder replacement and color codes.
Can block mentions and ignore bot messages.
Join/Leave/Death forwarding:
Randomizable messages for join/leave/death (discord.join-messages, discord.leave-messages, discord.death-messages).
Embedded messages with color and player name.
Features toggleable via features.send-join, features.send-leave, features.send-death.
🧾 Ticket system (Discord-only, but Minecraft-aware)
Multiple ticket types in config.yml under tickets: (e.g. support, entbannung, bugreport, teamapply, vorschlag, kriegsanfrage …)
Each type has:
Name, description, button label
Support roles (supporter_roles)
Ticket category (Discord category ID)
Optional LiteBans hook to attach ban info to unban tickets
A list of questions with max input length (modal form)
Slash command /ticket setup … (Discord) to post ticket panels.
When a ticket is created:
A private ticket channel is created in the configured category.
Supporters get permissions, the user sees only their own ticket.
Transcripts:
On closing a ticket, all messages are collected and uploaded as transcript.txt in the log channel, with an informative embed.
Minecraft integration:
When a staff member joins the server and there are open tickets, they receive an in-game reminder (configurable Lang key).
📊 Live server status embed
Slash command /setup info sends a server info panel to a Discord channel:
TPS, MSPT, uptime
Online player count
Java & Bedrock IP from config
tps-monitor automatically updates the embed every X seconds.
Synccord remembers channel + message ID in a small YAML file and restores them after restart.
If the server is offline, InfoUpdaterOffline replaces the panel with an “offline” embed and a button, so users always see a valid status.
👥 Online player list embed
Separate player list embed:
Shows current online players with rank & aliases (playerlist.rank-aliases).
Config options: show rank, alias, name; line format per player.
Updates automatically on player join / quit.
Stores channel + message ID and reuses them after restart.
📜 Rules & code-word acceptance
File rules.yml holds your server rules in multiple sections.
Discord slash command /setup regel:
Sends the rules into a channel (split into multiple embeds if needed).
Adds a “Accept rules” button that opens a modal with a code word.
If the user enters the correct codeword from config.yml (rules.keyword):
They receive the configured accept role (rules.accept-role-id).
Errors, success, and debug messages are fully localized via Lang.
🧩 PlaceholderAPI: %synccord_*%
Synccord registers a PlaceholderAPI expansion synccord with many placeholders, for example:
Global:
%synccord_tps%, %synccord_mspt%
%synccord_online_count%, %synccord_max_players%
%synccord_uptime%
%synccord_ip_java%, %synccord_ip_bedrock%
%synccord_synccord_version%
%synccord_status_embed_active%, %synccord_playerlist_embed_active%
%synccord_discord_online%, %synccord_linked_online%
%synccord_tickets_open%
Per-player (needs player context & link):
Basic: %synccord_player%, %synccord_uuid%, %synccord_x%, %synccord_y%, %synccord_z%
Link state: %synccord_discord_id%, %synccord_discord_linked%, %synccord_discord_status%
Discord info: %synccord_discord_tag%, %synccord_discord_username%, %synccord_discord_avatar%
Roles: %synccord_discord_roles%, %synccord_role_count%, %synccord_highest_role%
Linking info: %synccord_last_linked%, %synccord_code_expire%, %synccord_sync_fail_reason%
Tickets: %synccord_tickets_user%, %synccord_ticket_support_role%, %synccord_last_ticket_time%
Perfect for Scoreboards, MOTDs, TAB, or other chat plugins.
🛠 Language, debug & metrics
All user-visible text is in lang/de.yml:
Normal messages, error messages, debug logs, ticket texts, rule messages, etc.
Missing keys get a clear “missing key” message so you can fix them.
debug: true in config.yml enables very detailed debug logging:
Linking, Slash commands, role sync, tickets, embeds, Playerlist, InfoUpdater, etc.
bStats is integrated (ID is configured in the plugin) to provide anonymous statistics.
📦 Requirements
Server: Paper / Purpur / Spigot (tested with 1.21)
Java: modern LTS (e.g. Java 17+; plugin is built for Java 21)
Dependencies:
Required: LuckPerms
Optional but supported:
LiteBans – for unban ticket integration
PlaceholderAPI – for placeholders & chat formatting
🇩🇪 Deutsch
Synccord ist ein umfangreiches Discord-↔-Minecraft-Plugin:
✅ Account-Verknüpfung (MC ↔ Discord) mit Codes & SQLite
🔁 Rollen-Sync zwischen Discord-Rollen und LuckPerms-Gruppen
💬 Chat-Bridge (Minecraft ↔ Discord) inkl. Join/Leave/Tod-Embeds
🧾 Ticketsystem mit Buttons, Modals, LiteBans-Anbindung & Transkript
📊 Serverstatus-Embed (TPS, MSPT, Spieler, IPs) mit Offline-Erkennung
👥 Spielerliste-Embed, das sich automatisch aktualisiert
📜 Regel-System mit Codewort-Abfrage & Auto-Rolle
🧩 PlaceholderAPI-Expansion (synccord_…) für Stats, Linkstatus & Discord-Infos
⚙️ Voll konfigurierbar über config.yml, lang/de.yml, rules.yml
🪲 Debug-Modus mit ausführlichen Logs
📈 bStats-Unterstützung
Funktionsübersicht 🔗 Account-Verknüpfung (Minecraft ↔ Discord)
Spieler erhalten im Minecraft einen Code, den sie auf Discord bestätigen.
Die Verknüpfung wird in einer SQLite-Datenbank gespeichert – dauerhaft und sauber.
Befehle:
/dcfind <Spieler> – zeigt die verknüpfte Discord-ID + Tag eines Spielers
/unlinkdiscord <Spieler> – entfernt eine Verknüpfung (Minecraft, Admin)
/linkmc … / /unlinkmc … – Slash-Commands auf Discord
Placeholders & Langtexte liefern Infos zu Linkstatus, letztem Link, Restlaufzeit des Codes usw.
🎭 Rollen-Synchronisation
Discord → Minecraft (LuckPerms):
In config.yml unter role-link: werden Discord-Rollen-IDs → LuckPerms-Gruppen gemappt.
Beim Join eines verknüpften Spielers werden die Gruppen in LuckPerms angepasst.
Gruppen werden hinzugefügt/entfernt, bis sie zu den vorhandenen Discord-Rollen passen.
Umfangreiche Debug-Ausgaben: welche Rolle/Gruppe geprüft, hinzugefügt, entfernt oder ignoriert wurde.
Fehler (fehlende Guild-ID, Rolle, Member) laufen komplett über die Sprachdatei.
💬 Chat-Bridge & Join/Leave/Tod
Minecraft → Discord:
Chat aus Minecraft geht in den konfigurierten Discord-Channel (discord.chat-channel-id).
PlaceholderAPI kann benutzt werden, um Namen, Prefix, Status usw. einzubauen.
Format konfigurierbar in config.yml (chat.format-to-discord).
Discord → Minecraft:
Nachrichten aus dem Chat-Channel werden in Minecraft angezeigt.
Mentions können geblockt werden, Bots ignoriert werden.
Join/Leave/Tod-Weiterleitung:
Zufällige Join-/Leave-/Death-Texte (discord.join-messages, discord.leave-messages, discord.death-messages).
Darstellung als Embed mit Farbe & Spielernamen.
Über features.send-join, features.send-leave, features.send-death einzeln deaktivierbar.
🧾 Ticketsystem
Tickets werden komplett über Discord erstellt, sind aber Minecraft-aware.
Mehrere Tickettypen unter tickets: in config.yml:
z. B. support, entbannung, bugreport, teamapply, vorschlag, kriegsanfrage …
Pro Typ:
Name, Beschreibung, Button-Text
Supporter-Rollen (supporter_roles)
Ticket-Kategorie (Channel-Kategorie)
Optional LiteBans-Hook (z. B. für Entbannungs-Tickets)
Fragen mit maximaler Zeichenzahl (Modal-Formular)
Slash-Command /ticket setup … zum Posten der Ticket-Embeds.
Beim Erstellen:
Private Ticket-Channel mit passenden Rechten für User & Supporter.
Transkript:
Beim Schließen werden alle Nachrichten gesammelt, als transcript.txt in den Logchannel geladen + Embed mit Metadaten.
Minecraft-Integration:
Join-Hinweis im Spiel, wenn offene Tickets existieren (für berechtigte Spieler).
📊 Live-Serverstatus
/setup info postet einen Status-Embed:
TPS, MSPT, Uptime
Spieleranzahl
Java- & Bedrock-IP aus der Config
tps-monitor aktualisiert den Embed automatisch in einem Intervall.
Synccord speichert Channel + Message-ID und belebt alles nach einem Restart wieder.
Wenn der Server nicht erreichbar ist, wird ein Offline-Embed gesendet, sodass der Status nie “veraltet” wirkt.
👥 Spielerliste-Embed
Eigenes Playerlist-Panel:
Zeigt alle online Spieler mit Gruppe und Alias (playerlist.rank-aliases).
Anzeige pro Spieler über ein Format ({alias} {name} etc.) definierbar.
Wird bei Join/Quit automatisch aktualisiert.
Channel + Nachricht werden persistent gespeichert und nach Neustart wiederverwendet.
📜 Regeln & Codewort-System
rules.yml enthält deine Serverregeln in Kategorien.
/setup regel auf Discord:
Postet die Regeln als mehrere Embeds.
Fügt einen Button hinzu, der ein Modal mit Codewort-Eingabe öffnet.
Korrektes Codewort (rules.keyword):
Benutzer bekommt die definierte Rolle (rules.accept-role-id).
Alle Texte (Fehler, Erfolg, Debug) laufen über lang/de.yml.
🧩 PlaceholderAPI-Expansion synccord
Synccord bringt eine große Anzahl an Placeholders mit:
Global:
%synccord_tps%, %synccord_mspt%
%synccord_online_count%, %synccord_max_players%
%synccord_uptime%
%synccord_ip_java%, %synccord_ip_bedrock%
%synccord_synccord_version%
%synccord_status_embed_active%, %synccord_playerlist_embed_active%
%synccord_discord_online%, %synccord_linked_online%
%synccord_tickets_open%
Spielerbezogen:
Basis: %synccord_player%, %synccord_uuid%, %synccord_x%, %synccord_y%, %synccord_z%
Link: %synccord_discord_id%, %synccord_discord_linked%, %synccord_discord_status%
Discord-Infos: %synccord_discord_tag%, %synccord_discord_username%, %synccord_discord_avatar%
Rollen: %synccord_discord_roles%, %synccord_role_count%, %synccord_highest_role%
Linking: %synccord_last_linked%, %synccord_code_expire%, %synccord_sync_fail_reason%
Tickets: %synccord_tickets_user%, %synccord_ticket_support_role%, %synccord_last_ticket_time%
Ideal für Scoreboards, TAB, Chat-Plugins, MOTD usw.
🛠 Sprache, Debug & Statistiken
Alle Texte im Plugin sind über lang/de.yml anpassbar.
Fehlende Keys werden klar gekennzeichnet, damit du sie schnell ergänzen kannst.
debug: true in der Config aktiviert umfangreiche Debug-Ausgaben für:
Linking, RoleSync, Ticketsystem, Status-Panel, Playerlist, Chat-Bridge usw.
bStats ist integriert.
📦 Voraussetzungen
Server: Paper / Purpur / Spigot (getestet mit 1.21)
Java: moderne Java-Version (empfohlen: Java 17+ / 21)
Abhängigkeiten:
Pflicht: LuckPerms
Optional: LiteBans, PlaceholderAPI