Skip to content

Commit 618e655

Browse files
committed
feat: add image upload support for 1.15.2
1 parent af9c2ba commit 618e655

4 files changed

Lines changed: 102 additions & 17 deletions

File tree

forge-1.15/src/main/java/net/azisaba/interchatmod/forge/Commands.java

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.azisaba.interchatmod.forge;
22

3+
import com.google.gson.Gson;
4+
import com.google.gson.JsonObject;
35
import com.mojang.brigadier.arguments.ArgumentType;
46
import com.mojang.brigadier.arguments.StringArgumentType;
57
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
@@ -17,16 +19,18 @@
1719
import net.minecraft.util.text.event.HoverEvent;
1820
import org.jetbrains.annotations.NotNull;
1921

20-
import java.util.Collections;
21-
import java.util.HashSet;
22-
import java.util.Locale;
23-
import java.util.Set;
22+
import java.io.File;
23+
import java.io.IOException;
24+
import java.net.URISyntaxException;
25+
import java.nio.file.Files;
26+
import java.util.*;
2427
import java.util.function.Consumer;
2528
import java.util.stream.Collectors;
2629
import java.util.stream.Stream;
2730

2831
public class Commands {
2932
public static final @NotNull Set<String> KNOWN_PLAYERS = new HashSet<>();
33+
private static final Gson GSON = new Gson();
3034

3135
public static LiteralArgumentBuilder<ISuggestionProvider> literal(String name) {
3236
return LiteralArgumentBuilder.literal(name);
@@ -211,6 +215,11 @@ public static LiteralArgumentBuilder<ISuggestionProvider> builderGuild() {
211215
)
212216
)
213217
)
218+
.then(literal("upload_image")
219+
.then(argument("uuid", StringArgumentType.string())
220+
.executes(ctx -> executeUploadImage(ctx.getSource(), StringArgumentType.getString(ctx, "uuid")))
221+
)
222+
)
214223
;
215224
}
216225

@@ -341,6 +350,31 @@ private static int executeChat(ISuggestionProvider source, String guildName, Str
341350
return 1;
342351
}
343352

353+
private static int executeUploadImage(ISuggestionProvider source, String uuid) {
354+
File image = Mod.images.get(UUID.fromString(uuid));
355+
if (image == null) {
356+
return 0;
357+
}
358+
((CommandSource) source).sendFeedback(new TranslationTextComponent("generic.uploading").applyTextStyles(TextFormatting.GRAY), false);
359+
Thread thread = new Thread(() -> {
360+
try {
361+
byte[] data = Files.readAllBytes(image.toPath());
362+
JsonObject obj = GSON.fromJson(Mod.uploadImage(data), JsonObject.class);
363+
if (!obj.has("uuid")) {
364+
Minecraft.getInstance().execute(() -> ((CommandSource) source).sendErrorMessage(new TranslationTextComponent("generic.upload_image_failed", new StringTextComponent(obj.toString()).applyTextStyles(TextFormatting.RED))));
365+
return;
366+
}
367+
String imageUuid = obj.get("uuid").getAsString();
368+
Mod.client.sendMessageToGuild(null, "https://" + ModConfig.getEffectiveApiHost() + "/interchat/image?key=" + imageUuid);
369+
} catch (IOException | URISyntaxException e) {
370+
throw new RuntimeException(e);
371+
}
372+
});
373+
thread.setName("InterChat Upload Image Thread");
374+
thread.start();
375+
return 1;
376+
}
377+
344378
private static String roleTranslationKey(String role) {
345379
return "generic.guild_role." + role.toLowerCase(Locale.ROOT);
346380
}

forge-1.15/src/main/java/net/azisaba/interchatmod/forge/Mod.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121

