Following the wiki, everything works except account linking.
Server is running Forge 1.19.4 on Ubuntu 22.04 via Pterodactyl (Java 17). Bot was invited normally using the /mc2discord invite command.
Console log:
[12:11:19] [boundedElastic-9/WARN] [mc2discord/]: Can't change pseudo for member Hasumin (IG : hsmn)
[ERROR] (boundedElastic-9) Operator called default onErrorDropped - ml.denisd3d.mc2discord.repack.reactor.core.Exceptions$ErrorCallbackNotImplemented: ml.denisd3d.mc2discord.repack.discord4j.rest.http.client.ClientException: PUT /guilds/1087323928256577628/members/489578008030740500/roles/1103901713091539036 returned 403 Forbidden with response {code=50001, message=Missing Access}
ml.denisd3d.mc2discord.repack.reactor.core.Exceptions$ErrorCallbackNotImplemented: ml.denisd3d.mc2discord.repack.discord4j.rest.http.client.ClientException: PUT /guilds/1087323928256577628/members/489578008030740500/roles/1103901713091539036 returned 403 Forbidden with response {code=50001, message=Missing Access}
Caused by: ml.denisd3d.mc2discord.repack.discord4j.rest.http.client.ClientException: PUT /guilds/1087323928256577628/members/489578008030740500/roles/1103901713091539036 returned 403 Forbidden with response {code=50001, message=Missing Access}
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.discord4j.rest.http.client.ClientResponse.clientException(ClientResponse.java:171)
Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below:
Error has been observed at the following site(s):
*__checkpoint ⇢ Request to PUT /guilds/1087323928256577628/members/489578008030740500/roles/1103901713091539036 [RequestStream]
*__checkpoint ⇢ Request to PUT /guilds/1087323928256577628/members/489578008030740500/roles/1103901713091539036 [DefaultRouter]
Original Stack Trace:
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.discord4j.rest.http.client.ClientResponse.clientException(ClientResponse.java:171)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.discord4j.rest.http.client.ClientResponse.lambda$createException$13(ClientResponse.java:149)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:125)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:126)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:224)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:113)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onNext(FluxHandleFuseable.java:191)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onComplete(MonoCollectList.java:129)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:415)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:424)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:478)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:712)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:113)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1372)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1235)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1284)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:507)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:446)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at TRANSFORMER/mc2discord@3.3.1-pre/ml.denisd3d.mc2discord.repack.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Your upload command isn't working (as https://m2d.denisd3d.ml is down and upon checking it doesn't seem like I'm the only one that can't access it, it's actually down), so I'm pasting the config here without sensitive data:
# Change the language of the mod. Delete the rest of this file to translate the config. Big thanks to the translators : Morty#0273 (ru_ru), PixelVoxel#4327 (ko_kr)
# Supported language : en_us, fr_fr, ru_ru, ko_kr
lang = "en_us"
# Minecraft2Discord configuration
# - Curseforge: https://www.curseforge.com/minecraft/mc-mods/minecraft2discord
# - Modrinth: https://modrinth.com/mod/minecraft2discord
# - Discord: https://discord.gg/rzzd76c
# - Github: https://github.com/DenisD3D/Minecraft2Discord
# - Wiki: https://github.com/DenisD3D/Minecraft2Discord/wiki
#
# Read the wiki for a quick start guide or for more advanced customization
# You can also join the discord to get some help
#
# You can use discord markdown
# Many variables are available to customize the behavior. Check them on the wiki: https://github.com/DenisD3D/Minecraft2Discord/wiki/Variables
[General]
# Token for the bot. This is a secret string that can be generated on discord website. More info here: https://github.com/DenisD3D/Minecraft2Discord/wiki/Discord-token
token = --redacted--
# Channels configuration. You may duplicate this block. Each one correspond to one channel
# id is the discord id of the channel. See: https://github.com/DenisD3D/Minecraft2Discord/wiki/Discord-ids
# subscriptions is an array of what type of message you want in this channel. Currently supported are:
# - chat (player chat message in both direction)
# - info (join, leave, start, stop, death, advancement)
# - command (listen to command, see Commands section)
# - log (all the log of the server)
# - discord_announcement (for relaying announcement channel to Discord)
# mode define how to send messages (WEBHOOK, PLAIN_TEXT or EMBED)
[Channels]
[[Channels.Channel]]
id = --redacted--
subscriptions = ["info", "chat", "command"]
mode = "WEBHOOK"
# Customize here the message that are sent on discord. To disable one, set an empty value ("")
# For the list of available variables see: https://github.com/DenisD3D/Minecraft2Discord/wiki/Variables
[Messages]
# Global variables only
start = "The server has started"
# Global variables only
stop = "The server has stopped"
# Global variables and Player variables
join = "${player_display_name} joined the game"
# Global variables and Player variables
leave = "${player_display_name} left the game"
# Global variables, Player variables and Death variables
death = "${death_message}"
# Global variables, Player variables and Advancement variables
advancement = "${player_display_name} has made the advancement ${advancement_title}. ${advancement_description}."
[Commands]
# Prefix used before each command. Minecraft default one is '/' (eg : /help)
prefix = "/"
# If true, text returned by commands will be in a Discord code block
use_codeblocks = true
# Response when the user isn't allowed to use the command
error = "Sorry, you're not allowed to use that command!"
# Commands permissions configuration. You may duplicate the block. Each block correspond to one rule
# id is an user id or a role id. The rule (current block) will apply for this user or users with this role
# commands is a list of the commands that are allowed in addition of the permission level
# permission_level allow all the commands with this permission or under level. -1 mean only the commands in the list commands above and 0 mean all non op commands
# comment not used by the mod. You can use it to remember what the rule is for
# see https://minecraft.gamepedia.com/Server.properties#op-permission-level
[[Commands.Command]]
id = 0
commands = ["help"]
permission_level = -1
comment = ""
[Status]
[Status.Presence]
# Message to display under the bot in the member list on Discord
message = " Minecraft (${online_players} online)"
#The type of presence (PLAYING, STREAMING, LISTENING, WATCHING, COMPETING)
type = "PLAYING"
# Update frequency of the presence message (in seconds). A too low number might result in limitation from Discord
update = 60
# Only if type is STREAMING, ignored for others. Must be a valid youtube or twitch link.
link = ""
# Status channels configuration. You may duplicate the block. Each block correspond to one channel
# id is the discord id of the channel. See : https://github.com/DenisD3D/Minecraft2Discord/wiki/Discord-ids
# update_period is the update frequency of the channel (in seconds). A too low number might result in limitation form Discord (max 2 update per 10 minutes as of writing)
# name_message is the message to set as a name of the channel. You can use Global variables. If the channel is a text channel, whitespace will be replaced by '-'
# topic_message is the message to set as the description of the channel. You can use Global variables
[Status.Channels]
[[Status.Channels.Channel]]
id = 0
update_period = 610
name_message = "${online_players} / ${max_players}"
topic_message = "${online_players} / ${max_players}"
[Features]
# Enable account linking features (use /mc2discord restart to generate the associated config). Require SERVER MEMBERS INTENT to be enabled for all features to work
account_linking = true
[Account]
# The id of the guild your players are on
guild_id = --redacted--
# If true, the member on discord will be renamed to the format in discord_pseudo_format
rename_discord_member = true
# The format to rename the discord member. Available variables : Player & Member
discord_pseudo_format = "${member_name} (IG: ${player_name})"
# The link command (you need to leave & rejoin for the command to appear in suggestion, old command will disappear after a server restart)
link_command = "discord link"
# The unlink command (you need to leave & rejoin for the command to appear in suggestion, old command will disappear after a server restart)
unlink_command = "discord unlink"
# If true, non linked players will be kick of the server at login with a link code else players will be able to link using the command
force_link = false
# Customize here the message that are sent
[Account.Messages]
# Message to give the code to the player. ${code} will be replaced by the code
link_get_code = "To link your account please send $c!code ${code}$r to ${bot_name}#${bot_discriminator} in a private message on Discord"
# The message sent when link is complete
link_successful = "You have successfully linked your account"
# The message sent when the code is wrong
link_invalid_code = "This code is invalid"
# The message sent when the account is already linked
link_error_already = "Your account is already linked"
# The message sent when the account unlinking is successful
unlink_successful = "Your account is now unlinked"
# The message sent when the account unlink is unsuccessful
unlink_error = "Can't unlink your account"
# The message sent when the account is missing some roles
missing_roles = "You are missing some permissions or roles on Discord needed for Account Linking"
# Set here some requirements to link accounts: required_roles_id is an array of role id required to make the link & roles_id_to_give is an array of role id that will be given on the link. You may create multiple block
[[Account.Policy]]
required_roles_id = [--redacted--]
roles_id_to_give = [--redacted--]
# Style configuration
[Style]
# Override the bot name in webhook mode. You may use global variable here
bot_name = ""
# Override the bot avatar in webhook mode. Must be a valid an url. You may use global variable here
bot_avatar = ""
# Url to fetch player avatar from. Must be a valid url and not empty. You may use Global variables and Player variables here
avatar_api = "https://mc-heads.net/head/${player_uuid}/right"
# Format for the messages sent in the minecraft chat. You may use Global variables, Member variables and Message variable here. You may change the color with '${color_start_COLOR} CONTENT ${color_end}' where COLOR is a hex color or 'top_role' for discord highest role color. ${reply} will be replaced with reply_format if the message has a referenced message.
minecraft_chat_format = "${color_start_#ffff00}<Discord - ${color_end}${color_start_top_role}${member_nickname}${color_end}${color_start_#ffff00}>${color_end} ${message}"
# Format for chat messages sent in discord when webhook mode is turned to false. You may use Global variables, Player variables and Message variable here
discord_chat_format = "**${player_display_name}**: ${message}"
# Replace ${reply} in minecraft_chat_format if the message has a referenced message. You may use Global variables and Member (author of the referenced message) variables here.
reply_format = "Replying to ${member_nickname}: "
# If true, the server avatar will be shown in the embed for info messages
embed_show_server_avatar = false
[Style.embed_color]
# Color for the embeds. A int color or one of https://github.com/DenisD3D/Mc2Discord/blob/main/mc2discord-core/src/main/java/ml/denisd3d/mc2discord/core/M2DUtils.java#L102-L134
info = "SUMMER_SKY"
chat = "MEDIUM_SEA_GREEN"
command = "MEDIUM_SEA_GREEN"
log = "SUMMER_SKY"
# The rest of the settings
[Misc]
# Define if other bots messages must be sent in the minecraft chat
relay_bot_messages = false
# Define if /say & /me command must be relayed on Discord
relay_say_me_tellraw_command = true
# List of allowed mention type. Supported value : "EVERYONE_AND_HERE", "ROLE", "USER"
# Eg : ["ROLE", "USER"] to allow all mention except @everyone & @here
allowed_mention = []
# Message for the /discord command
discord_text = "Invitation link not set"
# Link for the /discord command
discord_link = "https://discord.gg/"
# Format for forwarding the log on Discord
logs_format = "[${log_time!HH:mm:ss}] [${log_thread_name}/${log_level}] [${log_logger_name}]: ${log_message}"
# Level for the log on Discord (FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ALL)
logs_level = "INFO"
# List of class to prevent from being sent to discord. You may use a package or a fully qualified class name. Eg: ["net.minecraft", "com.asupermod.somepackage.AClassToBan"]
banned_mods_messages = []
Describe the bug
Following the wiki, everything works except account linking.
Server is running Forge 1.19.4 on Ubuntu 22.04 via Pterodactyl (Java 17). Bot was invited normally using the
/mc2discord invite
command.Console log:
Your upload command isn't working (as https://m2d.denisd3d.ml is down and upon checking it doesn't seem like I'm the only one that can't access it, it's actually down), so I'm pasting the config here without sensitive data:
Your config file
N/A