Merge branch 'slash_commands'

# Conflicts:
#	src/main/java/com/alttd/proxydiscordlink/bot/Bot.java
#	src/main/java/com/alttd/proxydiscordlink/util/Utilities.java
This commit is contained in:
Teriuihi 2024-08-09 22:58:21 +02:00
commit 3b4a4660d0
38 changed files with 876 additions and 580 deletions

View File

@ -7,7 +7,7 @@ plugins {
allprojects {
val build = System.getenv("BUILD_NUMBER") ?: "SNAPSHOT"
group = "com.alttd.proxydiscordlink"
version = "1.0.0-BETA-$build"
version = "1.0.1-BETA-$build"
description = "A velocity plugin to link Discord and Minecraft accounts."
apply(plugin = "java")
@ -38,8 +38,8 @@ dependencies {
compileOnly("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT") // Velocity
annotationProcessor("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT")
// JDA
implementation("net.dv8tion:JDA:5.0.0-alpha.3") {
shadow("net.dv8tion:JDA:5.0.0-alpha.3") {
implementation("net.dv8tion:JDA:5.0.0-beta.2") {
shadow("net.dv8tion:JDA:5.0.0-beta.2") {
exclude("opus-java") // exclude audio
}
compileOnly("com.gitlab.ruany:LitebansAPI:0.3.5")

View File

@ -19,11 +19,11 @@ import com.velocitypowered.api.plugin.Dependency;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.ProxyServer;
import org.slf4j.Logger;
import java.io.File;
import java.nio.file.Path;
import java.sql.SQLException;
import java.util.logging.Logger;
@Plugin(id = "proxydiscordlink", name = "ProxyDiscordLink", version = "1.0.0",
description = "A plugin that links Discord accounts with uuid's",
@ -63,8 +63,8 @@ public class DiscordLink {
DatabaseConnection.initialize();
} catch (SQLException exception) {
exception.printStackTrace();
getLogger().severe("*** Could not connect to the database. ***");
getLogger().severe("*** This plugin will be disabled. ***");
ALogger.error("*** Could not connect to the database. ***");
ALogger.error("*** This plugin will be disabled. ***");
//TODO shutdown plugin
}
loadCommands();

View File

@ -0,0 +1,23 @@
package com.alttd.proxydiscordlink;
import com.alttd.proxydiscordlink.bot.commandManager.CommandManager;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.session.ReadyEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
public class JDAListener extends ListenerAdapter {
private final JDA jda;
public JDAListener(JDA jda) {
this.jda = jda;
}
@Override
public void onReady(@NotNull ReadyEvent event) {
CommandManager commandManager = new CommandManager(jda);
jda.addEventListener(commandManager);
}
}

View File

@ -1,9 +1,12 @@
package com.alttd.proxydiscordlink.bot;
import com.alttd.proxydiscordlink.JDAListener;
import com.alttd.proxydiscordlink.bot.commandManager.CommandManager;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.listeners.DiscordMessageListener;
import com.alttd.proxydiscordlink.bot.listeners.DiscordRoleListener;
import com.alttd.proxydiscordlink.bot.tasks.CheckLinkSync;
import com.alttd.proxydiscordlink.bot.tasks.CheckLinkSync;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.util.ALogger;
import net.dv8tion.jda.api.EmbedBuilder;
@ -13,9 +16,11 @@ import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.exceptions.HierarchyException;
import net.dv8tion.jda.api.exceptions.InsufficientPermissionException;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import org.jetbrains.annotations.Nullable;
@ -33,15 +38,16 @@ public class Bot {
disconnect();
try {
jda = JDABuilder
.createDefault(BotConfig.BOT_TOKEN)
.createDefault(BotConfig.DISCORD.BOT_TOKEN)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
jda.setAutoReconnect(true);
jda.awaitReady();
jda.addEventListener(new DiscordMessageListener(),
new DiscordRoleListener());
jda.addEventListener(
new DiscordMessageListener(),
new DiscordRoleListener(),
new JDAListener(jda)));
DiscordCommand.loadCommands();
DiscordLink.getPlugin().getProxy().getScheduler().buildTask(DiscordLink.getPlugin(), new CheckLinkSync())
.delay(120, TimeUnit.SECONDS)
@ -236,9 +242,9 @@ public class Bot {
private void discordBan(Member member, @Nullable String optionalReason) {
try {
if (optionalReason == null)
member.ban(0).queue();
member.ban(0, TimeUnit.DAYS).queue();
else
member.ban(0, optionalReason).queue();
member.ban(0, TimeUnit.DAYS).reason(optionalReason).queue();
} catch (InsufficientPermissionException exception) {
ALogger.warn("Unable to ban " + member.getAsMention() + " : " + member.getId() + " from Discord they might be above me.");
}
@ -259,4 +265,8 @@ public class Bot {
return guild.getMembers().stream().filter(member -> member.getRoles().contains(role)).toList();
}
public void addListener(ListenerAdapter listenerAdapter) {
jda.addEventListener(listenerAdapter);
}
}

View File

@ -1,40 +0,0 @@
package com.alttd.proxydiscordlink.bot;
import com.alttd.proxydiscordlink.bot.commands.*;
import net.dv8tion.jda.api.entities.Message;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class DiscordCommand {
private static List<DiscordCommand> commands;
public abstract String getCommand();
public abstract String getPermission();// TODO discord and LP permissions
public abstract String getDescription();
public abstract String getSyntax();
public abstract long getChannel();
public abstract void handleCommand(Message message, String sender, String command, String[] args);
public static void loadCommands() {
commands = new ArrayList<>();
loadCommand(new DiscordLinkCommand(),
new DiscordUnlink(),
new DiscordNick(),
new DiscordStaffList(),
new DiscordServerList()
);
}
private static void loadCommand(DiscordCommand ... discordCommands) {
Collections.addAll(commands, discordCommands);
}
public static List<DiscordCommand> getCommands() {
return commands;
}
}

View File

@ -0,0 +1,58 @@
package com.alttd.proxydiscordlink.bot.commandManager;
import com.alttd.proxydiscordlink.bot.commandManager.commands.*;
import com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand.CommandNick;
import com.alttd.proxydiscordlink.util.ALogger;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.util.List;
import java.util.Optional;
public class CommandManager extends ListenerAdapter {
private final List<DiscordCommand> commands;
public CommandManager(JDA jda) {
ALogger.info("Loading commands...");
commands = List.of(
new CommandLink(jda),
new CommandUnlink(jda),
new CommandNick(jda),
new CommandServerList(jda),
new CommandStaffList(jda),
new CommandBroadcast(jda)
);
}
@Override
public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {
String commandName = event.getName();
Optional<DiscordCommand> first = commands.stream()
.filter(discordCommand -> discordCommand.getName().equalsIgnoreCase(commandName))
.findFirst();
if (first.isEmpty()) {
return;
}
first.get().execute(event);
}
@Override
public void onCommandAutoCompleteInteraction(@NotNull CommandAutoCompleteInteractionEvent event) {
Optional<DiscordCommand> first = commands.stream()
.filter(discordCommand -> discordCommand.getName().equalsIgnoreCase(event.getName()))
.findFirst();
if (first.isEmpty())
return;
first.get().suggest(event);
}
public List<DiscordCommand> getCommands() {
return commands;
}
}

View File

@ -0,0 +1,22 @@
package com.alttd.proxydiscordlink.bot.commandManager;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import java.util.ArrayList;
public abstract class DiscordCommand {
public abstract String getName();
public abstract void execute(SlashCommandInteractionEvent event);
public void suggest(CommandAutoCompleteInteractionEvent event) {
event.replyChoices(new ArrayList<>()).queue();
}
public abstract CommandData getCommandData();
public abstract long getChannelId();
}

View File

@ -0,0 +1,29 @@
package com.alttd.proxydiscordlink.bot.commandManager;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import java.util.ArrayList;
public abstract class SubCommand extends SubOption{
private final SubCommandGroup parentGroup;
private final boolean inSubGroup;
protected SubCommand(SubCommandGroup parentGroup, DiscordCommand parent) {
super(parent);
this.parentGroup = parentGroup;
this.inSubGroup = parentGroup != null;
}
public SubCommandGroup getParentGroup() {
return parentGroup;
}
public boolean isInSubGroup() {
return inSubGroup;
}
public void suggest(CommandAutoCompleteInteractionEvent event) {
event.replyChoices(new ArrayList<>()).queue();
}
}

View File

@ -0,0 +1,7 @@
package com.alttd.proxydiscordlink.bot.commandManager;
public abstract class SubCommandGroup extends SubOption{
protected SubCommandGroup(DiscordCommand parent) {
super(parent);
}
}

View File

@ -0,0 +1,21 @@
package com.alttd.proxydiscordlink.bot.commandManager;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
public abstract class SubOption {
private final DiscordCommand parent;
protected SubOption(DiscordCommand parent) {
this.parent = parent;
}
public DiscordCommand getParent() {
return parent;
}
public abstract String getName();
public abstract void execute(SlashCommandInteractionEvent event);
public abstract String getHelpMessage();
}

View File

@ -0,0 +1,49 @@
package com.alttd.proxydiscordlink.bot.commandManager.commands;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.util.Utilities;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
public class CommandBroadcast extends DiscordCommand {
CommandData commandData;
public CommandBroadcast(JDA jda) {
commandData = Commands.slash(getName(), "Broadcast a message to all online players")
.addOption(OptionType.STRING, "text", "Text to broadcast", true)
.setDefaultPermissions(DefaultMemberPermissions.DISABLED);
Utilities.registerCommand(jda, commandData);
}
@Override
public String getName() {
return "broadcast";
}
@Override
public void execute(SlashCommandInteractionEvent event) {
String msg = event.getOption("text", OptionMapping::getAsString);
if (msg == null) {
Utilities.commandErrAutoRem("Couldn't find text", event);
return;
}
event.replyEmbeds(Utilities.genericSuccessEmbed("Success", "Broadcast the following message:\n" + msg))
.setEphemeral(true).queue();
Utilities.broadcast(msg);
}
@Override
public CommandData getCommandData() {
return null;
}
@Override
public long getChannelId() {
return BotConfig.DISCORD.STAFF_COMMAND_CHANNEL;
}
}

View File

@ -1,17 +1,21 @@
package com.alttd.proxydiscordlink.bot.commands;
package com.alttd.proxydiscordlink.bot.commandManager.commands;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.bot.objects.DiscordRole;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.config.Config;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import com.alttd.proxydiscordlink.util.Utilities;
import com.velocitypowered.api.proxy.Player;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.exceptions.HierarchyException;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.luckperms.api.model.user.User;
import java.util.List;
@ -20,41 +24,34 @@ import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class DiscordLinkCommand extends DiscordCommand {
public class CommandLink extends DiscordCommand {
private final CommandData commandData;
public CommandLink(JDA jda) {
commandData = Commands.slash(getName(), "Link your Discord and Altitude Minecraft accounts")
.addOption(OptionType.STRING, "code", "The code you got from doing /discord link on Altitude in Minecraft", true)
.setDefaultPermissions(DefaultMemberPermissions.ENABLED);
Utilities.registerCommand(jda, commandData);
}
@Override
public String getCommand() {
public String getName() {
return "link";
}
@Override
public String getPermission() {
return null;
}
@Override
public String getDescription() {
return "Link your Minecraft and Discord accounts.";
}
@Override
public String getSyntax() {
return "link <code>";
}
@Override
public long getChannel() {
return BotConfig.LINK_CHANNEL;
}
@Override
public void handleCommand(Message message, String sender, String command, String[] args) {
Member member = message.getMember();
if (member == null)
public void execute(SlashCommandInteractionEvent event) {
Member member = event.getMember();
if (member == null) {
Utilities.commandErrAutoRem("Unable to find you", event);
return;
}
UUID uuid;
if ((uuid = getUUID(message.getTextChannel(), args.length == 1 ? args[0] : "")) == null)
UUID uuid = getUUID(event.getOption("code", OptionMapping::getAsString));
if (uuid == null) {
Utilities.commandErrAutoRem("This is not a valid link code, please check Minecraft and try again", event);
return;
}
List<DiscordRole> discordRoles = Utilities.getDiscordRolesForUser(uuid, member);
@ -69,10 +66,10 @@ public class DiscordLinkCommand extends DiscordCommand {
.map(DiscordRole::getInternalName)
.collect(Collectors.toList()));
linkAccount(discordLinkPlayer, message);
linkAccount(discordLinkPlayer, event);
}
private void linkAccount(DiscordLinkPlayer discordLinkPlayer, Message message) {
private void linkAccount(DiscordLinkPlayer discordLinkPlayer, SlashCommandInteractionEvent event) {
discordLinkPlayer.updateDiscord(
DiscordRole.getDiscordRoles().stream()
.filter(role -> discordLinkPlayer.getRoles().contains(role.getInternalName()))
@ -87,23 +84,30 @@ public class DiscordLinkCommand extends DiscordCommand {
discordLinkPlayer.linkedRole(true);
Player player = DiscordLink.getPlugin().getProxy().getPlayer(discordLinkPlayer.getUuid()).orElse(null);
User user = Utilities.getLuckPerms().getUserManager().getUser(discordLinkPlayer.getUuid());
Guild guild = event.getGuild();
Member member = event.getMember();
if (guild == null || member == null) {
Utilities.commandErrAutoRem("Unable to find guild", event);
return;
}
if (player != null || user != null)
DiscordLink.getPlugin().getBot().changeNick(
message.getGuild().getIdLong(),
message.getMember().getIdLong(),
guild.getIdLong(),
member.getIdLong(),
player == null ?
user.getUsername() :
player.getUsername());
else
DiscordLink.getPlugin().getBot().changeNick(
message.getGuild().getIdLong(),
message.getMember().getIdLong(),
guild.getIdLong(),
member.getIdLong(),
discordLinkPlayer.getUsername());
message.getChannel().sendMessage("You have successfully linked " +
discordLinkPlayer.getUsername() + " with " +
discordLinkPlayer.getDiscordUsername() + "!")
.queue(message1 -> message1.delete().queueAfter(5, TimeUnit.SECONDS));
event.replyEmbeds(Utilities.genericSuccessEmbed("Success","You have successfully linked " +
discordLinkPlayer.getUsername() + " with " +
discordLinkPlayer.getDiscordUsername() + "!"))
.setEphemeral(true)
.queue(result -> result.deleteOriginal().queueAfter(5, TimeUnit.SECONDS));
DiscordLinkPlayer.addDiscordLinkPlayer(discordLinkPlayer);
DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer);
@ -123,16 +127,19 @@ public class DiscordLinkCommand extends DiscordCommand {
return "No User";
}
private UUID getUUID(TextChannel channel, String code) {
UUID uuid;
if (code.matches("[0-9]{6}")) {
if ((uuid = DiscordLink.getPlugin().getCache().getUUID(code)) != null)
return uuid;
}
private UUID getUUID(String code) {
if (code == null || !code.matches("[0-9]{6}"))
return null;
return DiscordLink.getPlugin().getCache().getUUID(code);
}
channel.sendMessage("Please use `&link ######` where the #'s are the code you received in-game.")
.queue(message1 -> message1.delete().queueAfter(15, TimeUnit.SECONDS, null, error -> {
}));
return null;
@Override
public CommandData getCommandData() {
return commandData;
}
@Override
public long getChannelId() {
return BotConfig.DISCORD.LINK_CHANNEL;
}
}

View File

@ -1,68 +1,58 @@
package com.alttd.proxydiscordlink.bot.commands;
package com.alttd.proxydiscordlink.bot.commandManager.commands;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.Bot;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.util.Utilities;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.proxy.server.ServerInfo;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.model.user.User;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class DiscordServerList extends DiscordCommand {
public class CommandServerList extends DiscordCommand {
private DiscordLink plugin;
CommandData commandData;
private final DiscordLink plugin;
private final Bot bot;
public DiscordServerList() {
public CommandServerList(JDA jda) {
plugin = DiscordLink.getPlugin();
bot = plugin.getBot();
commandData = Commands.slash(getName(), "Lists all online players on the server or a specific server")
.addOption(OptionType.STRING, "server", "Server to check online players on", false)
.setDefaultPermissions(DefaultMemberPermissions.DISABLED);
Utilities.registerCommand(jda, commandData);
}
@SuppressWarnings("SpellCheckingInspection")
@Override
public String getCommand() {
public String getName() {
return "serverlist";
}
@Override
public String getPermission() {
return null;
}
@Override
public String getDescription() {
return "Lists all online players on the server or a specific server";
}
@Override
public String getSyntax() {
return "serverlist";
}
@Override
public long getChannel() {
return BotConfig.STAFF_COMMAND_CHANNEL;
}
@Override
public void handleCommand(Message message, String sender, String command, String[] args) {
public void execute(SlashCommandInteractionEvent event) {
String serverName = "Altitude";
String tmp;
Collection<Player> onlinePlayer = plugin.getProxy().getAllPlayers();
ServerInfo server;
if (args.length != 0) {
Optional<RegisteredServer> registeredServer = plugin.getProxy().getServer(args[0]);
if ((tmp = event.getOption("server", OptionMapping::getAsString)) != null) {
Optional<RegisteredServer> registeredServer = plugin.getProxy().getServer(tmp);
if (registeredServer.isEmpty()) {
Utilities.commandErrAutoRem("This server does not exist " + tmp, event);
return;
}
onlinePlayer = registeredServer.get().getPlayersConnected();
@ -76,7 +66,7 @@ public class DiscordServerList extends DiscordCommand {
int i = Integer.compare(luckPerms.getGroupManager().getGroup(o2.getPrimaryGroup()).getWeight().orElse(0), luckPerms.getGroupManager().getGroup(o1.getPrimaryGroup()).getWeight().orElse(0));
return i != 0 ? i : o1.getUsername().compareToIgnoreCase(o2.getUsername());
})
.collect(Collectors.toList());
.toList();
EmbedBuilder embedBuilder = new EmbedBuilder();
String title = "Players online on " + serverName + ": " + players.size();
embedBuilder.setTitle(title);
@ -87,16 +77,14 @@ public class DiscordServerList extends DiscordCommand {
int totalCharacters = title.length();
int fieldCounter = 0;
Iterator<User> iterator = players.iterator();
while (iterator.hasNext()) {
User user = iterator.next();
if(user != null) {
if(!rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
for (User user : players) {
if (user != null) {
if (!rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
if (currentFieldText.length() != 0) {
totalCharacters += rankname.length() + currentFieldText.length();
fieldCounter++;
if (totalCharacters > 6000 || fieldCounter > 25) {
bot.sendEmbedToDiscord(getChannel(), embedBuilder, 300);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, 300);
embedBuilder.clearFields();
totalCharacters = title.length() + rankname.length() + currentFieldText.length();
fieldCounter = 1;
@ -106,16 +94,16 @@ public class DiscordServerList extends DiscordCommand {
currentFieldText = new StringBuilder();
}
rankname = Utilities.capitalize(user.getPrimaryGroup());
} else if(rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
} else if (rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
currentFieldText.append(separator);
}
if (entryCounter <= 50) {
Optional<Player> optionalPlayer = plugin.getProxy().getPlayer(user.getUniqueId());
if(optionalPlayer.isPresent()) {
if (optionalPlayer.isPresent()) {
Player player = optionalPlayer.get();
currentFieldText.append("`").append(player.getUsername()).append("`");
}
} else if (entryCounter == 51){
} else if (entryCounter == 51) {
currentFieldText.append("...");
}
entryCounter++;
@ -126,13 +114,22 @@ public class DiscordServerList extends DiscordCommand {
totalCharacters = title.length() + rankname.length() + currentFieldText.length();
fieldCounter++;
if (totalCharacters > 6000 || fieldCounter > 25) {
bot.sendEmbedToDiscord(getChannel(), embedBuilder, 300);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, 300);
embedBuilder.clearFields();
}
embedBuilder.addField(rankname, currentFieldText.toString(), true);
}
message.delete().queueAfter(300, TimeUnit.SECONDS);
bot.sendEmbedToDiscord(getChannel(), embedBuilder, 300);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, 300);
}
@Override
public CommandData getCommandData() {
return commandData;
}
@Override
public long getChannelId() {
return BotConfig.DISCORD.STAFF_COMMAND_CHANNEL;
}
}

View File

@ -1,56 +1,48 @@
package com.alttd.proxydiscordlink.bot.commands;
package com.alttd.proxydiscordlink.bot.commandManager.commands;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.Bot;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.util.Utilities;
import com.velocitypowered.api.proxy.Player;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.model.user.User;
import java.util.*;
import java.util.stream.Collectors;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class DiscordStaffList extends DiscordCommand {
public class CommandStaffList extends DiscordCommand {
private DiscordLink plugin;
CommandData commandData;
private final DiscordLink plugin;
private final Bot bot;
public DiscordStaffList() {
public CommandStaffList(JDA jda) {
plugin = DiscordLink.getPlugin();
bot = plugin.getBot();
commandData = Commands.slash(getName(), "Lists all online players on the server or a specific server")
.addOption(OptionType.STRING, "server", "Server to check online players on", false)
.setDefaultPermissions(DefaultMemberPermissions.DISABLED);
Utilities.registerCommand(jda, commandData);
}
@SuppressWarnings("SpellCheckingInspection")
@Override
public String getCommand() {
public String getName() {
return "stafflist";
}
@Override
public String getPermission() {
return null;
}
@Override
public String getDescription() {
return "Lists all online staff on the server";
}
@Override
public String getSyntax() {
return "staffList";
}
@Override
public long getChannel() {
return BotConfig.STAFF_COMMAND_CHANNEL;
}
@Override
public void handleCommand(Message message, String sender, String command, String[] args) {
public void execute(SlashCommandInteractionEvent event) {
LuckPerms luckPerms = Utilities.getLuckPerms();
List<User> staff = plugin.getProxy().getAllPlayers()
.stream().filter(player-> player.hasPermission("group." + BotConfig.SL_MINIMUMRANK))
@ -59,7 +51,7 @@ public class DiscordStaffList extends DiscordCommand {
int i = Integer.compare(luckPerms.getGroupManager().getGroup(o2.getPrimaryGroup()).getWeight().orElse(0), luckPerms.getGroupManager().getGroup(o1.getPrimaryGroup()).getWeight().orElse(0));
return i != 0 ? i : o1.getUsername().compareToIgnoreCase(o2.getUsername());
})
.collect(Collectors.toList());
.toList();
EmbedBuilder embedBuilder = new EmbedBuilder();
String title = "Online Staff: " + staff.size() + " - Online Players: " + plugin.getProxy().getAllPlayers().size();
embedBuilder.setTitle(title);
@ -72,16 +64,14 @@ public class DiscordStaffList extends DiscordCommand {
int totalCharacters = title.length();
int fieldCounter = 0;
Iterator<User> iterator = staff.iterator();
while (iterator.hasNext()) {
User user = iterator.next();
if(user != null) {
if(!rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
for (User user : staff) {
if (user != null) {
if (!rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
if (currentFieldText.length() != 0) {
totalCharacters += rankname.length() + currentFieldText.length();
fieldCounter++;
if (totalCharacters > 6000 || fieldCounter > 25) {
bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1);
embedBuilder.clearFields();
totalCharacters = title.length() + rankname.length() + currentFieldText.length();
fieldCounter = 1;
@ -91,15 +81,15 @@ public class DiscordStaffList extends DiscordCommand {
currentFieldText = new StringBuilder();
}
rankname = Utilities.capitalize(user.getPrimaryGroup());
} else if(rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
} else if (rankname.equalsIgnoreCase(user.getPrimaryGroup())) {
currentFieldText.append(separator);
}
Optional<Player> optionalPlayer = plugin.getProxy().getPlayer(user.getUniqueId());
if(optionalPlayer.isPresent()) {
if (optionalPlayer.isPresent()) {
Player player = optionalPlayer.get();
String currentServerName = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo().getName() : "";
if (onlineStaff.containsKey(currentServerName)){
if (onlineStaff.containsKey(currentServerName)) {
onlineStaff.put(currentServerName, onlineStaff.get(currentServerName) + 1);
} else {
onlineStaff.put(currentServerName, 1);
@ -107,7 +97,7 @@ public class DiscordStaffList extends DiscordCommand {
if (entryCounter <= 50) {
currentFieldText.append("`").append(player.getUsername()).append("`");
} else if (entryCounter == 51){
} else if (entryCounter == 51) {
currentFieldText.append("...");
}
entryCounter++;
@ -119,7 +109,7 @@ public class DiscordStaffList extends DiscordCommand {
totalCharacters = title.length() + rankname.length() + currentFieldText.length();
fieldCounter++;
if (totalCharacters > 6000 || fieldCounter > 25) {
bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1);
embedBuilder.clearFields();
}
embedBuilder.addField(rankname, currentFieldText.toString(), true);
@ -141,12 +131,22 @@ public class DiscordStaffList extends DiscordCommand {
totalCharacters = title.length() + rankname.length() + currentFieldText.length();
fieldCounter++;
if (totalCharacters > 6000 || fieldCounter > 25) {
bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1);
embedBuilder.clearFields();
}
embedBuilder.addField(rankname, currentFieldText.toString(), true);
}
bot.sendEmbedToDiscord(getChannel(), embedBuilder, -1);
bot.sendEmbedToDiscord(getChannelId(), embedBuilder, -1);
}
@Override
public CommandData getCommandData() {
return commandData;
}
@Override
public long getChannelId() {
return BotConfig.DISCORD.STAFF_COMMAND_CHANNEL;
}
}

View File

@ -0,0 +1,66 @@
package com.alttd.proxydiscordlink.bot.commandManager.commands;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import com.alttd.proxydiscordlink.util.Utilities;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import java.util.Optional;
public class CommandUnlink extends DiscordCommand {
private final CommandData commandData;
public CommandUnlink(JDA jda) {
commandData = Commands.slash(getName(), "Unlink your Discord and Altitude Minecraft accounts")
.setDefaultPermissions(DefaultMemberPermissions.ENABLED);
Utilities.registerCommand(jda, commandData);
}
@Override
public String getName() {
return "unlink";
}
@Override
public void execute(SlashCommandInteractionEvent event) {
Member member = event.getMember();
if (member == null) {
Utilities.commandErrAutoRem("Unable to find you", event);
return;
}
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong());
if (discordLinkPlayer == null) {
Optional<Role> linkedRole = member.getRoles().stream().filter(role -> role.getIdLong() == BotConfig.DISCORD.LINKED_ROLE_ID).findAny();
if (linkedRole.isPresent()) {
member.getGuild().removeRoleFromMember(member, linkedRole.get()).queue();
event.replyEmbeds(Utilities.genericSuccessEmbed("Success", "Your Discord and Minecraft accounts have been unlinked."))
.setEphemeral(true)
.queue();
return;
}
Utilities.commandErrAutoRem("Your accounts aren't linked", event);
return;
}
discordLinkPlayer.unlinkDiscordLinkPlayer();
event.replyEmbeds(Utilities.genericSuccessEmbed("Success", "Your Discord and Minecraft accounts have been unlinked."))
.setEphemeral(true)
.queue();
}
@Override
public CommandData getCommandData() {
return commandData;
}
@Override
public long getChannelId() {
return BotConfig.DISCORD.LINK_CHANNEL;
}
}

View File

@ -0,0 +1,27 @@
package com.alttd.proxydiscordlink.bot.commandManager.commands;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
public class DiscordSync extends DiscordCommand {
@Override
public String getName() {
return "sync";
}
@Override
public void execute(SlashCommandInteractionEvent event) { //TODO implement
}
@Override
public CommandData getCommandData() { //TODO implement
return null;
}
@Override
public long getChannelId() { //TODO implement
return 0;
}
}

View File

@ -0,0 +1,101 @@
package com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.bot.commandManager.SubOption;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import com.alttd.proxydiscordlink.util.ALogger;
import com.alttd.proxydiscordlink.util.Utilities;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
import java.util.HashMap;
public class CommandNick extends DiscordCommand {
CommandData commandData;
private final HashMap<String, SubOption> subOptionsMap = new HashMap<>();
public CommandNick(JDA jda) {
commandData = Commands.slash(getName(), "Change your nickname to be your mc name/nickname")
.addSubcommands(new SubcommandData("username", "Change your name to your Minecraft username"),
new SubcommandData("nickname", "Change your name to your Minecraft nickname")
)
.setDefaultPermissions(DefaultMemberPermissions.ENABLED);
Utilities.registerSubOptions(subOptionsMap,
new SubCommandUserName(null,this),
new SubCommandNick(null,this)
);
Utilities.registerCommand(jda, commandData);
}
@Override
public String getName() {
return "nick";
}
@Override
public void execute(SlashCommandInteractionEvent event) {
if (event.getGuild() == null || event.getMember() == null) {
Utilities.commandErrAutoRem("This command can only be used within a guild: " + getName(), event);
return;
}
String subcommandName = event.getInteraction().getSubcommandGroup();
subcommandName = subcommandName == null ? event.getInteraction().getSubcommandName() : subcommandName;
if (subcommandName == null) {
ALogger.error("No subcommand found for " + getName());
return;
}
SubOption subOption = subOptionsMap.get(subcommandName);
if (subOption == null) {
event.replyEmbeds(Utilities.invalidSubcommand(subcommandName))
.setEphemeral(true)
.queue();
return;
}
subOption.execute(event);
}
@Override
public CommandData getCommandData() {
return commandData;
}
@Override
public long getChannelId() {
return 0;
}
public String setNickname(SlashCommandInteractionEvent event, boolean hasNick) {
Member member = event.getMember();
if (member == null) {
Utilities.commandErrAutoRem("This command can only be run in a guild.", event);
return null;
}
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong());
if (discordLinkPlayer == null) {
Utilities.commandErrAutoRem("You aren't linked, please link before using this command.", event);
return null;
}
String nick;
if (hasNick) {
nick = DiscordLink.getPlugin().getDatabase().getNick(discordLinkPlayer.getUuid());
if (nick == null || nick.isBlank())
nick = discordLinkPlayer.getUsername();
} else {
nick = discordLinkPlayer.getUsername();
}
member.modifyNickname(nick).queue();
discordLinkPlayer.setNick(hasNick);
DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer);
return nick;
}
}

View File

@ -0,0 +1,36 @@
package com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.bot.commandManager.SubCommand;
import com.alttd.proxydiscordlink.bot.commandManager.SubCommandGroup;
import com.alttd.proxydiscordlink.util.Utilities;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
public class SubCommandNick extends SubCommand {
protected SubCommandNick(SubCommandGroup parentGroup, DiscordCommand parent) {
super(parentGroup, parent);
}
@Override
public String getName() {
return "nickname";
}
@Override
public void execute(SlashCommandInteractionEvent event) {
if (!(getParent() instanceof CommandNick commandNick)) {
Utilities.commandErrAutoRem("Couldn't find parent command", event);
return;
}
String resultingName = commandNick.setNickname(event, true);
event.replyEmbeds(Utilities.genericSuccessEmbed("Success",
"Your nickname has been set to `" + resultingName + "`."))
.setEphemeral(true).queue();
}
@Override
public String getHelpMessage() {
return null;
}
}

View File

@ -0,0 +1,36 @@
package com.alttd.proxydiscordlink.bot.commandManager.commands.NickCommand;
import com.alttd.proxydiscordlink.bot.commandManager.DiscordCommand;
import com.alttd.proxydiscordlink.bot.commandManager.SubCommand;
import com.alttd.proxydiscordlink.bot.commandManager.SubCommandGroup;
import com.alttd.proxydiscordlink.util.Utilities;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
public class SubCommandUserName extends SubCommand {
protected SubCommandUserName(SubCommandGroup parentGroup, DiscordCommand parent) {
super(parentGroup, parent);
}
@Override
public String getName() {
return "username";
}
@Override
public void execute(SlashCommandInteractionEvent event) {
if (!(getParent() instanceof CommandNick commandNick)) {
Utilities.commandErrAutoRem("Couldn't find parent command", event);
return;
}
String resultingName = commandNick.setNickname(event, false);
event.replyEmbeds(Utilities.genericSuccessEmbed("Success",
"Your nickname has been set to `" + resultingName + "`."))
.setEphemeral(true).queue();
}
@Override
public String getHelpMessage() {
return null;
}
}

View File

@ -1,52 +0,0 @@
package com.alttd.proxydiscordlink.bot.commands;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.Bot;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.util.Utilities;
import net.dv8tion.jda.api.entities.Message;
public class DiscordBroadCast extends DiscordCommand {
private DiscordLink plugin;
private final Bot bot;
public DiscordBroadCast() {
plugin = DiscordLink.getPlugin();
bot = plugin.getBot();
}
@Override
public String getCommand() {
return "broadcast";
}
@Override
public String getPermission() {
return null;
}
@Override
public String getDescription() {
return "Broadcast a message to all online players";
}
@Override
public String getSyntax() {
return "broadcast";
}
@Override
public long getChannel() {
return BotConfig.STAFF_COMMAND_CHANNEL;
}
@Override
public void handleCommand(Message message, String sender, String command, String[] args) {
//TODO also send this to the bot channel, optional command args for color and decoration?
String msg = String.join(" ", args);
bot.sendMessageToDiscord(BotConfig.COMMAND_CHANNEL, msg);
Utilities.broadcast(msg);
}
}

View File

@ -1,75 +0,0 @@
package com.alttd.proxydiscordlink.bot.commands;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
public class DiscordNick extends DiscordCommand {
@Override
public String getCommand() {
return "nick";
}
@Override
public String getPermission() {
return null;
}
@Override
public String getDescription() {
return "Change your name between your Minecraft username and Minecraft nickname.";
}
@Override
public String getSyntax() {
return "nick <username/nickname>";
}
@Override
public long getChannel() {
return BotConfig.COMMAND_CHANNEL;
}
@Override
public void handleCommand(Message message, String sender, String command, String[] args) {
MessageChannel channel = message.getChannel();
if (args.length != 1) {
channel.sendMessage("The correct syntax is: `" +
BotConfig.prefixMap.get(message.getGuild().getIdLong()) +
getSyntax() + "`.").queue();
return;
}
Member member = message.getMember();
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong());
if (discordLinkPlayer == null) {
channel.sendMessage("You aren't linked, please link before using this command.").queue();
return;
}
switch (args[0].toLowerCase()) {
case "username" -> {
member.modifyNickname(discordLinkPlayer.getUsername()).queue();
channel.sendMessage("Your nickname has been set to `" + discordLinkPlayer.getUsername() + "`.").queue();
discordLinkPlayer.setNick(false);
DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer);
}
case "nickname" -> {
String nick = DiscordLink.getPlugin().getDatabase().getNick(discordLinkPlayer.getUuid());
if (nick == null || nick.isBlank())
nick = discordLinkPlayer.getUsername();
member.modifyNickname(nick).queue();
channel.sendMessage("Your nickname has been set to `" + nick + "`.").queue();
discordLinkPlayer.setNick(true);
DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer);
}
default -> channel.sendMessage("The correct syntax is: `" +
BotConfig.prefixMap.get(message.getGuild().getIdLong()) +
getSyntax() + "`.").queue();
}
}
}

View File

@ -1,49 +0,0 @@
package com.alttd.proxydiscordlink.bot.commands;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
public class DiscordUnlink extends DiscordCommand {
@Override
public String getCommand() {
return "unlink";
}
@Override
public String getPermission() {
return null;
}
@Override
public String getDescription() {
return "Unlink your Minecraft and Discord accounts.";
}
@Override
public String getSyntax() {
return "unlink";
}
@Override
public long getChannel() {
return BotConfig.LINK_CHANNEL;
}
@Override
public void handleCommand(Message message, String sender, String command, String[] args) {
Member member = message.getMember();
if (member == null)
return;
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(member.getIdLong());
if (discordLinkPlayer == null) {
message.getChannel().sendMessage("Your accounts aren't linked.").queue();
return;
}
discordLinkPlayer.unlinkDiscordLinkPlayer();
message.getChannel().sendMessage("Your Discord and Minecraft accounts have been unlinked.").queue();
}
}

View File

@ -1,77 +0,0 @@
package com.alttd.proxydiscordlink.bot.listeners;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.Bot;
import com.alttd.proxydiscordlink.bot.DiscordCommand;
import com.alttd.proxydiscordlink.config.BotConfig;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.util.Arrays;
public class DiscordMessageListener extends ListenerAdapter {
private final DiscordLink plugin;
private final Bot bot;
public DiscordMessageListener() {
plugin = DiscordLink.getPlugin();
bot = plugin.getBot();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (!event.isFromGuild())
return;
if (event.getAuthor() == event.getJDA().getSelfUser())
return;
if (event.isWebhookMessage())
return;
/*
if (event.getMessage().getChannel().getIdLong() == BotConfig.COMMAND_CHANNEL) {
String content = event.getMessage().getContentRaw();
if (content.startsWith(BotConfig.prefixMap.get(event.getGuild().getIdLong())) && content.length() > 1) {
String[] split = content.split(" ");
String cmd = split[0].substring(1).toLowerCase();
String[] args = Arrays.copyOfRange(split, 1, split.length);
for(DiscordCommand command : DiscordCommand.getCommands()) {
if(!command.getCommand().equalsIgnoreCase(cmd))
continue;
if(command.getPermission() != null) {
// TODO permission check? do we need this?
}
command.handleCommand(event.getMessage(), event.getAuthor().getName(), cmd, args);
}
}
} else if (event.getMessage().getChannel().getIdLong() == BotConfig.LINK_CHANNEL) {
String content = event.getMessage().getContentRaw();
String[] split = content.split(" ");
String cmd = split[0].substring(1).toLowerCase();
String[] args = Arrays.copyOfRange(split, 1, split.length);
if (cmd.equalsIgnoreCase("link"))
DiscordCommand.getCommands().stream()
.filter(discordCommand -> discordCommand.getCommand().equals("link"))
.findFirst()
.ifPresent(discordCommand -> discordCommand.handleCommand(event.getMessage(), event.getAuthor().getName(), cmd, args));
}
*/
String content = event.getMessage().getContentRaw();
if (!BotConfig.prefixMap.containsKey(event.getGuild().getIdLong())) return; // early return
if (content.startsWith(BotConfig.prefixMap.get(event.getGuild().getIdLong())) && content.length() > 1) {
String[] split = content.split(" ");
String cmd = split[0].substring(1).toLowerCase();
String[] args = Arrays.copyOfRange(split, 1, split.length);
for (DiscordCommand command : DiscordCommand.getCommands()) {
if (!command.getCommand().equalsIgnoreCase(cmd))
continue;
if (!(event.getMessage().getChannel().getIdLong() == command.getChannel()))
continue;
if (command.getPermission() != null) {
// TODO permission check? do we need this?
}
command.handleCommand(event.getMessage(), event.getAuthor().getName(), cmd, args);
}
}
}
}

View File

@ -35,7 +35,7 @@ public class BotConfig {
public static File CONFIGPATH;
public static void init() { // todo setup share for the config
CONFIGPATH = new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "DiscordLink");
CONFIGPATH = new File(File.separator + "mnt" + File.separator + "configs" + File.separator + "DiscordLink");
CONFIG_FILE = new File(CONFIGPATH, "bot-config.yml");
configLoader = YAMLConfigurationLoader.builder()
@ -161,27 +161,31 @@ public class BotConfig {
return config.getNode(splitPath(path));
}
/**
* ONLY EDIT ANYTHING BELOW THIS LINE
**/
@SuppressWarnings("unused")
private static void loadSubclasses() {
BotConfig.DISCORD.settings();
}
public static class DISCORD {
public static String BOT_TOKEN = "unconfigured";
public static long COMMAND_CHANNEL = -1;
public static long STAFF_COMMAND_CHANNEL = -1;
public static long LINK_CHANNEL = -1;
public static long GUILD_ID = -1;
public static long EVIDENCE_CHANNEL_ID = -1;
public static long LINKED_ROLE_ID = -1;
public static String BOT_TOKEN = "unconfigured";
public static long COMMAND_CHANNEL = -1;
public static long STAFF_COMMAND_CHANNEL = -1;
public static long LINK_CHANNEL = -1;
public static long GUILD_ID = -1;
public static long EVIDENCE_CHANNEL_ID = -1;
public static long LINKED_ROLE_ID = -1;
private static void settings() {
BOT_TOKEN = getString("settings.token", BOT_TOKEN);
STAFF_COMMAND_CHANNEL = getLong("settings.staff-command-channel", STAFF_COMMAND_CHANNEL);
COMMAND_CHANNEL = getLong("settings.command-channel", COMMAND_CHANNEL);
LINK_CHANNEL = getLong("settings.link-channel", LINK_CHANNEL);
GUILD_ID = getLong("settings.guild-id", GUILD_ID);
EVIDENCE_CHANNEL_ID = getLong("settings.evidence-channel-id", EVIDENCE_CHANNEL_ID);
LINKED_ROLE_ID = getLong("settings.linked-role-id", LINKED_ROLE_ID);
private static void settings() {
BOT_TOKEN = getString("settings.token", BOT_TOKEN);
STAFF_COMMAND_CHANNEL = getLong("settings.staff-command-channel", STAFF_COMMAND_CHANNEL);
COMMAND_CHANNEL = getLong("settings.command-channel", COMMAND_CHANNEL);
LINK_CHANNEL = getLong("settings.link-channel", LINK_CHANNEL);
GUILD_ID = getLong("settings.guild-id", GUILD_ID);
EVIDENCE_CHANNEL_ID = getLong("settings.evidence-channel-id", EVIDENCE_CHANNEL_ID);
LINKED_ROLE_ID = getLong("settings.linked-role-id", LINKED_ROLE_ID);
}
}
public static String SL_MINIMUMRANK = "trainee";

View File

@ -31,7 +31,7 @@ public final class Config {
public static File CONFIGPATH;
public static void init() { // todo setup share for the config
CONFIGPATH = new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "DiscordLink");
CONFIGPATH = new File(File.separator + "mnt" + File.separator + "configs" + File.separator + "DiscordLink");
CONFIG_FILE = new File(CONFIGPATH, "config.yml");
configLoader = YAMLConfigurationLoader.builder()
@ -161,68 +161,83 @@ public final class Config {
/**
* ONLY EDIT ANYTHING BELOW THIS LINE
**/
public static String DRIVERS = "mysql";
public static String IP = "localhost";
public static String PORT = "3306";
public static String DATABASE_NAME = "discordlink";
public static String USERNAME = "root";
public static String PASSWORD = "root";
private static void database() {
DRIVERS = getString("database.drivers", DRIVERS);
IP = getString("database.ip", IP);
PORT = getString("database.port", PORT);
DATABASE_NAME = getString("database.database_name", DATABASE_NAME);
USERNAME = getString("database.username", USERNAME);
PASSWORD = getString("database.password", PASSWORD);
}
public static List<String> DONOR_GROUPS = new ArrayList<>(List.of("donor"));
public static List<String> DISCORD_GROUPS = new ArrayList<>(List.of("nitro"));
@SuppressWarnings("unused")
private static void loadGroups() {
DONOR_GROUPS = getList("settings.donor-groups", DONOR_GROUPS);
DISCORD_GROUPS = getList("settings.discord-groups", DISCORD_GROUPS);
}
public static List<String> DISCORD_MESSAGE = new ArrayList<>(List.of("Invite code here."));
public static String DISCORD_LINK = "<click:run:command:discord link:><yellow>Your Minecraft and Discord accounts aren't linked yet, to link them click this message!</yellow></click>";
public static String GIVE_CODE = "<yellow>Your code is <gold><code></gold>, To link your accounts do <gold>&link <code></gold> in the Discord #link channel.</yellow>";
public static String ALREADY_LINKED_ACCOUNTS = "<yellow>Your accounts are already linked. You can unlink your accounts by doing <gold>/discord unlink</gold>.</yellow>";
public static String ALREADY_GOT_CODE = "<yellow>You have already got your code. Your code is <gold><code><gold></yellow>";
public static String ACCOUNTS_NOT_LINKED = "<yellow>Your Minecraft and Discord accounts aren't linked</yellow>";
public static String UNLINKED_ACCOUNTS = "<yellow>You have successfully unlinked your accounts.</yellow>";
public static String IS_LINKED = "<yellow><player> is <linked_status>.</yellow>";
public static String WHITELIST_LINK_MESSAGE = "<green>You aren't linked yet! If you would like to link your account join our discord and use the following command in the link channel: <gold>&link <code></gold>.</green>";
public static String INVALID_PLAYER = "<red><player> is not online or is not a valid player.</red>";
public static String NO_PERMISSION = "<red>You do not have permission to do that.</red>";
public static String NO_CONSOLE = "<red>This command can not be executed from console.</red>";
public static String RELOAD_CONFIG = "<green>Reloaded DiscordLink config.</green>";
public static String HELP_MESSAGE = "<yellow>DiscordLink commands:\n<commands></yellow>";
public static String HELP_LINK = "<yellow><gold>/discord link</gold>: Get a code which can be used to link your Minecraft and Discord accounts.</yellow>";
public static String HELP_UNLINK = "<yellow><gold>/discord unlink</gold>: Unlink your Minecraft and Discord accounts.</yellow>";
public static String HELP_CHECK_LINKED = "<yellow><gold>/discord checklinked <user></gold>: Check if the specified user has their Minecraft and Discord accounts linked.</yellow>";
public static String HELP_RELOAD = "<yellow><gold>/discord reload</gold>: Reload the config.</yellow>";
public static String HELP_SYNC = "<yellow><gold>/discord sync</gold>: Manually synchronize your roles across Discord and Minecraft.</yellow>";
@SuppressWarnings("unused")
private static void loadSubclasses() {
DB.database();
MESSAGES.loadMessages();
}
private static void loadMessages() {
DISCORD_MESSAGE = getList("messages.discord-message", DISCORD_MESSAGE);
DISCORD_LINK = getString("messages.discord-link", DISCORD_LINK);
GIVE_CODE = getString("messages.give-code", GIVE_CODE);
ALREADY_LINKED_ACCOUNTS = getString("messages.already-linked-accounts", ALREADY_LINKED_ACCOUNTS);
ALREADY_GOT_CODE = getString("messages.already-got-code", ALREADY_GOT_CODE);
ACCOUNTS_NOT_LINKED = getString("messages.accounts-not-linked", ACCOUNTS_NOT_LINKED);
UNLINKED_ACCOUNTS = getString("messages.unlinked-accounts", UNLINKED_ACCOUNTS);
IS_LINKED = getString("messages.is-linked", IS_LINKED);
WHITELIST_LINK_MESSAGE = getString("messages.whitelist-link-message", WHITELIST_LINK_MESSAGE);
INVALID_PLAYER = getString("messages.invalid-player", INVALID_PLAYER);
NO_PERMISSION = getString("messages.no-permission", NO_PERMISSION);
NO_CONSOLE = getString("messages.no-console", NO_CONSOLE);
RELOAD_CONFIG = getString("messages.reload-config", RELOAD_CONFIG);
HELP_MESSAGE = getString("messages.help-message", HELP_MESSAGE);
HELP_LINK = getString("messages.help-link", HELP_LINK);
HELP_UNLINK = getString("messages.help-unlink", HELP_UNLINK);
HELP_CHECK_LINKED = getString("messages.help-check-linked", HELP_CHECK_LINKED);
HELP_RELOAD = getString("messages.help-reload", HELP_RELOAD);
public static class DB {
public static String DRIVERS = "mysql";
public static String IP = "localhost";
public static String PORT = "3306";
public static String DATABASE_NAME = "discordlink";
public static String USERNAME = "root";
public static String PASSWORD = "root";
private static void database() {
DRIVERS = getString("database.drivers", DRIVERS);
IP = getString("database.ip", IP);
PORT = getString("database.port", PORT);
DATABASE_NAME = getString("database.database_name", DATABASE_NAME);
USERNAME = getString("database.username", USERNAME);
PASSWORD = getString("database.password", PASSWORD);
}
}
public static class MESSAGES {
public static String ALREADY_LINKED_ACCOUNTS = "<yellow>Your accounts are already linked. You can unlink your accounts by doing <gold>/discord unlink</gold>.</yellow>";
public static String ALREADY_GOT_CODE = "<yellow>You have already got your code. Your code is <gold><code><gold></yellow>";
public static String ACCOUNTS_NOT_LINKED = "<yellow>Your Minecraft and Discord accounts aren't linked</yellow>";
public static String UNLINKED_ACCOUNTS = "<yellow>You have successfully unlinked your accounts.</yellow>";
public static String IS_LINKED = "<yellow><player> is linked with discord user: <discord> (<discord_id>).</yellow>";
public static String IS_NOT_LINKED = "<yellow><player> is not linked.</yellow>";
public static String WHITELIST_LINK_MESSAGE = "<green>You aren't linked yet! If you would like to link your account join our discord and use the following command in the link channel: <gold>&link <code></gold>.</green>";
public static String INVALID_PLAYER = "<red><player> is not online or is not a valid player.</red>";
public static String NO_PERMISSION = "<red>You do not have permission to do that.</red>";
public static String NO_CONSOLE = "<red>This command can not be executed from console.</red>";
public static String RELOAD_CONFIG = "<green>Reloaded DiscordLink config.</green>";
public static String HELP_MESSAGE = "<yellow>DiscordLink commands:\n<commands></yellow>";
public static String HELP_LINK = "<yellow><gold>/discord link</gold>: Get a code which can be used to link your Minecraft and Discord accounts.</yellow>";
public static String HELP_UNLINK = "<yellow><gold>/discord unlink</gold>: Unlink your Minecraft and Discord accounts.</yellow>";
public static String HELP_CHECK_LINKED = "<yellow><gold>/discord checklinked <user></gold>: Check if the specified user has their Minecraft and Discord accounts linked.</yellow>";
public static String HELP_RELOAD = "<yellow><gold>/discord reload</gold>: Reload the config.</yellow>";
public static String HELP_SYNC = "<yellow><gold>/discord sync</gold>: Manually synchronize your roles across Discord and Minecraft.</yellow>";
public static List<String> DISCORD_MESSAGE = new ArrayList<>(List.of("Invite code here."));
public static String DISCORD_LINK = "<click:run_command:'/discord link'><yellow>Your Minecraft and Discord accounts aren't linked yet, to link them click this message!</yellow></click>";
public static String GIVE_CODE = "<yellow>Your code is <gold><code></gold>, To link your accounts do <gold>&link <code></gold> in the Discord #link channel.</yellow>";
private static void loadMessages() {
DISCORD_MESSAGE = getList("messages.discord-message", DISCORD_MESSAGE);
DISCORD_LINK = getString("messages.discord-link", DISCORD_LINK);
GIVE_CODE = getString("messages.give-code", GIVE_CODE);
ALREADY_LINKED_ACCOUNTS = getString("messages.already-linked-accounts", ALREADY_LINKED_ACCOUNTS);
ALREADY_GOT_CODE = getString("messages.already-got-code", ALREADY_GOT_CODE);
ACCOUNTS_NOT_LINKED = getString("messages.accounts-not-linked", ACCOUNTS_NOT_LINKED);
UNLINKED_ACCOUNTS = getString("messages.unlinked-accounts", UNLINKED_ACCOUNTS);
IS_LINKED = getString("messages.is-linked", IS_LINKED);
IS_NOT_LINKED = getString("messages.is-not-linked", IS_NOT_LINKED);
WHITELIST_LINK_MESSAGE = getString("messages.whitelist-link-message", WHITELIST_LINK_MESSAGE);
INVALID_PLAYER = getString("messages.invalid-player", INVALID_PLAYER);
NO_PERMISSION = getString("messages.no-permission", NO_PERMISSION);
NO_CONSOLE = getString("messages.no-console", NO_CONSOLE);
RELOAD_CONFIG = getString("messages.reload-config", RELOAD_CONFIG);
HELP_MESSAGE = getString("messages.help-message", HELP_MESSAGE);
HELP_LINK = getString("messages.help-link", HELP_LINK);
HELP_UNLINK = getString("messages.help-unlink", HELP_UNLINK);
HELP_CHECK_LINKED = getString("messages.help-check-linked", HELP_CHECK_LINKED);
HELP_RELOAD = getString("messages.help-reload", HELP_RELOAD);
}
}
}

View File

@ -29,11 +29,11 @@ public class DatabaseConnection {
e.printStackTrace();
}
this.connection = DriverManager.getConnection("jdbc:"
+ Config.DRIVERS + "://"
+ Config.IP + ":"
+ Config.PORT + "/"
+ Config.DATABASE_NAME
+ "?autoReconnect=true&useSSL=false", Config.USERNAME, Config.PASSWORD);
+ Config.DB.DRIVERS + "://"
+ Config.DB.IP + ":"
+ Config.DB.PORT + "/"
+ Config.DB.DATABASE_NAME
+ "?autoReconnect=true&useSSL=false", Config.DB.USERNAME, Config.DB.PASSWORD);
}
}
}

View File

@ -34,11 +34,11 @@ public class MinecraftCommand implements SimpleCommand {
if (args.length < 1) {
if (!source.hasPermission("discordlink.link"))
source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION));
else if (source instanceof Player)
source.sendMessage(miniMessage.deserialize(Config.DISCORD_LINK));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.DISCORD_LINK));
else
source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE));
return;
}
@ -98,6 +98,6 @@ public class MinecraftCommand implements SimpleCommand {
if (stringBuilder.length() != 0)
stringBuilder.replace(stringBuilder.length() - 1, stringBuilder.length(), "");
return miniMessage.deserialize(Config.HELP_MESSAGE, Placeholder.unparsed("commands", stringBuilder.toString()));
return miniMessage.deserialize(Config.MESSAGES.HELP_MESSAGE, Placeholder.unparsed("commands", stringBuilder.toString()));
}
}

View File

@ -3,6 +3,7 @@ package com.alttd.proxydiscordlink.minecraft.commands.subcommands;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.config.Config;
import com.alttd.proxydiscordlink.minecraft.commands.SubCommand;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.proxy.Player;
import net.kyori.adventure.text.minimessage.MiniMessage;
@ -37,7 +38,7 @@ public class CheckLinked implements SubCommand {
@Override
public void execute(String[] args, CommandSource source) {
if (!source.hasPermission(getPermission())) {
source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION));
return;
}
if (args.length != 2 || !args[1].matches("\\w{3,16}")) {
@ -54,7 +55,7 @@ public class CheckLinked implements SubCommand {
.getPlayer(UUID.fromString(uuidFromName));
if (optionalPlayer.isEmpty())
{
source.sendMessage(miniMessage.deserialize(Config.INVALID_PLAYER, Placeholder.unparsed("player", args[1])));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.INVALID_PLAYER, Placeholder.unparsed("player", args[1])));
return;
}
}
@ -63,12 +64,18 @@ public class CheckLinked implements SubCommand {
}
private void isLinked(CommandSource source, Player player) {
TagResolver tagResolver = TagResolver.resolver(
Placeholder.unparsed("linked_status", DiscordLink.getPlugin().getDatabase()
.playerIsLinked(player.getUniqueId()) ? "linked" : "not linked"),
Placeholder.unparsed("player", player.getUsername()));
source.sendMessage(miniMessage.deserialize(Config.IS_LINKED, tagResolver));
DiscordLinkPlayer linkPlayer = DiscordLink.getPlugin().getDatabase()
.getPlayer(player.getUniqueId());
TagResolver tagResolver = TagResolver.resolver(Placeholder.unparsed("player", player.getUsername()));
if (!linkPlayer.isActive()) {
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.IS_NOT_LINKED, tagResolver));
return;
}
tagResolver = TagResolver.resolver(
tagResolver,
Placeholder.unparsed("discord", linkPlayer.getDiscordUsername()),
Placeholder.unparsed("discord_id", linkPlayer.getUserId() + ""));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.IS_LINKED, tagResolver));
}
@Override
@ -78,6 +85,6 @@ public class CheckLinked implements SubCommand {
@Override
public String getHelpMessage() {
return Config.HELP_CHECK_LINKED;
return Config.MESSAGES.HELP_CHECK_LINKED;
}
}

View File

@ -36,11 +36,11 @@ public class Link implements SubCommand {
@Override
public void execute(String[] args, CommandSource source) {
if (!(source instanceof Player player)) {
source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE));
return;
}
if (!player.hasPermission(getPermission())) {
source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION));
return;
}
@ -51,18 +51,18 @@ public class Link implements SubCommand {
Database database = DiscordLink.getPlugin().getDatabase();
if (database.playerIsLinked(player.getUniqueId())) {
player.sendMessage(miniMessage.deserialize(Config.ALREADY_LINKED_ACCOUNTS));
player.sendMessage(miniMessage.deserialize(Config.MESSAGES.ALREADY_LINKED_ACCOUNTS));
return;
}
String authCode = DiscordLink.getPlugin().getCache().getCode(player.getUniqueId());
if (authCode != null) {
player.sendMessage(miniMessage.deserialize(Config.ALREADY_GOT_CODE, Placeholder.unparsed("code", authCode)));
player.sendMessage(miniMessage.deserialize(Config.MESSAGES.ALREADY_GOT_CODE, Placeholder.unparsed("code", authCode)));
return;
}
authCode = Utilities.getAuthKey();
player.sendMessage(miniMessage.deserialize(Config.GIVE_CODE, Placeholder.unparsed("code", authCode)));
player.sendMessage(miniMessage.deserialize(Config.MESSAGES.GIVE_CODE, Placeholder.unparsed("code", authCode)));
DiscordLink.getPlugin().getCache()
.cacheCode(player.getUniqueId(), authCode);
}
@ -74,6 +74,6 @@ public class Link implements SubCommand {
@Override
public String getHelpMessage() {
return Config.HELP_LINK;
return Config.MESSAGES.HELP_LINK;
}
}

View File

@ -34,7 +34,7 @@ public class Reload implements SubCommand {
@Override
public void execute(String[] args, CommandSource source) {
DiscordLink.getPlugin().reloadConfig();
source.sendMessage(miniMessage.deserialize(Config.RELOAD_CONFIG));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.RELOAD_CONFIG));
}
@Override
@ -44,6 +44,6 @@ public class Reload implements SubCommand {
@Override
public String getHelpMessage() {
return Config.HELP_RELOAD;
return Config.MESSAGES.HELP_RELOAD;
}
}

View File

@ -45,16 +45,16 @@ public class Sync implements SubCommand { //TODO implement
@Override
public void execute(String[] args, CommandSource source) {
if (!(source instanceof Player player)) {
source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE));
return;
}
if (!player.hasPermission(getPermission())) {
source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION));
return;
}
User user = Utilities.getLuckPerms().getUserManager().getUser(player.getUniqueId());
if (user == null) {
source.sendMessage(miniMessage.deserialize(Config.INVALID_PLAYER));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.INVALID_PLAYER));
return;
}
player.sendMessage(syncAccounts(user));
@ -64,7 +64,7 @@ public class Sync implements SubCommand { //TODO implement
Database database = DiscordLink.getPlugin().getDatabase();
if (!database.playerIsLinked(user.getUniqueId())) {
return miniMessage.deserialize(Config.ACCOUNTS_NOT_LINKED);
return miniMessage.deserialize(Config.MESSAGES.ACCOUNTS_NOT_LINKED);
}
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(user.getUniqueId());
@ -83,6 +83,6 @@ public class Sync implements SubCommand { //TODO implement
@Override
public String getHelpMessage() {
return Config.HELP_SYNC;
return Config.MESSAGES.HELP_SYNC;
}
}

View File

@ -46,11 +46,11 @@ public class Unlink implements SubCommand {
unlinkOther(args, source);
}
if (!(source instanceof Player player)) {
source.sendMessage(miniMessage.deserialize(Config.NO_CONSOLE));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_CONSOLE));
return;
}
if (!player.hasPermission(getPermission())) {
source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION));
return;
}
@ -59,12 +59,12 @@ public class Unlink implements SubCommand {
private void unlinkOther(String[] args, CommandSource source) {
if (!source.hasPermission(getPermission() + ".other")) {
source.sendMessage(miniMessage.deserialize(Config.NO_PERMISSION));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.NO_PERMISSION));
return;
}
User user = Utilities.getLuckPerms().getUserManager().getUser(args[1]);
if (user == null) {
source.sendMessage(miniMessage.deserialize(Config.INVALID_PLAYER));
source.sendMessage(miniMessage.deserialize(Config.MESSAGES.INVALID_PLAYER));
return;
}
@ -75,7 +75,7 @@ public class Unlink implements SubCommand {
Database database = DiscordLink.getPlugin().getDatabase();
if (!database.playerIsLinked(uuid)) {
return miniMessage.deserialize(Config.ACCOUNTS_NOT_LINKED);
return miniMessage.deserialize(Config.MESSAGES.ACCOUNTS_NOT_LINKED);
}
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(uuid);
@ -91,7 +91,7 @@ public class Unlink implements SubCommand {
.filter(role -> discordLinkPlayer.getRoles().contains(role.getInternalName()))
.collect(Collectors.toList()),
false);
return miniMessage.deserialize(Config.UNLINKED_ACCOUNTS);
return miniMessage.deserialize(Config.MESSAGES.UNLINKED_ACCOUNTS);
}
@Override
@ -101,6 +101,6 @@ public class Unlink implements SubCommand {
@Override
public String getHelpMessage() {
return Config.HELP_UNLINK;
return Config.MESSAGES.HELP_UNLINK;
}
}

View File

@ -45,14 +45,14 @@ public class LiteBansBanListener {
return;
discordLinkPlayer.setActive(false);
DiscordLink.getPlugin().getBot().discordBan(BotConfig.GUILD_ID, discordLinkPlayer.getUserId(), "Auto ban due to Minecraft ban");
DiscordLink.getPlugin().getBot().discordBan(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId(), "Auto ban due to Minecraft ban");
Optional<Player> player = DiscordLink.getPlugin().getProxy().getPlayer(uuid);
String username = discordLinkPlayer.getUsername();
if (player.isPresent())
username = player.get().getUsername();
DiscordLink.getPlugin().getBot().sendEmbedToDiscord(BotConfig.EVIDENCE_CHANNEL_ID,
DiscordLink.getPlugin().getBot().sendEmbedToDiscord(BotConfig.DISCORD.EVIDENCE_CHANNEL_ID,
new EmbedBuilder()
.setColor(Color.RED)
.setAuthor(username, null, "https://crafatar.com/avatars/" + stringUuid + "?overlay")
@ -74,7 +74,7 @@ public class LiteBansBanListener {
if (uuid == null)
return;
DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(UUID.fromString(uuid));
DiscordLink.getPlugin().getBot().discordUnban(BotConfig.GUILD_ID, discordLinkPlayer.getUserId());
DiscordLink.getPlugin().getBot().discordUnban(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId());
}
}

View File

@ -34,7 +34,7 @@ public class PlayerJoin {
sync = true;
if (!discordLinkPlayer.hasNick())
DiscordLink.getPlugin().getBot().changeNick(BotConfig.GUILD_ID, discordLinkPlayer.getUserId(), username);
DiscordLink.getPlugin().getBot().changeNick(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId(), username);
}
if (discordLinkPlayer.hasNick()) { //If they have a nick update it, if nick is empty set it to false and use username
@ -43,7 +43,7 @@ public class PlayerJoin {
discordLinkPlayer.setNick(false);
nick = discordLinkPlayer.getUsername();
}
DiscordLink.getPlugin().getBot().changeNick(BotConfig.GUILD_ID, discordLinkPlayer.getUserId(), nick);
DiscordLink.getPlugin().getBot().changeNick(BotConfig.DISCORD.GUILD_ID, discordLinkPlayer.getUserId(), nick);
}
boolean hasMinecraftNitro = Utilities.hasMinecraftNitro(player);

View File

@ -24,6 +24,6 @@ public class WhitelistKick {
HashMap<String, String> stringStringHashMap = new HashMap<>();
stringStringHashMap.put("code", authCode);
event.appendTemplate(stringStringHashMap);
event.appendMessage("\n\n" + Config.WHITELIST_LINK_MESSAGE);
event.appendMessage("\n\n" + Config.MESSAGES.WHITELIST_LINK_MESSAGE);
}
}

View File

@ -3,6 +3,7 @@ package com.alttd.proxydiscordlink.objects;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.objects.DiscordRole;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.database.Database;
import com.alttd.proxydiscordlink.util.Utilities;
import net.luckperms.api.model.user.UserManager;
import net.luckperms.api.node.types.InheritanceNode;
@ -89,9 +90,9 @@ public class DiscordLinkPlayer {
public void updateDiscord(List<DiscordRole> roles, boolean added) {
if (added)
roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.GUILD_ID));
roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.DISCORD.GUILD_ID));
else
roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().removeRole(userId, role.getId(), BotConfig.GUILD_ID));
roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().removeRole(userId, role.getId(), BotConfig.DISCORD.GUILD_ID));
}
public void updateMinecraft(List<DiscordRole> roles, boolean added) {
@ -111,9 +112,9 @@ public class DiscordLinkPlayer {
public void linkedRole(boolean add) {
if (add)
DiscordLink.getPlugin().getBot().addRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID);
DiscordLink.getPlugin().getBot().addRole(userId, BotConfig.DISCORD.LINKED_ROLE_ID, BotConfig.DISCORD.GUILD_ID);
else
DiscordLink.getPlugin().getBot().removeRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID);
DiscordLink.getPlugin().getBot().removeRole(userId, BotConfig.DISCORD.LINKED_ROLE_ID, BotConfig.DISCORD.GUILD_ID);
}
public void unlinkDiscordLinkPlayer() {
@ -130,6 +131,7 @@ public class DiscordLinkPlayer {
.collect(Collectors.toList()),
false);
linkedRole(false);
DiscordLink.getPlugin().getDatabase().removeLinkedAccount(this);
}
//Static stuff

View File

@ -1,7 +1,6 @@
package com.alttd.proxydiscordlink.util;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.slf4j.Logger;
public class ALogger {
@ -11,12 +10,8 @@ public class ALogger {
logger = log;
}
private void log(String message) {
logger.info(message);
}
public static void warn(String message) {
logger.warning(message);
logger.warn(message);
}
public static void info(String message) {
@ -24,6 +19,6 @@ public class ALogger {
}
public static void error(String message) {
logger.log(Level.SEVERE, message);
logger.error(message);
}
}

View File

@ -1,13 +1,22 @@
package com.alttd.proxydiscordlink.util;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.commandManager.SubOption;
import com.alttd.proxydiscordlink.bot.objects.DiscordRole;
import com.alttd.proxydiscordlink.config.BotConfig;
import com.alttd.proxydiscordlink.config.Config;
import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.requests.RestAction;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
@ -15,13 +24,16 @@ import net.luckperms.api.model.user.User;
import net.luckperms.api.node.NodeType;
import net.luckperms.api.node.types.InheritanceNode;
import java.awt.*;
import java.util.List;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class Utilities {
private static LuckPerms luckPerms;
private static MiniMessage miniMessage = MiniMessage.miniMessage();
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
public static LuckPerms getLuckPerms() {
if (luckPerms == null)
@ -142,6 +154,71 @@ public class Utilities {
.collect(Collectors.toList());
}
public static void registerCommand(JDA jda, CommandData commandData) {
Guild guild = jda.getGuildById(BotConfig.DISCORD.GUILD_ID);
if (guild == null) {
ALogger.error("Unable to find guild with id: [" + BotConfig.DISCORD.GUILD_ID + "] to register commands");
return;
}
registerCommand(guild, commandData);
}
public static void registerCommand(Guild guild, CommandData commandData) {
guild.upsertCommand(commandData).queue(RestAction.getDefaultSuccess(), Utilities::handleFailure);
}
public static void registerSubOptions(HashMap<String, SubOption> subCommandMap, SubOption... subOptions) {
for (SubOption subOption : subOptions)
subCommandMap.put(subOption.getName(), subOption);
}
public static MessageEmbed invalidSubcommand(String subcommandName) {
return new EmbedBuilder()
.setTitle("Invalid sub command")
.setDescription("This is not a valid sub command: " + subcommandName)
.setColor(Color.RED)
.build();
}
public static MessageEmbed genericErrorEmbed(String title, String desc) {
return new EmbedBuilder()
.setTitle(title)
.setDescription(desc)
.setColor(Color.RED)
.build();
}
public static MessageEmbed genericSuccessEmbed(String title, String desc) {
return new EmbedBuilder()
.setTitle(title)
.setDescription(desc)
.setColor(Color.GREEN)
.build();
}
public static MessageEmbed genericWaitingEmbed(String title, String desc) {
return new EmbedBuilder()
.setTitle(title)
.setDescription(desc)
.setColor(Color.BLUE)
.build();
}
public static void ignoreSuccess(Object o) {
// IDK I thought this looked nicer in the .queue call
}
public static void handleFailure(Throwable failure) {
ALogger.error(failure.getMessage());
}
public static void commandErrAutoRem(String text, SlashCommandInteractionEvent event) {
event.replyEmbeds(Utilities.genericErrorEmbed("Error", text))
.setEphemeral(true)
.queue(res -> res.deleteOriginal().queueAfter(5, TimeUnit.SECONDS));
}
public static boolean removeRole(UUID uuid, String group) {
User user = getLuckPerms().getUserManager().getUser(uuid);
if (user == null)