diff --git a/core/src/main/java/mc/core/chat/CommandExecutor.java b/core/src/main/java/mc/core/chat/CommandExecutor.java index 39c4de1..e0d6e66 100644 --- a/core/src/main/java/mc/core/chat/CommandExecutor.java +++ b/core/src/main/java/mc/core/chat/CommandExecutor.java @@ -6,6 +6,12 @@ package mc.core.chat; import mc.core.player.Player; +import java.util.Optional; + public interface CommandExecutor { - void execute(Player sender, String command, String... args); + String getName(); + Optional getAliases(); + Optional getUsage(); + String getDescription(); + void execute(Player sender, String... args); } diff --git a/core/src/main/java/mc/core/chat/CommanderChatProcessor.java b/core/src/main/java/mc/core/chat/CommanderChatProcessor.java index bbbb17f..c561d46 100644 --- a/core/src/main/java/mc/core/chat/CommanderChatProcessor.java +++ b/core/src/main/java/mc/core/chat/CommanderChatProcessor.java @@ -8,15 +8,54 @@ import lombok.extern.slf4j.Slf4j; import mc.core.player.Player; import org.slf4j.Marker; import org.slf4j.helpers.BasicMarkerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; -import java.util.Collections; +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; import java.util.Map; @Slf4j public class CommanderChatProcessor extends SimpleChatProcessor { private static final Marker COMMAND_MARKER = new BasicMarkerFactory().getMarker("Command"); private static final String UNKNOW_COMMAND_MSG = ChatStyle.RED + "Unknown command \"" + ChatStyle.WHITE + "%s" + ChatStyle.RED + "\""; - private Map commands = Collections.emptyMap(); + @Autowired + private ApplicationContext applicationContext; + private Map commands = new HashMap<>(); + + @PostConstruct + public void init() { + Map beans = applicationContext.getBeansOfType(CommandExecutor.class); + beans.values().forEach(commandExecutor -> { + log.trace("Add command \"{}\" ({})", commandExecutor.getName(), commandExecutor.getClass().getName()); + if (commands.containsKey(commandExecutor.getName())) { + log.warn("Override command \"{}\"", commandExecutor.getName()); + log.debug("{} -> {}", + commands.get(commandExecutor.getName()).getClass().getName(), + commandExecutor.getClass().getName() + ); + } + commands.put(commandExecutor.getName(), commandExecutor); + + if (commandExecutor.getAliases().isPresent()) { + Arrays.stream(commandExecutor.getAliases().get()).forEach(aliase -> { + log.trace("Add aliase \"{}\" ({})", aliase, commandExecutor.getClass().getName()); + if (commands.containsKey(aliase)) { + log.warn("Override aliase \"{}\"", aliase); + log.debug("{} -> {}", + commands.get(aliase).getClass().getName(), + commandExecutor.getClass().getName() + ); + } + commands.put(aliase, commandExecutor); + }); + } + }); + + log.debug("Load {} commands", commands.size()); + } @Override public void process(Player player, String message) { @@ -31,7 +70,7 @@ public class CommanderChatProcessor extends SimpleChatProcessor { String command = message.substring(1, idx).toLowerCase(); if (commands.containsKey(command)) { String[] args = message.substring(idx).split(" "); - commands.get(command).execute(player, command, args); + commands.get(command).execute(player, args); } else { player.getChannel().sendChatMessage(String.format(UNKNOW_COMMAND_MSG, command)); } @@ -39,4 +78,8 @@ public class CommanderChatProcessor extends SimpleChatProcessor { super.process(player, message); } } + + public Collection getAllCommands() { + return commands.values(); + } } diff --git a/settings.gradle b/settings.gradle index 2588cb2..14016e6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,4 +4,4 @@ include('core') // Core include('proto125') // Protocol 1.2.5 include('proto125_netty') // Protocol 1.2.5 (Netty impl.) include('flat_world') -include('commander') +include('vanilla_commands') diff --git a/commander/build.gradle b/vanilla_commands/build.gradle similarity index 100% rename from commander/build.gradle rename to vanilla_commands/build.gradle diff --git a/vanilla_commands/src/main/java/mc/commands/HelpCommand.java b/vanilla_commands/src/main/java/mc/commands/HelpCommand.java new file mode 100644 index 0000000..e1115c5 --- /dev/null +++ b/vanilla_commands/src/main/java/mc/commands/HelpCommand.java @@ -0,0 +1,62 @@ +/* + * DmitriyMX + * 2018-05-23 + */ +package mc.commands; + +import lombok.extern.slf4j.Slf4j; +import mc.core.chat.ChatStyle; +import mc.core.chat.CommandExecutor; +import mc.core.chat.CommanderChatProcessor; +import mc.core.player.Player; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import java.util.Optional; + +@Slf4j +public class HelpCommand implements CommandExecutor { + @Autowired + private ApplicationContext applicationContext; + private CommanderChatProcessor commanderChatProcessor; + + @Override + public String getName() { + return "help"; + } + + @Override + public Optional getAliases() { + return Optional.of(new String[]{"?"}); + } + + @Override + public Optional getUsage() { + return Optional.empty(); + } + + @Override + public String getDescription() { + return "shows this message"; + } + + @Override + public void execute(Player sender, String... args) { + if (commanderChatProcessor == null) { + commanderChatProcessor = applicationContext.getBean(CommanderChatProcessor.class); + if (commanderChatProcessor == null) { + log.error("Error get bean of type \"CommanderChatProcessor\". WTF?!"); + sender.getChannel().sendChatMessage(ChatStyle.RED + "!!-Server error-!!"); + return; + } + } + + final String messageFormat = ChatStyle.RED + "%s " + ChatStyle.GRAY + "- " + ChatStyle.WHITE + "%s"; + commanderChatProcessor.getAllCommands().forEach(commandExecutor -> { + sender.getChannel().sendChatMessage(String.format(messageFormat, + commandExecutor.getUsage().orElse(commandExecutor.getName()), + commandExecutor.getDescription() + )); + }); + } +} diff --git a/vanilla_commands/src/main/java/mc/commands/ListCommand.java b/vanilla_commands/src/main/java/mc/commands/ListCommand.java new file mode 100644 index 0000000..eacbd0f --- /dev/null +++ b/vanilla_commands/src/main/java/mc/commands/ListCommand.java @@ -0,0 +1,49 @@ +/* + * DmitriyMX + * 2018-05-23 + */ +package mc.commands; + +import mc.core.chat.ChatStyle; +import mc.core.chat.CommandExecutor; +import mc.core.player.Player; +import mc.core.player.PlayerManager; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; +import java.util.StringJoiner; + +public class ListCommand implements CommandExecutor { + @Autowired + private PlayerManager playerManager; + + @Override + public String getName() { + return "list"; + } + + @Override + public Optional getAliases() { + return Optional.empty(); + } + + @Override + public Optional getUsage() { + return Optional.empty(); + } + + @Override + public String getDescription() { + return "lists all currently connected players"; + } + + @Override + public void execute(Player sender, String... args) { + StringJoiner sj = new StringJoiner(", "); + playerManager.getPlayers().forEach(pl -> sj.add(pl.getName())); + + sender.getChannel().sendChatMessage( + ChatStyle.GREEN + "Online(" + playerManager.getCountOnlinePlayers() + "): " + + ChatStyle.DARK_GREEN + sj.toString()); + } +}