Skip to content

Commit

Permalink
Merge pull request #1 from vaperion/dev
Browse files Browse the repository at this point in the history
1.1.0
  • Loading branch information
GitRowin authored Apr 27, 2021
2 parents c63e84d + 1319323 commit 711283a
Show file tree
Hide file tree
Showing 14 changed files with 337 additions and 99 deletions.
82 changes: 76 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ To use Blade, you simply have to include it as a dependency and shade it into yo
If you make any changes or improvements to the project, please consider making a pull request to merge your changes back into the upstream project.
This project is in its early stages, if you find any issues please open an issue.

## TODO
- [ ] Fix tab completion

## Using Blade

Maven
Expand All @@ -24,7 +21,7 @@ Maven
<dependency>
<groupId>com.github.vaperion</groupId>
<artifactId>blade</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
Expand All @@ -39,17 +36,18 @@ allprojects {
}
dependencies {
implementation 'com.github.vaperion:blade:1.0.0'
implementation 'com.github.vaperion:blade:1.1.0'
}
```

### Example code

Initialize Blade:
Initializing Blade:
```java
import me.vaperion.blade.Blade;
import me.vaperion.blade.command.bindings.impl.BukkitBindings;
import me.vaperion.blade.command.container.impl.BukkitCommandContainer;
import me.vaperion.blade.completer.impl.ProtocolLibTabCompleter;
import org.bukkit.plugin.java.JavaPlugin;

