Skip to content

Commit

Permalink
chore: lots of code cleanup, API documentation etc.
Browse files Browse the repository at this point in the history
  • Loading branch information
desht committed May 5, 2023
1 parent 51c083d commit c9d5d5a
Show file tree
Hide file tree
Showing 40 changed files with 896 additions and 765 deletions.
12 changes: 8 additions & 4 deletions common/src/main/java/dev/ftb/mods/ftbranks/FTBRanks.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import dev.architectury.event.events.common.CommandRegistrationEvent;
import dev.architectury.event.events.common.LifecycleEvent;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import dev.ftb.mods.ftbranks.api.event.RankEvent;
import dev.ftb.mods.ftbranks.impl.FTBRanksAPIImpl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand All @@ -14,13 +15,16 @@ public class FTBRanks {
public static final String MOD_ID = "ftbranks";
public static final Logger LOGGER = LogManager.getLogger("FTB Ranks");

public FTBRanks() {
FTBRanksAPI.INSTANCE = new FTBRanksAPIImpl();
LifecycleEvent.SERVER_BEFORE_START.register(FTBRanksAPIImpl::serverAboutToStart);
public static void init() {
FTBRanksAPI.setup(new FTBRanksAPIImpl());

LifecycleEvent.SERVER_STARTING.register(FTBRanksAPIImpl::serverStarting);
LifecycleEvent.SERVER_STARTED.register(FTBRanksAPIImpl::serverStarted);
LifecycleEvent.SERVER_STOPPED.register(FTBRanksAPIImpl::serverStopped);
LifecycleEvent.SERVER_LEVEL_SAVE.register(FTBRanksAPIImpl::worldSaved);
LifecycleEvent.SERVER_STARTING.register(FTBRanksAPIImpl::serverStarting);

RankEvent.REGISTER_CONDITIONS.register(FTBRanksAPIImpl::registerConditions);

CommandRegistrationEvent.EVENT.register(FTBRanksCommands::register);
}
}
54 changes: 23 additions & 31 deletions common/src/main/java/dev/ftb/mods/ftbranks/FTBRanksCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
Expand All @@ -13,10 +14,7 @@
import dev.ftb.mods.ftbranks.api.PermissionValue;
import dev.ftb.mods.ftbranks.api.Rank;
import dev.ftb.mods.ftbranks.api.RankCondition;
import dev.ftb.mods.ftbranks.impl.BooleanPermissionValue;
import dev.ftb.mods.ftbranks.impl.FTBRanksAPIImpl;
import dev.ftb.mods.ftbranks.impl.NumberPermissionValue;
import dev.ftb.mods.ftbranks.impl.StringPermissionValue;
import dev.ftb.mods.ftbranks.impl.condition.DefaultCondition;
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandBuildContext;
Expand All @@ -28,7 +26,6 @@
import net.minecraft.nbt.StringTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import org.apache.commons.lang3.math.NumberUtils;

import java.io.IOException;
import java.util.Collection;
Expand All @@ -39,11 +36,15 @@
* @author LatvianModder
*/
public class FTBRanksCommands {
public static final DynamicCommandExceptionType ERROR_UNKNOWN_RANK = new DynamicCommandExceptionType((object) -> Component.literal("Unknown rank: " + object.toString()));
public static final DynamicCommandExceptionType ERROR_UNKNOWN_RANK = new DynamicCommandExceptionType(
(object) -> Component.literal("Unknown rank: " + object.toString())
);

public static void register(CommandDispatcher<CommandSourceStack> dispatcher, CommandBuildContext commandBuildContext, Commands.CommandSelection selection) {
// source.getServer() *can* return null: https://github.com/FTBTeam/FTB-Mods-Issues/issues/766
//noinspection ConstantValue
dispatcher.register(Commands.literal("ftbranks")
.requires(source -> source.getServer().isSingleplayer() || source.hasPermission(2))
.requires(source -> source.getServer() != null && source.getServer().isSingleplayer() || source.hasPermission(2))
.then(Commands.literal("reload")
.executes(context -> reloadRanks(context.getSource()))
)
Expand All @@ -54,8 +55,10 @@ public static void register(CommandDispatcher<CommandSourceStack> dispatcher, Co
.executes(context -> listAllRanks(context.getSource()))
)
.then(Commands.literal("create")
.then(Commands.argument("name", StringArgumentType.greedyString())
.executes(context -> createRank(context.getSource(), StringArgumentType.getString(context, "name")))
.then(Commands.argument("name", StringArgumentType.word())
.then(Commands.argument("power", IntegerArgumentType.integer(1))
.executes(context -> createRank(context.getSource(), StringArgumentType.getString(context, "name"), IntegerArgumentType.getInteger(context,"power"))))
.executes(context -> createRank(context.getSource(), StringArgumentType.getString(context, "name"), 1))
)
)
.then(Commands.literal("delete")
Expand Down Expand Up @@ -135,11 +138,14 @@ public static void register(CommandDispatcher<CommandSourceStack> dispatcher, Co
}

private static CompletableFuture<Suggestions> suggestRanks(SuggestionsBuilder builder) {
return SharedSuggestionProvider.suggest(FTBRanksAPI.INSTANCE.getManager().getAllRanks().stream().map(Rank::getId), builder);
return SharedSuggestionProvider.suggest(FTBRanksAPI.manager().getAllRanks().stream().map(Rank::getId), builder);
}

private static String normalizeRankName(String name) {
return name.toLowerCase().replace("+", "_plus").replaceAll("[^a-z0-9_]", "_").replaceAll("_{2,}", "_");
return name.toLowerCase()
.replace("+", "_plus")
.replaceAll("[^a-z0-9_]", "_")
.replaceAll("_{2,}", "_");
}

private static int reloadRanks(CommandSourceStack source) {
Expand Down Expand Up @@ -180,22 +186,22 @@ private static int listAllRanks(CommandSourceStack source) {
return 1;
}

private static int createRank(CommandSourceStack source, String name) {
private static int createRank(CommandSourceStack source, String name, int power) {
String id = normalizeRankName(name);

if (FTBRanksAPIImpl.manager.getRank(id).isPresent()) {
source.sendFailure(Component.literal("Rank '" + name + "' is already taken!"));
return 0;
}

FTBRanksAPIImpl.manager.createRank(id, name);
FTBRanksAPIImpl.manager.createRank(id, name, power);
source.sendSuccess(Component.literal("Rank '" + id + "' created!"), false);
return 1;
}

private static int deleteRank(CommandSourceStack source, String rankName) throws CommandSyntaxException {
Rank rank = getRank(rankName);
FTBRanksAPI.INSTANCE.getManager().deleteRank(rank.getId());
FTBRanksAPI.manager().deleteRank(rank.getId());
source.sendSuccess(Component.literal("Rank '" + rank.getName() + "' deleted!"), false);

return 1;
Expand Down Expand Up @@ -271,7 +277,7 @@ private static int setNode(CommandSourceStack source, String rankName, String no
Rank rank = getRank(rankName);

try {
rank.setPermission(node, strToPermissionValue(value));
rank.setPermission(node, PermissionValue.parse(value));
if (value != null) {
source.sendSuccess(Component.literal(String.format("Permission node '%s'='%s' added to rank '%s'", node, rank.getPermission(node), rank)), false);
} else {
Expand All @@ -292,9 +298,9 @@ private static int setCondition(CommandSourceStack source, String rankName, Stri
if (value.equals("default") || value.equals("\"\"")) {
condition = new DefaultCondition(rank);
} else if (value.startsWith("{") || value.contains(" ")) {
condition = FTBRanksAPI.INSTANCE.getManager().createCondition(rank, SNBT.readLines(Collections.singletonList(value)));
condition = FTBRanksAPI.manager().createCondition(rank, SNBT.readLines(Collections.singletonList(value)));
} else {
condition = FTBRanksAPI.INSTANCE.getManager().createCondition(rank, StringTag.valueOf(value));
condition = FTBRanksAPI.manager().createCondition(rank, StringTag.valueOf(value));
}
rank.setCondition(condition);
source.sendSuccess(Component.literal(String.format("Condition '%s' added to rank '%s'", value, rank)), false);
Expand Down Expand Up @@ -325,21 +331,7 @@ private static int showRank(CommandSourceStack source, String rankName) throws C
return 0;
}

private static PermissionValue strToPermissionValue(String str) {
if (str == null) {
return null;
} else if (str.startsWith("\"") && str.endsWith("\"")) {
return StringPermissionValue.of(str.substring(1, str.length() - 1));
} if (str.equalsIgnoreCase("true") || str.equalsIgnoreCase("false")) {
return BooleanPermissionValue.of(str.equalsIgnoreCase("true"));
} else if (NumberUtils.isCreatable(str)) {
return NumberPermissionValue.of(NumberUtils.createNumber(str));
} else {
return StringPermissionValue.of(str);
}
}

private static Rank getRank(String rankName) throws CommandSyntaxException {
return FTBRanksAPI.INSTANCE.getManager().getRank(rankName).orElseThrow(() -> ERROR_UNKNOWN_RANK.create(rankName));
return FTBRanksAPI.manager().getRank(rankName).orElseThrow(() -> ERROR_UNKNOWN_RANK.create(rankName));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import dev.architectury.utils.GameInstance;
import dev.ftb.mods.ftblibrary.util.PlayerDisplayNameUtil;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import dev.ftb.mods.ftbranks.impl.FTBRanksAPIImpl;
import dev.ftb.mods.ftbranks.impl.TextComponentParser;
import dev.ftb.mods.ftbranks.impl.decorate.TextComponentParser;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.HoverEvent;
Expand All @@ -20,12 +19,6 @@ public static Component formatPlayerName(Player player, Component originalName)
String format = FTBRanksAPI.getPermissionValue(serverPlayer, "ftbranks.name_format").asString().orElse("");

if (!format.isEmpty()) {
if (format.startsWith("<")) {
// TODO remove in 1.20
FTBRanksAPIImpl.manager.migrateOldNameFormats();
format = FTBRanksAPI.getPermissionValue(serverPlayer, "ftbranks.name_format").asString().orElse("");
}

try {
return TextComponentParser.parse(format, s -> s.equals("name") ? originalName : null);
} catch (Exception ex) {
Expand Down
46 changes: 43 additions & 3 deletions common/src/main/java/dev/ftb/mods/ftbranks/api/FTBRanksAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,51 @@
* @author LatvianModder
*/
public abstract class FTBRanksAPI {
public static FTBRanksAPI INSTANCE;
private static FTBRanksAPI instance;

public abstract RankManager getManager();
/**
* Get the Ranks Manager instance
* @return the manager
*/
public static RankManager manager() {
return instance.getManager();
}

public static FTBRanksAPI getInstance() {
return instance;
}

/**
* Convenience method: get the given player's value for the given permission node. This just calls
* {@link RankManager#getPermissionValue(ServerPlayer, String)}.
*
* @param player the player to check
* @param node the node to check
* @return the permission value
*/
public static PermissionValue getPermissionValue(ServerPlayer player, String node) {
return INSTANCE.getManager().getPermissionValue(player, node);
return instance.getManager().getPermissionValue(player, node);
}

/**
* Create a permission value by parsing the string input. This method will make a best guess as to what type to use;
* a string permission can be forced by enclosing the text in double quotes. Otherwise, the texts "true" and "false"
* are treated as boolean, and any text which can be parsed as a number will be treated as a numeric value.
*
* @param str the string to parse
* @return the permission value, which may be null if the input was null
*/
public abstract PermissionValue parsePermissionValue(String str);

/**
* Do not call this yourself! For internal use only.
*/
public static void setup(FTBRanksAPI theInstance) {
if (instance != null || !theInstance.getClass().getName().startsWith("dev.ftb.mods.ftbranks")) {
throw new IllegalStateException("don't do this");
}
instance = theInstance;
}

protected abstract RankManager getManager();
}

This file was deleted.

Loading

0 comments on commit c9d5d5a

Please sign in to comment.