diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index 6b649ab..2da113e 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -2,6 +2,7 @@ package buttondevteam.discordplugin; import buttondevteam.lib.architecture.ConfigData; import buttondevteam.lib.architecture.IHaveConfig; +import lombok.val; import org.bukkit.Bukkit; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IIDLinkedObject; @@ -112,8 +113,11 @@ public final class DPUtils { return config.getDataPrimDef(key, defID, id -> DiscordPlugin.dc.getChannelByID((long) id), IIDLinkedObject::getLongID); //We can afford to search for the channel in the cache once (instead of using mainServer) } - public static ConfigData roleData(IHaveConfig config, String key, long defID) { - return config.getDataPrimDef(key, defID, id -> DiscordPlugin.dc.getRoleByID((long) id), IIDLinkedObject::getLongID); //We can afford to search for the channel in the cache once (instead of using mainServer) + public static ConfigData roleData(IHaveConfig config, String key, String defName) { + return config.getDataPrimDef(key, defName, name -> { + val roles = DiscordPlugin.mainServer.getRolesByName((String) name); + return roles.size() > 0 ? roles.get(0) : null; //TODO: May not handle null properly + }, IIDLinkedObject::getLongID); //We can afford to search for the channel in the cache once (instead of using mainServer) } /** diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 9187d52..40f90a9 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -1,7 +1,9 @@ package buttondevteam.discordplugin; import buttondevteam.discordplugin.broadcaster.GeneralEventBroadcasterModule; +import buttondevteam.discordplugin.commands.Command2DC; import buttondevteam.discordplugin.commands.DiscordCommandBase; +import buttondevteam.discordplugin.commands.VersionCommand; import buttondevteam.discordplugin.exceptions.ExceptionListenerModule; import buttondevteam.discordplugin.listeners.CommonListeners; import buttondevteam.discordplugin.listeners.MCListener; @@ -18,6 +20,7 @@ import buttondevteam.lib.architecture.ConfigData; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.player.ChromaGamerBase; import com.google.common.io.Files; +import lombok.Getter; import lombok.val; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; @@ -46,6 +49,8 @@ public class DiscordPlugin extends ButtonPlugin implements IListener public static IDiscordClient dc; public static DiscordPlugin plugin; public static boolean SafeMode = true; + @Getter + private Command2DC manager; public ConfigData Prefix() { return getIConfig().getData("prefix", '/', str -> ((String) str).charAt(0), Object::toString); @@ -64,11 +69,16 @@ public class DiscordPlugin extends ButtonPlugin implements IListener return DPUtils.channelData(getIConfig(), "commandChannel", 239519012529111040L); } + public ConfigData ModRole() { + return DPUtils.roleData(getIConfig(), "modRole", "Moderator"); + } + @Override public void pluginEnable() { try { Bukkit.getLogger().info("Initializing DiscordPlugin..."); plugin = this; + manager = new Command2DC(); ClientBuilder cb = new ClientBuilder(); cb.withToken(Files.readFirstLine(new File("TBMC", "Token.txt"), StandardCharsets.UTF_8)); dc = cb.login(); @@ -146,6 +156,7 @@ public class DiscordPlugin extends ButtonPlugin implements IListener new ChromaBot(this).updatePlayerList(); //Initialize ChromaBot - The MCCHatModule is tested to be enabled DiscordCommandBase.registerCommands(); + getManager().registerCommand(new VersionCommand()); if (ResetMCCommand.resetting) //These will only execute if the chat is enabled ChromaBot.getInstance().sendMessageCustomAsWell("", new EmbedBuilder().withColor(Color.CYAN) .withTitle("Discord plugin restarted - chat connected.").build(), ChannelconBroadcast.RESTART); //Really important to note the chat, hmm diff --git a/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java b/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java new file mode 100644 index 0000000..22565d9 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/Command2DC.java @@ -0,0 +1,32 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.chat.Command2; + +import java.util.HashMap; +import java.util.function.Function; + +public class Command2DC extends Command2 { + private HashMap> subcommands = new HashMap<>(); + private HashMap, ParamConverter> paramConverters = new HashMap<>(); + + @Override + public void addParamConverter(Class cl, Function converter, String errormsg) { + addParamConverter(cl, converter, errormsg, paramConverters); + } + + @Override + public boolean handleCommand(Command2DCSender sender, String commandLine) throws Exception { + return handleCommand(sender, commandLine, subcommands, paramConverters); + } + + @Override + public void registerCommand(ICommand2DC command) { + registerCommand(command, subcommands, DiscordPlugin.getPrefix()); + } + + @Override + public boolean hasPermission(Command2DCSender sender, ICommand2DC command) { + return !command.isModOnly() || sender.getMessage().getAuthor().hasRole(DiscordPlugin.plugin.ModRole().get()); + } +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java b/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java new file mode 100644 index 0000000..5a04166 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/Command2DCSender.java @@ -0,0 +1,21 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.lib.chat.Command2Sender; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import sx.blah.discord.handle.obj.IMessage; + +@RequiredArgsConstructor +public class Command2DCSender implements Command2Sender { + private final @Getter IMessage message; + + @Override + public void sendMessage(String message) { + this.message.reply(message); + } + + @Override + public void sendMessage(String[] message) { + this.message.reply(String.join("\n", message)); + } +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java index 947db5b..d05964f 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java +++ b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java @@ -27,12 +27,13 @@ public abstract class DiscordCommandBase { commands.put("mcchat", new MCChatCommand()); commands.put("channelcon", new ChannelconCommand()); commands.put("debug", new DebugCommand()); - commands.put("version", new VersionCommand()); } public static void runCommand(String cmd, String args, IMessage message) { debug("F"); //Not sure if needed DiscordCommandBase command = commands.get(cmd); + //if(command==null) + // DiscordPlugin.plugin.getManager().handleCommand(new Command2DCSender(message), cmd+" "+args); //TODO! if (command == null) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "Unknown command: " + cmd + " with args: " + args + "\nDo '" diff --git a/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java b/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java new file mode 100644 index 0000000..c602c68 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/ICommand2DC.java @@ -0,0 +1,20 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.chat.ICommand2; +import lombok.Getter; +import lombok.val; + +public abstract class ICommand2DC extends ICommand2 { + public ICommand2DC() { + super(DiscordPlugin.plugin.getManager()); + val ann = getClass().getAnnotation(CommandClass.class); + if (ann == null) + modOnly = false; + else + modOnly = ann.modOnly(); + } + + private final @Getter boolean modOnly; +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java b/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java index 5908495..cf0ee8c 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/VersionCommand.java @@ -1,26 +1,19 @@ package buttondevteam.discordplugin.commands; import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.chat.CommandClass; import lombok.val; -import sx.blah.discord.handle.obj.IMessage; -public class VersionCommand extends DiscordCommandBase { - @Override - public String getCommandName() { - return "version"; - } - - @Override - public boolean run(IMessage message, String args) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), String.join("\n", getVersion())); +@CommandClass(helpText = { + "Version", + "Returns the plugin's version" +}) +public class VersionCommand extends ICommand2DC { + public boolean def(Command2DCSender sender) { + sender.sendMessage(getVersion()); return true; } - @Override - public String[] getHelpText() { - return VersionCommand.getVersion(); //Heh - } - public static String[] getVersion() { val desc = DiscordPlugin.plugin.getDescription(); return new String[]{ //