Skip to content

Commit af9c2ba

Browse files
committed
feat: add image upload support for 1.16.5
1 parent f7d9f9c commit af9c2ba

5 files changed

Lines changed: 98 additions & 13 deletions

File tree

fabric-1.16/src/main/java/net/azisaba/interchatmod/fabric/Commands.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package net.azisaba.interchatmod.fabric;
22

3+
import com.google.gson.Gson;
4+
import com.google.gson.JsonObject;
35
import com.mojang.brigadier.arguments.StringArgumentType;
46
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
57
import net.azisaba.interchatmod.common.model.Guild;
68
import net.azisaba.interchatmod.common.model.GuildMember;
79
import net.azisaba.interchatmod.common.util.Constants;
810
import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager;
911
import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource;
12+
import net.minecraft.client.MinecraftClient;
1013
import net.minecraft.command.CommandSource;
1114
import net.minecraft.text.*;
1215
import net.minecraft.util.Formatting;
1316
import org.jetbrains.annotations.NotNull;
1417

18+
import java.io.File;
19+
import java.io.IOException;
20+
import java.net.URISyntaxException;
21+
import java.nio.file.Files;
1522
import java.util.*;
1623
import java.util.function.Consumer;
1724
import java.util.stream.Collectors;
@@ -21,6 +28,7 @@
2128
import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.literal;
2229

2330
public class Commands {
31+
private static final Gson GSON = new Gson();
2432
public static final @NotNull Set<String> KNOWN_PLAYERS = new HashSet<>();
2533

2634
public static LiteralArgumentBuilder<FabricClientCommandSource> builderGTell() {
@@ -197,6 +205,11 @@ public static LiteralArgumentBuilder<FabricClientCommandSource> builderGuild() {
197205
)
198206
)
199207
)
208+
.then(literal("upload_image")
209+
.then(argument("uuid", StringArgumentType.string())
210+
.executes(ctx -> executeUploadImage(ctx.getSource(), StringArgumentType.getString(ctx, "uuid")))
211+
)
212+
)
200213
;
201214
}
202215

@@ -293,6 +306,31 @@ private static int executeChat(FabricClientCommandSource source, String guildNam
293306
return 1;
294307
}
295308

309+
private static int executeUploadImage(FabricClientCommandSource source, String uuid) {
310+
File image = Mod.images.get(UUID.fromString(uuid));
311+
if (image == null) {
312+
return 0;
313+
}
314+
source.sendFeedback(new TranslatableText("generic.uploading").formatted(Formatting.GRAY));
315+
Thread thread = new Thread(() -> {
316+
try {
317+
byte[] data = Files.readAllBytes(image.toPath());
318+
JsonObject obj = GSON.fromJson(Mod.uploadImage(data), JsonObject.class);
319+
if (!obj.has("uuid")) {
320+
MinecraftClient.getInstance().execute(() -> source.sendError(new TranslatableText("generic.upload_image_failed", new LiteralText(obj.toString()).formatted(Formatting.RED))));
321+
return;
322+
}
323+
String imageUuid = obj.get("uuid").getAsString();
324+
Mod.client.sendMessageToGuild(null, "https://" + ModConfig.getEffectiveApiHost() + "/interchat/image?key=" + imageUuid);
325+
} catch (IOException | URISyntaxException e) {
326+
throw new RuntimeException(e);
327+
}
328+
});
329+
thread.setName("InterChat Upload Image Thread");
330+
thread.start();
331+
return 1;
332+
}
333+
296334
private static String roleTranslationKey(String role) {
297335
return "generic.guild_role." + role.toLowerCase(Locale.ROOT);
298336
}

fabric-1.16/src/main/java/net/azisaba/interchatmod/fabric/Mod.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
import net.minecraft.server.integrated.IntegratedServer;
1616
import org.jetbrains.annotations.NotNull;
1717

