Skip to content

Commit 574a5e9

Browse files
committed
refactored interface to make it easier to use with new api
1 parent 01a28e4 commit 574a5e9

File tree

12 files changed

+65
-69
lines changed

12 files changed

+65
-69
lines changed

api-jvm-impl/src/main/java/ch/vorburger/minecraft/storeys/japi/impl/EventsImpl.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030
import java.util.Optional;
3131
import java.util.concurrent.ConcurrentLinkedQueue;
3232
import net.kyori.adventure.audience.Audience;
33+
import net.kyori.adventure.text.Component;
3334
import org.slf4j.Logger;
3435
import org.slf4j.LoggerFactory;
3536
import org.spongepowered.api.Sponge;
3637
import org.spongepowered.api.command.Command;
37-
import org.spongepowered.api.command.CommandCause;
3838
import org.spongepowered.api.command.CommandResult;
3939
import org.spongepowered.api.command.registrar.CommandRegistrar;
4040
import org.spongepowered.plugin.PluginContainer;
@@ -75,6 +75,7 @@ class EventsImpl implements Events, Unregisterable {
7575
return;
7676
}
7777
registrar.get().register(plugin, spec, name);
78+
//TODO Sponge.server().commandManager().updateCommandTreeForPlayer();
7879
unregistrables.add(() -> {
7980

8081
});
@@ -104,7 +105,7 @@ class EventsImpl implements Events, Unregisterable {
104105
ch.vorburger.minecraft.storeys.japi.impl.events.Callback otherCallback = invoker -> {
105106
invokeCallback(invoker, callback);
106107
};
107-
unregistrables.add(eventService.registerInteractEntity(entityName, otherCallback));
108+
unregistrables.add(eventService.registerInteractEntity(Component.text(entityName), otherCallback));
108109
}
109110

