From eed94ec34a6c970e7699b0547531de9c515369f7 Mon Sep 17 00:00:00 2001 From: P0nk Date: Wed, 15 Mar 2023 22:56:40 +0100 Subject: [PATCH] Refactor CommandsExecutor - is no longer static singleton Preparing for change in Command#handle, which is going to take a CommandContext as an additional argument. This way we can pass in command dependencies in a safe way instead of requiring them to access static methods. --- .../java/client/command/CommandContext.java | 6 +++++ .../java/client/command/CommandsExecutor.java | 27 ++++++++++--------- src/main/java/net/ChannelDependencies.java | 4 ++- src/main/java/net/PacketProcessor.java | 2 +- src/main/java/net/server/Server.java | 6 +++-- .../channel/handlers/GeneralChatHandler.java | 9 +++++-- 6 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 src/main/java/client/command/CommandContext.java diff --git a/src/main/java/client/command/CommandContext.java b/src/main/java/client/command/CommandContext.java new file mode 100644 index 0000000000..62253004c2 --- /dev/null +++ b/src/main/java/client/command/CommandContext.java @@ -0,0 +1,6 @@ +package client.command; + +import database.drop.DropProvider; + +public record CommandContext(DropProvider dropProvider) { +} diff --git a/src/main/java/client/command/CommandsExecutor.java b/src/main/java/client/command/CommandsExecutor.java index cc35cce603..2920c38e8e 100644 --- a/src/main/java/client/command/CommandsExecutor.java +++ b/src/main/java/client/command/CommandsExecutor.java @@ -43,16 +43,27 @@ import java.util.List; public class CommandsExecutor { private static final Logger log = LoggerFactory.getLogger(CommandsExecutor.class); - private static final CommandsExecutor instance = new CommandsExecutor(); private static final char USER_HEADING = '@'; private static final char GM_HEADING = '!'; private final HashMap registeredCommands = new HashMap<>(); private final List, List>> commandsNameDesc = new ArrayList<>(); + private final CommandContext commandContext; private Pair, List> levelCommandsCursor; - public static CommandsExecutor getInstance() { - return instance; + public CommandsExecutor(CommandContext commandContext) { + this.commandContext = commandContext; + registerCommands(); + } + + private void registerCommands() { + registerLv0Commands(); + registerLv1Commands(); + registerLv2Commands(); + registerLv3Commands(); + registerLv4Commands(); + registerLv5Commands(); + registerLv6Commands(); } public static boolean isCommand(Client client, String content) { @@ -63,16 +74,6 @@ public class CommandsExecutor { return heading == USER_HEADING; } - private CommandsExecutor() { - registerLv0Commands(); - registerLv1Commands(); - registerLv2Commands(); - registerLv3Commands(); - registerLv4Commands(); - registerLv5Commands(); - registerLv6Commands(); - } - public List, List>> getGmCommands() { return commandsNameDesc; } diff --git a/src/main/java/net/ChannelDependencies.java b/src/main/java/net/ChannelDependencies.java index bbc71e71e1..46b066e90d 100644 --- a/src/main/java/net/ChannelDependencies.java +++ b/src/main/java/net/ChannelDependencies.java @@ -1,5 +1,6 @@ package net; +import client.command.CommandsExecutor; import client.processor.action.MakerProcessor; import client.processor.npc.FredrickProcessor; import database.drop.DropProvider; @@ -9,7 +10,7 @@ import java.util.Objects; public record ChannelDependencies( NoteService noteService, FredrickProcessor fredrickProcessor, MakerProcessor makerProcessor, - DropProvider dropProvider + DropProvider dropProvider, CommandsExecutor commandsExecutor ) { public ChannelDependencies { @@ -17,5 +18,6 @@ public record ChannelDependencies( Objects.requireNonNull(fredrickProcessor); Objects.requireNonNull(makerProcessor); Objects.requireNonNull(dropProvider); + Objects.requireNonNull(commandsExecutor); } } diff --git a/src/main/java/net/PacketProcessor.java b/src/main/java/net/PacketProcessor.java index 491096bc69..c6c5bcb534 100644 --- a/src/main/java/net/PacketProcessor.java +++ b/src/main/java/net/PacketProcessor.java @@ -142,7 +142,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.WORLD_TRANSFER, new TransferWorldHandler()); registerHandler(RecvOpcode.CHANGE_CHANNEL, new ChangeChannelHandler()); registerHandler(RecvOpcode.STRANGE_DATA, LoginRequiringNoOpHandler.getInstance()); - registerHandler(RecvOpcode.GENERAL_CHAT, new GeneralChatHandler()); + registerHandler(RecvOpcode.GENERAL_CHAT, new GeneralChatHandler(channelDeps.commandsExecutor())); registerHandler(RecvOpcode.WHISPER, new WhisperHandler()); registerHandler(RecvOpcode.NPC_TALK, new NPCTalkHandler()); registerHandler(RecvOpcode.NPC_TALK_MORE, new NPCMoreTalkHandler()); diff --git a/src/main/java/net/server/Server.java b/src/main/java/net/server/Server.java index 188505cf1d..17a70b985d 100644 --- a/src/main/java/net/server/Server.java +++ b/src/main/java/net/server/Server.java @@ -25,6 +25,7 @@ import client.Character; import client.Client; import client.Family; import client.SkillFactory; +import client.command.CommandContext; import client.command.CommandsExecutor; import client.inventory.Item; import client.inventory.ItemFactory; @@ -930,7 +931,6 @@ public class Server { log.info("Cosmic is now online after {} ms.", initDuration.toMillis()); OpcodeConstants.generateOpcodeNames(); - CommandsExecutor.getInstance(); for (Channel ch : this.getAllChannels()) { ch.reloadEventScriptManager(); @@ -977,8 +977,10 @@ public class Server { MakerProcessor makerProcessor = new MakerProcessor(new MakerInfoProvider(new MakerDao(connection))); FredrickProcessor fredrickProcessor = new FredrickProcessor(noteService); DropProvider dropProvider = new DropProvider(new DropDao(connection)); + CommandContext commandContext = new CommandContext(dropProvider); + CommandsExecutor commandsExecutor = new CommandsExecutor(commandContext); ChannelDependencies channelDependencies = new ChannelDependencies(noteService, fredrickProcessor, - makerProcessor, dropProvider); + makerProcessor, dropProvider, commandsExecutor); PacketProcessor.registerGameHandlerDependencies(channelDependencies); diff --git a/src/main/java/net/server/channel/handlers/GeneralChatHandler.java b/src/main/java/net/server/channel/handlers/GeneralChatHandler.java index 1826d86856..71f295dbcd 100644 --- a/src/main/java/net/server/channel/handlers/GeneralChatHandler.java +++ b/src/main/java/net/server/channel/handlers/GeneralChatHandler.java @@ -34,6 +34,11 @@ import tools.PacketCreator; public final class GeneralChatHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(GeneralChatHandler.class); + private final CommandsExecutor commandsExecutor; + + public GeneralChatHandler(CommandsExecutor commandsExecutor) { + this.commandsExecutor = commandsExecutor; + } @Override public void handlePacket(InPacket p, Client c) { @@ -51,7 +56,7 @@ public final class GeneralChatHandler extends AbstractPacketHandler { } char heading = s.charAt(0); if (CommandsExecutor.isCommand(c, s)) { - CommandsExecutor.getInstance().handle(c, s); + commandsExecutor.handle(c, s); } else if (heading != '/') { int show = p.readByte(); if (chr.getMap().isMuted() && !chr.isGM()) { @@ -70,4 +75,4 @@ public final class GeneralChatHandler extends AbstractPacketHandler { chr.getAutobanManager().spam(7); } } -} \ No newline at end of file +}