18-
import javax.net.ssl.SSLContext;
19-
import javax.net.ssl.SSLSocketFactory;
18+
import java.io.File;
2019
import java.io.IOException;
2120
import java.net.HttpURLConnection;
2221
import java.net.URI;
22+
import java.net.URISyntaxException;
2323
import java.net.URL;
2424
import java.nio.charset.StandardCharsets;
2525
import java.util.*;
@@ -29,6 +29,7 @@ public class Mod implements ModInitializer, ModMenuApi {
2929
public static final Timer TIMER = new Timer(true);
3030
public static final Set<Guild> GUILDS = Collections.synchronizedSet(new HashSet<>());
3131
public static final Map<Long, Set<GuildMember>> guildMembers = new ConcurrentHashMap<>();
32+
public static final Map<UUID, File> images = new ConcurrentHashMap<>();
3233
public static WebSocketChatClient client;
3334

3435
@Override
@@ -77,6 +78,17 @@ public void run() {
7778
return ByteStreams.readString(connection.getInputStream(), StandardCharsets.UTF_8);
7879
}
7980

81+
public static String uploadImage(byte[] data) throws IOException, URISyntaxException {
82+
String url = "https://" + ModConfig.getEffectiveApiHost() + "/interchat/upload_image";
83+
HttpURLConnection connection = (HttpURLConnection) new URI(url).toURL().openConnection();
84+
connection.addRequestProperty("Authorization", "Bearer " + ModConfig.apiKey);
85+
connection.setDoOutput(true);
86+
connection.setRequestMethod("POST");
87+
connection.setRequestProperty("Content-Type", "image/png");
88+
connection.getOutputStream().write(data);
89+
return new String(ByteStreams.readFully(connection.getInputStream()), StandardCharsets.UTF_8);
90+
}
91+
8092
public static void reconnect() {
8193
try {
8294
if (client != null) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.azisaba.interchatmod.fabric.mixin;
2+
3+
import net.azisaba.interchatmod.fabric.Mod;
4+
import net.minecraft.client.MinecraftClient;
5+
import net.minecraft.client.texture.NativeImage;
6+
import net.minecraft.client.util.ScreenshotUtils;
7+
import net.minecraft.text.*;
8+
import net.minecraft.util.Formatting;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
14+
import java.io.File;
15+
import java.util.UUID;
16+
import java.util.function.Consumer;
17+
18+
@Mixin(ScreenshotUtils.class)
19+
public class MixinScreenshotUtils {
20+
@Inject(at = @At(value = "INVOKE", target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V"), method = "method_1661")
21+
private static void onSaveScreenshot(NativeImage nativeImage, File file, Consumer<Text> consumer, CallbackInfo ci) {
22+
UUID uuid = UUID.randomUUID();
23+
MutableText text = new LiteralText("");
24+
text.append("[↑");
25+
text.append(new TranslatableText("generic.upload"));
26+
text.append("↑]");
27+
text.styled(style -> style
28+
.withColor(Formatting.AQUA)
29+
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TranslatableText("generic.upload.tooltip")))
30+
.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/cguild upload_image " + uuid)));
31+
MinecraftClient.getInstance().execute(() -> consumer.accept(text));
32+
Mod.images.put(uuid, file);
33+
}
34+
}

fabric-1.16/src/main/resources/fabric.mod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"interchatmod.mixins.json"
2525
],
2626
"depends": {
27-
"fabricloader": ">=0.14",
27+
"fabricloader": ">=0.13",
2828
"fabric": ">=0.42",
2929
"minecraft": ">=1.16",
3030
"java": ">=8"
Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
2-
"required": true,
3-
"package": "net.azisaba.interchatmod.fabric.mixin",
4-
"compatibilityLevel": "JAVA_8",
5-
"mixins": [
6-
"MixinClientPlayerEntity",
7-
"MixinMinecraftClient"
8-
],
9-
"injectors": {
10-
"defaultRequire": 1
11-
}
2+
"required": true,
3+
"package": "net.azisaba.interchatmod.fabric.mixin",
4+
"compatibilityLevel": "JAVA_8",
5+
"mixins": [
6+
"MixinClientPlayerEntity",
7+
"MixinMinecraftClient",
8+
"MixinScreenshotUtils"
9+
],
10+
"injectors": {
11+
"defaultRequire": 1
12+
}
1213
}

0 commit comments

Comments
 (0)