110111
@Override public void unregister() {

api-jvm-impl/src/main/java/ch/vorburger/minecraft/storeys/japi/impl/events/EventService.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,9 @@
2929
import javax.inject.Inject;
3030
import javax.inject.Singleton;
3131
import net.kyori.adventure.text.Component;
32-
import net.kyori.adventure.text.TextComponent;
3332
import org.slf4j.Logger;
3433
import org.slf4j.LoggerFactory;
35-
import org.spongepowered.api.data.Key;
3634
import org.spongepowered.api.data.Keys;
37-
import org.spongepowered.api.data.value.Value;
3835
import org.spongepowered.api.entity.living.player.Player;
3936
import org.spongepowered.api.event.EventManager;
4037
import org.spongepowered.api.event.Listener;
@@ -50,7 +47,7 @@
5047
private final Collection<Callback> onPlayerJoinCallbacks = new ConcurrentLinkedQueue<>();
5148

5249
private final Map<String, Collection<Callback>> onPlayerInsideCallbacks = new ConcurrentHashMap<>();
53-
private final Map<String, Collection<Callback>> onInteractEntityEventCallbacks = new ConcurrentHashMap<>();
50+
private final Map<Component, Collection<Callback>> onInteractEntityEventCallbacks = new ConcurrentHashMap<>();
5451

5552
private final EventManager eventManager;
5653

@@ -94,7 +91,7 @@ public Unregisterable registerInsideLocation(String locationName, Callback callb
9491
return add(callbacks, callback);
9592
}
9693

97-
public Unregisterable registerInteractEntity(String entityName, Callback callback) {
94+
public Unregisterable registerInteractEntity(Component entityName, Callback callback) {
9895
Collection<Callback> callbacks = onInteractEntityEventCallbacks.computeIfAbsent(entityName, name -> new ConcurrentLinkedQueue<>());
9996
return add(callbacks, callback);
10097
}
@@ -111,7 +108,7 @@ private Unregisterable add(Collection<Callback> collection, Callback callback) {
111108
Optional<Component> optEntityNameText = event.entity().get(Keys.DISPLAY_NAME);
112109
LOG.debug("InteractEntityEvent: entityName={}; event={}", optEntityNameText, event);
113110
optEntityNameText.ifPresent(entityNameText -> {
114-
Collection<Callback> callbacks = onInteractEntityEventCallbacks.getOrDefault(((TextComponent) entityNameText).content(),
111+
Collection<Callback> callbacks = onInteractEntityEventCallbacks.getOrDefault(entityNameText,
115112
Collections.emptySet());
116113
for (Callback callback : callbacks) {
117114
try {

storeys/src/main/java/ch/vorburger/minecraft/storeys/commands/NarrateCommand.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import ch.vorburger.minecraft.storeys.japi.ReadingSpeed;
2222
import ch.vorburger.minecraft.storeys.japi.impl.actions.Narrator;
2323
import ch.vorburger.minecraft.storeys.util.Command;
24-
import com.google.common.collect.ImmutableList;
25-
import java.util.List;
2624
import javax.inject.Inject;
2725
import net.kyori.adventure.text.Component;
2826
import org.spongepowered.api.command.CommandResult;
@@ -42,11 +40,11 @@ public class NarrateCommand implements Command {
4240
this.narrator = narrator;
4341
}
4442

45-
@Override public List<String> aliases() {
46-
return ImmutableList.of("narrate");
43+
@Override public String getName() {
44+
return "narrate";
4745
}
4846

49-
@Override public org.spongepowered.api.command.Command callable() {
47+
@Override public org.spongepowered.api.command.Command.Parameterized createCommand() {
5048
// TODO when Sponge uses entity names instead of UUIDs:
5149
// TODO requiringPermission()
5250
return org.spongepowered.api.command.Command.builder().shortDescription(Component.text(("Make an entity character narrate story lines")))

storeys/src/main/java/ch/vorburger/minecraft/storeys/commands/StoryCommand.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@
2727
import ch.vorburger.minecraft.storeys.model.parser.StoryParser;
2828
import ch.vorburger.minecraft.storeys.model.parser.StoryRepository;
2929
import ch.vorburger.minecraft.storeys.util.Command;
30-
import com.google.common.collect.ImmutableList;
3130
import java.io.File;
3231
import java.nio.file.Path;
33-
import java.util.List;
3432
import javax.inject.Inject;
3533
import net.kyori.adventure.text.Component;
3634
import org.spongepowered.api.command.CommandResult;
@@ -56,11 +54,11 @@ public class StoryCommand implements Command {
5654
this.storyPlayer = storyPlayer;
5755
}
5856

59-
@Override public List<String> aliases() {
60-
return ImmutableList.of("story");
57+
@Override public String getName() {
58+
return "story";
6159
}
6260

63-
@Override public org.spongepowered.api.command.Command callable() {
61+
@Override public org.spongepowered.api.command.Command.Parameterized createCommand() {
6462
return org.spongepowered.api.command.Command.builder().shortDescription(Component.text("Tell a story"))
6563
// .permission("storeys.commands.story") ?
6664
.addParameter(STORY_NAME) // TODO requiringPermission()

storeys/src/main/java/ch/vorburger/minecraft/storeys/events/ConditionService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.spongepowered.api.scheduler.ScheduledTask;
4040
import org.spongepowered.api.scheduler.Scheduler;
4141
import org.spongepowered.api.scheduler.Task;
42+
import org.spongepowered.plugin.PluginContainer;
4243

4344
@ThreadSafe @Singleton public class ConditionService implements AutoCloseable {
4445

@@ -90,8 +91,8 @@ private ConditionServiceRegistration(Triple<Condition, AtomicBoolean, Callback>
9091
private final Scheduler scheduler;
9192
private final UUID taskId;
9293

93-
@Inject public ConditionService(Scheduler scheduler) {
94-
Task task = Task.builder().execute(this::run).interval(10, TimeUnit.SECONDS).build();
94+
@Inject public ConditionService(PluginContainer plugin, Scheduler scheduler) {
95+
Task task = Task.builder().execute(this::run).interval(10, TimeUnit.SECONDS).plugin(plugin).build();
9596
this.scheduler = scheduler;
9697
taskId = scheduler.submit(task).uniqueId();
9798
}

storeys/src/main/java/ch/vorburger/minecraft/storeys/model/LocationAction.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public class LocationAction implements Action<Void> {
3737
public LocationAction() {
3838
}
3939

40-
@Inject public LocationAction(Scheduler scheduler) {
41-
conditionService = new ConditionService(scheduler);
40+
@Inject public LocationAction(ConditionService conditionService) {
41+
this.conditionService = conditionService;
4242
}
4343

4444
@Override public void setParameter(String param) {

storeys/src/main/java/ch/vorburger/minecraft/storeys/plugin/AbstractStoreysPlugin.java

+5-20
Original file line numberDiff line numberDiff line change
@@ -27,55 +27,40 @@
2727
import com.google.inject.Injector;
2828
import java.nio.file.Path;
2929
import javax.inject.Inject;
30-
import org.slf4j.Logger;
31-
import org.slf4j.LoggerFactory;
3230
import org.spongepowered.api.command.Command;
3331
import org.spongepowered.api.config.ConfigDir;
3432
import org.spongepowered.api.event.EventManager;
35-
import org.spongepowered.api.event.Listener;
3633
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
37-
import org.spongepowered.api.event.lifecycle.StartingEngineEvent;
3834

3935
// Do *NOT* annotate this class with @Plugin
4036
public abstract class AbstractStoreysPlugin extends AbstractPlugin {
4137

42-
private static final Logger LOG = LoggerFactory.getLogger(AbstractStoreysPlugin.class);
43-
4438
@Inject @ConfigDir(sharedRoot = false) private Path configDir;
4539

4640
@Inject protected Injector pluginInjector;
4741

48-
private Injector childInjector;
49-
5042
@Inject private EventManager eventManager;
5143

5244
@Inject private EventService eventService;
5345

54-
@Listener public final void onGameStartingServer(StartingEngineEvent event) throws Exception {
55-
LOG.info("See https://github.com/OASIS-learn-study/minecraft-storeys-maker for how to use /story and /narrate commands");
56-
start(this, configDir);
57-
}
58-
59-
protected void start(PluginInstance plugin, Path configDir) throws Exception {
46+
protected void start(PluginInstance plugin, Path configDir) {
6047
eventManager.registerListeners(plugin.getPluginContainer(), new GuardGameModeJoinListener());
6148
eventService.setPluginContainer(plugin.getPluginContainer());
6249

6350
// TODO(vorburger) child injector might not actually be required, could possibly just use only pluginInjector?
64-
childInjector = pluginInjector.createChildInjector(binder -> {
51+
Injector childInjector = pluginInjector.createChildInjector(binder -> {
6552
binder.bind(PluginInstance.class).toInstance(plugin);
6653
binder.bind(Path.class).toInstance(configDir);
6754
binder.bind(Scripts.class);
6855
binder.bind(ScriptsLoader.class);
6956
});
7057
}
7158

72-
@Listener public void register(RegisterCommandEvent<Command.Raw> event) {
59+
public void register(RegisterCommandEvent<Command.Parameterized> event) {
7360
final StoryCommand storyCommand = pluginInjector.getInstance(StoryCommand.class);
7461
final NarrateCommand narrateCommand = pluginInjector.getInstance(NarrateCommand.class);
7562

76-
event.register(this.getPluginContainer(), (Command.Raw) narrateCommand.callable(), narrateCommand.aliases().get(0),
77-
narrateCommand.aliases().toArray(new String[0]));
78-
event.register(this.getPluginContainer(), (Command.Raw) storyCommand.callable(), storyCommand.aliases().get(0),
79-
storyCommand.aliases().toArray(new String[0]));
63+
event.register(this.getPluginContainer(), narrateCommand.createCommand(), narrateCommand.getName(), narrateCommand.aliases());
64+
event.register(this.getPluginContainer(), storyCommand.createCommand(), storyCommand.getName(), storyCommand.aliases());
8065
}
8166
}

storeys/src/main/java/ch/vorburger/minecraft/storeys/util/Command.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@
2323

2424
public interface Command extends CommandExecutor {
2525

26-
org.spongepowered.api.command.Command callable();
26+
org.spongepowered.api.command.Command.Parameterized createCommand();
2727

28-
List<String> aliases();
28+
String getName();
29+
30+
default String[] aliases() {
31+
return new String[0];
32+
}
2933
}

web/src/main/java/ch/vorburger/minecraft/storeys/api/impl/TokenCommand.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import ch.vorburger.minecraft.storeys.japi.util.CommandExceptions;
2222
import ch.vorburger.minecraft.storeys.simple.TokenProvider;
2323
import ch.vorburger.minecraft.storeys.util.Command;
24-
import com.google.common.collect.ImmutableList;
25-
import java.util.List;
2624
import net.kyori.adventure.text.Component;
2725
import net.kyori.adventure.text.event.ClickEvent;
2826
import net.kyori.adventure.text.format.NamedTextColor;
@@ -42,13 +40,13 @@ public TokenCommand(TokenProvider newTokenProvider) {
4240
this.tokenProvider = newTokenProvider;
4341
}
4442

45-
@Override public org.spongepowered.api.command.Command callable() {
43+
@Override public org.spongepowered.api.command.Command.Parameterized createCommand() {
4644
return org.spongepowered.api.command.Command.builder().permission("storeys.token.new")
4745
.shortDescription(Component.text("Obtain API token for player")).executor(this).build();
4846
}
4947

50-
@Override public List<String> aliases() {
51-
return ImmutableList.of("token");
48+
@Override public String getName() {
49+
return "token";
5250
}
5351

5452
@Override public CommandResult execute(CommandContext args) throws CommandException {

web/src/main/java/ch/vorburger/minecraft/storeys/web/LocationToolListener.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,14 @@
4545
import org.spongepowered.api.data.Keys;
4646
import org.spongepowered.api.data.type.HandTypes;
4747
import org.spongepowered.api.entity.living.player.Player;
48+
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
4849
import org.spongepowered.api.event.Cause;
4950
import org.spongepowered.api.event.EventContext;
5051
import org.spongepowered.api.event.EventContextKeys;
5152
import org.spongepowered.api.event.EventManager;
5253
import org.spongepowered.api.event.Listener;
5354
import org.spongepowered.api.event.block.InteractBlockEvent;
55+
import org.spongepowered.api.event.filter.cause.First;
5456
import org.spongepowered.api.event.lifecycle.StoppedGameEvent;
5557
import org.spongepowered.api.item.inventory.ItemStack;
5658
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
@@ -93,7 +95,7 @@
9395
}
9496
}
9597

96-
@Listener public void locationToolInteraction(InteractBlockEvent event, Player player) {
98+
@Listener public void locationToolInteraction(InteractBlockEvent.Primary event, @First ServerPlayer player) {
9799
final Optional<ItemStackSnapshot> snapshot = event.context().get(EventContextKeys.USED_ITEM);
98100
snapshot.ifPresent(itemStackSnapshot -> {
99101
final ItemStack itemStack = player.itemInHand(HandTypes.MAIN_HAND);

web/src/main/java/ch/vorburger/minecraft/storeys/web/LoginCommand.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,10 @@
2121
import ch.vorburger.minecraft.storeys.japi.util.CommandExceptions;
2222
import ch.vorburger.minecraft.storeys.simple.TokenProvider;
2323
import ch.vorburger.minecraft.storeys.util.Command;
24-
import com.google.common.collect.ImmutableList;
2524
import java.net.URL;
26-
import java.util.List;
2725
import net.kyori.adventure.text.Component;
2826
import net.kyori.adventure.text.event.ClickEvent;
2927
import net.kyori.adventure.text.format.NamedTextColor;
30-
import org.spongepowered.api.command.Command.Parameterized;
3128
import org.spongepowered.api.command.CommandResult;
3229
import org.spongepowered.api.command.exception.CommandException;
3330
import org.spongepowered.api.command.parameter.CommandContext;
@@ -59,13 +56,17 @@ private String getSystemPropertyEnvVarOrDefault(String propertyName, String defa
5956
return defaultValue;
6057
}
6158

62-
@Override public org.spongepowered.api.command.Command callable() {
59+
@Override public org.spongepowered.api.command.Command.Parameterized createCommand() {
6360
return org.spongepowered.api.command.Command.builder().shortDescription(Component.text("Open the browser and start your story"))
6461
.executor(this).build();
6562
}
6663

67-
@Override public List<String> aliases() {
68-
return ImmutableList.of("make", "scratch");
64+
@Override public String getName() {
65+
return "make";
66+
}
67+
68+
@Override public String[] aliases() {
69+
return new String[] { "scratch" };
6970
}
7071

7172
@Override public CommandResult execute(CommandContext args) throws CommandException {
@@ -81,6 +82,7 @@ private String getSystemPropertyEnvVarOrDefault(String propertyName, String defa
8182
Component.text("Click here to open a browser and start MAKE actions").clickEvent(ClickEvent.openUrl(new URL(url)))
8283
.color(NamedTextColor.GOLD));
8384
});
85+
return CommandResult.success();
8486
}
8587
return CommandResult.error(Component.text("Command source must be Player").color(NamedTextColor.RED));
8688
}

web/src/main/java/ch/vorburger/minecraft/storeys/web/StoreysWebPlugin.java

+23-13
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,20 @@
2727
import com.google.inject.TypeLiteral;
2828
import com.google.inject.name.Names;
2929
import java.nio.file.Path;
30+
import java.util.Optional;
3031
import java.util.concurrent.ExecutionException;
3132
import javax.inject.Inject;
3233
import org.slf4j.Logger;
3334
import org.slf4j.LoggerFactory;
35+
import org.spongepowered.api.Server;
36+
import org.spongepowered.api.Sponge;
3437
import org.spongepowered.api.command.Command;
38+
import org.spongepowered.api.command.registrar.CommandRegistrar;
39+
import org.spongepowered.api.config.ConfigDir;
3540
import org.spongepowered.api.config.DefaultConfig;
3641
import org.spongepowered.api.event.Listener;
37-
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
42+
import org.spongepowered.api.event.lifecycle.StartingEngineEvent;
43+
import org.spongepowered.api.scheduler.Scheduler;
3844
import org.spongepowered.configurate.CommentedConfigurationNode;
3945
import org.spongepowered.configurate.loader.ConfigurationLoader;
4046
import org.spongepowered.plugin.builtin.jvm.Plugin;
@@ -43,13 +49,17 @@
4349
// do not extend StoreysPlugin, because we exclude that class in shadowJar
4450

4551
private static final Logger LOG = LoggerFactory.getLogger(StoreysWebPlugin.class);
46-
private VertxStarter vertxStarter;
47-
private LoginCommand loginCommand;
48-
private TokenCommand tokenCommand;
4952

53+
@Inject @ConfigDir(sharedRoot = false) private Path configDir;
5054
@Inject @DefaultConfig(sharedRoot = true) private ConfigurationLoader<CommentedConfigurationNode> configurationLoader;
5155

52-
@Override public void start(PluginInstance plugin, Path configDir) throws Exception {
56+
@Listener public final void onGameStartingServer(StartingEngineEvent<Server> event) throws Exception {
57+
LOG.info("See https://github.com/OASIS-learn-study/minecraft-storeys-maker for how to use /story and /narrate commands");
58+
start(this, configDir);
59+
}
60+
61+
@Override public void start(PluginInstance plugin, Path configDir) {
62+
LOG.info("See https://github.com/OASIS-learn-study/minecraft-storeys-maker for how to use /story and /narrate commands");
5363
super.start(plugin, configDir);
5464

5565
Injector injector = pluginInjector.createChildInjector(binder -> {
@@ -60,16 +70,21 @@
6070
binder.bind(new TypeLiteral<ConfigurationLoader<CommentedConfigurationNode>>() {
6171
}).toInstance(configurationLoader);
6272
binder.bind(LocationToolListener.class);
73+
binder.bind(Scheduler.class).toInstance(Sponge.asyncScheduler());
6374
});
6475
StaticWebServerVerticle staticWebServerVerticle = injector.getInstance(StaticWebServerVerticle.class);
6576

6677
TokenProvider tokenProvider = injector.getInstance(TokenProvider.class);
67-
loginCommand = new LoginCommand(tokenProvider);
68-
tokenCommand = new TokenCommand(tokenProvider);
78+
LoginCommand loginCommand = new LoginCommand(tokenProvider);
79+
TokenCommand tokenCommand = new TokenCommand(tokenProvider);
6980

81+
final Optional<CommandRegistrar<Command.Parameterized>> registrar = Sponge.server().commandManager().registrar(Command.Parameterized.class);
82+
final CommandRegistrar<Command.Parameterized> commandRegistrar = registrar.get();
83+
commandRegistrar.register(plugin.getPluginContainer(), loginCommand.createCommand(), loginCommand.getName(), loginCommand.aliases());
84+
commandRegistrar.register(plugin.getPluginContainer(), tokenCommand.createCommand(), tokenCommand.getName(), tokenCommand.aliases());
7085
try {
7186
try {
72-
vertxStarter = new VertxStarter();
87+
VertxStarter vertxStarter = new VertxStarter();
7388
vertxStarter.deployVerticle(staticWebServerVerticle).toCompletableFuture().get();
7489

7590
} catch (ExecutionException | InterruptedException e) {
@@ -82,9 +97,4 @@
8297
throw e;
8398
}
8499
}
85-
86-
@Listener public void register(RegisterCommandEvent<Command.Raw> event) {
87-
event.register(this.getPluginContainer(),
88-
(Command.Raw) loginCommand.callable(), loginCommand.aliases().get(0), loginCommand.aliases().toArray(new String[0]));
89-
}
90100
}

0 commit comments

Comments
 (0)