/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.util; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; public class PronounDB { private static boolean isDisabled() { JsonObject disabled = Constants.DISABLE; return disabled != null && disabled.has("pronoundb"); } /** * Returns an Optional, since JVMs can be *very* funky with KeyStore loading */ public static CompletableFuture> performPronouning(String platform, String id) { if (isDisabled()) return CompletableFuture.completedFuture(Optional.empty()); return NotEnoughUpdates.INSTANCE.manager.apiUtils .request() .url("https://pronoundb.org/api/v1/lookup") .queryArgument("platform", platform) .queryArgument("id", id) .requestJson() .handle((result, ex) -> Optional.ofNullable(result)); } public enum Pronoun { HE("he", "him", "his"), IT("it", "it", "its"), SHE("she", "her", "hers"), THEY("they", "them", "theirs"); private final String subject; private final String object; private final String possessive; Pronoun(String subject, String object, String possessive) { this.subject = subject; this.object = object; this.possessive = possessive; } public String getSubject() { return subject; } public String getObject() { return object; } public String getPossessive() { return possessive; } } public enum PronounChoice { UNSPECIFIED("unspecified", "Unspecified"), HE("hh", Pronoun.HE), HEIT("hi", Pronoun.HE, Pronoun.IT), HESHE("hs", Pronoun.HE, Pronoun.SHE), HETHEY("ht", Pronoun.HE, Pronoun.THEY), ITHE("ih", Pronoun.IT, Pronoun.HE), IT("ii", Pronoun.IT), ITSHE("is", Pronoun.IT, Pronoun.SHE), ITTHEY("it", Pronoun.IT, Pronoun.THEY), SHEHE("shh", Pronoun.SHE, Pronoun.HE), SHE("sh", Pronoun.SHE), SHEIT("si", Pronoun.SHE, Pronoun.IT), SHETHEY("st", Pronoun.SHE, Pronoun.THEY), THEYHE("th", Pronoun.THEY, Pronoun.HE), THEYIT("ti", Pronoun.THEY, Pronoun.IT), THEYSHE("ts", Pronoun.THEY, Pronoun.SHE), THEY("tt", Pronoun.THEY), ANY("any", "Any pronouns"), OTHER("other", "Other pronouns"), ASK("ask", "Ask me my pronouns"), AVOID("avoid", "Avoid pronouns, use my name"); private final String id; private List pronouns = null; private String override = null; PronounChoice(String id, String override) { this.override = override; this.id = id; } PronounChoice(String id, Pronoun... pronouns) { this.id = id; this.pronouns = Arrays.asList(pronouns); } public static Optional findPronounsForId(String id) { for (PronounChoice value : values()) { if (value.id.equals(id)) return Optional.of(value); } return Optional.empty(); } public String getOverride() { return override; } public List getPronounsInPreferredOrder() { return pronouns; } public String getId() { return id; } public List render() { if (override != null) return Arrays.asList(override); return pronouns .stream() .map(pronoun -> pronoun.getSubject() + "/" + pronoun.getObject()) .collect(Collectors.toList()); } public boolean isConsciousChoice() { return this != UNSPECIFIED; } } public static Optional parsePronouns(JsonObject pronounObject) { if (pronounObject.has("pronouns")) { JsonElement pronouns = pronounObject.get("pronouns"); if (pronouns.isJsonPrimitive() && pronouns.getAsJsonPrimitive().isString()) return PronounChoice.findPronounsForId(pronouns.getAsString()); } return Optional.empty(); } public static CompletableFuture> getPronounsFor(String platform, String name) { return performPronouning(platform, name).thenApply(it -> it.flatMap(PronounDB::parsePronouns)); } public static CompletableFuture> getPronounsFor(UUID minecraftPlayer) { return getPronounsFor("minecraft", minecraftPlayer.toString() /* dashed UUID */); } public static void test() { System.out.println("Pronouning..."); getPronounsFor(UUID.fromString("842204e6-6880-487b-ae5a-0595394f9948")).thenAccept(it -> { PronounChoice pronounsFor = it.get(); pronounsFor.render().forEach(System.out::println); }); } }