aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhiram555 <63419731+abhithedev200@users.noreply.github.com>2023-01-26 21:34:15 +0530
committerGitHub <noreply@github.com>2023-01-26 17:04:15 +0100
commit19f6d6eacf3df61c3079d342482df3ae4a2c3e15 (patch)
tree30c8c309e46ecfc9d96d505322523178a53c1549
parent7cfe4c326b668683cccc9c250d58b7ef9c3e9083 (diff)
downloadCOFL-19f6d6eacf3df61c3079d342482df3ae4a2c3e15.tar.gz
COFL-19f6d6eacf3df61c3079d342482df3ae4a2c3e15.tar.bz2
COFL-19f6d6eacf3df61c3079d342482df3ae4a2c3e15.zip
Add Proxy support to the cofl mod (#85)
* Implement basic proxy functionality * Finish the api key management * Finished the hypixel api key support * Fixed a check, for some reason intelij didn't update my code * Only upload request if the upload is enabled, else just do the request Co-authored-by: Äkwav <16632490+Ekwav@users.noreply.github.com> Co-authored-by: Äkwav <16632490+Ekwav@users.noreply.github.com>
-rw-r--r--build.gradle.kts1
-rw-r--r--src/main/java/de/torui/coflsky/CoflSky.java35
-rw-r--r--src/main/java/de/torui/coflsky/WSCommandHandler.java12
-rw-r--r--src/main/java/de/torui/coflsky/commands/CommandType.java4
-rw-r--r--src/main/java/de/torui/coflsky/commands/models/ProxyRequest.java27
-rw-r--r--src/main/java/de/torui/coflsky/listeners/ChatListener.java22
-rw-r--r--src/main/java/de/torui/coflsky/minecraft_integration/CoflSessionManager.java1
-rw-r--r--src/main/java/de/torui/coflsky/proxy/APIKeyManager.java54
-rw-r--r--src/main/java/de/torui/coflsky/proxy/ProxyManager.java99
-rw-r--r--src/main/java/de/torui/coflsky/utils/ChatUtils.java10
10 files changed, 258 insertions, 7 deletions
diff --git a/build.gradle.kts b/build.gradle.kts
index 734083b..b1e378c 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -67,6 +67,7 @@ tasks.withType(Jar::class) {
manifest.attributes.run {
this["FMLCorePluginContainsFMLMod"] = "true"
this["ForceLoadAsMod"] = "true"
+ this["Manifest-Version"] = "1.0"
}
}
diff --git a/src/main/java/de/torui/coflsky/CoflSky.java b/src/main/java/de/torui/coflsky/CoflSky.java
index 7ab2448..0127859 100644
--- a/src/main/java/de/torui/coflsky/CoflSky.java
+++ b/src/main/java/de/torui/coflsky/CoflSky.java
@@ -2,7 +2,6 @@ package de.torui.coflsky;
import java.io.File;
-import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -11,6 +10,8 @@ import java.nio.file.Paths;
import com.google.gson.Gson;
import de.torui.coflsky.configuration.LocalConfig;
import de.torui.coflsky.handlers.EventRegistry;
+import de.torui.coflsky.listeners.ChatListener;
+import de.torui.coflsky.proxy.APIKeyManager;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.lwjgl.input.Keyboard;
@@ -46,6 +47,9 @@ public class CoflSky
};
public static String CommandUri = Config.BaseUrl + "/api/mod/commands";
+ private final static APIKeyManager apiKeyManager = new APIKeyManager();
+
+
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
String configString = null;
@@ -64,9 +68,19 @@ public class CoflSky
if (config == null) {
config = LocalConfig.createDefaultConfig();
}
+
+ try {
+ this.apiKeyManager.loadIfExists();
+ }catch (Exception exception){
+ exception.printStackTrace();
+ }
+
+ MinecraftForge.EVENT_BUS.register(new ChatListener());
+
// Cache all the mods on load
WSCommandHandler.cacheMods();
}
+
@EventHandler
public void init(FMLInitializationEvent event) throws URISyntaxException
{
@@ -93,12 +107,21 @@ public class CoflSky
}
Events = new EventRegistry();
MinecraftForge.EVENT_BUS.register(Events);
- Runtime.getRuntime()
- .addShutdownHook(
- new Thread(
- () -> config.saveConfig(configFile , config)));
+
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ config.saveConfig(configFile , config);
+ try {
+ apiKeyManager.saveKey();
+ }catch (Exception exception){
+ exception.printStackTrace();
+ }
+ }));
}
-
+
+ public static APIKeyManager getAPIKeyManager(){
+ return apiKeyManager;
+ }
+
}
diff --git a/src/main/java/de/torui/coflsky/WSCommandHandler.java b/src/main/java/de/torui/coflsky/WSCommandHandler.java
index 5427364..0d37851 100644
--- a/src/main/java/de/torui/coflsky/WSCommandHandler.java
+++ b/src/main/java/de/torui/coflsky/WSCommandHandler.java
@@ -10,6 +10,7 @@ import de.torui.coflsky.commands.RawCommand;
import de.torui.coflsky.commands.models.*;
import de.torui.coflsky.configuration.ConfigurationManager;
import de.torui.coflsky.handlers.EventRegistry;
+import de.torui.coflsky.proxy.ProxyManager;
import de.torui.coflsky.utils.FileUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
@@ -35,6 +36,7 @@ public class WSCommandHandler {
public static FlipHandler flipHandler = new FlipHandler();
private static final ModListData modListData = new ModListData();
private static final Gson gson = new Gson();
+ private static final ProxyManager proxyManager = new ProxyManager();
public static boolean HandleCommand(JsonStringCommand cmd, Entity sender) {
// Entity sender = Minecraft.getMinecraft().thePlayer;
@@ -64,6 +66,9 @@ public class WSCommandHandler {
case GetMods:
getMods();
break;
+ case ProxyRequest:
+ handleProxyRequest(cmd.GetAs(new TypeToken<ProxyRequest[]>() {}).getData());
+ break;
default:
break;
}
@@ -71,6 +76,13 @@ public class WSCommandHandler {
return true;
}
+ private static void handleProxyRequest(ProxyRequest[] request){
+ for(ProxyRequest req : request){
+ proxyManager.handleRequestAsync(req);
+ }
+ }
+
+
public static void cacheMods(){
File modFolder = new File(Minecraft.getMinecraft().mcDataDir, "mods");
for(File mods : modFolder.listFiles()){
diff --git a/src/main/java/de/torui/coflsky/commands/CommandType.java b/src/main/java/de/torui/coflsky/commands/CommandType.java
index b7dbc37..d7de3b1 100644
--- a/src/main/java/de/torui/coflsky/commands/CommandType.java
+++ b/src/main/java/de/torui/coflsky/commands/CommandType.java
@@ -54,7 +54,9 @@ public enum CommandType {
@SerializedName("uploadTab")
uploadTab,
@SerializedName("getMods")
- GetMods;
+ GetMods,
+ @SerializedName("proxy")
+ ProxyRequest;
public static Map<CommandType,String> data;
diff --git a/src/main/java/de/torui/coflsky/commands/models/ProxyRequest.java b/src/main/java/de/torui/coflsky/commands/models/ProxyRequest.java
new file mode 100644
index 0000000..b070355
--- /dev/null
+++ b/src/main/java/de/torui/coflsky/commands/models/ProxyRequest.java
@@ -0,0 +1,27 @@
+package de.torui.coflsky.commands.models;
+
+import com.google.gson.annotations.SerializedName;
+
+public class ProxyRequest {
+ @SerializedName("upload")
+ private boolean uploadEnabled;
+
+ @SerializedName("id")
+ private String id;
+
+ @SerializedName("url")
+ private String url;
+
+
+ public String getId(){
+ return id;
+ }
+
+ public String getUrl(){
+ return url;
+ }
+
+ public boolean isUploadEnabled(){
+ return this.uploadEnabled;
+ }
+}
diff --git a/src/main/java/de/torui/coflsky/listeners/ChatListener.java b/src/main/java/de/torui/coflsky/listeners/ChatListener.java
new file mode 100644
index 0000000..b808f5e
--- /dev/null
+++ b/src/main/java/de/torui/coflsky/listeners/ChatListener.java
@@ -0,0 +1,22 @@
+package de.torui.coflsky.listeners;
+
+import de.torui.coflsky.CoflSky;
+import de.torui.coflsky.utils.ChatUtils;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.fml.common.eventhandler.EventPriority;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class ChatListener {
+
+ @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true)
+ public void onGuiChat(ClientChatReceivedEvent e) {
+ String unformatted = ChatUtils.cleanColour(e.message.getUnformattedText());
+
+ if(unformatted.startsWith("Your new API key is ")){
+ // We have found the api key YAY!
+ CoflSky.getAPIKeyManager().getApiInfo().key = unformatted.substring("Your new API key is ".length()).substring(0, 36);
+ }
+ }
+
+
+}
diff --git a/src/main/java/de/torui/coflsky/minecraft_integration/CoflSessionManager.java b/src/main/java/de/torui/coflsky/minecraft_integration/CoflSessionManager.java
index 26db791..cab0c15 100644
--- a/src/main/java/de/torui/coflsky/minecraft_integration/CoflSessionManager.java
+++ b/src/main/java/de/torui/coflsky/minecraft_integration/CoflSessionManager.java
@@ -95,6 +95,7 @@ public class CoflSessionManager {
private static Path GetUserPath(String username) {
return Paths.get(GetTempFileFolder().toString() + "/" + username);
}
+
public static void DeleteCoflSession(String username) {
Path path =GetUserPath(username);
path.toFile().delete();
diff --git a/src/main/java/de/torui/coflsky/proxy/APIKeyManager.java b/src/main/java/de/torui/coflsky/proxy/APIKeyManager.java
new file mode 100644
index 0000000..e726552
--- /dev/null
+++ b/src/main/java/de/torui/coflsky/proxy/APIKeyManager.java
@@ -0,0 +1,54 @@
+package de.torui.coflsky.proxy;
+
+import com.google.gson.Gson;
+import com.google.gson.annotations.SerializedName;
+import net.minecraftforge.fml.common.Loader;
+
+import java.io.*;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.stream.Collectors;
+
+public class APIKeyManager {
+ private final Gson gson = new Gson();
+ private APIInfo apiInfo = new APIInfo();
+
+ public APIInfo getApiInfo(){
+ return this.apiInfo;
+ }
+
+
+ public class APIInfo{
+ @SerializedName("api-key")
+ public String key;
+ }
+
+ public void loadIfExists() throws Exception {
+ Path dataPath = Paths.get(Loader.instance().getConfigDir().getPath(), "CoflSky", "api-key.json");
+ File file = dataPath.toFile();
+ if(file.exists()) {
+ BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(file)));
+ String raw = reader.lines().collect(Collectors.joining("\n"));
+ this.apiInfo = gson.fromJson(raw,APIInfo.class);
+ reader.close();
+ }
+ }
+
+
+ public void saveKey() throws Exception {
+ Path dataPath = Paths.get(Loader.instance().getConfigDir().getPath(), "CoflSky", "api-key.json");
+ File file = dataPath.toFile();
+ if(file.exists()) {
+ file.delete();
+ }
+ file.createNewFile();
+
+ String data = gson.toJson(apiInfo);
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+ bw.append(data);
+ bw.flush();
+ bw.close();
+ }
+
+
+}
diff --git a/src/main/java/de/torui/coflsky/proxy/ProxyManager.java b/src/main/java/de/torui/coflsky/proxy/ProxyManager.java
new file mode 100644
index 0000000..b9abf86
--- /dev/null
+++ b/src/main/java/de/torui/coflsky/proxy/ProxyManager.java
@@ -0,0 +1,99 @@
+package de.torui.coflsky.proxy;
+
+import de.torui.coflsky.CoflSky;
+import de.torui.coflsky.commands.models.ProxyRequest;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class ProxyManager {
+ private final String ProxyResponseUrl = "http://sky.coflnet.com/api/data/proxy";
+ private final ExecutorService requestExecutor = Executors.newSingleThreadExecutor();
+
+
+ public void handleRequestAsync(ProxyRequest request){
+ CompletableFuture<String> req = this.doRequest(request.getUrl());
+ if(request.isUploadEnabled()) {
+ req.thenAcceptAsync(res -> this.uploadData(res,request.getId()));
+ }
+ }
+
+
+ private String getString(HttpURLConnection con) {
+ try {
+ InputStream in = new BufferedInputStream(con.getInputStream());
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ for (int length; (length = in.read(buffer)) != -1; ) {
+ result.write(buffer, 0, length);
+ }
+ String resString = result.toString("UTF-8");
+ return resString;
+ } catch(IOException e){
+ return null;
+ }
+ }
+
+ public void uploadData(String data,String id){
+ this.requestExecutor.submit(new Runnable() {
+ @Override
+ public void run() {
+ try{
+ URL url = new URL(ProxyManager.this.ProxyResponseUrl);
+ HttpURLConnection con = (HttpURLConnection) url.openConnection();
+ con.setRequestMethod("POST");
+
+ con.setRequestProperty("X-Request-Id", id);
+
+ con.setDoOutput(true);
+ con.setDoInput(true);
+
+ OutputStream os = con.getOutputStream();
+ os.write(data.getBytes("UTF-8"));
+ os.close();
+ String response = getString(con);
+ System.out.println("Response=" + response);
+ }catch (Exception exception){
+ exception.printStackTrace();
+ }
+ }
+ });
+ }
+
+
+ private CompletableFuture<String> doRequest(String targetUrl){
+ CompletableFuture<String> future = new CompletableFuture<>();
+
+ this.requestExecutor.submit(new Runnable() {
+ @Override
+ public void run() {
+ try{
+ URL url = new URL(targetUrl);
+ HttpURLConnection con = (HttpURLConnection) url.openConnection();
+ con.setRequestMethod("GET");
+ con.setRequestProperty("Accept", "application/json");
+ con.setRequestProperty("User-Agent", "CoflMod");
+
+ String key = CoflSky.getAPIKeyManager().getApiInfo().key;
+
+ if(targetUrl.startsWith("https://api.hypixel.net") && !key.isEmpty()){
+ con.setRequestProperty("API-Key", key);
+ }
+
+ con.setDoInput(true);
+ future.complete(getString(con));
+ }catch (Exception exception){
+ exception.printStackTrace();
+ }
+ }
+ });
+
+ return future;
+ }
+
+
+}
diff --git a/src/main/java/de/torui/coflsky/utils/ChatUtils.java b/src/main/java/de/torui/coflsky/utils/ChatUtils.java
new file mode 100644
index 0000000..766fb2c
--- /dev/null
+++ b/src/main/java/de/torui/coflsky/utils/ChatUtils.java
@@ -0,0 +1,10 @@
+package de.torui.coflsky.utils;
+
+public class ChatUtils {
+
+ public static String cleanColour(String in) {
+ return in.replaceAll("(?i)\\u00A7.", "");
+ }
+
+
+}