Merge pull request #7 from JustPyrrha/feat/pronoundb

This commit is contained in:
Ashhhleyyy 2022-07-17 15:42:34 +01:00 committed by GitHub
commit be80375f2c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 5 deletions

View file

@ -42,6 +42,10 @@ dependencies {
include(libs.fabric.permissions)
}
loom {
runtimeOnlyLog4j.set(true)
}
tasks.processResources {
inputs.property("version", project.version)

View file

@ -21,31 +21,38 @@ import java.util.Optional;
public class Config {
private static final Codec<Config> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Codec.BOOL.fieldOf("allow_custom").forGetter(config -> config.allowCustom),
Codec.BOOL.fieldOf("enable_pronoundb_sync").forGetter(config -> config.enablePronounDBSync),
Pronoun.CODEC.listOf().fieldOf("single").forGetter(config -> config.single),
Pronoun.CODEC.listOf().fieldOf("pairs").forGetter(config -> config.pairs),
Codec.STRING.optionalFieldOf("default_placeholder", "Unknown").forGetter(config -> config.defaultPlaceholder)
).apply(instance, Config::new));
private final boolean allowCustom;
private final boolean enablePronounDBSync;
private final List<Pronoun> single;
private final List<Pronoun> pairs;
private final String defaultPlaceholder;
private Config(boolean allowCustom, List<Pronoun> single, List<Pronoun> pairs, String defaultPlaceholder) {
private Config(boolean allowCustom, boolean enablePronounDBSync, List<Pronoun> single, List<Pronoun> pairs, String defaultPlaceholder) {
this.allowCustom = allowCustom;
this.enablePronounDBSync = enablePronounDBSync;
this.single = single;
this.pairs = pairs;
this.defaultPlaceholder = defaultPlaceholder;
}
private Config() {
this(true, Collections.emptyList(), Collections.emptyList(), "Unknown");
this(true, true, Collections.emptyList(), Collections.emptyList(), "Unknown");
}
public boolean allowCustom() {
return allowCustom;
}
public boolean enablePronounDBSync() {
return enablePronounDBSync;
}
public List<Pronoun> getSingle() {
return single;
}

View file

@ -1,5 +1,6 @@
package io.github.ashisbored.playerpronouns;
import com.google.gson.JsonObject;
import eu.pb4.placeholders.api.PlaceholderContext;
import eu.pb4.placeholders.api.PlaceholderResult;
import eu.pb4.placeholders.api.Placeholders;
@ -10,22 +11,62 @@ import io.github.ashisbored.playerpronouns.data.Pronouns;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import net.minecraft.util.WorldSavePath;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spongepowered.include.com.google.common.base.Charsets;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class PlayerPronouns implements ModInitializer {
public static final Logger LOGGER = LogManager.getLogger();
public static final Logger LOGGER = LoggerFactory.getLogger(PlayerPronouns.class);
public static final String MOD_ID = "playerpronouns";
private static final Map<String, String> PRONOUNDB_ID_MAP = new HashMap<>() {{
// short pronoun set identifier map from https://pronoundb.org/docs
put("unspecified", "ask"); // default if unknown
put("hh", "he/him");
put("hi", "he/it");
put("hs", "he/she");
put("ht", "he/they");
put("ih", "it/he");
put("ii", "it/its");
put("is", "it/she");
put("it", "it/they");
put("shh", "she/he");
put("sh", "she/her");
put("si", "she/it");
put("st", "she/they");
put("th", "they/he");
put("ti", "they/it");
put("ts", "they/she");
put("tt", "they/them");
put("any", "any");
put("other", "other");
put("ask", "ask");
put("avoid", "avoid");
}};
private static PronounDatabase pronounDatabase;
public static Config config;
@ -59,6 +100,33 @@ public class PlayerPronouns implements ModInitializer {
}
});
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
if(config.enablePronounDBSync()) {
var pronounDbUrl = "https://pronoundb.org/api/v1/lookup?platform=minecraft&id=%s"
.formatted(handler.getPlayer().getUuid());
try {
var client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
var req = HttpRequest.newBuilder()
.uri(new URI(pronounDbUrl))
.GET()
.timeout(Duration.ofSeconds(10))
.build();
client.sendAsync(req, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(body -> {
var json = JsonHelper.deserialize(body);
var pronouns = PRONOUNDB_ID_MAP.getOrDefault(json.get("pronouns").getAsString(), "ask");
setPronouns(handler.getPlayer(), new Pronouns(pronouns, PronounList.get().getCalculatedPronounStrings().get(pronouns)));
}).join();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
});
//noinspection CodeBlock2Expr
CommandRegistrationCallback.EVENT.register((dispatcher, registry, env) -> {
PronounsCommand.register(dispatcher);