Skip to content

Commit

Permalink
chore: Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
phinner committed Feb 29, 2024
1 parent 24a5036 commit 6cb72d6
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 137 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
*/
public final class ArcCaptionKeys {

private static final Collection<Caption> RECOGNIZED_CAPTIONS = new ArrayList<>(7);
private static final Collection<Caption> RECOGNIZED_CAPTIONS = new ArrayList<>(3);

/**
* Variables: {@code {input}}.
Expand All @@ -48,26 +48,6 @@ public final class ArcCaptionKeys {
*/
public static final Caption ARGUMENT_PARSE_FAILURE_TEAM = of("argument.parse.failure.team");

/**
* Variables: {@code {syntax}}.
*/
public static final Caption COMMAND_INVALID_SYNTAX = of("command.invalid.syntax");

/**
* Variables: {@code {permission}}.
*/
public static final Caption COMMAND_INVALID_PERMISSION = of("command.invalid.permission");

/**
* Variables: {@code {command}}.
*/
public static final Caption COMMAND_FAILURE_NO_SUCH_COMMAND = of("command.failure.no_such_command");

/**
* Variables: {@code {message}}.
*/
public static final Caption COMMAND_FAILURE_EXECUTION = of("command.failure.execution");

private ArcCaptionKeys() {}

private static Caption of(final String key) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,13 @@
*/
package com.xpdustry.distributor.command.cloud;

public interface PermissionChecker {}
import io.leangen.geantyref.TypeToken;
import org.incendo.cloud.key.CloudKey;

public final class ArcCommandContextKeys {

public static final CloudKey<Boolean> MINDUSTRY_ADMIN =
CloudKey.of("mindustry:admin", TypeToken.get(Boolean.class));

private ArcCommandContextKeys() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,15 @@ public ArcCommandManager(
TypeToken.get(Team.class),
params ->
new TeamParser<>(params.get(ArcParserParameters.TEAM_MODE, TeamParser.TeamMode.BASE)));

this.registerCommandPreProcessor(ctx -> {
final var reversed =
this.senderMapper().reverse(ctx.commandContext().sender());
ctx.commandContext()
.store(
ArcCommandContextKeys.MINDUSTRY_ADMIN,
reversed.isServer() || reversed.getPlayer().admin());
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,7 @@
*/
package com.xpdustry.distributor.command.cloud.parser;

import arc.Core;
import com.xpdustry.distributor.core.DistributorProvider;
import com.xpdustry.distributor.core.collection.ArcCollections;
import com.xpdustry.distributor.core.player.PlayerLookup;
import java.util.concurrent.CompletableFuture;
import mindustry.gen.Groups;
import mindustry.gen.Player;
import com.xpdustry.distributor.command.cloud.ArcCommandContextKeys;
import mindustry.net.Administration;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.incendo.cloud.component.CommandComponent;
Expand All @@ -33,10 +27,9 @@
import org.incendo.cloud.parser.ArgumentParseResult;
import org.incendo.cloud.parser.ArgumentParser;
import org.incendo.cloud.parser.ParserDescriptor;
import org.incendo.cloud.suggestion.Suggestion;
import org.incendo.cloud.suggestion.SuggestionProvider;

public final class PlayerInfoParser<C> implements ArgumentParser.FutureArgumentParser<C, Administration.PlayerInfo> {
public final class PlayerInfoParser<C> implements ArgumentParser<C, Administration.PlayerInfo> {

public static <C> ParserDescriptor<C, Administration.PlayerInfo> playerInfoParser() {
return ParserDescriptor.of(new PlayerInfoParser<>(), Administration.PlayerInfo.class);
Expand All @@ -47,33 +40,24 @@ public static <C> CommandComponent.Builder<C, Administration.PlayerInfo> playerI
}

@Override
public CompletableFuture<ArgumentParseResult<Administration.PlayerInfo>> parseFuture(
final CommandContext<C> ctx, final CommandInput input) {
public ArgumentParseResult<Administration.PlayerInfo> parse(final CommandContext<C> ctx, final CommandInput input) {
final var query = input.readString();
return DistributorProvider.get()
.getService(PlayerLookup.class)
.orElseThrow()
.findOfflinePlayers(query, true)
.thenApply(result -> {
if (result.isEmpty()) {
return ArgumentParseResult.failure(
new PlayerParseException.PlayerNotFound(PlayerInfoParser.class, query, ctx));
} else if (result.size() > 1) {
return ArgumentParseResult.failure(
new PlayerParseException.TooManyPlayers(PlayerInfoParser.class, query, ctx));
} else {
return ArgumentParseResult.success(result.get(0));
}
});
final var result =
PlayerLookup.findOfflinePlayers(query, ctx.getOrDefault(ArcCommandContextKeys.MINDUSTRY_ADMIN, false));
if (result.isEmpty()) {
return ArgumentParseResult.failure(
new PlayerParseException.PlayerNotFound(PlayerInfoParser.class, query, ctx));
} else if (result.size() > 1) {
return ArgumentParseResult.failure(
new PlayerParseException.TooManyPlayers(PlayerInfoParser.class, query, ctx));
} else {
return ArgumentParseResult.success(result.iterator().next());
}
}

@SuppressWarnings("unchecked")
@Override
public @NonNull SuggestionProvider<C> suggestionProvider() {
return (ctx, input) -> CompletableFuture.supplyAsync(
() -> ArcCollections.immutableList(Groups.player).stream()
.map(Player::plainName)
.map(Suggestion::simple)
.toList(),
Core.app::post);
return (SuggestionProvider<C>) PlayerParser.SUGGESTION_PROVIDER;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,37 +16,27 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.xpdustry.distributor.core.player;
package com.xpdustry.distributor.command.cloud.parser;

import arc.Core;
import arc.util.Strings;
import com.xpdustry.distributor.core.collection.ArcCollections;
import com.xpdustry.distributor.core.player.MUUID;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import mindustry.Vars;
import mindustry.gen.Groups;
import mindustry.gen.Player;
import mindustry.net.Administration;

final class SimplePlayerLookup implements PlayerLookup {
final class PlayerLookup {

static final SimplePlayerLookup INSTANCE = new SimplePlayerLookup();

/**
* Finds online players their its name, UUID or entity ID.
*
* @param query the query
* @param admin whether the query should also search by sensitive IDs such as MUUID
* @return the list player of matching players
*/
@Override
public List<Player> findOnlinePlayers(final String query, final boolean admin) {
public static Collection<Player> findOnlinePlayers(final String query, final boolean admin) {
if (query.startsWith("#")) {
final var id = Strings.parseInt(query.substring(1), -1);
final var players = ArcCollections.immutableList(Groups.player).stream()
Expand Down Expand Up @@ -83,24 +73,18 @@ public List<Player> findOnlinePlayers(final String query, final boolean admin) {
return matches == 1 ? Collections.singletonList(match) : Collections.unmodifiableList(result);
}

@Override
public CompletableFuture<List<Administration.PlayerInfo>> findOfflinePlayers(
final String query, final boolean admin) {
return CompletableFuture.supplyAsync(
() -> {
final Set<Administration.PlayerInfo> result = new LinkedHashSet<>();
for (final var online : findOnlinePlayers(query, admin)) {
result.add(online.getInfo());
}
if (admin && MUUID.isUuid(query)) {
final var info = Vars.netServer.admins.getInfoOptional(query);
if (info != null) {
result.add(info);
}
}
return List.copyOf(result);
},
Core.app::post);
static Collection<Administration.PlayerInfo> findOfflinePlayers(final String query, final boolean admin) {
final Set<Administration.PlayerInfo> result = new LinkedHashSet<>();
for (final var online : findOnlinePlayers(query, admin)) {
result.add(online.getInfo());
}
if (admin && MUUID.isUuid(query)) {
final var info = Vars.netServer.admins.getInfoOptional(query);
if (info != null) {
result.add(info);
}
}
return Collections.unmodifiableSet(result);
}

// https://stackoverflow.com/a/4122207
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@
package com.xpdustry.distributor.command.cloud.parser;

import arc.Core;
import com.xpdustry.distributor.core.DistributorProvider;
import com.xpdustry.distributor.command.cloud.ArcCommandContextKeys;
import com.xpdustry.distributor.core.collection.ArcCollections;
import com.xpdustry.distributor.core.player.PlayerLookup;
import java.util.concurrent.CompletableFuture;
import mindustry.gen.Groups;
import mindustry.gen.Player;
Expand All @@ -37,6 +36,13 @@

public final class PlayerParser<C> implements ArgumentParser<C, Player> {

static SuggestionProvider<?> SUGGESTION_PROVIDER = (ctx, input) -> CompletableFuture.supplyAsync(
() -> ArcCollections.immutableList(Groups.player).stream()
.map(Player::plainName)
.map(Suggestion::simple)
.toList(),
Core.app::post);

public static <C> ParserDescriptor<C, Player> playerParser() {
return ParserDescriptor.of(new PlayerParser<>(), Player.class);
}
Expand All @@ -48,16 +54,14 @@ public static <C> CommandComponent.Builder<C, Player> playerComponent() {
@Override
public ArgumentParseResult<Player> parse(final CommandContext<C> ctx, final CommandInput input) {
final var query = input.readString();
final var result = DistributorProvider.get()
.getService(PlayerLookup.class)
.orElseThrow()
.findOnlinePlayers(query, true);
if (result.isEmpty()) {
final var players =
PlayerLookup.findOnlinePlayers(query, ctx.getOrDefault(ArcCommandContextKeys.MINDUSTRY_ADMIN, false));
if (players.isEmpty()) {
return ArgumentParseResult.failure(new PlayerParseException.PlayerNotFound(PlayerParser.class, query, ctx));
} else if (result.size() > 1) {
} else if (players.size() > 1) {
return ArgumentParseResult.failure(new PlayerParseException.TooManyPlayers(PlayerParser.class, query, ctx));
} else {
return ArgumentParseResult.success(result.get(0));
return ArgumentParseResult.success(players.iterator().next());
}
}

Expand All @@ -67,13 +71,9 @@ public ArgumentParseResult<Player> parse(final CommandContext<C> ctx, final Comm
return CompletableFuture.supplyAsync(() -> this.parse(ctx, input), Core.app::post);
}

@SuppressWarnings("unchecked")
@Override
public @NonNull SuggestionProvider<C> suggestionProvider() {
return (ctx, input) -> CompletableFuture.supplyAsync(
() -> ArcCollections.immutableList(Groups.player).stream()
.map(Player::plainName)
.map(Suggestion::simple)
.toList(),
Core.app::post);
return (SuggestionProvider<C>) SUGGESTION_PROVIDER;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ public boolean isPlayer() {
public boolean isServer() {
return false;
}

@Override
public Player getPlayer() {
throw new UnsupportedOperationException();
}
};
}

Expand All @@ -51,10 +56,17 @@ public boolean isPlayer() {
public boolean isServer() {
return true;
}

@Override
public Player getPlayer() {
throw new UnsupportedOperationException();
}
};
}

boolean isPlayer();

boolean isServer();

Player getPlayer();
}

This file was deleted.

0 comments on commit 6cb72d6

Please sign in to comment.