From 25714bc7ec6295630506b4ce0e6d4c4d8341ab34 Mon Sep 17 00:00:00 2001 From: Cow Date: Sat, 28 Mar 2020 04:11:23 +0100 Subject: Reworked best friends list - Saving best friends' UUIDs now (instead of just the name), also checking for name changes periodically to keep best friends list up to date - Moved best friends add/remove functionality from config GUI back to commands (`/moo `) --- .../java/eu/olli/cowmoonication/util/ApiUtils.java | 70 ++++++++++++++++++++ .../eu/olli/cowmoonication/util/ChatHelper.java | 74 ++++++++++++++++++++++ .../java/eu/olli/cowmoonication/util/Utils.java | 59 ++--------------- .../olli/cowmoonication/util/VersionChecker.java | 2 +- 4 files changed, 149 insertions(+), 56 deletions(-) create mode 100644 src/main/java/eu/olli/cowmoonication/util/ApiUtils.java create mode 100644 src/main/java/eu/olli/cowmoonication/util/ChatHelper.java (limited to 'src/main/java/eu/olli/cowmoonication/util') diff --git a/src/main/java/eu/olli/cowmoonication/util/ApiUtils.java b/src/main/java/eu/olli/cowmoonication/util/ApiUtils.java new file mode 100644 index 0000000..5ff7d5d --- /dev/null +++ b/src/main/java/eu/olli/cowmoonication/util/ApiUtils.java @@ -0,0 +1,70 @@ +package eu.olli.cowmoonication.util; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonParser; +import com.mojang.util.UUIDTypeAdapter; +import eu.olli.cowmoonication.friends.Friend; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.function.Consumer; + +public class ApiUtils { + public static final String UUID_NOT_FOUND = "UUID-NOT-FOUND"; + private static final String NAME_TO_UUID_URL = "https://api.mojang.com/users/profiles/minecraft/"; + private static final String UUID_TO_NAME_URL = "https://api.mojang.com/user/profiles/%s/names"; + private static ExecutorService pool = Executors.newCachedThreadPool(); + private static Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).registerTypeAdapter(Friend.class, new Friend.FriendCreator()).create(); + + private ApiUtils() { + } + + public static void fetchFriendData(String name, Consumer action) { + pool.execute(() -> action.accept(getFriend(name))); + } + + private static Friend getFriend(String name) { + try { + HttpURLConnection connection = (HttpURLConnection) new URL(NAME_TO_UUID_URL + name).openConnection(); + connection.setReadTimeout(5000); + if (connection.getResponseCode() == 204) { + return Friend.FRIEND_NOT_FOUND; + } else if (connection.getResponseCode() == 200) { + return gson.fromJson(new BufferedReader(new InputStreamReader(connection.getInputStream())), Friend.class); + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static void fetchCurrentName(Friend friend, Consumer action) { + pool.execute(() -> action.accept(getCurrentName(friend))); + } + + private static String getCurrentName(Friend friend) { + try { + HttpURLConnection connection = (HttpURLConnection) new URL(String.format(UUID_TO_NAME_URL, UUIDTypeAdapter.fromUUID(friend.getUuid()))).openConnection(); + connection.setReadTimeout(5000); + if (connection.getResponseCode() == 204) { + return UUID_NOT_FOUND; + } else if (connection.getResponseCode() == 200) { + JsonArray nameHistoryData = new JsonParser().parse(new BufferedReader(new InputStreamReader(connection.getInputStream()))).getAsJsonArray(); + if (nameHistoryData.size() > 0) { + return nameHistoryData.get(nameHistoryData.size() - 1).getAsJsonObject().get("name").getAsString(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/eu/olli/cowmoonication/util/ChatHelper.java b/src/main/java/eu/olli/cowmoonication/util/ChatHelper.java new file mode 100644 index 0000000..a0820c0 --- /dev/null +++ b/src/main/java/eu/olli/cowmoonication/util/ChatHelper.java @@ -0,0 +1,74 @@ +package eu.olli.cowmoonication.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.common.MinecraftForge; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ChatHelper { + private static final Pattern USELESS_JSON_CONTENT_PATTERN = Pattern.compile("\"[A-Za-z]+\":false,?"); + private static final int DISPLAY_DURATION = 5000; + private List offlineMessages = new ArrayList<>(); + private String[] aboveChatMessage; + private long aboveChatMessageExpiration; + + public ChatHelper() { + } + + public void sendMessage(EnumChatFormatting color, String text) { + sendMessage(new ChatComponentText(text).setChatStyle(new ChatStyle().setColor(color))); + } + + public void sendMessage(IChatComponent chatComponent) { + ClientChatReceivedEvent event = new ClientChatReceivedEvent((byte) 1, chatComponent); + MinecraftForge.EVENT_BUS.post(event); + if (!event.isCanceled()) { + if (Minecraft.getMinecraft().thePlayer == null) { + offlineMessages.add(event.message); + } else { + Minecraft.getMinecraft().thePlayer.addChatMessage(event.message); + } + } + } + + public void sendOfflineMessages() { + if (Minecraft.getMinecraft().thePlayer != null) { + Iterator offlineMessages = this.offlineMessages.iterator(); + if (offlineMessages.hasNext()) { + Minecraft.getMinecraft().thePlayer.playSound("random.levelup", 0.4F, 0.8F); + } + while (offlineMessages.hasNext()) { + Minecraft.getMinecraft().thePlayer.addChatMessage(offlineMessages.next()); + offlineMessages.remove(); + } + } + } + + public void sendAboveChatMessage(String... text) { + aboveChatMessage = text; + aboveChatMessageExpiration = Minecraft.getSystemTime() + DISPLAY_DURATION; + } + + public String[] getAboveChatMessage() { + if (aboveChatMessageExpiration < Minecraft.getSystemTime()) { + // message expired + aboveChatMessage = null; + } + return aboveChatMessage; + } + + public String cleanChatComponent(IChatComponent chatComponent) { + String component = IChatComponent.Serializer.componentToJson(chatComponent); + Matcher jsonMatcher = USELESS_JSON_CONTENT_PATTERN.matcher(component); + return jsonMatcher.replaceAll(""); + } +} diff --git a/src/main/java/eu/olli/cowmoonication/util/Utils.java b/src/main/java/eu/olli/cowmoonication/util/Utils.java index 60e2ea3..0b890f0 100644 --- a/src/main/java/eu/olli/cowmoonication/util/Utils.java +++ b/src/main/java/eu/olli/cowmoonication/util/Utils.java @@ -1,65 +1,14 @@ package eu.olli.cowmoonication.util; -import eu.olli.cowmoonication.Cowmoonication; -import net.minecraft.client.Minecraft; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.client.event.ClientChatReceivedEvent; -import net.minecraftforge.common.MinecraftForge; - -import java.io.File; -import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Utils { - public static final Pattern VALID_USERNAME = Pattern.compile("^[\\w]{1,16}$"); - private static final Pattern USELESS_JSON_CONTENT_PATTERN = Pattern.compile("\"[A-Za-z]+\":false,?"); - private final Cowmoonication main; - private final File modsDir; - private String[] aboveChatMessage; - private long aboveChatMessageExpiration; - - public Utils(Cowmoonication main, File sourceFile) { - this.main = main; - modsDir = sourceFile.getParentFile(); - } - - public void sendMessage(String text) { - sendMessage(new ChatComponentText(text)); - } - - public void sendMessage(IChatComponent chatComponent) { - ClientChatReceivedEvent event = new ClientChatReceivedEvent((byte) 1, chatComponent); - MinecraftForge.EVENT_BUS.post(event); - if (!event.isCanceled()) { - Minecraft.getMinecraft().thePlayer.addChatMessage(event.message); - } - } +public final class Utils { + private static final Pattern VALID_USERNAME = Pattern.compile("^[\\w]{1,16}$"); - public void sendAboveChatMessage(String... text) { - aboveChatMessage = text; - aboveChatMessageExpiration = Minecraft.getSystemTime() + 5000; + private Utils() { } - public String[] getAboveChatMessage() { - if (aboveChatMessageExpiration < Minecraft.getSystemTime()) { - // message expired - aboveChatMessage = null; - } - return aboveChatMessage; - } - - public boolean isValidMcName(String username) { + public static boolean isValidMcName(String username) { return VALID_USERNAME.matcher(username).matches(); } - - public String cleanChatComponent(IChatComponent chatComponent) { - String component = IChatComponent.Serializer.componentToJson(chatComponent); - Matcher jsonMatcher = USELESS_JSON_CONTENT_PATTERN.matcher(component); - return jsonMatcher.replaceAll(""); - } - - public File getModsFolder() { - return modsDir; - } } diff --git a/src/main/java/eu/olli/cowmoonication/util/VersionChecker.java b/src/main/java/eu/olli/cowmoonication/util/VersionChecker.java index 5c29ae5..fa04c38 100644 --- a/src/main/java/eu/olli/cowmoonication/util/VersionChecker.java +++ b/src/main/java/eu/olli/cowmoonication/util/VersionChecker.java @@ -120,7 +120,7 @@ public class VersionChecker { } if (statusMsg != null) { - main.getUtils().sendMessage(statusMsg); + main.getChatHelper().sendMessage(statusMsg); } } -- cgit