2222
import javax.net.ssl.SSLContext;
2323
import javax.net.ssl.SSLSocketFactory;
24+
import java.io.File;
2425
import java.io.IOException;
2526
import java.net.HttpURLConnection;
2627
import java.net.URI;
28+
import java.net.URISyntaxException;
2729
import java.net.URL;
2830
import java.nio.charset.StandardCharsets;
2931
import java.util.*;
@@ -34,6 +36,7 @@ public class Mod {
3436
public static final Timer TIMER = new Timer(true);
3537
public static final Set<Guild> GUILDS = Collections.synchronizedSet(new HashSet<>());
3638
public static final Map<Long, Set<GuildMember>> guildMembers = new ConcurrentHashMap<>();
39+
public static final Map<UUID, File> images = new ConcurrentHashMap<>();
3740
public static WebSocketChatClient client;
3841

3942
public Mod() {
@@ -77,6 +80,17 @@ public void run() {
7780
return ByteStreams.readString(connection.getInputStream(), StandardCharsets.UTF_8);
7881
}
7982

83+
public static String uploadImage(byte[] data) throws IOException, URISyntaxException {
84+
String url = "https://" + ModConfig.getEffectiveApiHost() + "/interchat/upload_image";
85+
HttpURLConnection connection = (HttpURLConnection) new URI(url).toURL().openConnection();
86+
connection.addRequestProperty("Authorization", "Bearer " + ModConfig.apiKey);
87+
connection.setDoOutput(true);
88+
connection.setRequestMethod("POST");
89+
connection.setRequestProperty("Content-Type", "image/png");
90+
connection.getOutputStream().write(data);
91+
return new String(ByteStreams.readFully(connection.getInputStream()), StandardCharsets.UTF_8);
92+
}
93+
8094
public static void reconnect() {
8195
try {
8296
if (client != null) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package net.azisaba.interchatmod.forge.mixin;
2+
3+
import net.azisaba.interchatmod.forge.Mod;
4+
import net.minecraft.client.Minecraft;
5+
import net.minecraft.client.renderer.texture.NativeImage;
6+
import net.minecraft.util.ScreenShotHelper;
7+
import net.minecraft.util.text.*;
8+
import net.minecraft.util.text.event.ClickEvent;
9+
import net.minecraft.util.text.event.HoverEvent;
10+
import net.minecraftforge.client.event.ScreenshotEvent;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15+
16+
import java.io.File;
17+
import java.util.UUID;
18+
import java.util.function.Consumer;
19+
20+
@Mixin(ScreenShotHelper.class)
21+
public class MixinScreenshotUtils {
22+
@Inject(at = @At(value = "INVOKE", target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V"), method = "lambda$saveScreenshotRaw$2")
23+
private static void onSaveScreenshot(NativeImage nativeimage, File target, ScreenshotEvent event, Consumer<ITextComponent> messageConsumer, CallbackInfo ci) {
24+
UUID uuid = UUID.randomUUID();
25+
TextComponent text = new StringTextComponent("");
26+
text.appendText("[↑");
27+
text.appendSibling(new TranslationTextComponent("generic.upload"));
28+
text.appendText("↑]");
29+
text.applyTextStyle(style -> style
30+
.setColor(TextFormatting.AQUA)
31+
.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TranslationTextComponent("generic.upload.tooltip")))
32+
.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/cguild upload_image " + uuid)));
33+
Minecraft.getInstance().execute(() -> messageConsumer.accept(text));
34+
Mod.images.put(uuid, target);
35+
}
36+
}
Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
{
2-
"required": true,
3-
"minVersion": "0.8.2",
4-
"refmap": "mixins.interchatmod.refmap.json",
5-
"package": "net.azisaba.interchatmod.forge.mixin",
6-
"compatibilityLevel": "JAVA_8",
7-
"mixins": [
8-
"MixinClientPlayNetHandler",
9-
"MixinClientPlayerEntity",
10-
"MixinMinecraft"
11-
],
12-
"injectors": {
13-
"defaultRequire": 1
14-
}
2+
"required": true,
3+
"minVersion": "0.8.2",
4+
"refmap": "mixins.interchatmod.refmap.json",
5+
"package": "net.azisaba.interchatmod.forge.mixin",
6+
"compatibilityLevel": "JAVA_8",
7+
"mixins": [
8+
"MixinClientPlayerEntity",
9+
"MixinClientPlayNetHandler",
10+
"MixinMinecraft",
11+
"MixinScreenshotUtils"
12+
],
13+
"injectors": {
14+
"defaultRequire": 1
15+
}
1516
}

0 commit comments

Comments
 (0)