Migrate PlayerMeta, add ReadyEvent, change name

This commit is contained in:
Alessandro Proto 2024-11-22 18:55:41 +01:00
parent 24d509106a
commit 50b43b6648
10 changed files with 260 additions and 41 deletions

View file

@ -8,7 +8,7 @@ loader_version=0.16.9
# Mod Properties # Mod Properties
mod_version=1.0.0 mod_version=1.0.0
maven_group=cc.reconnected maven_group=cc.reconnected
archives_base_name=rcc-lib archives_base_name=rcc-library
# Dependencies # Dependencies
# check this on https://modmuss50.me/fabric.html # check this on https://modmuss50.me/fabric.html
fabric_version=0.92.2+1.20.1 fabric_version=0.92.2+1.20.1

View file

@ -1,27 +0,0 @@
package cc.reconnected.library;
import cc.reconnected.library.config.ConfigManager;
import net.fabricmc.api.ModInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class RccLib implements ModInitializer {
public static final String MOD_ID = "rcclib";
public static RccLibConfig CONFIG;
public static Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
@Override
public void onInitialize() {
try {
loadConfig();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void loadConfig() throws IOException {
CONFIG = ConfigManager.load(RccLibConfig.class);
}
}

View file

@ -2,7 +2,7 @@ package cc.reconnected.library;
import cc.reconnected.library.config.Config; import cc.reconnected.library.config.Config;
@Config(RccLib.MOD_ID) @Config(RccLibrary.MOD_ID)
public class RccLibConfig { public class RccLibConfig {
public String link = "<c:#8888ff><u>${label}</u></c>"; public String link = "<c:#8888ff><u>${label}</u></c>";
public String linkHover = "${url}"; public String linkHover = "${url}";

View file

@ -0,0 +1,51 @@
package cc.reconnected.library;
import cc.reconnected.library.config.ConfigManager;
import cc.reconnected.library.event.ReadyEvent;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class RccLibrary implements ModInitializer {
public static final String MOD_ID = "rcc-library";
public static RccLibConfig CONFIG;
public static Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
private LuckPerms luckPerms;
public LuckPerms luckPerms() {
return luckPerms;
}
private static RccLibrary instance;
public static RccLibrary getInstance() {
return instance;
}
public RccLibrary() {
instance = this;
}
@Override
public void onInitialize() {
try {
loadConfig();
} catch (Exception e) {
throw new RuntimeException(e);
}
ServerLifecycleEvents.SERVER_STARTED.register(server -> {
luckPerms = LuckPermsProvider.get();
ReadyEvent.EVENT.invoker().onReady(server, this);
});
}
public static void loadConfig() throws IOException {
CONFIG = ConfigManager.load(RccLibConfig.class);
}
}

View file

@ -1,6 +1,6 @@
package cc.reconnected.library.config; package cc.reconnected.library.config;
import cc.reconnected.library.RccLib; import cc.reconnected.library.RccLibrary;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
@ -57,7 +57,7 @@ public class ConfigManager {
try (var fw = new FileWriter(path.toFile(), StandardCharsets.UTF_8)) { try (var fw = new FileWriter(path.toFile(), StandardCharsets.UTF_8)) {
fw.write(json); fw.write(json);
} catch (Exception e) { } catch (Exception e) {
RccLib.LOGGER.error("Error saving {} config file.", id, e); RccLibrary.LOGGER.error("Error saving {} config file.", id, e);
} }
} }
} }

View file

@ -0,0 +1,179 @@
package cc.reconnected.library.data;
import cc.reconnected.library.RccLibrary;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.model.user.User;
import net.luckperms.api.node.Node;
import net.luckperms.api.node.NodeBuilder;
import net.luckperms.api.node.NodeType;
import net.luckperms.api.node.types.MetaNode;
import net.minecraft.server.network.ServerPlayerEntity;
import org.jetbrains.annotations.Nullable;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class PlayerMeta {
public static final String nodePrefix = "rcc";
private static LuckPerms luckPerms() {
return RccLibrary.getInstance().luckPerms();
}
public static class KEYS {
public static final String username = "username";
public static final String discordId = "discord_id";
public static final String isBot = "is_bot";
public static final String isAlt = "is_alt";
public static final String pronouns = "pronouns";
public static final String firstJoinedDate = "first_joined_date";
public static final String supporterLevel = "supporter_level";
public static final String activeTime = "active_time";
}
private final User lpUser;
private final UUID uuid;
@Nullable
private String name;
private Set<MetaNode> rawNodes;
private Map<String, String> nodes;
private PlayerMeta(UUID uuid, User lpUser) {
this.uuid = uuid;
this.lpUser = lpUser;
refreshNodes();
}
public UUID getUuid() {
return uuid;
}
public @Nullable String getUsername() {
var username = get(KEYS.username);
if (username == null) {
return name;
}
return username;
}
public String getEffectiveName() {
var effName = getUsername();
if (effName == null)
return uuid.toString();
return effName;
}
public void refreshNodes() {
rawNodes = lpUser.getNodes(NodeType.META)
.parallelStream()
.filter(node -> node.getMetaKey().startsWith(nodePrefix + "."))
.collect(Collectors.toSet());
nodes = rawNodes.stream().collect(Collectors.toMap(MetaNode::getMetaKey, MetaNode::getMetaValue));
}
@SuppressWarnings("UnusedReturnValue")
public CompletableFuture<Void> set(String key, @Nullable String value) {
var node = meta(key, value).build();
return luckPerms().getUserManager().modifyUser(uuid, user -> {
user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals(key)));
user.data().add(node);
refreshNodes();
});
}
@SuppressWarnings("UnusedReturnValue")
public CompletableFuture<Void> set(String key, @Nullable String value, boolean replace) {
if (replace) delete(key);
return set(key, value);
}
public @Nullable String get(String key) {
if (!nodes.containsKey(nodePrefix + "." + key))
return null;
return nodes.get(nodePrefix + "." + key);
}
public @Nullable MetaNode getNode(String key) {
return rawNodes.stream().filter(rawNode -> rawNode.getMetaKey().equals(key)).findFirst().orElse(null);
}
@SuppressWarnings("UnusedReturnValue")
public CompletableFuture<Void> setBoolean(String key, boolean value) {
return set(key, Boolean.toString(value));
}
public boolean getBoolean(String key) {
if (!nodes.containsKey(nodePrefix + "." + key))
return false;
return Boolean.parseBoolean(nodes.get(nodePrefix + "." + key));
}
public boolean getBoolean(String key, boolean defaultValue) {
if (!nodes.containsKey(nodePrefix + "." + key))
return defaultValue;
return Boolean.parseBoolean(nodes.get(nodePrefix + "." + key));
}
@SuppressWarnings("UnusedReturnValue")
public CompletableFuture<Void> setDate(String key, Date date) {
var dateString = DateTimeFormatter.ISO_INSTANT.format(date.toInstant());
return set(key, dateString);
}
public Date getDate(String key) {
if (!nodes.containsKey(nodePrefix + "." + key))
return null;
var dateString = nodes.get(nodePrefix + "." + key);
var ta = DateTimeFormatter.ISO_INSTANT.parse(dateString);
return Date.from(Instant.from(ta));
}
@SuppressWarnings("UnusedReturnValue")
public CompletableFuture<Void> delete(String key) {
return luckPerms().getUserManager().modifyUser(uuid, user -> {
user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals(nodePrefix + "." + key)));
});
}
public String getPrimaryGroup() {
return lpUser.getPrimaryGroup();
}
public static PlayerMeta getPlayer(UUID uuid) {
var lp = luckPerms();
var userManager = lp.getUserManager();
var userFuture = userManager.loadUser(uuid);
// TODO: ouch, not good...
var lpUser = userFuture.join();
var playerData = new PlayerMeta(uuid, lpUser);
playerData.name = lpUser.getUsername();
return playerData;
}
public static PlayerMeta getPlayer(ServerPlayerEntity player) {
var user = luckPerms().getPlayerAdapter(ServerPlayerEntity.class).getUser(player);
var playerData = new PlayerMeta(player.getUuid(), user);
playerData.name = player.getEntityName();
return playerData;
}
public static NodeBuilder<?, ?> node(String key) {
return Node.builder(nodePrefix + "." + key);
}
public static NodeBuilder<?, ?> meta(String key, String value) {
return MetaNode.builder(nodePrefix + "." + key, value);
}
}

