aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/eu/olli/cowmoonication/util
diff options
context:
space:
mode:
authorCow <cow@volloeko.de>2020-03-28 04:11:23 +0100
committerCow <cow@volloeko.de>2020-03-28 04:11:23 +0100
commit25714bc7ec6295630506b4ce0e6d4c4d8341ab34 (patch)
treeffa6ae145b4c1e26398bf446fa33e098cfacaa10 /src/main/java/eu/olli/cowmoonication/util
parent0a105c807a3f8040ada76c4e4edac4a79fe32fe6 (diff)
downloadCowlection-25714bc7ec6295630506b4ce0e6d4c4d8341ab34.tar.gz
Cowlection-25714bc7ec6295630506b4ce0e6d4c4d8341ab34.tar.bz2
Cowlection-25714bc7ec6295630506b4ce0e6d4c4d8341ab34.zip
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 <add|remove> <name>`)
Diffstat (limited to 'src/main/java/eu/olli/cowmoonication/util')
-rw-r--r--src/main/java/eu/olli/cowmoonication/util/ApiUtils.java70
-rw-r--r--src/main/java/eu/olli/cowmoonication/util/ChatHelper.java74
-rw-r--r--src/main/java/eu/olli/cowmoonication/util/Utils.java59
-rw-r--r--src/main/java/eu/olli/cowmoonication/util/VersionChecker.java2
4 files changed, 149 insertions, 56 deletions
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<Friend> 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<String> 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<IChatComponent> 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<IChatComponent> 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);
}
}