mirror of
https://github.com/ashhhleyyy/player-pronouns.git
synced 2024-11-01 07:07:38 +00:00
feat: the big refactor
- Change the package from io.github.ashisbored to dev.ashhhleyyy - Split into API and implementation packages - Adjust command to allow querying other players' pronouns - Removed some static fields
This commit is contained in:
parent
91d9c5c3cd
commit
9a84ade7f5
12 changed files with 204 additions and 70 deletions
|
@ -1,17 +1,23 @@
|
||||||
package io.github.ashisbored.playerpronouns.data;
|
package dev.ashhhleyyy.playerpronouns.api;
|
||||||
|
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.Codec;
|
||||||
import com.mojang.serialization.DataResult;
|
import com.mojang.serialization.DataResult;
|
||||||
import com.mojang.serialization.DynamicOps;
|
import com.mojang.serialization.DynamicOps;
|
||||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
import io.github.ashisbored.playerpronouns.PlayerPronouns;
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.PlayerPronouns;
|
||||||
import net.minecraft.text.*;
|
import net.minecraft.text.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A single pronoun, which consists of the word itself, along with an associated style.
|
||||||
|
* @param pronoun The text of this pronoun
|
||||||
|
* @param style An associated style that is used for display as {@link Text}
|
||||||
|
*/
|
||||||
public record Pronoun(
|
public record Pronoun(
|
||||||
String pronoun,
|
String pronoun,
|
||||||
Style style
|
Style style
|
||||||
|
@ -91,6 +97,9 @@ public record Pronoun(
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A version of this pronoun formatted as a {@link MutableText}
|
||||||
|
*/
|
||||||
public MutableText toText() {
|
public MutableText toText() {
|
||||||
return Text.literal(this.pronoun).setStyle(this.style);
|
return Text.literal(this.pronoun).setStyle(this.style);
|
||||||
}
|
}
|
|
@ -1,10 +1,16 @@
|
||||||
package io.github.ashisbored.playerpronouns.data;
|
package dev.ashhhleyyy.playerpronouns.api;
|
||||||
|
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.Codec;
|
||||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.dynamic.Codecs;
|
import net.minecraft.util.dynamic.Codecs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A combined set of {@link Pronoun}s
|
||||||
|
* @param raw The plain text version of this pronoun set
|
||||||
|
* @param formatted The styled version of this pronoun set
|
||||||
|
* @param remote Whether the pronouns were fetched from a remote API
|
||||||
|
*/
|
||||||
public record Pronouns(
|
public record Pronouns(
|
||||||
String raw,
|
String raw,
|
||||||
Text formatted,
|
Text formatted,
|
|
@ -0,0 +1,85 @@
|
||||||
|
package dev.ashhhleyyy.playerpronouns.api;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entrypoint to the API, and provides access to a {@link PronounReader} and {@link PronounSetter}
|
||||||
|
*/
|
||||||
|
public final class PronounsApi {
|
||||||
|
private static @Nullable PronounReader READER = null;
|
||||||
|
private static @Nullable PronounSetter SETTER = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The currently initialised {@link PronounReader}
|
||||||
|
*/
|
||||||
|
public static PronounReader getReader() {
|
||||||
|
if (READER == null) {
|
||||||
|
throw new IllegalStateException("PronounReader has not been initialised");
|
||||||
|
}
|
||||||
|
return READER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The currently initialised {@link PronounSetter}
|
||||||
|
*/
|
||||||
|
public static PronounSetter getSetter() {
|
||||||
|
if (SETTER == null) {
|
||||||
|
throw new IllegalStateException("PronounSetter has not been initialised");
|
||||||
|
}
|
||||||
|
return SETTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes the passed reader be set as the default.
|
||||||
|
*
|
||||||
|
* This should not be called by most mods, unless they are implementing a custom backend.
|
||||||
|
*
|
||||||
|
* @param reader The reader to configure
|
||||||
|
*/
|
||||||
|
public static void initReader(PronounReader reader) {
|
||||||
|
if (READER != null) {
|
||||||
|
throw new IllegalStateException("PronounReader has already been initialised");
|
||||||
|
}
|
||||||
|
READER = reader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes the passed setter be set as the default.
|
||||||
|
*
|
||||||
|
* This should not be called by most mods, unless they are implementing a custom backend.
|
||||||
|
*
|
||||||
|
* @param reader The reader to configure
|
||||||
|
*/
|
||||||
|
public static void initSetter(PronounSetter setter) {
|
||||||
|
if (SETTER != null) {
|
||||||
|
throw new IllegalStateException("PronounSetter has already been initialised");
|
||||||
|
}
|
||||||
|
SETTER = setter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows updating a player's {@link Pronouns}.
|
||||||
|
*
|
||||||
|
* Methods in this class may invoke blocking IO operations to save the database to disk.
|
||||||
|
*/
|
||||||
|
public interface PronounSetter {
|
||||||
|
default boolean setPronouns(ServerPlayerEntity player, @Nullable Pronouns pronouns) {
|
||||||
|
return this.setPronouns(player.getUuid(), pronouns);
|
||||||
|
}
|
||||||
|
boolean setPronouns(UUID playerId, @Nullable Pronouns pronouns);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows obtaining a player's {@link Pronouns}
|
||||||
|
*/
|
||||||
|
public interface PronounReader {
|
||||||
|
default @Nullable Pronouns getPronouns(ServerPlayerEntity player) {
|
||||||
|
return this.getPronouns(player.getUuid());
|
||||||
|
}
|
||||||
|
@Nullable Pronouns getPronouns(UUID playerId);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package io.github.ashisbored.playerpronouns;
|
package dev.ashhhleyyy.playerpronouns.impl;
|
||||||
|
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
|
@ -8,7 +8,8 @@ import com.mojang.serialization.Codec;
|
||||||
import com.mojang.serialization.DataResult;
|
import com.mojang.serialization.DataResult;
|
||||||
import com.mojang.serialization.JsonOps;
|
import com.mojang.serialization.JsonOps;
|
||||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
import io.github.ashisbored.playerpronouns.data.Pronoun;
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.api.Pronoun;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
|
@ -1,17 +1,12 @@
|
||||||
package io.github.ashisbored.playerpronouns;
|
package dev.ashhhleyyy.playerpronouns.impl;
|
||||||
|
|
||||||
import eu.pb4.placeholders.api.PlaceholderContext;
|
import eu.pb4.placeholders.api.PlaceholderContext;
|
||||||
import eu.pb4.placeholders.api.PlaceholderResult;
|
import eu.pb4.placeholders.api.PlaceholderResult;
|
||||||
import eu.pb4.placeholders.api.Placeholders;
|
import eu.pb4.placeholders.api.Placeholders;
|
||||||
import io.github.ashisbored.playerpronouns.command.PronounsCommand;
|
|
||||||
import io.github.ashisbored.playerpronouns.data.PronounDatabase;
|
|
||||||
import io.github.ashisbored.playerpronouns.data.PronounList;
|
|
||||||
import io.github.ashisbored.playerpronouns.data.Pronouns;
|
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||||
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
|
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
|
||||||
import net.minecraft.server.MinecraftServer;
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.JsonHelper;
|
import net.minecraft.util.JsonHelper;
|
||||||
|
@ -20,6 +15,12 @@ import org.jetbrains.annotations.Nullable;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.api.Pronouns;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.api.PronounsApi;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.command.PronounsCommand;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.data.PronounDatabase;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.data.PronounList;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
@ -31,10 +32,9 @@ import java.nio.file.Path;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class PlayerPronouns implements ModInitializer {
|
public class PlayerPronouns implements ModInitializer, PronounsApi.PronounReader, PronounsApi.PronounSetter {
|
||||||
public static final Logger LOGGER = LoggerFactory.getLogger(PlayerPronouns.class);
|
public static final Logger LOGGER = LoggerFactory.getLogger(PlayerPronouns.class);
|
||||||
public static final String MOD_ID = "playerpronouns";
|
public static final String MOD_ID = "playerpronouns";
|
||||||
private static final String USER_AGENT = "player-pronouns/1.0 (+https://ashhhleyyy.dev/projects/2021/player-pronouns)";
|
private static final String USER_AGENT = "player-pronouns/1.0 (+https://ashhhleyyy.dev/projects/2021/player-pronouns)";
|
||||||
|
@ -63,7 +63,7 @@ public class PlayerPronouns implements ModInitializer {
|
||||||
put("avoid", "avoid");
|
put("avoid", "avoid");
|
||||||
}};
|
}};
|
||||||
|
|
||||||
private static PronounDatabase pronounDatabase;
|
private PronounDatabase pronounDatabase;
|
||||||
public static Config config;
|
public static Config config;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -88,7 +88,7 @@ public class PlayerPronouns implements ModInitializer {
|
||||||
ServerLifecycleEvents.SERVER_STOPPING.register(server -> {
|
ServerLifecycleEvents.SERVER_STOPPING.register(server -> {
|
||||||
if (pronounDatabase != null) {
|
if (pronounDatabase != null) {
|
||||||
try {
|
try {
|
||||||
savePronounDatabase(server);
|
pronounDatabase.save();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.error("Failed to save pronoun database!", e);
|
LOGGER.error("Failed to save pronoun database!", e);
|
||||||
}
|
}
|
||||||
|
@ -139,14 +139,17 @@ public class PlayerPronouns implements ModInitializer {
|
||||||
PronounsCommand.register(dispatcher);
|
PronounsCommand.register(dispatcher);
|
||||||
});
|
});
|
||||||
|
|
||||||
Placeholders.register(new Identifier(MOD_ID, "pronouns"), (ctx, argument)->
|
Placeholders.register(new Identifier(MOD_ID, "pronouns"), (ctx, argument) ->
|
||||||
PlayerPronouns.fromContext(ctx, argument, true));
|
fromContext(ctx, argument, true));
|
||||||
|
|
||||||
Placeholders.register(new Identifier(MOD_ID, "raw_pronouns"), (ctx, argument)->
|
Placeholders.register(new Identifier(MOD_ID, "raw_pronouns"), (ctx, argument) ->
|
||||||
PlayerPronouns.fromContext(ctx, argument, false));
|
fromContext(ctx, argument, false));
|
||||||
|
|
||||||
|
PronounsApi.initReader(this);
|
||||||
|
PronounsApi.initSetter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PlaceholderResult fromContext(PlaceholderContext ctx, @Nullable String argument, boolean formatted) {
|
private PlaceholderResult fromContext(PlaceholderContext ctx, @Nullable String argument, boolean formatted) {
|
||||||
if (!ctx.hasPlayer()) {
|
if (!ctx.hasPlayer()) {
|
||||||
return PlaceholderResult.invalid("missing player");
|
return PlaceholderResult.invalid("missing player");
|
||||||
}
|
}
|
||||||
|
@ -172,20 +175,12 @@ public class PlayerPronouns implements ModInitializer {
|
||||||
PronounList.load(config);
|
PronounList.load(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void savePronounDatabase(MinecraftServer server) throws IOException {
|
public boolean setPronouns(UUID playerId, @Nullable Pronouns pronouns) {
|
||||||
Path playerData = server.getSavePath(WorldSavePath.PLAYERDATA);
|
|
||||||
if (!Files.exists(playerData)) {
|
|
||||||
Files.createDirectories(playerData);
|
|
||||||
}
|
|
||||||
pronounDatabase.save(playerData.resolve("pronouns.dat"));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean setPronouns(ServerPlayerEntity player, @Nullable Pronouns pronouns) {
|
|
||||||
if (pronounDatabase == null) return false;
|
if (pronounDatabase == null) return false;
|
||||||
|
|
||||||
pronounDatabase.put(player.getUuid(), pronouns);
|
pronounDatabase.put(playerId, pronouns);
|
||||||
try {
|
try {
|
||||||
savePronounDatabase(Objects.requireNonNull(player.getServer()));
|
pronounDatabase.save();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.error("Failed to save pronoun database!", e);
|
LOGGER.error("Failed to save pronoun database!", e);
|
||||||
}
|
}
|
||||||
|
@ -193,11 +188,11 @@ public class PlayerPronouns implements ModInitializer {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @Nullable Pronouns getPronouns(ServerPlayerEntity player) {
|
public @Nullable Pronouns getPronouns(ServerPlayerEntity player) {
|
||||||
return getPronouns(player.getUuid());
|
return getPronouns(player.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @Nullable Pronouns getPronouns(UUID playerId) {
|
public @Nullable Pronouns getPronouns(UUID playerId) {
|
||||||
if (pronounDatabase == null) return null;
|
if (pronounDatabase == null) return null;
|
||||||
return pronounDatabase.get(playerId);
|
return pronounDatabase.get(playerId);
|
||||||
}
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
package io.github.ashisbored.playerpronouns.command;
|
package dev.ashhhleyyy.playerpronouns.impl.command;
|
||||||
|
|
||||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
||||||
import io.github.ashisbored.playerpronouns.data.PronounList;
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.data.PronounList;
|
||||||
import net.minecraft.server.command.CommandManager;
|
import net.minecraft.server.command.CommandManager;
|
||||||
import net.minecraft.server.command.ServerCommandSource;
|
import net.minecraft.server.command.ServerCommandSource;
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
package io.github.ashisbored.playerpronouns.command;
|
package dev.ashhhleyyy.playerpronouns.impl.command;
|
||||||
|
|
||||||
import com.mojang.brigadier.Command;
|
import com.mojang.brigadier.Command;
|
||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import io.github.ashisbored.playerpronouns.PlayerPronouns;
|
|
||||||
import io.github.ashisbored.playerpronouns.data.PronounList;
|
import dev.ashhhleyyy.playerpronouns.api.Pronouns;
|
||||||
import io.github.ashisbored.playerpronouns.data.Pronouns;
|
import dev.ashhhleyyy.playerpronouns.api.PronounsApi;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.data.PronounList;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.PlayerPronouns;
|
||||||
import me.lucko.fabric.api.permissions.v0.Permissions;
|
import me.lucko.fabric.api.permissions.v0.Permissions;
|
||||||
|
import net.minecraft.command.argument.EntityArgumentType;
|
||||||
import net.minecraft.server.command.ServerCommandSource;
|
import net.minecraft.server.command.ServerCommandSource;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
@ -14,12 +17,14 @@ import net.minecraft.util.Formatting;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
|
||||||
import static io.github.ashisbored.playerpronouns.command.PronounsArgument.pronouns;
|
import static dev.ashhhleyyy.playerpronouns.impl.command.PronounsArgument.pronouns;
|
||||||
|
import static net.minecraft.server.command.CommandManager.argument;
|
||||||
import static net.minecraft.server.command.CommandManager.literal;
|
import static net.minecraft.server.command.CommandManager.literal;
|
||||||
|
|
||||||
public class PronounsCommand {
|
public class PronounsCommand {
|
||||||
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
|
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
|
||||||
dispatcher.register(literal("pronouns")
|
dispatcher.register(literal("pronouns")
|
||||||
|
.then(literal("set")
|
||||||
.then(pronouns("pronouns")
|
.then(pronouns("pronouns")
|
||||||
.executes(ctx -> {
|
.executes(ctx -> {
|
||||||
ServerPlayerEntity player = ctx.getSource().getPlayer();
|
ServerPlayerEntity player = ctx.getSource().getPlayer();
|
||||||
|
@ -38,7 +43,7 @@ public class PronounsCommand {
|
||||||
pronouns = new Pronouns(pronounsString, Text.literal(pronounsString), false);
|
pronouns = new Pronouns(pronounsString, Text.literal(pronounsString), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PlayerPronouns.setPronouns(player, pronouns)) {
|
if (!PronounsApi.getSetter().setPronouns(player, pronouns)) {
|
||||||
ctx.getSource().sendError(Text.literal("Failed to update pronouns, sorry"));
|
ctx.getSource().sendError(Text.literal("Failed to update pronouns, sorry"));
|
||||||
} else {
|
} else {
|
||||||
ctx.getSource().sendFeedback(() -> Text.literal("Updated your pronouns to ")
|
ctx.getSource().sendFeedback(() -> Text.literal("Updated your pronouns to ")
|
||||||
|
@ -48,6 +53,7 @@ public class PronounsCommand {
|
||||||
|
|
||||||
return Command.SINGLE_SUCCESS;
|
return Command.SINGLE_SUCCESS;
|
||||||
})
|
})
|
||||||
|
)
|
||||||
).then(literal("reload-config")
|
).then(literal("reload-config")
|
||||||
.requires(ctx -> Permissions.check(ctx, "playerpronouns.reload_config", 4))
|
.requires(ctx -> Permissions.check(ctx, "playerpronouns.reload_config", 4))
|
||||||
.executes(ctx -> {
|
.executes(ctx -> {
|
||||||
|
@ -58,7 +64,7 @@ public class PronounsCommand {
|
||||||
).then(literal("unset")
|
).then(literal("unset")
|
||||||
.executes(ctx -> {
|
.executes(ctx -> {
|
||||||
ServerPlayerEntity player = ctx.getSource().getPlayer();
|
ServerPlayerEntity player = ctx.getSource().getPlayer();
|
||||||
if (!PlayerPronouns.setPronouns(player, null)) {
|
if (!PronounsApi.getSetter().setPronouns(player, null)) {
|
||||||
ctx.getSource().sendError(Text.literal("Failed to update pronouns, sorry"));
|
ctx.getSource().sendError(Text.literal("Failed to update pronouns, sorry"));
|
||||||
} else {
|
} else {
|
||||||
ctx.getSource().sendFeedback(() -> Text.literal("Cleared your pronouns!")
|
ctx.getSource().sendFeedback(() -> Text.literal("Cleared your pronouns!")
|
||||||
|
@ -66,6 +72,24 @@ public class PronounsCommand {
|
||||||
}
|
}
|
||||||
return Command.SINGLE_SUCCESS;
|
return Command.SINGLE_SUCCESS;
|
||||||
})
|
})
|
||||||
|
).then(literal("show")
|
||||||
|
.then(argument("player", EntityArgumentType.player())
|
||||||
|
.executes(ctx -> {
|
||||||
|
ServerPlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
|
||||||
|
Pronouns pronouns = PronounsApi.getReader().getPronouns(player);
|
||||||
|
if (pronouns != null) {
|
||||||
|
ctx.getSource().sendFeedback(() -> Text.literal("")
|
||||||
|
.append(player.getDisplayName())
|
||||||
|
.append(Text.literal("'s pronouns are ")
|
||||||
|
.append(pronouns.formatted())), false);
|
||||||
|
} else {
|
||||||
|
ctx.getSource().sendFeedback(() -> Text.literal("")
|
||||||
|
.append(player.getDisplayName())
|
||||||
|
.append(Text.literal(" has not set any pronouns.")), false);
|
||||||
|
}
|
||||||
|
return Command.SINGLE_SUCCESS;
|
||||||
|
})
|
||||||
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
|
@ -1,10 +1,12 @@
|
||||||
package io.github.ashisbored.playerpronouns.data;
|
package dev.ashhhleyyy.playerpronouns.impl.data;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.api.Pronouns;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
@ -12,14 +14,16 @@ import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class BinaryPronounDatabase {
|
public class BinaryPronounDatabase {
|
||||||
|
private final Path databasePath;
|
||||||
private final Object2ObjectMap<UUID, String> data;
|
private final Object2ObjectMap<UUID, String> data;
|
||||||
|
|
||||||
private BinaryPronounDatabase(Object2ObjectMap<UUID, String> data) {
|
private BinaryPronounDatabase(Path databasePath, Object2ObjectMap<UUID, String> data) {
|
||||||
|
this.databasePath = databasePath;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private BinaryPronounDatabase() {
|
private BinaryPronounDatabase(Path databasePath) {
|
||||||
this(new Object2ObjectOpenHashMap<>());
|
this(databasePath, new Object2ObjectOpenHashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void put(UUID uuid, @Nullable String pronouns) {
|
public void put(UUID uuid, @Nullable String pronouns) {
|
||||||
|
@ -34,8 +38,8 @@ public class BinaryPronounDatabase {
|
||||||
return this.data.get(uuid);
|
return this.data.get(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void save(Path path) throws IOException {
|
public synchronized void save() throws IOException {
|
||||||
try (OutputStream os = Files.newOutputStream(path);
|
try (OutputStream os = Files.newOutputStream(this.databasePath);
|
||||||
DataOutputStream out = new DataOutputStream(os)) {
|
DataOutputStream out = new DataOutputStream(os)) {
|
||||||
|
|
||||||
out.writeShort(0x4567); // some form of magic, idk
|
out.writeShort(0x4567); // some form of magic, idk
|
||||||
|
@ -60,12 +64,12 @@ public class BinaryPronounDatabase {
|
||||||
}
|
}
|
||||||
pronouns.put(entry.getKey(), new Pronouns(entry.getValue(), formatted, false));
|
pronouns.put(entry.getKey(), new Pronouns(entry.getValue(), formatted, false));
|
||||||
}
|
}
|
||||||
return new PalettePronounDatabase(pronouns);
|
return new PalettePronounDatabase(path, pronouns);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BinaryPronounDatabase load(Path path) throws IOException {
|
public static BinaryPronounDatabase load(Path path) throws IOException {
|
||||||
if (!Files.exists(path)) {
|
if (!Files.exists(path)) {
|
||||||
return new BinaryPronounDatabase();
|
return new BinaryPronounDatabase(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
try (InputStream is = Files.newInputStream(path);
|
try (InputStream is = Files.newInputStream(path);
|
||||||
|
@ -89,7 +93,7 @@ public class BinaryPronounDatabase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new BinaryPronounDatabase(data);
|
return new BinaryPronounDatabase(path, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,8 +1,10 @@
|
||||||
package io.github.ashisbored.playerpronouns.data;
|
package dev.ashhhleyyy.playerpronouns.impl.data;
|
||||||
|
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.mojang.serialization.JsonOps;
|
import com.mojang.serialization.JsonOps;
|
||||||
import io.github.ashisbored.playerpronouns.PlayerPronouns;
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.api.Pronouns;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.PlayerPronouns;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
|
@ -19,20 +21,22 @@ import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An improved version of {@link io.github.ashisbored.playerpronouns.data.BinaryPronounDatabase} that uses a palette
|
* An improved version of {@link dev.ashhhleyyy.playerpronouns.data.BinaryPronounDatabase} that uses a palette
|
||||||
* for efficiency when storing lots of players. It also supports versioning of the file to allow for changes to be
|
* for efficiency when storing lots of players. It also supports versioning of the file to allow for changes to be
|
||||||
* made to the format in the future.
|
* made to the format in the future.
|
||||||
*/
|
*/
|
||||||
public class PalettePronounDatabase implements PronounDatabase {
|
public class PalettePronounDatabase implements PronounDatabase {
|
||||||
public static final int VERSION_NUMBER = 1;
|
public static final int VERSION_NUMBER = 1;
|
||||||
|
private final Path databasePath;
|
||||||
private final Object2ObjectMap<UUID, Pronouns> data;
|
private final Object2ObjectMap<UUID, Pronouns> data;
|
||||||
|
|
||||||
protected PalettePronounDatabase(Object2ObjectMap<UUID, Pronouns> data) {
|
protected PalettePronounDatabase(Path databasePath, Object2ObjectMap<UUID, Pronouns> data) {
|
||||||
|
this.databasePath = databasePath;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private PalettePronounDatabase() {
|
private PalettePronounDatabase(Path databasePath) {
|
||||||
this(new Object2ObjectOpenHashMap<>());
|
this(databasePath, new Object2ObjectOpenHashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,8 +54,8 @@ public class PalettePronounDatabase implements PronounDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void save(Path path) throws IOException {
|
public synchronized void save() throws IOException {
|
||||||
try (OutputStream os = Files.newOutputStream(path);
|
try (OutputStream os = Files.newOutputStream(this.databasePath);
|
||||||
DataOutputStream out = new DataOutputStream(os)) {
|
DataOutputStream out = new DataOutputStream(os)) {
|
||||||
|
|
||||||
out.writeShort(0x4568);
|
out.writeShort(0x4568);
|
||||||
|
@ -90,7 +94,7 @@ public class PalettePronounDatabase implements PronounDatabase {
|
||||||
|
|
||||||
public static PalettePronounDatabase load(Path path) throws IOException {
|
public static PalettePronounDatabase load(Path path) throws IOException {
|
||||||
if (!Files.exists(path)) {
|
if (!Files.exists(path)) {
|
||||||
return new PalettePronounDatabase();
|
return new PalettePronounDatabase(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
try (InputStream is = Files.newInputStream(path);
|
try (InputStream is = Files.newInputStream(path);
|
||||||
|
@ -136,7 +140,7 @@ public class PalettePronounDatabase implements PronounDatabase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new PalettePronounDatabase(data);
|
return new PalettePronounDatabase(path, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,8 +1,10 @@
|
||||||
package io.github.ashisbored.playerpronouns.data;
|
package dev.ashhhleyyy.playerpronouns.impl.data;
|
||||||
|
|
||||||
import io.github.ashisbored.playerpronouns.PlayerPronouns;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import dev.ashhhleyyy.playerpronouns.api.Pronouns;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.PlayerPronouns;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
@ -13,7 +15,7 @@ import java.util.UUID;
|
||||||
public interface PronounDatabase {
|
public interface PronounDatabase {
|
||||||
void put(UUID player, @Nullable Pronouns pronouns);
|
void put(UUID player, @Nullable Pronouns pronouns);
|
||||||
@Nullable Pronouns get(UUID player);
|
@Nullable Pronouns get(UUID player);
|
||||||
void save(Path path) throws IOException;
|
void save() throws IOException;
|
||||||
|
|
||||||
static PronounDatabase load(Path path) throws IOException {
|
static PronounDatabase load(Path path) throws IOException {
|
||||||
if (!Files.exists(path)) {
|
if (!Files.exists(path)) {
|
|
@ -1,10 +1,12 @@
|
||||||
package io.github.ashisbored.playerpronouns.data;
|
package dev.ashhhleyyy.playerpronouns.impl.data;
|
||||||
|
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import io.github.ashisbored.playerpronouns.Config;
|
|
||||||
import io.github.ashisbored.playerpronouns.PlayerPronouns;
|
import dev.ashhhleyyy.playerpronouns.api.Pronoun;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.Config;
|
||||||
|
import dev.ashhhleyyy.playerpronouns.impl.PlayerPronouns;
|
||||||
import net.minecraft.text.MutableText;
|
import net.minecraft.text.MutableText;
|
||||||
import net.minecraft.text.Style;
|
import net.minecraft.text.Style;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
|
@ -9,13 +9,14 @@
|
||||||
],
|
],
|
||||||
"contact": {
|
"contact": {
|
||||||
"sources": "https://github.com/ashhhleyyy/player-pronouns",
|
"sources": "https://github.com/ashhhleyyy/player-pronouns",
|
||||||
"issues": "https://github.com/ashhhleyyy/player-pronouns/issues"
|
"issues": "https://github.com/ashhhleyyy/player-pronouns/issues",
|
||||||
|
"homepage": "https://ashhhleyyy.dev/projects/2021/player-pronouns"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"environment": "*",
|
"environment": "*",
|
||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
"main": [
|
"main": [
|
||||||
"io.github.ashisbored.playerpronouns.PlayerPronouns"
|
"dev.ashhhleyyy.playerpronouns.impl.PlayerPronouns"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"depends": {
|
"depends": {
|
||||||
|
|
Loading…
Reference in a new issue