View file

@ -0,0 +1,17 @@
package cc.reconnected.library.event;
import cc.reconnected.library.RccLibrary;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
import net.minecraft.server.MinecraftServer;
public interface ReadyEvent {
Event<ReadyEvent> EVENT = EventFactory.createArrayBacked(ReadyEvent.class,
(listeners) -> (server, instance) -> {
for (var listener : listeners) {
listener.onReady(server, instance);
}
});
void onReady(MinecraftServer server, RccLibrary instance);
}

View file

@ -1,6 +1,6 @@
package cc.reconnected.library.text.parser; package cc.reconnected.library.text.parser;
import cc.reconnected.library.RccLib; import cc.reconnected.library.RccLibrary;
import cc.reconnected.library.text.Placeholder; import cc.reconnected.library.text.Placeholder;
import eu.pb4.placeholders.api.node.DirectTextNode; import eu.pb4.placeholders.api.node.DirectTextNode;
import eu.pb4.placeholders.api.node.LiteralNode; import eu.pb4.placeholders.api.node.LiteralNode;
@ -51,12 +51,12 @@ public class LinkParser implements NodeParser {
); );
var display = Placeholder.parse( var display = Placeholder.parse(
RccLib.CONFIG.link, RccLibrary.CONFIG.link,
placeholders placeholders
); );
var hover = Placeholder.parse( var hover = Placeholder.parse(
RccLib.CONFIG.linkHover, RccLibrary.CONFIG.linkHover,
placeholders placeholders
); );

