Skip to content

Commit

Permalink
MagicConfig impl
Browse files Browse the repository at this point in the history
Signed-off-by: Hendrix-Shen <HendrixShen@hendrixshen.top>
  • Loading branch information
Hendrix-Shen committed Apr 5, 2024
1 parent 8940377 commit 70b98ab
Show file tree
Hide file tree
Showing 34 changed files with 1,602 additions and 164 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@
*/
String category() default Config.defaultCategory;

boolean debugOnly() default false;

boolean devOnly() default false;

Statistic statistic() default @Statistic;

CompositeDependencies compositeDependencies() default @CompositeDependencies();

String defaultCategory = "all";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package top.hendrixshen.magiclib.api.malilib.annotation;

import java.lang.annotation.*;

@Target({ /* No targets allowed */ })
@Retention(RetentionPolicy.RUNTIME)
public @interface Statistic {
boolean hotkey() default true;

boolean valueChanged() default true;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,21 @@
import top.hendrixshen.magiclib.impl.malilib.config.ConfigContainer;
import top.hendrixshen.magiclib.impl.malilib.config.MagicConfigFactory;
import top.hendrixshen.magiclib.impl.malilib.config.gui.MagicConfigGui;
import top.hendrixshen.magiclib.impl.malilib.config.option.MagicConfigHotkey;
import top.hendrixshen.magiclib.util.collect.ValueContainer;
import top.hendrixshen.magiclib.util.serializable.JsonSaveAble;

import java.util.Collection;
import java.util.List;

public interface MagicConfigManager {
static void setHotkeyCallback(@NotNull MagicConfigHotkey configHotkey, Runnable runnable,
boolean cancelFurtherProcess) {
configHotkey.setCallBack((keyAction, iKeybind) -> {
runnable.run();
return cancelFurtherProcess;
});
}

String getIdentifier();

MagicConfigFactory getConfigFactory();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package top.hendrixshen.magiclib.api.malilib.config.option;

import fi.dy.masa.malilib.config.IConfigOptionListEntry;
import top.hendrixshen.magiclib.api.i18n.minecraft.I18n;
import top.hendrixshen.magiclib.util.minecraft.StringUtil;

import java.util.Arrays;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package top.hendrixshen.magiclib.api.malilib.config.option;

import fi.dy.masa.malilib.config.IConfigBase;
import fi.dy.masa.malilib.gui.GuiBase;
import org.jetbrains.annotations.Nullable;
import top.hendrixshen.magiclib.impl.malilib.config.ConfigContainer;
import top.hendrixshen.magiclib.impl.malilib.config.GlobalConfigManager;
import top.hendrixshen.magiclib.util.minecraft.StringUtil;

import java.util.function.Function;

public interface MagicIConfigBase extends IConfigBase {
String getTranslationPrefix();

void onValueChanged(boolean fromFile);

@Override
default String getComment() {
return StringUtil.translateOrFallback(String.format("%s.config.option.%s.comment",
Expand All @@ -26,7 +32,40 @@ default String getConfigGuiDisplayName() {
this.getTranslationPrefix(), this.getName()), this.getName());
}

default void updateStatisticOnUse() {
this.getMagicContainer().getStatistic().onConfigUsed();
}

default void setCommentModifier(@Nullable Function<String, String> commentModifier) {
this.getMagicContainer().setCommentModifier(commentModifier);
}

default String getCommentNoFooter() {
ConfigContainer option = this.getMagicContainer();
option.setAppendFooterFlag(false);

try {
return this.getComment();
} finally {
option.setAppendFooterFlag(true);
}
}

default ConfigContainer getMagicContainer() {
return GlobalConfigManager.getInstance().getContainerByConfig(this).orElseThrow(() -> new RuntimeException(""));
}

default Function<String, String> getGuiDisplayLineModifier() {
ConfigContainer magicContainer = this.getMagicContainer();

if (!magicContainer.isSatisfied()) {
return line -> GuiBase.TXT_DARK_RED + line + GuiBase.TXT_RST;
} else if (magicContainer.isDebugOnly()) {
return line -> GuiBase.TXT_BLUE + line + GuiBase.TXT_RST;
} else if (magicContainer.isDevOnly()) {
return line -> GuiBase.TXT_LIGHT_PURPLE + line + GuiBase.TXT_RST;
}

return line -> line;
}
}
Original file line number Diff line number Diff line change
@@ -1,32 +1,50 @@
package top.hendrixshen.magiclib.impl.malilib.config;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import fi.dy.masa.malilib.gui.GuiBase;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import top.hendrixshen.magiclib.api.i18n.minecraft.I18n;
import top.hendrixshen.magiclib.api.malilib.annotation.Config;
import top.hendrixshen.magiclib.api.malilib.config.option.MagicIConfigBase;
import top.hendrixshen.magiclib.game.malilib.Configs;
import top.hendrixshen.magiclib.impl.dependency.DependenciesContainer;
import top.hendrixshen.magiclib.impl.dependency.DependencyCheckResult;
import top.hendrixshen.magiclib.impl.malilib.config.statistic.ConfigStatistic;
import top.hendrixshen.magiclib.util.collect.InfoNode;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class ConfigContainer {
private final Config annotation;
private final Config configAnnotation;
@Getter
private final MagicIConfigBase config;
private final List<DependenciesContainer<ConfigContainer>> dependencies;
@Getter
private final ConfigStatistic statistic;
@Nullable
protected Function<String, String> commentModifier = null;
@Setter
@Getter
private boolean appendFooterFlag = true;

public ConfigContainer(@NotNull Config annotation, MagicIConfigBase config) {
this.annotation = annotation;
public ConfigContainer(@NotNull Config configAnnotation, MagicIConfigBase config) {
this.configAnnotation = configAnnotation;
this.config = config;
this.dependencies = Arrays.stream(this.annotation.compositeDependencies().value())
this.dependencies = Arrays.stream(this.configAnnotation.compositeDependencies().value())
.map(deps -> DependenciesContainer.of(deps, this))
.collect(Collectors.toList());
this.statistic = new ConfigStatistic();
}

public String getCategory() {
return this.annotation.category();
return this.configAnnotation.category();
}

public String getName() {
Expand All @@ -37,7 +55,104 @@ public ImmutableList<DependenciesContainer<ConfigContainer>> getDependencies() {
return ImmutableList.copyOf(this.dependencies);
}

public boolean isDebugOnly() {
return this.configAnnotation.debugOnly();
}

public boolean isDevOnly() {
return this.configAnnotation.devOnly();
}

public boolean isSatisfied() {
return this.dependencies.stream().allMatch(DependenciesContainer::isSatisfied);
}

@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean shouldStatisticHotkey() {
return this.configAnnotation.statistic().hotkey();
}

@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean shouldStatisticValueChange() {
return this.configAnnotation.statistic().valueChanged();
}

public void setCommentModifier(@Nullable Function<String, String> commentModifier) {
this.commentModifier = commentModifier;
}

public String modifyComment(String comment) {
if (this.commentModifier != null) {
comment = this.commentModifier.apply(comment);
}

if (this.appendFooterFlag) {
if (!this.dependencies.stream().allMatch(DependenciesContainer::isSatisfied)) {
InfoNode rootNode = new InfoNode(null,
GuiBase.TXT_GRAY + I18n.tr("magiclib.config.gui.dependencies_footer"));
ConfigContainer.generateDependencyCheckMessage(this.dependencies, rootNode);
comment += "\n" + rootNode.toString().replaceAll("\t", " ");
}

List<String> lines = this.statistic.getDisplayLines();

if (Configs.debug.getBooleanValue()) {
comment += "\n" + GuiBase.TXT_GRAY + I18n.tr("magiclib.config.gui.statistic.title") + GuiBase.TXT_RST
+ "\n" + Joiner.on('\n').join(lines.stream().
map(line -> GuiBase.TXT_DARK_GRAY + " " + GuiBase.TXT_GRAY + line + GuiBase.TXT_RST).
toArray()
);
}
}

return comment;
}

private static void generateDependencyCheckMessage(
@NotNull List<DependenciesContainer<ConfigContainer>> dependencies, InfoNode rootNode) {
boolean first = true;
boolean composite = false;
InfoNode compositeNode = new InfoNode(null, GuiBase.TXT_GRAY +
I18n.tr("magiclib.dependency.label.composite") + GuiBase.TXT_RST);

for (DependenciesContainer<?> dependenciesContainer : dependencies) {
boolean conflictSatisfied = dependenciesContainer.isConflictSatisfied();
boolean requireSatisfied = dependenciesContainer.isRequireSatisfied();
InfoNode orNode = null;

if (first) {
first = false;
} else if (!conflictSatisfied || !requireSatisfied) {
if (!composite) {
for (InfoNode child : rootNode.getChildren()) {
child.moveTo(compositeNode);
}

compositeNode.moveTo(rootNode);
composite = true;
}

orNode = new InfoNode(rootNode, GuiBase.TXT_GRAY +
I18n.tr("magiclib.dependency.label.or") + GuiBase.TXT_RST);
}

if (!conflictSatisfied) {
InfoNode conflictNode = new InfoNode(orNode == null ? rootNode : orNode,
GuiBase.TXT_GRAY + I18n.tr("magiclib.dependency.label.conflict"));

for (DependencyCheckResult result : dependenciesContainer.checkConflict()) {
new InfoNode(conflictNode, GuiBase.TXT_RED + result.getReason());
}
}

if (!requireSatisfied) {
InfoNode requireNode = new InfoNode(orNode == null ? rootNode : orNode,
GuiBase.TXT_GRAY + I18n.tr("magiclib.dependency.label.require"));

for (DependencyCheckResult result : dependenciesContainer.checkRequire()) {
new InfoNode(requireNode, GuiBase.TXT_RED + result.getReason());
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import fi.dy.masa.malilib.config.IConfigBase;
import fi.dy.masa.malilib.event.InputEventHandler;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import top.hendrixshen.magiclib.api.malilib.annotation.Config;
import top.hendrixshen.magiclib.api.malilib.config.MagicConfigManager;
import top.hendrixshen.magiclib.api.malilib.config.option.MagicIConfigBase;
import top.hendrixshen.magiclib.impl.malilib.config.statistic.ConfigStatisticSaver;
import top.hendrixshen.magiclib.util.FileUtil;
import top.hendrixshen.magiclib.util.serializable.JsonSaveAble;

Expand Down Expand Up @@ -61,6 +62,7 @@ public MagicConfigHandler(@NotNull MagicConfigManager configManager, int configV
this.configManager = configManager;
this.internalDataSavers.put("global", this.globalConfig);
this.internalDataSavers.put("config_gui", this.configManager.getGuiSetting());
this.internalDataSavers.put("configStatistic", new ConfigStatisticSaver(this.configManager));
}

public void loadConfig(JsonObject root) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class MagicConfigManagerImpl implements MagicConfigManager, IKeybindProvi
@Getter
private final MagicConfigGui.GuiSetting guiSetting = new MagicConfigGui.GuiSetting();
private final List<ConfigContainer> CONTAINERS = Lists.newArrayList();
private final Set<String> CATEGORIES = Sets.newHashSet(Config.defaultCategory);
private final Set<String> CATEGORIES = Sets.newLinkedHashSet();
private final Map<String, List<ConfigContainer>> CATEGORY_TO_CONTAINERS = Maps.newLinkedHashMap();
private final Map<MagicIConfigBase, ConfigContainer> CONFIG_TO_CONTAINER = Maps.newLinkedHashMap();
private final Map<String, ConfigContainer> NAME_TO_CONTAINER = Maps.newLinkedHashMap();
Expand All @@ -40,6 +40,7 @@ public class MagicConfigManagerImpl implements MagicConfigManager, IKeybindProvi
protected MagicConfigManagerImpl(String identifier) {
this.identifier = identifier;
this.configFactory = new MagicConfigFactory(identifier);
this.CATEGORIES.add(Config.defaultCategory);
}

@Override
Expand Down
Loading

0 comments on commit 70b98ab

Please sign in to comment.