public class ExamplePlugin extends JavaPlugin {
Expand All @@ -66,6 +64,22 @@ public class ExamplePlugin extends JavaPlugin {
}
```

Setting a custom tab completer:
```java
Blade.of()
...
.tabCompleter(new ProtocolLibTabCompleter(this))
...;
```

Registering a type provider without Bindings:
```java
Blade.of()
...
.bind(Example.class, new BladeProvider<Example>() {...})
...;
```

Example commands:
```java
import me.vaperion.blade.command.annotation.*;
Expand Down Expand Up @@ -93,3 +107,59 @@ public class ExampleCommand {
}
}
```

Example custom tab completer with Netty:
```java
import me.vaperion.blade.command.service.BladeCommandService;
import me.vaperion.blade.completer.TabCompleter;
import net.minecraft.server.v1_7_R4.PacketPlayInTabComplete;
import net.minecraft.server.v1_7_R4.PacketPlayOutTabComplete;
import net.minecraft.util.io.netty.channel.ChannelDuplexHandler;
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class CustomTabCompleter implements TabCompleter, Listener {

private BladeCommandService commandService;

public CustomTabCompleter(JavaPlugin plugin) {
Bukkit.getServer().getPluginManager().registerEvents(this, plugin);
}

@Override
public void init(@NotNull BladeCommandService bladeCommandService) {
this.commandService = bladeCommandService;
}

@EventHandler
public void onJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
((CraftPlayer) player).getHandle().playerConnection.networkManager.m.pipeline()
.addBefore("packet_handler", "blade_completer", new ChannelDuplexHandler() {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof PacketPlayInTabComplete) {
String commandLine = ((PacketPlayInTabComplete) msg).c();
if (commandLine.startsWith("/")) {
commandLine = commandLine.substring(1);

List<String> suggestions = commandService.getCommandCompleter().suggest(commandLine, () -> new BukkitSender(player), (cmd) -> hasPermission(player, cmd));
if (suggestions != null) {
ctx.writeAndFlush(new PacketPlayOutTabComplete(suggestions.toArray(new String[0])));
return;
}
}
}

super.channelRead(ctx, msg);
}
});
}
}
```
20 changes: 12 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>me.vaperion</groupId>
<artifactId>blade</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand All @@ -19,6 +19,10 @@
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
</repositories>

<dependencies>
Expand All @@ -28,36 +32,39 @@
<version>1.18.16</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>13.0</version>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.5-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId>
<version>4.6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<defaultGoal>clean install</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
Expand All @@ -67,7 +74,6 @@
<target>1.8</target>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
Expand All @@ -87,6 +93,4 @@
</plugin>
</plugins>
</build>


</project>
7 changes: 7 additions & 0 deletions src/main/java/me/vaperion/blade/Blade.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import me.vaperion.blade.command.bindings.Binding;
import me.vaperion.blade.command.container.ContainerCreator;
import me.vaperion.blade.command.service.BladeCommandService;
import me.vaperion.blade.completer.TabCompleter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -22,6 +23,7 @@ public class Blade {
private final BladeCommandService commandService = new BladeCommandService();
private final String fallbackPrefix;
private final ContainerCreator<?> containerCreator;
private final TabCompleter tabCompleter;

@Singular("bind0") private final Map<Map.Entry<Class<?>, Class<? extends ProviderAnnotation>>, BladeProvider<?>> customProviderMap;
@Singular private final List<Binding> bindings;
Expand Down Expand Up @@ -56,10 +58,15 @@ public Blade build() {
if (blade.fallbackPrefix != null)
blade.commandService.setFallbackPrefix(blade.fallbackPrefix);

if (blade.tabCompleter != null)
blade.commandService.setTabCompleter(blade.tabCompleter);

for (Binding binding : blade.bindings) {
binding.bind(blade.commandService);
}

blade.commandService.getTabCompleter().init(blade.commandService);

for (Map.Entry<Map.Entry<Class<?>, Class<? extends ProviderAnnotation>>, BladeProvider<?>> entry : blade.customProviderMap.entrySet()) {
//noinspection deprecation
blade.commandService.bindProviderUnsafely(entry.getKey().getKey(), entry.getValue(), entry.getKey().getValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
import me.vaperion.blade.command.service.BladeCommandService;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -81,6 +83,37 @@ public List<String> suggest(@NotNull BladeContext context, @NotNull String input

return offlinePlayer;
});

commandService.bindProvider(GameMode.class, new BladeProvider<GameMode>() {
@Nullable
@Override
public GameMode provide(@NotNull BladeContext ctx, @NotNull BladeParameter param, @Nullable String input) throws BladeExitMessage {
if (input == null) return null;
input = input.trim();

GameMode mode = getGameMode(input);

if (mode == null)
throw new BladeExitMessage("No game mode with name " + ChatColor.YELLOW + input + ChatColor.RED + " found.");

return mode;
}

@NotNull
@Override
public List<String> suggest(@NotNull BladeContext context, @NotNull String input) throws BladeExitMessage {
input = input.toUpperCase(Locale.ROOT);
List<String> completions = new ArrayList<>();

for (GameMode mode : GameMode.values()) {
if (mode.name().startsWith(input)) {
completions.add(mode.name().toLowerCase(Locale.ROOT));
}
}

return completions;
}
});
}

private boolean isUUID(@NotNull String input) {
Expand All @@ -99,4 +132,16 @@ private OfflinePlayer getOfflinePlayer(@NotNull String input) {
return Bukkit.getOfflinePlayer(input);
}

@Nullable
private GameMode getGameMode(String input) {
input = input.toUpperCase(Locale.ROOT);

for (GameMode mode : GameMode.values()) {
if (mode.name().startsWith(input) || input.equals(String.valueOf(mode.getValue()))) {
return mode;
}
}

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class BladeCommand {
private final boolean senderParameter;

private final List<BladeParameter> parameters = new LinkedList<>();
private final List<BladeProvider<?>> providers = new LinkedList<>();
private final List<BladeProvider<?>> providers = new LinkedList<>(), parameterProviders = new LinkedList<>(), flagProviders = new LinkedList<>();

public BladeCommand(BladeCommandService commandService, Object instance, Method method, String[] aliases, Command command, Permission permission) {
this.commandService = commandService;
Expand Down Expand Up @@ -70,8 +70,16 @@ public BladeCommand(BladeCommandService commandService, Object instance, Method
bladeParameter = new BladeParameter.CommandParameter(parameterName, parameter.getType(), parameter.getAnnotation(Optional.class), parameter.getAnnotation(Range.class), parameter.isAnnotationPresent(Combined.class));
}

BladeProvider<?> provider = commandService.getCommandResolver().resolveProvider(parameter.getType(), Arrays.asList(parameter.getAnnotations()));

parameters.add(bladeParameter);
providers.add(commandService.getCommandResolver().resolveProvider(parameter.getType(), Arrays.asList(parameter.getAnnotations())));
providers.add(provider);

if (bladeParameter instanceof BladeParameter.FlagParameter)
flagProviders.add(provider);
else
parameterProviders.add(provider);

i++;
}
}
Expand Down
Loading

0 comments on commit 711283a

Please sign in to comment.