View file

@ -1,6 +1,6 @@
package cc.reconnected.library.text.parser; package cc.reconnected.library.text.parser;
import cc.reconnected.library.RccLib; import cc.reconnected.library.RccLibrary;
import cc.reconnected.library.text.Placeholder; import cc.reconnected.library.text.Placeholder;
import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.node.TextNode;
import eu.pb4.placeholders.api.node.parent.ClickActionNode; import eu.pb4.placeholders.api.node.parent.ClickActionNode;
@ -37,8 +37,8 @@ public class MarkdownComponentParser {
"label", TextNode.wrap(textNodes).toText(), "label", TextNode.wrap(textNodes).toText(),
"url", url.toText() "url", url.toText()
); );
var text = Placeholder.parse(RccLib.CONFIG.link, placeholders); var text = Placeholder.parse(RccLibrary.CONFIG.link, placeholders);
var hover = Placeholder.parse(RccLib.CONFIG.linkHover, placeholders); var hover = Placeholder.parse(RccLibrary.CONFIG.linkHover, placeholders);
return new HoverNode<>(TextNode.array( return new HoverNode<>(TextNode.array(
new ClickActionNode( new ClickActionNode(

View file

@ -1,17 +1,16 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"id": "rcc-lib", "id": "rcc-library",
"version": "${version}", "version": "${version}",
"name": "rcc-lib", "name": "rcc-library",
"description": "", "description": "",
"authors": [], "authors": [],
"contact": {}, "contact": {},
"license": "MIT", "license": "MIT",
"icon": "assets/rcc-lib/icon.png",
"environment": "server", "environment": "server",
"entrypoints": { "entrypoints": {
"main": [ "main": [
"cc.reconnected.library.RccLib" "cc.reconnected.library.RccLibrary"
] ]
}, },
"depends": { "depends": {