Skip to content

Commit

Permalink
Added velocity implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
vaperion committed Mar 24, 2022
1 parent 860068e commit 19dede6
Show file tree
Hide file tree
Showing 12 changed files with 592 additions and 5 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Maven
<dependency>
<groupId>com.github.vaperion</groupId>
<artifactId>blade</artifactId>
<version>2.1.7</version>
<version>2.1.8</version>
<scope>compile</scope>
</dependency>
</dependencies>
Expand All @@ -46,7 +46,7 @@ allprojects {
}
dependencies {
implementation 'com.github.vaperion:blade:2.1.7'
implementation 'com.github.vaperion:blade:2.1.8'
}
```

Expand Down
12 changes: 11 additions & 1 deletion 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>2.1.7</version>
<version>2.1.8</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand All @@ -23,6 +23,10 @@
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
<repository>
<id>velocity</id>
<url>https://nexus.velocitypowered.com/repository/maven-public/</url>
</repository>
</repositories>

<dependencies>
Expand All @@ -44,6 +48,12 @@
<version>1.16.5-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId>
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/me/vaperion/blade/Blade.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import me.vaperion.blade.container.ContainerCreator;
import me.vaperion.blade.help.HelpGenerator;
import me.vaperion.blade.help.impl.BukkitHelpGenerator;
import me.vaperion.blade.help.impl.VelocityHelpGenerator;
import me.vaperion.blade.permissions.PermissionPredicate;
import me.vaperion.blade.service.BladeCommandRegistrar;
import me.vaperion.blade.service.BladeCommandService;
Expand Down Expand Up @@ -38,6 +39,8 @@ public class Blade implements BladeCommandRegistrar.Registrar {
private final HelpGenerator helpGenerator;
private final Consumer<Runnable> asyncExecutor;

private final Object bukkitPlugin, velocityServer;

@Builder.Default
private final long executionTimeWarningThreshold = 5;

Expand Down Expand Up @@ -92,6 +95,9 @@ public Blade build() {

blade.commandService.setOverrideCommands(blade.overrideCommands);

blade.commandService.setBukkitPlugin(blade.bukkitPlugin);
blade.commandService.setVelocityProxyServer(blade.velocityServer);

if (blade.defaultPermissionMessage != null && !"".equals(blade.defaultPermissionMessage))
blade.commandService.setDefaultPermissionMessage(blade.defaultPermissionMessage);

Expand All @@ -107,6 +113,8 @@ public Blade build() {
blade.commandService.setHelpGenerator(blade.helpGenerator);
else if (ClassUtil.classExists("org.bukkit.Bukkit"))
blade.commandService.setHelpGenerator(new BukkitHelpGenerator());
else if (ClassUtil.classExists("com.velocitypowered.api.proxy.ProxyServer"))
blade.commandService.setHelpGenerator(new VelocityHelpGenerator());

if (blade.asyncExecutor != null) {
blade.commandService.setAsyncExecutor(blade.asyncExecutor);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package me.vaperion.blade.bindings.impl;

import com.velocitypowered.api.proxy.Player;
import me.vaperion.blade.bindings.Binding;
import me.vaperion.blade.bindings.impl.provider.VelocityPlayerBladeProvider;
import me.vaperion.blade.service.BladeCommandService;
import org.jetbrains.annotations.NotNull;

import java.util.regex.Pattern;

public class VelocityBindings implements Binding {

public static final Pattern UUID_PATTERN = Pattern.compile("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}");

@Override
public void bind(@NotNull BladeCommandService commandService) {
commandService.bindProvider(Player.class, new VelocityPlayerBladeProvider());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package me.vaperion.blade.bindings.impl.provider;

import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import me.vaperion.blade.argument.BladeArgument;
import me.vaperion.blade.argument.BladeProvider;
import me.vaperion.blade.bindings.impl.VelocityBindings;
import me.vaperion.blade.context.BladeContext;
import me.vaperion.blade.exception.BladeExitMessage;
import me.vaperion.blade.exception.BladeUsageMessage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class VelocityPlayerBladeProvider implements BladeProvider<Player> {

@Override
public @Nullable Player provide(@NotNull BladeContext ctx, @NotNull BladeArgument arg) throws BladeExitMessage {
ProxyServer proxyServer = (ProxyServer) ctx.commandService().getVelocityProxyServer();

Player player = ctx.sender().parseAs(Player.class);

if (arg.getType() == BladeArgument.Type.OPTIONAL && "self".equals(arg.getString())) {
if (player != null) return player;
else
throw new BladeUsageMessage(); // show usage to console if we have 'self' as a default value (only works on players)
}

Player onlinePlayer = getPlayer(proxyServer, arg.getString());
if (onlinePlayer == null && !arg.getParameter().ignoreFailedArgumentParse())
throw new BladeExitMessage("Error: No online player with name or UUID '" + arg.getString() + "' found.");

return onlinePlayer;
}

@Override
public @NotNull List<String> suggest(@NotNull BladeContext ctx, @NotNull BladeArgument arg) throws BladeExitMessage {
ProxyServer proxyServer = (ProxyServer) ctx.commandService().getVelocityProxyServer();

List<String> completions = new ArrayList<>();
String input = arg.getString();

for (Player player : proxyServer.getAllPlayers()) {
if (player.getUsername().toLowerCase().startsWith(input.toLowerCase()))
completions.add(player.getUsername());
}

return completions;
}

private boolean isUUID(@NotNull String input) {
return VelocityBindings.UUID_PATTERN.matcher(input).matches();
}

@Nullable
private Player getPlayer(@NotNull ProxyServer proxyServer, @NotNull String input) {
if (isUUID(input)) return proxyServer.getPlayer(UUID.fromString(input)).orElse(null);
return proxyServer.getPlayer(input).orElse(null);
}
}
106 changes: 106 additions & 0 deletions src/main/java/me/vaperion/blade/command/impl/VelocityUsageMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package me.vaperion.blade.command.impl;

import com.velocitypowered.api.command.CommandSource;
import me.vaperion.blade.annotation.Flag;
import me.vaperion.blade.command.BladeCommand;
import me.vaperion.blade.command.BladeParameter;
import me.vaperion.blade.command.BladeParameter.CommandParameter;
import me.vaperion.blade.command.UsageMessage;
import me.vaperion.blade.context.BladeContext;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.jetbrains.annotations.NotNull;

public class VelocityUsageMessage implements UsageMessage {

private final Component component;

public VelocityUsageMessage(BladeCommand command) {
Component component = Component.text("Usage: /").color(NamedTextColor.RED)
.hoverEvent(HoverEvent.showText(
Component.text(command.getDescription()).color(NamedTextColor.GRAY))
).append(
Component.text(command.getUsageAlias().isEmpty() ? command.getAliases()[0] : command.getUsageAlias())
);

if (!command.getCustomUsage().isEmpty()) {
this.component = component.append(
Component.text(command.getCustomUsage())
);
return;
}

// Add flag parameters
boolean first = true;
for (BladeParameter.FlagParameter flagParameter : command.getFlagParameters()) {
Flag flag = flagParameter.getFlag();

if (first) {
component = component.append(
Component.text(" (").color(NamedTextColor.RED)
);
first = false;
} else {
component = component.append(
Component.text(" | ").color(NamedTextColor.RED)
).hoverEvent(HoverEvent.showText(
Component.text(command.getDescription()).color(NamedTextColor.GRAY))
);
}

component = component.append(
Component.text("-" + flag.value() + (flagParameter.isBooleanFlag() ? "" : " <" + flagParameter.getName() + ">"))
).color(NamedTextColor.AQUA)
.hoverEvent(HoverEvent.showText(
Component.text(flag.description()).color(NamedTextColor.GRAY))
);
}
if (!first) component = component.append(
Component.text(")").color(NamedTextColor.RED)
).hoverEvent(HoverEvent.showText(
Component.text(command.getDescription()).color(NamedTextColor.GRAY))
);

// Add real parameters
for (CommandParameter commandParameter : command.getCommandParameters()) {
component = component.append(
Component.text(" ")
);

component = component.append(
Component.text(commandParameter.isOptional() ? "(" : "<")
);
component = component.append(
Component.text(commandParameter.getName())
);
if (commandParameter.isCombined()) component = component.append(
Component.text("...")
);
component = component.append(
Component.text(commandParameter.isOptional() ? ")" : ">")
);
}

// Add extra usage
if (!command.getExtraUsageData().isEmpty()) {
component = component.append(
Component.text(" " + command.getExtraUsageData().trim())
);
}

this.component = component;
}

@Override
public void sendTo(@NotNull BladeContext context) {
((CommandSource) context.sender().getBackingSender()).sendMessage(this.component);
}

@NotNull
@Override
public String toString() {
return LegacyComponentSerializer.legacyAmpersand().serialize(this.component);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ public boolean testPermissionSilent(@NotNull CommandSender sender) {
@Override
public boolean execute(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
BladeCommand command = null;
String resolvedAlias = alias;
String resolvedAlias;

String[] joined = joinAliasToArgs(alias, args);
BladeContext context = new BladeContext(commandService, new BukkitSender(sender), alias, args);
Expand Down
Loading

0 comments on commit 19dede6

Please sign in to comment.